向Windows内核驱动中传递一个函数指针,使其在内核模式下执行

来源:互联网 发布:cms网站系统 编辑:程序博客网 时间:2024/06/04 18:22

向Windows内核驱动中传递一个函数指针,使其在内核级执行。

这个例子是来自于张帆编写的《Windows驱动开发技术详解》第15章15.5节,P397-399页。首先注意这个例子有个错误:

switch (code){// process requestcase 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;}

少了个case分支中少了个break语句(上面已经加上了),这样会导致IRPTrace查看“IRP_MJ_DEVICE_CONTROL”返回时失败,注意这个细节的小问题。

应用层的调用方法:

////首先定义要执行的函数//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


0 0
原创粉丝点击