问题标签 [setupapi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1374 浏览

windows-xp - Windows XP 自定义 USB 类驱动程序,无需 WHQL 签名即可预安装?

我正在为 USB 设备开发 Windows 驱动程序,安装必须覆盖 Microsoft 的内置类驱动程序,以便设备使用我的驱动程序。

驱动程序是自签名的,但不是 WHQL 签名的。在 Vista 或 Win7 上安装不是问题,其中 SetupAPI 确认驱动程序已签名并选择它作为内置类驱动程序的首选驱动程序。

但是,这在 Windows XP SP3 上不起作用。SetupAPI 日志告诉我它找到了驱动程序,但认为它不受信任。(日志摘录:“驱动节点不受信任,等级从 0x00000001 更改为 0x0000c001”)

以前在 stackoverflow 和其他地方对类似问题的回答表明,WHQL 签名是在 XP 上工作的唯一方法。真的是这样吗,还是有任何已知的解决方法?

是否有人有任何资源链接,其中包含有关变通方法或问题解决方案的信息?

我感谢任何关于此事的帮助。

0 投票
1 回答
1800 浏览

winapi - 如何获取驱动程序安装日期?

如何使用 Setup API 获取驱动程序的安装日期?


(这与这个问题几乎相同,只是我正在寻找使用Setup API而非WMI 的解决方案。)

我需要的数据位于键中的值中,如下所示:

但是,Properties由于权限,密钥默认情况下是不可访问的,我确信有更好的方法可以使用类似的方法来执行此操作SetupDiGetDeviceRegistryProperty,但我不知道如何操作。设备管理器在详细信息选项卡中非常容易做到这一点(看起来就像获取一样容易CM_DRP_INSTALL_STATE),所以它必须很容易......

0 投票
1 回答
867 浏览

c# - 在 C# 中获取视频适配器的硬件 GUID

我正在为 Windows 上的 3D 游戏开发启动器应用程序。配置“ini”文件要求用户指定所需设备的硬件 GUID,如 dxdiag.exe 返回的设备标识符 GUID。

我正在尝试列出系统上可用的适配器,允许用户选择一个并将该设备的硬件 GUID 加载到 ini 文件中。

我已经研究了许多尝试这样做的方法。我尝试使用 System.Management 类,它返回类 GUID 但不返回特定的驱动程序 GUID。我尝试使用对 SetupAPI.h 函数的本机调用,这些函数似乎也无法列出特定的设备标识符 GUID。我试过检查注册表,看看 GUID 是否驻留在那里。没运气。

我最好的想法可能是使用托管 DirectX 库来返回我正在寻找的 GUID,考虑到 dxdiag 可能就是这样做的。我能够使用用于 .NET 应用程序的 SharpDX Managed DirectX 接口枚举和收集有关每个驱动程序的硬件信息(我的目标是框架 3.5),但同样,我无法返回 dxdiag 返回的相同 GUID。

我真的很难找到解决方案。帮助?

0 投票
1 回答
615 浏览

windows - 如何使用 WPD 和 Setup API 将数码相机与其他设备区分开来

我有两个任务:

a) 将数码相机与其他 MTP 设备区分开来,由 IPortableDeviceManager::GetDeviceList 获得;

b) 我想使用 Setup API 查找已连接的数码相机。我的想法是先获取所有 USB 设备:

但是在这样做之后,我已经没有想法了。具体来说,我不知道如何获取特定 USB 设备的 USB 接口描述符。我的意思是 USB 接口,而不是设置 API 中所谓的接口。

提前致谢。

0 投票
1 回答
1205 浏览

windows-7 - SetupDiGetClassDevs 在 XP 上导致错误,在 VS2010 中内置的应用程序,在 Win7 上

我正在编写一个 WPF 应用程序,它使用 PINVOKE 来调用我也在编写的 dll。在 dll 中的一个导出函数中,调用了 SetupDiGetClassDevs。此时,在XP上运行该应用程序时,我得到一个错误,首先是一个对话框说:

“无法在动态链接库 KERNAL32.dll 中找到程序入口点 RegOpenKeyExW。”

单击确定然后将我带到一个未处理的异常对话框。WPP应用程序和dll都是在Win7机器上用VS2010构建的,应用程序在Win7系统上运行良好。只有在 XP 上运行应用程序时才会出现此问题。如果我避免在 dll 中使用 SetupDiGetClassDevs(以及随后的 SetUpdi 函数调用),则不会出错;所以看起来 PINVOKE 机制工作正常。

