创建 IRP 给底层驱动
在驱动开发的过程中,中间层的驱动可以需要创建 IRP 发送给底层的驱动, 在window
中常见有三种方法来创建 IRP
1. IoAllocateIrp 创建 IRP 并且把 I/O statck location 都初始化为 0
如果调用这个函数创建 IRP, 必须设置新创建的 IRP 的下一个底层驱动的 I/O stack location
通常的做法是从原来的 IRP 拷贝当前 I/O stack location 的信息
2. IoBuildAsynchronouseFsdRequest
3. IoMakeAssociatedIrp, 这个函数创建 IRP 且把 I/O stack location 信息都初始化为0
且和原始处理的IRP 建立Association. 中间的驱动不能调用这个函数。 最高层的驱动可以调用
这个函数创建 IRP 之后把控制交还 I/O manager. 等待 I/O manager 的通知。 I/O manager
会在所有关联的IRP 结束之后自动结束 master IRP。
中间层的驱动可以调用如下函数来创建 IRP
1. IoAllocateIrp
2. IoBuildDeviceIoControlRequest 通常会调用这个函数
3. IoBuildSynchronousFsdRequest
4. IoBuildAsynchronousFsdRequest
如果驱动中创建了新的IRP,并且设置了 IoCompletion 函数,那么在 IoCompletion 函数中应该释放所有分配的 IRP(IoFreeIrp)
之后调用 IoCompleteRequest 来设置最初的IRP。