首页
社区
课程
招聘
[求助]驱动中IoCompletion函数疑惑
发表于: 2013-9-30 13:37 4292

[求助]驱动中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中的参考代码究竟哪一份才更靠谱?

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回