向Windows内核驱动中传递一个函数指针,使其在内核级执行。
这个例子是来自于张帆编写的《Windows驱动开发技术详解》第15章15.5节,P397-399页。首先注意这个例子有个错误:
switch (code) { // process request case IOCTL_KERNEL_FUNCTION: { KdPrint(("IOCTL_KERNEL_FUNCTION\n")); KernelFun* InputBuffer = (KernelFun*)pIrp->AssociatedIrp.SystemBuffer; //将应用程序提供的函数地址提供给驱动程序 KernelFun foo = *InputBuffer; //在内核模式下调用应用程序的函数 int ret = foo(); KdPrint(("ret = %d, out = %d\n", ret, cbout)); memcpy(pIrp->AssociatedIrp.SystemBuffer, &ret, 4); info = cbout; break; } default: status = STATUS_INVALID_VARIANT; }
应用层的调用方法:
// // 首先定义要执行的函数 // int KernelModeFunction() { //运行在ring0 //所以能执行IO操作 // Out_8((PUCHAR)0x378,0); return 100+67; } // //下面是DeviceIoControl调用 // DWORD dwOutput ; int ret; //类似于Out_8((PUCHAR)0x378,0); DWORD Function_Address = (DWORD)KernelModeFunction; DeviceIoControl(hDevice, IOCTL_KERNEL_FUNCTION, &Function_Address, 4, &ret, 4, &dwOutput, NULL);
可以在这里下载张帆完整的《Windows驱动开发技术详解》光盘源码:http://pan.baidu.com/s/1sjJhjwp