2

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

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

4

1 回答 1

7

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您可以通过简单地运行或调用CreateServiceAPI向 SCM 注册新驱动程序。但是,如果您出于其他原因已经拥有 INF,则可以使用任何样式的 INF 通过AddService指令执行相同的操作。

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。

于 2020-04-10T14:02:06.163 回答