任何想法出了什么问题?我对看到引用 RegOpenKeyExW 感到有些困惑,因为 dll 不是在启用 UNICODE 的情况下构建的。

谢谢汤姆

0 投票
1 回答
8652 浏览

windows-installer - 在 XP 上安装 WinUSB 驱动程序失败(在 Win7 上工作正常)

我在 Windows XP(x86,Service Pack 3)上安装 WinUSB 驱动程序时遇到了困难。我遵循 Microsoft WinUSB 指南,使用 inf 文件、签名的 cat 文件(使用 Inf2cat 制作)和相关的 WinUSB 安装程序来创建签名的驱动程序包。在 Windows7 上一切正常,但在 XP 上安装失败。

inf文件如下:

XP 中的 setupapi 登录失败如下所示:

我正在努力找出 XP 出了什么问题。错误

“扫描文件队列时无法验证目录”和“未签名或未正确签名的文件”

对我来说毫无意义,因为驱动程序包已正确签名,并且可以在 Win7 上正确安装而没有警告。非常欢迎任何帮助

谢谢汤姆

0 投票
1 回答
3533 浏览

c# - 以编程方式为特定设备安装特定驱动程序(以及预安装失败时)

我有一个签名的驱动程序,我需要使用 C#(针对 Vista 和 7 64 位)以编程方式为特定的 USB 设备安装它。

我发现在 DIFx API中使用DriverPackagePreinstall函数非常容易(这里是如何 P/Invoke 它):通过在设备插入 USB 之前调用它,Windows 能够将驱动程序与设备相关联。检测到。

当设备在未预安装驱动程序的情况下插入 USB 时会出现问题。可能会为该设备安装另一个驱动程序(在一台测试 PC 中,我发现已安装通用驱动程序,并且该设备列在设备管理器的“其他设备”下)。

为了解决这个问题,到目前为止,我已经能够通过使用SetupDiGetClassDevsSetupDiEnumDeviceInfoSetupDiGetDeviceRegistryProperty函数来检测设备是否存在,以便通过设备的 VID 和 PID(供应商和产品标识符)来识别设备。现在我有了设备的SP_DEVINFO_DATA,我想我必须调用InstallSelectedDriver函数,不是吗?如果是,您能否告诉我如何 P/Invoke 该功能(我在 pinvoke.net 上找不到它)以及如何通过指定我要为我的设备安装的驱动程序来使用它(假设我有 INF 路径) ?

0 投票
1 回答
2633 浏览

winapi - 在 64 位机器上为 32 位编译时,SetupDiCallClassInstaller 抛出 ERROR_IN_WOW64。

为 32 位编译时在 64 位计算机上调用 SetupDiCallClassInstaller 返回 false。

所有其他函数调用在 32 位下都可以正常工作,只是这个给我带来了问题。

我想知道是否有人知道我在这里做错了什么。

0 投票
2 回答
3065 浏览

winapi - 为什么 SetupDiCallClassInstaller 函数仅限于 64 位程序?

尝试从以 32 位模式编译的程序调用 SetupDiCallClassInstaller 在 64 位 Windows 上失败。

显然这是设计使然,但我想知道原因。

0 投票
1 回答
460 浏览

c++ - 从 setup api 获取 SATA HBA 列表

我不确定我错过了什么,但现在是时候向比我更有知识的人提问了。我正在使用我在这里找到的 HDC GUID 。我试图在我的 C++ 代码中打开它:

这个调用通过并且 hDevices 持有一个有效的引用。但是,当我调用 SetupDiEnumDeviceInterfaces() 时,它不会迭代:

SetupDiEnumDeviceInterfaces() 将系统错误代码设置为 249,即“没有更多项目”,但没有进行任何迭代。显然,句柄指向一个空列表。我在调用 SetupDiGetClassDevs() 时遇到了什么问题?我认为可能是 GUID 不是“接口”GUID(即名称中没有“接口”一词)。所以,我尝试使用 DIGCF_DEVICEINTERFACE 取消按位或,但这没有帮助。

我对如何使用这个 API 的了解非常有限,我现在除了旋转我的轮子什么都不做。

谢谢你的帮助。