我编写了一个PCIe switch设备的过滤驱动,但是它会顶替掉原驱动pci.sys,而不是附加在原驱动上

卫平 谢 0 信誉分
2025-11-18T10:17:04.7766667+00:00

我编写了一个PCIe switch设备的过滤驱动,但是它会顶替掉原驱动pci.sys,而不是附加在原驱动上。现象如下图所示,主要代码我也附上了,帮忙检查一下到底是什么问题导致的?

当我安装这个驱动后,用管理员打开powershell终端,调用应用程序打开这个过滤驱动,提示错误:

Windows 开发 | Windows API - Win32
{count} 票

2 个答案

排序依据: 非常有帮助
  1. Emmanuel Santana 33,000 信誉分 独立顾问
    2025-11-18T12:11:51.5766667+00:00

    你好。请问在 PowerShell 中用应用程序打开这个过滤驱动时,返回的具体错误代码和信息是什么? Windows 通常会记录一个 STATUS_xxx 错误值或 Win32 错误代码。


  2. Tom Tran (WICLOUD CORPORATION) 3,320 信誉分 Microsoft 外部员工 仲裁人
    2025-12-09T06:09:21.9566667+00:00

    @卫平 谢 ,

    根据你描述的情况,问题主要有两个:

    1. INF 文件替换了系统自带的 PCI 驱动(pci.sys),而不是作为过滤驱动附加在它上面,这会破坏总线驱动栈。
    2. 应用程序尝试用 CreateFile 打开过滤驱动创建的设备接口,但驱动没有处理打开请求,导致 Windows 返回 ERROR_INVALID_FUNCTION

    过滤驱动通常不应该在被过滤的 PCI 设备上发布用户模式接口,正确做法是创建一个独立的控制设备对象供应用访问。

    我建议你尝试以下步骤:


    1. 修正 INF 文件,让驱动作为过滤驱动而不是功能驱动

    老方法:在设备实例键中使用 UpperFilters / LowerFilters。

    新方法(Windows 10 1903+):使用 INF AddFilter 指令INF DDInstall.Filters 部分,保持 pci.sys 作为功能驱动。 参考:安装筛选器驱动程序

    2. 创建控制设备对象供应用程序打开

    3. 添加 IOCTL 实现 PCI 访问

    4. 确保驱动正确处理打开/关闭请求

    注册文件创建回调或默认 I/O 队列,避免 CreateFile 返回错误。 参考:IRP_MJ_CREATE


    这是过滤驱动常见问题,修正 INF 并使用控制设备对象后,可以保留 pci.sys,安全访问 PCI 配置空间和 BAR。

    希望这能帮到你!


你的答案

提问者可以将答案标记为“已接受”,版主可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。