当前位置 博文首页 > OBJECT_KOOKNUT的博客:驱动程序数据结构--DRIVER

    OBJECT_KOOKNUT的博客:驱动程序数据结构--DRIVER

    作者:[db:作者] 时间:2021-07-03 09:22

    我们先来看一下微软对这个结构体的定义:

    typedef struct _DRIVER_OBJECT
     {
        CSHORT Type;
        CSHORT Size; 
    
        PDEVICE_OBJECT DeviceObject;//该驱动程序挂载的设备对象
        ULONG Flags;
    
        PVOID DriverStart;
        ULONG DriverSize;
        PVOID DriverSection;
        PDRIVER_EXTENSION DriverExtension;
    
        UNICODE_STRING DriverName;//当前驱动名
    
    
        PUNICODE_STRING HardwareDatabase;//设备硬件数据库键名,Pointer to the \Registry\Machine\Hardware path to the hardware configuration information in the registry.
    
    
        PFAST_IO_DISPATCH FastIoDispatch;//指向定义驱动程序的快速I/O入口点的结构的指针。此成员仅供FSDs和网络传输驱动程序使用。
    
    
        PDRIVER_INITIALIZE DriverInit;//驱动入口例程的入口点,由IO管理器设置
        PDRIVER_STARTIO DriverStartIo;//指向StartIO例程的函数地址
        PDRIVER_UNLOAD DriverUnload;//驱动卸载函数的回调地址
        PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];//处理IRP派遣例程的指针数组     IRP_MJ_MAXIMUM_FUNCTION 0x1b
    
    } DRIVER_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;//attach到的设备对象
        struct _IRP *CurrentIrp;//当前IRP堆栈
        PIO_TIMER Timer;
        ULONG Flags; //设备对象标志
        ULONG Characteristics;                      // See ntioapi:  FILE_...
        __volatile PVPB Vpb;
        PVOID DeviceExtension;//设备拓展对象
        DEVICE_TYPE DeviceType;//设备类型,包括磁盘、文件、邮槽等等
        CCHAR StackSize;//IO堆栈的层数
        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;
    

    每个驱动程序会创建一个或多个设备对象,每个设备对象都有一个指针指向下一个设备对象(如果下一个存在),会形成一个设备链。

    设备拓展:
    设备拓展由程序员指定内容和大小,由I\O管理器创建的,保存在非分页内存中。在驱动程序编写时候,为保证多线程的安全性,将一些全局数据以设备拓展的形式存储。

    “夜色之浓,莫过于黎明前的黑暗。”
    参考书籍:
    《Windows驱动开发技术详解》

    cs
    下一篇:没有了