创建 IRP 给底层驱动



创建 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。

你可能感兴趣的:(创建 IRP 给底层驱动)