-
-
[笔记]IRP里两个方便同步请求的标志
-
发表于:
2015-4-5 21:06
3635
-
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
https://msdn.microsoft.com/en-us/library/windows/hardware/ff548318(v=vs.85).aspx IoBuildDeviceIoControlRequest
https://msdn.microsoft.com/en-us/library/windows/hardware/ff548330(v=vs.85).aspx IoBuildSynchronousFsdRequest
https://msdn.microsoft.com/en-us/library/windows/hardware/ff548310(v=vs.85).aspx IoBuildAsynchronousFsdRequest
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)