如何手动部署驱动程序服务?

Ian*_*oyd 10 windows wdm

如何手动部署或注册Windows筛选器驱动程序?

警告:未来有很多"研究证据".如果你不想,你不必再阅读了.我只是详细地指出,我已经尝试了你应该做的事情,我已经尝试了MSDN所说的,并且我已经尝试过互联网上任何地方的任何人都曾提出过的建议.

tl;博士:预期的方式是什么?

背景

我正在测试将Visual Studio 2013中开发的64位驱动程序部署到64位Windows机器上.我想在Windows上注册驱动程序服务,然后启动它.

你试过什么

  • Visual Studio 2013驱动程序部署功能

    理想情况下,您将使用Visual Studio的功能自动部署到远程计算机.不幸的是它只是不起作用("发生了扩展错误")

  • 使用"添加新硬件向导"

    理想情况下,您将使用Windows 添加新硬件向导(请参阅MSDN页面使用添加硬件向导安装驱动程序包.幸运的是,从Windows 7开始,Microsoft从控制面板中删除了添加新硬件向导;要求您手动运行Hdwwiz.exe从提升的命令提示符.不幸的是你不能使用添加新硬件向导添加安装驱动程序包,因为添加新硬件向导只适用于硬件(即它不适用于筛选器驱动程序):

    在此输入图像描述

    向导知道这一点,所以不提供让你安装任何驱动程序服务.

  • SC命令行实用程序

    理想情况下,您可以sc.exe使用提升的命令提示符,使用Service Control Manager手动注册驱动程序服务:

    >sc create MyDriver binPath="C:\Drop\Driver\MyDriver.sys" type=kernel
    >[SC] CreateService SUCCESS
    
    Run Code Online (Sandbox Code Playgroud)

    不幸的是,即使驱动程序文件上有有效的数字签名:

    在此输入图像描述

    Windows将拒绝安装驱动程序:

    在此输入图像描述

  • OSR的驱动程序加载程序实用程序

    理想情况下,人们会使用OSR的Driver Loader实用程序.但即使使用有效数字签名的驱动程序文件,驱动程序也不会安装:

    在此输入图像描述

  • .INF设置文件

    理想情况下,您将部署驱动程序包并通过安装来安装它.inf.然后我可以右键单击INF,选择Install.但它只是不起作用 - 它没有注册任何新的驱动程序服务.

  • 使用DefaultInstall部分进行.INF设置

    理想情况下,您只需使用DefaultInstall部分的.INF文件.Windows只会执行DefaultInstall部分.不幸的是,MSDN警告您不允许将其用于驱动程序:

    注意驱动程序包 的INF文件不能包含INF DefaultInstall部分

    你不能这样做的原因是因为DefaultInstall没有AddService指令.即使我们忽略了警告并尝试无论如何它只是不起作用 - 它不会注册任何新的驱动程序服务.

  • .INF使用DefaultInstall.Services部分进行设置

    虽然MSDN警告您不要使用DefaultInstall来注册驱动程序服务,但我们可以忽略它们并使用该[DefaultInstall.Services]部分.幸运的是,它实际上尝试安装驱动程序服务:

    在此输入图像描述

    但Windows然后声称驱动程序是未签名的:

    在此输入图像描述

    没有实际注册的驱动程序服务.

  • SetupAPI InstallHinfSection函数

    理想情况下,我可以使用SetupAPI运行与上面相同的命令行:

    >RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 C:\Drop\Driver\ipfw.inf
    
    Run Code Online (Sandbox Code Playgroud)

    除了驱动程序没有安装.函数返回成功; 但是Windows认为驱动程序是未签名的:

    在此输入图像描述

  • 使用BCDEDIT启用TESTSIGNING

    理想情况下,我会按照TESTSIGNING引导配置选项中的说明进行操作,该选项表示从提升的命令提示符运行:

    >Bcdedit.exe -set TESTSIGNING ON
    
    Run Code Online (Sandbox Code Playgroud)

    除非失败并出现错误:

    >Bcdedit.exe -set TESTSIGNING ON
    An error has occurred setting the element data.
    The value is protected by Secure Boot policy and cannot be modified or deleted.
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用BCDEDIT打开DEBUG

    理想情况下,我会按照在开发和测试期间安装未签名驱动程序的说明进行操作,该说明从提升的命令提示符开始运行:

    >bcdedit -debug on
    
    Run Code Online (Sandbox Code Playgroud)

    除非失败并出现错误:

    >bcdedit -debug on
    An error occurred while attempting to modify the debugger settings.
    The value is protected by Secure Boot policy and cannot be modified or deleted.
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用高级恢复选项禁用驱动程序签名实施

    理想情况下,我会使用高级恢复选项来禁用驱动程序签名实施:

    在此输入图像描述

    除了Windows启动后,仍然启用了驱动程序签名:

    在此输入图像描述

  • 在BIOS中禁用SecureBoot

    理想情况下,在这个虚拟的Hyper-V计算机中,我会在其虚拟BIOS中禁用SecureBoot:

    在此输入图像描述

    然后尝试禁用驱动程序签名策略.

哦,我的上帝在这三天.我希望微软的人解释一下:

  • 不仅是在开发过程中测试驱动程序的正确方法
  • 但要详细解释为什么上述每一次尝试都失败了

什么是正确的方法

安装过滤器驱动程序服务的正确方法是什么,而不是我尝试随机的东西,一遍又一遍(以及一遍又一遍).

奖金问题

为什么微软拒绝让开发人员的生活更轻松?

奖金Chatter

驱动程序文件使用有效的可信证书进行签名.

在此输入图像描述

签署.sys驱动程序文件的证书也位于本地计算机 受信任的根证书存储中:

在此输入图像描述

这就是驱动程序文件的签名有效且可信的原因.

对MSDN随机页面的一次性评论说,必须将测试证书添加到本地计算机存储中的两个位置:

必须添加用于在驱动程序文件中嵌入签名并对驱动程序包的目录文件进行签名的测试证书

这解释了为什么我将证书添加到另一个商店:

在此输入图像描述

Windows 10技术预览版,64位

奖金阅读

kel*_*ogs 0

如果您仍然不能并且没有证书问题,我已经这样做了:

devcon install irpsender\irpsender.inf Root\irpsender

其中 Root\irpsender 来自 .inf 文件:

[Standard.NT$ARCH$]
%irpsender.DeviceDesc%=irpsender_Device, Root\irpsender ; TODO: edit hw-id
Run Code Online (Sandbox Code Playgroud)

我的方法虽然在一些较旧的 Win10 中成功,但在 Win8.1 上不起作用 - 我已经创建了一个像上面这样的服务并启动了它;DriverEntry确实被叫了,没有别的。还得到了

c:\DriverTest\Drivers>sc stop irpsender
[SC] ControlService FAILED 1052:

The requested control is not valid for this service.
Run Code Online (Sandbox Code Playgroud)

可能是因为没有指定硬件 ID。

华泰