设备对象(DEVICE_OBJECT)

来源:互联网 发布:二维数组的定义方式 编辑:程序博客网 时间:2024/05/16 09:27

1.每个驱动程序会创建一个或多个设备对象(下文称DO),用DEVICE_OBJECT数据结构表示。每个DO都会有个指针指向下一个DO,因此就形成了一个DO链。DO链的第一个DO是由DRIVER_OBJECT 结构体中的 PDRIVER_EXTENSION 指明的.DO保存DO特征和状态信息,以下是字段信息:

typedef struct  _DEVICE_OBJECT {    CSHORT Type;    USHORT Size;    LONG ReferenceCount;    struct _DRIVER_OBJECT *DriverObject; //point to the DriverObject    struct _DEVICE_OBJECT *NextDevice;// point to the next DO to make the links    struct _DEVICE_OBJECT *AttachedDevice;//如果有更高一层的驱动附加到这个驱动的时候,AttachedDevice指向//的就是那个更高一层的驱动    struct _IRP *CurrentIrp;//在使用StartIO例程的时候,此域指向的是当前IRP结构    PIO_TIMER Timer;    ULONG Flags;                                // See above:  DO_...    ULONG Characteristics;                      // See ntioapi:  FILE_...    __volatile PVPB Vpb;    PVOID DeviceExtension;    DEVICE_TYPE DeviceType;    CCHAR StackSize;     //在多层驱动情况下,驱动与驱动之间会形成类似堆栈的结构。IRP会依次从最高层次传递到最底层。    union {        LIST_ENTRY ListEntry;        WAIT_CONTEXT_BLOCK Wcb;    } Queue;    ULONG AlignmentRequirement;    KDEVICE_QUEUE DeviceQueue;    KDPC Dpc;    //    //  The following field is for exclusive use by the filesystem to keep    //  track of the number of Fsp threads currently using the device    //    ULONG ActiveThreadCount;    PSECURITY_DESCRIPTOR SecurityDescriptor;    KEVENT DeviceLock;    USHORT SectorSize;    USHORT Spare1;    struct _DEVOBJ_EXTENSION  *DeviceObjectExtension; //自己定义特殊结构体。根据设备的需要,需要填写相应的设备类型。当制作虚拟设备时,应选择FILE_DEVICE_UNKNOWN//类型的设备    PVOID  Reserved;} DEVICE_OBJECT;