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