Windows WDI驱动示例:MiniportInitializeEx在步骤c执行失败求助
我正在学习GitHub上微软Windows-driver-samples-master\network\wlan\WDI中的Windows WDI驱动示例,按照官方教程及示例代码编写代码。根据教程,MiniportInitializeEx在MiniportWdiOpenAdapter后会执行以下步骤:
- a. 调用MiniportWdiTalTxRxInitialize初始化数据路径和交换处理程序
- b. 调用OID_WDI_GET_ADAPTER_CAPABILITIES获取适配器能力
- c. 调用OID_WDI_SET_ADAPTER_CONFIGURATION配置适配器
- d. 若初始无线电状态不符合预期则调用OID_WDI_TASK_SET_RADIO_STATE设置状态
- e. 调用MiniportWdiTalTxRxStart建立数据路径
- f. 调用OID_WDI_TASK_CREATE_PORT创建初始端口
任何步骤失败,微软组件都会回滚前置操作导致初始化失败。我的调试日志显示执行完步骤c后触发了回滚,日志如下:
[DriverEntry:12] >>
[WdiInitialize:726] >>
[WdiInitialize:801] <<
[DriverEntry:25] <<
[AllocateAdapterHandler:161] >>
[AllocateAdapterHandler:200] <<
[OpenAdapterHandler:225] >>
[OpenAdapterHandler:232] <<
[TalTxRxInitializeHandler:631] >>
[TalTxRxInitializeHandler:695] <<
[OidRequestHandler:48] >>
[DbgPrintOidName:84] OID_WDI_GET_ADAPTER_CAPABILITIES
[OidRequestHandler:51] PortNumber:0
[OidRequestHandler:52] InputBufferLength: 16
[WdiOidGetAdapterCapabilities:471] >>
[WdiOidGetAdapterCapabilities:505] <<
[OidRequestHandler:89] BytesWritten: 203
[OidRequestHandler:92] <<
[OidRequestHandler:48] >>
[DbgPrintOidName:84] OID_WDI_SET_ADAPTER_CONFIGURATION
[OidRequestHandler:51] PortNumber:0
[OidRequestHandler:52] InputBufferLength: 47
[OidRequestHandler:89] BytesWritten: 16
[OidRequestHandler:92] <<
[TalTxRxDeinitializeHandler:708] >>
[TalTxRxDeinitializeHandler:713] <<
[CloseAdapterHandler:246] >>
[CloseAdapterHandler:252] <<
[FreeAdapterHandler:211] >>
[FreeAdapterHandler:212] <<
[UnloadHandler:27] >>
[UnloadHandler:33] <<
排查方向
检查OID请求的返回状态
现有日志仅记录了字节写入量,未输出OID_WDI_SET_ADAPTER_CONFIGURATION的NTSTATUS返回值。需在OidRequestHandler中添加该OID的返回状态打印,确认是否返回了STATUS_SUCCESS以外的错误码(如STATUS_INVALID_PARAMETER、STATUS_UNSUCCESSFUL)——WDI框架会在OID请求失败时触发回滚流程。验证配置参数的合法性
该OID的输入缓冲区对应WDI_ADAPTER_CONFIGURATION结构,需重点检查:DesiredPowerMode是否与之前OID_WDI_GET_ADAPTER_CAPABILITIES返回的支持模式匹配DeviceSleepConfig、WakeUpCapabilities等字段是否符合硬件实际规格- 输入缓冲区长度(日志中为47)是否与结构实际大小一致,避免参数截断或内存越界
对照官方示例的实现细节
检查你的WdiOidSetAdapterConfiguration函数是否遗漏关键步骤:- 是否正确将配置参数存储到适配器上下文
- 是否向硬件下发了对应配置命令,且硬件返回成功响应
- 输出缓冲区的
WDI_ADAPTER_CONFIGURATION_COMPLETION结构中Status字段是否设置为WDI_STATUS_SUCCESS
确认硬件初始化状态
执行配置OID前,需确保硬件处于就绪状态:- 硬件是否完成基础初始化,能够接收配置命令
- 之前的
MiniportWdiTalTxRxInitialize是否正确初始化了数据路径,确保配置命令可正常下发到硬件
启用WDI框架详细日志
通过注册表开启WDI框架的调试日志:- 注册表路径:
HKLM\System\CurrentControlSet\Services\WdiWiFi\Parameters - 添加
DebugLevelDWORD值,设置为0x0000000F(启用所有日志类别) - 重启系统后重新触发初始化,查看框架日志获取回滚的具体触发原因
- 注册表路径:
内容的提问来源于stack exchange,提问作者Levoir

