-
-
[求助]驱动中IoCompletion函数疑惑
-
发表于: 2013-9-30 13:37 4292
-
具体问题如下所述,诚心求教!
msdn上关于IoCompletion有如下一段说明:


从这段说明上,我个人得到的信息是Context参数指向的内存要存储在非分页空间,确保DISPATCH_LEVEL下也能使用;但是实际看到开源代码或者MSDN自己的示例代码,好像又不是这么用的;
如MSDN(d90K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8W2j5$3S2F1k6i4c8Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9q4)9J5k6r3y4F1i4K6u0r3L8r3W2T1M7X3q4J5P5g2)9J5c8X3S2Z5y4o6f1H3z5o6V1&6i4@1g2r3i4@1u0o6i4K6R3&6i4@1g2r3i4@1u0o6i4K6W2m8


以下代码摘自于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(d90K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8W2j5$3S2F1k6i4c8Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9q4)9J5k6r3y4F1i4K6u0r3L8r3W2T1M7X3q4J5P5g2)9J5c8X3S2Z5y4o6f1H3z5o6V1&6i4@1g2r3i4@1u0o6i4K6R3&6i4@1g2r3i4@1u0o6i4K6W2m8


以下代码摘自于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中的参考代码究竟哪一份才更靠谱?
赞赏
他的文章
- [讨论]iTunes自动注册问题求教 15003
- [求助]CreateProcess挂住无返回,诡异! 3205
- [求助]驱动中IoCompletion函数疑惑 4293
- [求助]IoCancelIrp疑惑!(已解决) 8414
- 驱动相关问题,诚心求指教! 8697
赞赏
雪币:
留言: