【问题标题】:How to distribute a windows kmdf driver to clients privately如何私下向客户端分发 Windows kmdf 驱动程序
【发布时间】:2018-12-01 23:14:19
【问题描述】:

我对 Windows 驱动程序开发非常陌生。 我已经编写了一个 KMDF Windows 驱动程序,并且能够使用 VS deploy 测试将它部署到我的目标机器上。它运行良好,现在我想将此驱动程序与使用此驱动程序的应用程序一起提供。

问题来了……我在 Google 上找不到任何东西告诉我们如何分发 KMDF 驱动程序(比如制作安装程序)。此驱动程序是上层过滤器驱动程序,仅我的应用程序需要它,因此不应将其发布到 Windows 更新。

我的问题是如何制作安装程序来分发此驱动程序?感谢您的任何建议或教程。


编辑 1 这是一个假的设备驱动程序(意味着没有物理设备可以驱动)

【问题讨论】:

    标签: windows driver kmdf


    【解决方案1】:

    通常,软件的设备驱动程序不会通过 Windows 更新推出。英特尔、AMD、NVIDIA 等供应商有例外,但那是因为这些公司是什么以及它们的受欢迎程度/使用率如何(他们将为此与微软合作)。您不能只通过 Windows 更新推出驱动程序。

    您将需要一个数字签名来签署您的内核模式软件,只要您要将其分发到使用现代版本的 Windows x64 的机器上(为了记录,即使是 Windows Vista x64 也会强制执行这个要求)。这个要求目前不会出现在 x86 版本的 Windows 上,但事实上,无论如何不签署您的内核模式软件是不道德的。

    从 Windows 10 上的一个特定补丁开始,该补丁很早就发布了,要求从具有可用于签署内核模式二进制文件的普通数字签名变为必须是 EV 数字签名;要获得用于内核模式软件签名的 EV 数字签名,您无疑需要合法注册为公司(并且可能还需要公司银行帐户)。

    有关此的更多信息,请参阅以下内容。

    https://blogs.msdn.microsoft.com/windows_hardware_certification/2015/04/01/driver-signing-changes-in-windows-10/

    这是一个转折点...对于使用安全启动的系统(新的现代系统现在往往默认启用它,这是一项安全功能),您需要让您的内核模式软件共同签名由微软自己。这将要求您通过在线门户上传您的内核模式软件与 Microsoft 共享,但您仍需要您的 EV 数字签名才能进入该阶段。

    有关 Microsoft 共同签名要求的更多信息(取决于环境),请参阅以下内容:

    https://www.osr.com/blog/2017/07/06/attestation-signing-mystery/

    注意:请不要试图想出办法来规避这一点(例如,在客户端系统上启用测试模式,然后为您的驱动程序使用测试证书,或者在依赖它的系统上禁用安全启动......此类变通办法会以降低系统安全性的巨大代价为代价,并且永远不应该在现实世界中用作解决此问题的方法。


    为了实际安装设备驱动程序,您可以通过编程方式将 .INF 文件与 Win32 API 一起使用,然后使用 StartService 例程通过 .INF 启动服务安装后。另见:https://msdn.microsoft.com/en-us/library/aa376957%28v=vs.85%29.aspx

    或者,您可以使用CreateService 例程自己注册服务,然后使用StartService 例程启动它(或重新启动并根据服务创建的标志在启动时加载它)。

    请记住,有时使用服务管理器,您会错过注册某些驱动程序类型(例如文件系统微过滤器)的重要内容,您需要手动处理,否则将无法正常工作。检查 .INF 并确保在使用 Service Manager 进行安装时需要完成的所有操作(如果您决定不依赖 .INF)。


    希望这可以帮助您到达需要的地方。

    【讨论】:

    • 看来安装驱动已经不是我/我们的选择了……我也听说内核驱动可以在使用时动态加载,使用后卸载,是这样吗?而且does也受上述限制?
    • 您可以动态加载和卸载设备驱动程序,这是正确的,但它不会更改 64 位版本 Windows 上的代码签名要求。但是,对于某些类型的设备驱动程序(例如 Filesystem Minifilter 就是一个例子),用于安装时的 .INF 文件将执行服务管理器默认不会为您执行的操作,因此您仍然必须进行 -如果您没有以编程方式使用 .INF 文件并且您的设备驱动程序适合该类别,则可以解决此问题。
    • 但是,如果您确实有一个加载的驱动程序(如果它是正式“安装”并在启动时自动加载或通过其他方式自动加载,它也可以工作),您可以停止服务您通过 ControlService 注册了设备驱动程序。不过,您的驱动程序中需要有一个 DriverUnload 例程,否则它将无法工作。或者,您可以使用 NtUnloadDriver,但不建议这样做,因为它没有记录(并且不会改变您仍然需要在驱动程序中注册的 DriverUnload 例程才能工作的事实)。
    • 通过“DriverUnload”,我的意思是您需要将它注册到您从 DriverEntry 例程中获得的指针所指向的 _DRIVER_OBJECT 中。但是,有时对于像 Filesystem Minifilter 这样的类型,您将有不同的注册方式......例如通过回调的注册信息。您必须检查您的驱动程序类型的文档。
    • 非常感谢您的详细解释,请给我一些时间阅读和理解!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多