首页
社区
课程
招聘
[笔记]IRP里两个方便同步请求的标志
发表于: 2015-4-5 21:06 3636

[笔记]IRP里两个方便同步请求的标志

2015-4-5 21:06
3636
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期)

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
ok
2015-4-5 21:31
0
游客
登录 | 注册 方可回帖
返回
//