Windows驱动中的IRP

来源:互联网 发布:加密软件破解版 编辑:程序博客网 时间:2024/05/18 03:33

               如所周知,Windows中的驱动中的所有的IO请求都是已IRP的形式存在的。即所有的应用程序对驱动程序的调用,驱动程序对驱动程序的调用,都是通过IRP,驱动程序本身的所有功能都是通过IRP来呈现的,下面给出IRP的MSDN中数据结构定义:

             

typedef struct _IRP {
  .
  .
  PMDL  MdlAddress;
  ULONG  Flags;
  union {
    struct _IRP  *MasterIrp;
    .
    .
    PVOID  SystemBuffer;
  } AssociatedIrp;
  .
  .
  IO_STATUS_BLOCK  IoStatus;
  KPROCESSOR_MODE  RequestorMode;
  BOOLEAN PendingReturned;
  .
  .
  BOOLEAN  Cancel;
  KIRQL  CancelIrql;
  .
  .
  PDRIVER_CANCEL  CancelRoutine;
  PVOID UserBuffer;
  union {
    struct {
    .
    .
    union {
      KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
      struct {
        PVOID  DriverContext[4];
      };
    };
    .
    .
    PETHREAD  Thread;
    .
    .
    LIST_ENTRY  ListEntry;
    .
    .
    } Overlay;
  .
  .
  } Tail;
} IRP, *PIRP;

        这里,我们只说明几个成员,MSDN上面有详细的说明。

      MdlAddress 用户空间的MDL的指针。

     Flags 文件驱动使用这个域,对所有驱动都是可读的。

     AssociatedIrp 这个域可以重点介绍下,MasterIrp为主IRP,SystemBuffer,当设备对象的FLAG域设置为DO_BUFFERED_IO,SystemBuffer代表这个缓冲区,缓冲区的长度在IO_STACK_LOCATION的Parameters种指定。

     IoStatus  IO_STATION_LOCATION的状态。

     UserBuffer 当IO请求的定义成METHOD_NEITHER ,IO堆栈中的Major Function 代码为IO_MJ_DEVICE_CONTORL和IO_MJ_INTERNEL_DEVICE_CONTROL,输出空间地址。

     一般来说,IRP本身情况,我们很少使用,在WDM驱动中,一般做为函数输入参数,由系统传入。我们用得比较多的操作一般都是对于IO_STATION_LOCATION,这里面包含很多IRP相关的属性。下节会详细介绍它!