IRP里两个方便同步请求的标志
See-->
http://bbs.pediy.com/showthread.php?p=1363356
在中间层和其他过滤驱动中,经常有向下层设备获取信息的需求。
有4个内核函数可以完成这个操作:
IoBuildDeviceIoControlRequest
IoBuildAsynchronousFsdRequest
IoBuildSynchronousFsdRequest
IoAllocateIrp
其中前两者都会调用IoAllocateIrp,IoBuildSynchronousFsdRequest会在内部调用IoBuildAsynchronousFsdRequest。
IoAllocateIrp顾名思义,是分配IRP的函数,从它得到的IRP,需要填写符合目的的参数才可以IoCallDriver。
我们的驱动向下层获取信息,一般会等待这个操作完成,拿到数据才会往下执行,说明这里是个同步操作。
一般常见的操作是初始化一个事件,用上面提到的函数创建IRP,给IRP设置一个完成函数发往下层,然后等待这个事件;
完成函数里置信这个事件,返回STATUS_MORE_PROCESSING_REQUIRED,达到等待完成的目的。
操作完成后,IoAllocateIrp和IoBuildAsynchronousFsdRequest的IRP需要IoFreeIrp。
其实Irp里UserEvent,和Flags项,配合起来做同步操作是非常惬意的。
Irp->Flags |= IRP_CLOSE_OPERATION; // 完成后自动 KeSetEvent(Irp->UserEvent)
Irp->Flags |= IRP_SYNCHRONOUS_PAGING_IO; // 完成后自动 IoFreeIrp
这样就不需要设置完成函数来KeSetEvent。
参考:
http://bbs.pediy.com/showthread.php?t=140445 IoCompleteRequest
22dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3c8F1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0r3K9r3q4J5k6s2N6S2M7X3g2Q4x3V1k6X3k6U0f1@1z5o6x3I4z5q4)9J5z5s2k6Q4x3@1c8$3M7#2)9J5k6e0R3#2i4K6t1&6i4K6u0W2j5i4y4H3P5q4)9J5y4X3&6T1M7%4m8Q4x3@1u0Q4x3U0k6F1j5Y4y4H3i4K6y4n7d9h3!0n7N6h3W2D9k6p5c8W2N6X3W2U0k6f1W2G2b7$3!0F1N6s2u0G2L8q4u0W2M7i4g2W2M7%4b7`.
34cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3c8F1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0r3K9r3q4J5k6s2N6S2M7X3g2Q4x3V1k6X3k6U0f1@1z5o6x3K6x3q4)9J5z5s2k6Q4x3@1c8$3M7#2)9J5k6e0R3#2i4K6t1&6i4K6u0W2j5i4y4H3P5q4)9J5y4X3&6T1M7%4m8Q4x3@1u0Q4x3U0k6F1j5Y4y4H3i4K6y4n7d9h3!0n7N6h3W2D9k6q4y4&6L8X3y4Z5M7X3!0F1L8%4g2K6c8Y4y4V1f1X3g2I4N6h3g2K6N6l9`.`.
2b1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3c8F1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0r3K9r3q4J5k6s2N6S2M7X3g2Q4x3V1k6X3k6U0f1@1z5o6x3I4x3q4)9J5z5s2k6Q4x3@1c8$3M7#2)9J5k6e0R3#2i4K6t1&6i4K6u0W2j5i4y4H3P5q4)9J5y4X3&6T1M7%4m8Q4x3@1u0Q4x3U0k6F1j5Y4y4H3i4K6y4n7d9h3!0n7N6h3W2D9k6p5q4K6P5h3&6U0K9s2u0G2L8X3!0#2M7@1k6K6k6q4u0W2M7i4g2W2M7%4b7`.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课