DRIVER_OBJECT,DEVICE_OBJECT 结构体分析

本文分析了WDK中的DRIVER_OBJECT和DEVICE_OBJECT结构体,详细探讨了这两个结构体在驱动程序中的作用和关键成员,为理解驱动开发提供基础。
摘要由CSDN通过智能技术生成


在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;




在Windows Device Driver Model (WDDM) 中,注册GUID_DEVINTERFACE_I2C通常涉及到编写设备驱动程序以支持I2C总线通信。以下是一个简化的步骤概述: 1. **包含头文件**: 首先,在设备驱动程序的源代码中,包括`ntddk.h`和`wdm.h`等基本头文件,以及`guiddef.h`来处理GUID。 ```c++ #include <ntddk.h> #include <wdm.h> #include <guiddef.h> ``` 2. **定义I2C接口 GUID**: 创建一个全局唯一标识符(GUID),用于表示I2C设备接口。这通常是通过宏完成的,例如: ```c++ DEFINE_GUID(GUID_DEVINTERFACE_I2C, 0x4D36E978, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x5E); ``` 3. **声明设备接口结构体**: 使用`DEVICE_INTERFACE_DATA`结构,并将其`InterfaceClass`成员设置为你刚才定义的GUID。 ```c++ DEVICE_INTERFACE_DATA I2C_DID = { sizeof(DEVICE_INTERFACE_DATA), DDI_DEVICE鼾CLASS常规, GUID_DEVINTERFACE_I2C }; ``` 4. **添加到设备信息类**: 在设备安装函数(如`DriverEntry`)中,将I2C接口数据结构添加到设备的信息类数组`DeviceObject->DeviceExtension`中。 5. **注册设备接口**: 调用`IoRegisterDeviceInterface()`函数来注册这个设备接口,这样系统就能识别和支持该类型的I2C设备。 ```c++ Status status = IoRegisterDeviceInterface( DeviceObject, &I2C_DID, NULL, FILE_DEVICE_I2C ); ``` 请注意,实际编程过程中还需要处理错误、设备枚举和打开/关闭等功能。以上步骤仅提供了一个基础框架。此外,如果你需要更详细的代码示例或了解特定平台的细节,可能需要查阅官方文档或相关的驱动程序开发教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值