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);
WDF





