【问题标题】:Windows driver with or without INF file带有或不带有 INF 文件的 Windows 驱动程序
【发布时间】:2020-07-21 23:49:53
【问题描述】:

我见过两种安装 Windows 驱动程序的方法。
一种。同时使用 SYS 文件和 INF 文件。 (如 NDIS 驱动程序)
湾。仅使用 SYS 文件,驱动程序将由服务加载。 (如司机在 C:\Windows\System32\drivers)

所以,我的问题是:
1. 什么样的驱动或情况需要INF文件?
2. 造成这种差异的根本原因是什么?

【问题讨论】:

    标签: windows driver wdk kmdf wdf


    【解决方案1】:

    Windows 上有不同种类的驱动程序。对于驱动程序的安装方式,每种类型的驱动程序都有自己的故事。以下是几种常见的驱动程序类型。

    PNP 设备驱动程序。 PNP 设备驱动程序操作设备树中的设备。当设备被其父总线枚举时,PNP 驱动程序由 PNP 加载。为了让 PNP 知道您的驱动程序支持哪种类型的设备(以及一堆其他东西),您需要一个 PNP 样式的 INF 来描述您的驱动程序。

    SCM 管理的驱动程序(有时称为“旧版驱动程序”)。 SCM 根据用于启动 NT 服务的相同规则加载这些驱动程序。 SCM 不需要任何 INF。您只需运行sc.exe create my_cool_driver type=kernel binPath=c:\my\driver.sys start=auto 或调用CreateService API 即可向SCM 注册新驱动程序。但是,如果您出于其他原因已经拥有 INF,您可以通过 AddService 指令使用任何样式的 INF 来执行相同的操作。

    NDIS 轻量级过滤器 (LWF) 驱动程序。 NDIS 不加载 LWF; NDIS 不在乎它们是如何加载的。大多数 LWF 选择由 SCM 加载,因为这很容易控制。不过,仍然需要 NetCfg 样式的 INF,因为 NDIS 需要知道将过滤器附加到哪种类型的网络适配器(例如以太网与 WLAN)。

    导出驱动程序。当 Mm 试图加载一些从它导入函数的其他驱动程序时,内存管理器会加载一个导出驱动程序。导出驱动程序只是 DLL 的内核等价物——它只是为其他驱动程序提供 API。导出驱动程序不需要 INF;它们只需要放入磁盘上的正确目录即可。如果您出于其他原因已经拥有 INF,您可以使用CopyFiles 指令来执行此操作。

    WinUSB 驱动程序。 WinUSB 是一个内置驱动程序,它将管理 USB 设备的大部分职责委托给用户模式 ​​API,因此任何应用程序都可以轻松地使用设备执行简单的操作。这意味着几乎任何应用程序都可以成为设备的驱动程序。如果 USB 设备将某些数据放入其硬件描述符中,Windows 将知道自动设置 WinUSB,因此不需要 INF。但是,如果硬件没有宣传它需要 WinUSB,那么您将需要一个 WinUSB 样式的 INF 来告诉 Windows 为您设置 WinUSB。除此之外,您无需 INF 即可从您的应用程序调用 WinUSB API。

    如果您只是在试验并想调用一些内核 API 来获得乐趣,您可以选择任何类型的驱动程序。大多数人发现 SCM 管理的驱动程序是最简单的,因为您不需要任何 INF,并且您可以完全控制驱动程序的启动和停止时间。但在任何其他情况下,驱动程序类型的选择很大程度上取决于您要解决的问题。例如,如果您正在为 PCI GPU 编写驱动程序,则必须使用 PNP 驱动程序,因此必须具有 PCI 样式的 INF。

    【讨论】:

    • 绝妙的答案!非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多