WDF
+ -

WdfDeviceCreate之WDFDEVICE_INIT对象

2026-06-03 6 0

WdfAddDevice回调函数中会调用WdfDeviceCreate创建设备对象WDFDEVICE,设备创建包含2个重要的参数:

  • WDF_OBJECT_ATTRIBUTES:仅用于描述符设备对象的扩展空间大小
WDF_OBJECT_ATTRIBUTES               attributes;
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, REQUEST_CONTEXT);
WdfDeviceInitSetRequestAttributes(DeviceInit, &attributes);

结构体的定义如下:

//
// This context is associated with every request received by the driver from the app.
//
typedef struct _REQUEST_CONTEXT {

    WDFMEMORY         UrbMemory;
    PMDL              Mdl;
    ULONG             Length;         // remaining to xfer
    ULONG             Numxfer;
    ULONG_PTR         VirtualAddress; // va for next segment of xfer.
    BOOLEAN           Read; // TRUE if Read
} REQUEST_CONTEXT, * PREQUEST_CONTEXT;

WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(REQUEST_CONTEXT, GetRequestContext)
  • WDFDEVICE_INIT 则描述符设备对象的相关回调和属性信息
WDFDEVICE_INIT (DeviceInit)
├── PnP 事件回调 (对应 WDM: IRP_MJ_PNP 处理例程)
│   ├── EvtDevicePrepareHardware   ← IRP_MN_START_DEVICE (初始化硬件)
│   ├── EvtDeviceReleaseHardware   ← IRP_MN_STOP_DEVICE (释放硬件资源)
│   ├── EvtDeviceD0Entry           ← IRP_MN_POWER_SET (进入D0状态)
│   ├── EvtDeviceD0Exit            ← IRP_MN_POWER_SET (离开D0状态)
│   ├── EvtDeviceQueryRemove       ← IRP_MN_QUERY_REMOVE_DEVICE
│   ├── EvtDeviceRemoveComplete    ← IRP_MN_REMOVE_DEVICE
│   └── EvtDeviceSurpriseRemoval   ← IRP_MN_SURPRISE_REMOVAL
│
├── Power 事件回调 (对应 WDM: IRP_MJ_POWER 处理例程)
│   ├── EvtDevicePowerPolicyStateChange ← 电源策略状态变化
│   ├── EvtDeviceSelfManagedIoInit     ← 自管理I/O初始化
│   └── EvtDeviceSelfManagedIoCleanup  ← 自管理I/O清理
│
├── 文件对象配置 (对应 WDM: IRP_MJ_CREATE/CLOSE/CLEANUP)
│   ├── EvtDeviceFileCreate    ← IRP_MJ_CREATE (打开设备)
│   ├── EvtDeviceFileClose     ← IRP_MJ_CLOSE (关闭设备)
│   ├── EvtDeviceFileCleanup   ← IRP_MJ_CLEANUP (清理操作)
│   └── FILE_CONTEXT           ← WDM: FsContext/FsContext2 (每句柄上下文)
│
├── I/O 请求配置 (对应 WDM: IoCreateDevice 标志)
│   ├── RequestAttributes
│   │   └── REQUEST_CONTEXT    ← 每个IRP的私有上下文
│   ├── IoType
│   │   ├── WdfDeviceIoBuffered   ← DO_BUFFERED_IO
│   │   ├── WdfDeviceIoDirect     ← DO_DIRECT_IO
│   │   └── WdfDeviceIoNeither    ← 无标志(Neither模式)
│   └── Exclusive               ← DO_EXCLUSIVE
│
├── 设备类型与特性 (对应 WDM: IoCreateDevice 参数)
│   ├── DeviceType             ← DeviceType 参数
│   ├── DeviceCharacteristics  ← DeviceCharacteristics 参数
│   ├── Exclusive              ← Exclusive 参数
│   └── SecurityDescriptor     ← 安全描述符
│
├── 命名空间配置 (对应 WDM: IoCreateDevice 设备名称)
│   ├── DeviceName             ← \Device\XXX
│   └── SymbolicLinkName       ← \DosDevices\XXX (用户态可见名称)
│
├── 驱动对象引用 (对应 WDM: DriverObject)
│   └── WdfDriver              ← 框架驱动对象(封装DriverObject)
│
└── 低层设备信息 (对应 WDM: 设备栈信息)
    ├── LowerDevice            ← 下层设备对象指针
    └── DeviceStackSize        ← 设备栈大小

创建设备:

 status = WdfDeviceCreate(&DeviceInit, &attributes, &device);
 if (!NT_SUCCESS(status)) {
     UsbSamp_DbgPrint(1, ("WdfDeviceCreate failed with Status code 0x%x\n", status));
     return status;
 }

pDevContext = GetDeviceContext(device);

0 篇笔记 写笔记

