DRIVER_OBJECT,DEVICE_OBJECT 结构体分析

来源:互联网 发布:spss如何将数据分组 编辑:程序博客网 时间:2024/06/04 19:56


在wdm.h这个头文件中可以看到这两个结构体的定义,下面简单的分析一下结构体中的内容。

DRIVER_OBJECT

typedef struct _DRIVER_OBJECT {    CSHORT Type;    CSHORT Size;     //这个驱动生成的设备对象,形成一个链,DeviceObject指向这个链    PDEVICE_OBJECT DeviceObject;    //驱动对象是否可以扩展的标记    ULONG Flags;    //这部分描述的就是驱动从哪儿被加载。记数字段用来记录驱动注册的重新初始化程序一共被调用了多少次    PVOID DriverStart;    ULONG DriverSize;    PVOID DriverSection;    //指向driver extension.他唯一可以访问的成员就是 DriverExtension->AddDevice,,我们也是利用这个方法在 DriverEntry 程序中存储驱动程序的AddDevice程序       PDRIVER_EXTENSION DriverExtension;    // 驱动程序的名字被错误日志线程用来决定I/O请求所绑定的驱动的名字    UNICODE_STRING DriverName;     //这个字段是用来进行注册用的。这个指针指向在注册表中硬件信息的路径。    PUNICODE_STRING HardwareDatabase;   //这是一个指向支持快速I/O的备用驱动入口的数组的可选择指针,快速I/O通过传入独立参数直接调用驱动程序来实现,而不是利用标准的IRP呼叫机制。  //注意这些方法只能被用于同步的I/O处理,而且是在文件已经被缓存了的情况下    PFAST_IO_DISPATCH FastIoDispatch;   //是DriverEntry这个程序的主入口,在I/O管理中来进行设置   PDRIVER_INITIALIZE DriverInit;   //是StartIo程序的入口,在DriverEntry来进行设置,如果没有的话,默认是NULL   PDRIVER_STARTIO DriverStartIo;   //是Unload程序的入口,在DriverEntry来进行设置,如果没有的话,默认是NULL    PDRIVER_UNLOAD DriverUnload;   //这是一个指针数组,因为每一个驱动程序都需要处理不同种类的IRP消息,所以驱动程序需要设定当不同类型的IRP请求到来时,用哪一个函数来处理这些  //请求,这个数组的小标的值对应的就是IRP major function code,指向的就是处理这种IRP请求的函数。  PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];} DRIVER_OBJECT;typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; 



DEVICE_OBJECT

typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {    CSHORT Type;    USHORT Size;    LONG ReferenceCount;    //从属于哪一个驱动对象   struct _DRIVER_OBJECT *DriverObject;    //设备链上的下一个对象   struct _DEVICE_OBJECT *NextDevice;    //设备绑定对象   struct _DEVICE_OBJECT *AttachedDevice;   //指向当前的IRP结构  struct _IRP *CurrentIrp;    PIO_TIMER Timer;   //此成员是一个32位的无符号整型变量,每个位有不同的含义。可通过按位取“或”操作为新创建的设备对象设置不同的特性   ULONG Flags;                                   ULONG Characteristics;                     .    __volatile PVPB Vpb;    PVOID DeviceExtension;    //设备类型   DEVICE_TYPE DeviceType;       CCHAR StackSize;    union {        LIST_ENTRY ListEntry;        WAIT_CONTEXT_BLOCK Wcb;    } Queue;    ULONG AlignmentRequirement;    KDEVICE_QUEUE DeviceQueue;    KDPC Dpc;      ULONG ActiveThreadCount;    PSECURITY_DESCRIPTOR SecurityDescriptor;    KEVENT DeviceLock;    USHORT SectorSize;    USHORT Spare1;    struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;    PVOID  Reserved;} DEVICE_OBJECT;typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;




0 0
原创粉丝点击