Windows driver 有或没有 INF 文件

Windows driver with or without INF file

我见过两种安装方式 Windows drivers.
一种。同时使用 SYS 文件和 INF 文件。 (例如 NDIS driver)
b.仅使用 SYS 文件,driver 将由服务加载。 (例如 drivers 在 C:\Windows\System32\drivers)

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

Windows 上有不同类型的驱动程序。每种类型的驱动程序都有自己的驱动程序安装方式。下面介绍几种常见的驱动类型。

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

SCM 管理的驱动程序(有时称为 "legacy driver")。 SCM 根据它用于启动 NT 服务的相同规则加载这些驱动程序。 SCM 不需要任何 INF。您可以通过 运行 sc.exe create my_cool_driver type=kernel binPath=c:\my\driver.sys start=auto 或调用 CreateService API 向 SCM 注册新驱动程序。但是,如果由于其他原因你已经有了一个 INF,你 可以 使用任何风格的 INF 通过 AddService 指令来做同样的事情。

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

导出驱动程序。当 Mm 试图加载一些从它导入函数的其他驱动程序时,内存管理器会加载一个导出驱动程序。导出驱动程序只是一个 DLL 的内核等价物——它只是向其他驱动程序提供 APIs。导出驱动程序不需要 INF;它们只需要放在磁盘上的正确目录中。如果由于其他原因你已经有了一个 INF,你 可以 使用 CopyFiles 指令来做到这一点。

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

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