你好。请问在 PowerShell 中用应用程序打开这个过滤驱动时,返回的具体错误代码和信息是什么? Windows 通常会记录一个 STATUS_xxx 错误值或 Win32 错误代码。
我编写了一个PCIe switch设备的过滤驱动,但是它会顶替掉原驱动pci.sys,而不是附加在原驱动上
卫平 谢
0
信誉分
我编写了一个PCIe switch设备的过滤驱动,但是它会顶替掉原驱动pci.sys,而不是附加在原驱动上。现象如下图所示,主要代码我也附上了,帮忙检查一下到底是什么问题导致的?
当我安装这个驱动后,用管理员打开powershell终端,调用应用程序打开这个过滤驱动,提示错误:
Windows 开发 | Windows API - Win32
-
-
Tom Tran (WICLOUD CORPORATION) 3,320 信誉分 Microsoft 外部员工 仲裁人
2025-12-09T06:09:21.9566667+00:00 嗨 @卫平 谢 ,
根据你描述的情况,问题主要有两个:
- INF 文件替换了系统自带的 PCI 驱动(pci.sys),而不是作为过滤驱动附加在它上面,这会破坏总线驱动栈。
- 应用程序尝试用 CreateFile 打开过滤驱动创建的设备接口,但驱动没有处理打开请求,导致 Windows 返回 ERROR_INVALID_FUNCTION。
过滤驱动通常不应该在被过滤的 PCI 设备上发布用户模式接口,正确做法是创建一个独立的控制设备对象供应用访问。
我建议你尝试以下步骤:
1. 修正 INF 文件,让驱动作为过滤驱动而不是功能驱动
老方法:在设备实例键中使用 UpperFilters / LowerFilters。
新方法(Windows 10 1903+):使用 INF AddFilter 指令 和 INF DDInstall.Filters 部分,保持 pci.sys 作为功能驱动。 参考:安装筛选器驱动程序。
2. 创建控制设备对象供应用程序打开
- 在 KMDF 中调用 WdfControlDeviceInitAllocate 函数 (wdfcontrol.h),设置 SDDL 权限,给它一个 DOS 名称(例如
\\.\MyPciFilter)。 - 应用程序通过这个路径打开设备并使用 IOCTL 通信。 参考:使用控制设备对象。
3. 添加 IOCTL 实现 PCI 访问
- PCI 配置空间:使用 访问 PCI 设备配置空间 或通过 BUS_INTERFACE_STANDARD 结构 (wdm.h) 调用 WdfFdoQueryForInterface 函数 (wdffdo.h)。
- BAR MMIO:在 EVT_WDF_DEVICE_PREPARE_HARDWARE回调函数 (wdfdevice.h) 中遍历资源列表,找到
CmResourceTypeMemory,用 查找和映射硬件资源 映射内存。
4. 确保驱动正确处理打开/关闭请求
注册文件创建回调或默认 I/O 队列,避免 CreateFile 返回错误。 参考:IRP_MJ_CREATE。
这是过滤驱动常见问题,修正 INF 并使用控制设备对象后,可以保留 pci.sys,安全访问 PCI 配置空间和 BAR。
希望这能帮到你!