驱动开发主要用C,
也可以用C++,还是用C好,因为好多工具只支持C,
如Static Driver Verifier.
 
如何用C++来开发呢,
以下引用一段代码.
 
#ifndef DRIVER_H
#define DRIVER_H
#pragma warning (disable:4200)
extern "C" {
#include <ntddk.h>
#include <ndis.h>
#include <stdarg.h>
#include <stdio.h>
}
#include <debug.h>
#include <ether.h>
#include <sys/types.h>
static __inline PVOID GetSysBuffer(PIRP irp)
{
 PVOID p = NULL;
 if( irp->MdlAddress )
  p = MmGetSystemAddressForMdl( irp->MdlAddress );
 else
  p = irp->AssociatedIrp.SystemBuffer;
 if( !p )
  p = irp->UserBuffer;
 return p;
}
static __inline void CompleteIRP(PIRP irp, int sz = 0, NTSTATUS status = STATUS_SUCCESS)
{
 irp->IoStatus.Information = sz;
 irp->IoStatus.Status = status;
 if( status != STATUS_PENDING ) {
  IoSetCancelRoutine(irp, NULL);
  IoCompleteRequest( irp, IO_NO_INCREMENT );
 }
}
class CObject
{
public:
 CObject() { DebugPrint((_D("\n"))); }
 virtual ~CObject() {}
 void *operator new(size_t size)
 { return ExAllocatePool(NonPagedPool, size); }
 void operator delete(void *p)
 { ExFreePool(p); }
 
};
class CDriver : public CObject
{
public:
 CDriver(PDRIVER_OBJECT drvobj, PUNICODE_STRING registry) : _drvobj(drvobj), _registry(registry)
 { DebugPrint((_D("\n"))); }
 virtual ~CDriver() { }
 
 PDRIVER_OBJECT GetObject()
 { return _drvobj; }
 void SetObject(PDRIVER_OBJECT drvobj)
 { _drvobj = drvobj; }
 PUNICODE_STRING GetRegistry()
 { return _registry; }
 void SetRegistry(PUNICODE_STRING registry)
 { _registry = registry; }
 
 virtual void Unload();
 virtual NTSTATUS Initialize(int removable);
protected:
 PDRIVER_OBJECT  _drvobj;
 PUNICODE_STRING _registry;
  
};
class CDevice : public CObject
{
public:
 CDevice(CDriver *drvobj)
  : _drvobj(drvobj), _extension(NULL),