-
-
[求助]驱动中IoCompletion函数疑惑
-
2013-9-30 13:37 3718
-
具体问题如下所述,诚心求教!
msdn上关于IoCompletion有如下一段说明:
从这段说明上,我个人得到的信息是Context参数指向的内存要存储在非分页空间,确保DISPATCH_LEVEL下也能使用;但是实际看到开源代码或者MSDN自己的示例代码,好像又不是这么用的;
如MSDN(http://technet.microsoft.com/zh-cn/library/hh450899):
以下代码摘自于Libusb:
上面二份代码完成例程中的Context参数Kevent指向的内存都在栈中,不是ExAllocatePool等函数分配的非分页内存,这样的代码安全吗?当然通过实际测试此完成例程的IRQL发现为0,但是还有其他更加充分的理由能表明其安全性吗?(或者说USB相关的都是IRQL为0?)
通过阅读wrk中的IopfCompleteRequest:
发现完成例程被调用时,内部的IRQL没有做过调整,那么MSDN中担心的DISPATCH_LEVEL难道是在IopfCompleteRequest外部调整的,也就是特定驱动的才会在外部调整IRQL?
还有我发现在MSDN的示例代码中会判断PendingReturned为true时再调用KeSetEvent?但是在libusb中又没有这么做,同时IopfCompleteRequest中不是已经表明了调用IoComplete就表明已经执行完成了?那MSDN跟LIBUSB中的参考代码究竟哪一份才更靠谱?
msdn上关于IoCompletion有如下一段说明:
从这段说明上,我个人得到的信息是Context参数指向的内存要存储在非分页空间,确保DISPATCH_LEVEL下也能使用;但是实际看到开源代码或者MSDN自己的示例代码,好像又不是这么用的;
如MSDN(http://technet.microsoft.com/zh-cn/library/hh450899):
以下代码摘自于Libusb:
上面二份代码完成例程中的Context参数Kevent指向的内存都在栈中,不是ExAllocatePool等函数分配的非分页内存,这样的代码安全吗?当然通过实际测试此完成例程的IRQL发现为0,但是还有其他更加充分的理由能表明其安全性吗?(或者说USB相关的都是IRQL为0?)
通过阅读wrk中的IopfCompleteRequest:
发现完成例程被调用时,内部的IRQL没有做过调整,那么MSDN中担心的DISPATCH_LEVEL难道是在IopfCompleteRequest外部调整的,也就是特定驱动的才会在外部调整IRQL?
还有我发现在MSDN的示例代码中会判断PendingReturned为true时再调用KeSetEvent?但是在libusb中又没有这么做,同时IopfCompleteRequest中不是已经表明了调用IoComplete就表明已经执行完成了?那MSDN跟LIBUSB中的参考代码究竟哪一份才更靠谱?
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
赞赏
他的文章
[讨论]iTunes自动注册问题求教
13047
驱动相关问题,诚心求指教!
8223
看原图