【发布时间】:2011-12-19 00:21:24
【问题描述】:
要安装驱动程序,您通常发送命令:
DefaultInstall 128 {inf 路径}
通过直接调用或 RunDLL 到 InstallHinfSection。
这非常有效。我可以在任何地方安装我的驱动程序(包括 64 位 Win 2008 R2,这意味着我也获得了所有代码签名)。
但是,当从 Windows 服务启动时,上述操作会失败。我已经阅读了有关服务与客户端安装的信息,并希望我已经满足了静默服务安装的所有要求(构建了一个 .CAT 文件,它与驱动程序一起签名等)。
但没有骰子 - 它只是失败了。比较交互式安装和从服务安装之间的 SetupAPI.log 中的错误没有显示任何差异(除了交互式执行复制驱动程序文件的步骤并成功,而其他则没有)。
驱动程序本身未使用(我的服务是唯一使用它的服务)。有什么方法可以让服务静默更新驱动程序而无需用户交互?
【问题讨论】:
-
我们从服务中做同样的事情,它工作正常;这是直接调用 API,而不是通过 rundll32。
-
真的吗?我尝试启动 rundll32 并以相同的结果调用 API。你在什么操作系统上运行?正在安装什么类型的驱动程序?
-
其实我们两种方法都用。在 32 位机器上,我们直接调用 API;在 64 位机器上,我们通过 rundll32 调用它(我们有一个 32 位安装程序)。这适用于 Vista 及更高版本上的文件系统微过滤器。
-
我的安装程序一切正常(当用户运行它时)。但如果正在运行的服务在后台静默启动安装程序以更新自身(即在不同的 WinStation 中作为非交互式服务运行),则不会。你这样做了,它有效吗?
-
我们的驱动程序是在作为 LocalSystem 运行的服务的上下文中按需安装的;它本身不是安装程序。也许这就是问题所在。我们有一个公开 Start() 函数的 DLL。该函数是从作为 LocalSystem 运行的服务调用的。如果驱动没有安装,Start() 函数将通过 InstallHinfSection() API 安装它。
标签: windows service windows-services installation driver