WDF 体系统构
Windows操作系统系列的下一代驱动程序模型是WDF,这相模型相当于以前的WDM架构,可以减少驱动程序的开发时间,实现更好的系统稳定性,提高驱动程序的适应性。WDF提供了两种类型的框架:KMDF(Kernel Mode Driver FrameWord,内核模式驱动程序框架)实现了Windo......
WDF驱动程序模型
WDF驱动程序模型定义了一个面向对象的事件驱动环境,在这个环境中,驱动程序代码管理特定于设备的功能,而在发生会影响设备操作的事件时,微软公司提供的一个框架则会调用驱动程序进行响应。驱动程序模型包含以下内容。KMDF和UMDF都要实现的一个对象模型。KMDF和UMDF都使用的一个即插即用和电源管......
WDF对象模型
WDF对象模型中,对象具有以下特点。对象是驱动程序的构造块。驱动程序通过明确定义的接口来修改这些对象。对象本身有 明确定义的生命周期。有一组事件可以影响每类对象。框架定义了每个事件的默认行为。要支持特定于设备的 行为,驱动程序中要包含能重写默认行为的回调例程。模型定义了一组对象,用来表示公共......
WDF内核对象
KMDF对象对驱动程序来说是不透明的结构。驱动程序永远不会直接访问KMDF对象的实例。相反,它们通过句柄来引用对象实例。要读、写对象或在对象上执行操作,驱动程序需要调用对象的方法并传递该句柄。 KMDF定义了20多种对象类型。下在是最常用的一些对象。 KMDF对象是KMDF框架独有的。它们不受W......
WDF即插即用和电源管理支持
WDF的主要设计目标简化即插即用和电源管理的驱动程序支持,在内核模式和用户模式下都能使用即插即用和电源管理。无缝地处理即插即用事件和电源事件,对于系统的可靠性和良好用户体验来说至关重要,但要想正确实现也出奇地复杂。 这种复杂性多数是因为驱动程序必须确定处理每个即插即用或电源管理请求的正确方式。正确......
WDF集成的IO队列和取消
WDF将即插即用和电源管理支持与I/O请求的排队相集成,并进一步将排队与请求取消集成。 KMDF和UMDF都提供可配置的IO队列。驱动程序为特定的I/O请求、电源管理特征和调度请求创建并配置队列。框架根据驱动程序的说明对请求进行排队和调度:顺序(一次一个)、并行(到达就分配)或手动(根据驱动程序的......
WDF IO模型
在Windows中,IRP(IORequestPacket,IO请求数据包)的功能不仅仅是向驱动程序提供传统的I/O请求(读、写、创建等)。它是操作系统和驱动程序、驱动程序和驱动程序之间一种基于数据包的通用通信机制。除了传递IO请求之外,WindowsIO管理器还发送IRP来通知驱动程序发生了即插即......
WDF IO请求流程
虽然由不同的组件实现,但KMDF和UMDF使用的I/O模型相同。在这个模型中,IO请求的流程如图所示。WDF调度程序代码在框架内传递I/O请求数据包。WDF根据IO请求的主功能代码调度IO请求。主功能代码是IRP中的一个字段,用来标识请求的类型。根据主I/O功能代码,调度程序决定最初应该由框架中的......
WDF WMI请求(仅限内核模式驱动程序)
WMI(WindowsManagementInstrumentation)请求触发驱动程序为当前所有WMI事件所注册的回调。在WMI回调中,驱动程序可能会调用设备对象的WIM方法来创建和操纵WMI实例,以WMI提供程序的形式改变它的状态。在WIM回调返回之后,框架代替驱动程序根据具体情况完成或转发请......
WDF 驱动程序架构
WDF内核驱动程序架构对于内核模式驱动程序,KMDF不会替代WDM,而是提供了一个框架性的WDM实现。驱动程序开发人员通过创建对象并提供基于事件的回调例程,配置框架驱动程序从而在特定设备上使用。 KMDF是一个可以重入的库,可以在多个驱动程序之间共享。驱动程序在加载的时候与这个库动态绑定,可以同时......
KMDF驱动程序结构
KMDF驱动程序包含DriverEntry函数(根据KMDF标识驱动程序)、 KMF调用的一系列回调函数(以便驱动程序能够对影响其设备的事件做出响应),以及驱动程序特有的其他实用函数。几乎每种KMDF驱动程序均必须具备下列函数。DriverEntry函数,表示驱动程序的主要入口点。EvtDriv......
WDF结构体继承
WDF在内核中的驱动模块为Wdf01000.sysWDF中的各个对象的公共模块为FxObject,其它对象对是继随于FxObject,如FxDevice对于的DEVICE_OBJECT,FxDriver对应的DRIVER_OBJECT.Wdf01000的驱动属性信息如下:1: kd> !......
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME
#define WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(_contexttype, _castingfunction) ......
WdfDeviceCreate之WDFDEVICE_INIT对象
WdfAddDevice回调函数中会调用WdfDeviceCreate创建设备对象WDFDEVICE,设备创建包含2个重要的参数:WDF_OBJECT_ATTRIBUTES:仅用于描述符设备对象的扩展空间大小WDF_OBJECT_ATTRIBUTES attribu......
WdfDriverCreate之WDF_DRIVER_CONFIG
WDF_DRIVER_CONFIG├── 必选配置│ └── EvtDriverDeviceAdd ← WDM: DriverObject->DriverExtension->AddDevice│ (设备添加回调,处理 PnP AddDevice 请求)│......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!