您的位置:首页 > 编程语言 > C语言/C++

天书笔记(2)---使用C++开发内核程序

2011-08-18 20:59 435 查看
1.使用C接口的标准声明

在C++中使用C编写的接口,要在前面加 extern "c"。

extern "C"{
#include <ntddk.h>
};

extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver_object,PUNICODE_STRING reg_path)
{
	return STATUS_SUCCESS;
}

2.重载操作符

void *__cdecl operator new(unsigned int size)
{
	void *pt=ExAllocatePool(NonPagedPool,size);
	if (pt!=NULL)
	{
		memset(pt,0,size);
	}
	return pt;
}
void __cdecl operator delete(void *p)
{
	ExFreePool(p);
}
void __cdecl operator delete [](void *p)
{
	ExFreePool(p);
}



3.使用类静态成员函数

使用C++的时候总是要注意,把一个类的成员函数当做普通的C函数使用是不对的。至少类的成员函数都知道this指针,而C函数不知道,所以它们的接口实际上是不一样的。而静态函数可以,静态函数调用的结果不会访问或者修改任何对象(非static)数据成员。

下面实现一个MyDriver的类,把分发函数作为虚函数以便于继承

extern "C"{
#include <ntddk.h>
};

void *__cdecl operator new(unsigned int size)
{
	void *pt=ExAllocatePool(NonPagedPool,size);
	if (pt!=NULL)
	{
		memset(pt,0,size);
	}
	return pt;
}
class MyDriver
{
public:
	MyDriver(PDRIVER_OBJECT driver);
	virtual NTSTATUS OnDispatch(PDEVICE_OBJECT dev,PIRP irp)//测试:直接返回失败
	{
		return STATUS_UNSUCCESSFUL;
	}
	static MyDriver *d_my_driver;//静态成员,总是记录唯一被实例化的MyDriver指针
private:
	//静态成员函数,用来作为Dispatch函数使用
	static NTSTATUS sDispatch(PDEVICE_OBJECT dev,PIRP irp);
	PDRIVER_OBJECT d_driver;
}

MyDriver::MyDriver(PDRIVER_OBJECT driver) : d_driver(driver)
{
	size_t i;
	for (i=0;i<=IRP_MJ_MAXIMUM_FUNCTION;i++)
	{
		driver->MajorFunction[i]=sDispatch;
	}
	d_my_driver=this;
}
NTSTATUS MyDriver::sDispatch(PDEVICE_OBJECT dev,PIRP irp)
{
	return d_my_driver->OnDispatch(dev,irp);
}
MyDriver *MyDriver::d_my_driver=NULL;

extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver_object,PUNICODE_STRING reg_path)
{
	MyDriver *MyDriver::d_my_driver=new MyDriver(driver_object);
	return STATUS_SUCCESS;
}

代码照着书敲得可哥就是没编译成功。。。

driver->MajorFunction[i]=sDispatch为什么不直接给我们的OnDispatch,因为类成员函数(右)跟普通C函数(左)接口不同,所以又定义了一个静态函数,这个静态函数来作为分发函数的指针,这个静态函数里面调用虚函数OnDispatch(要调用这个虚函数因为静态函数里面没有this指针,所以去定义了一个类型为MyDriver*的静态成员,这等于是一个全局公共的指针,只有singleton才可以这样做),以便我们派生。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: