问题标签 [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 投票
0 回答
293 浏览

c++ - 使用 SP_DEVICE_INTERFACE_DETAIL_DATA 的 mem alloc 进行调试断言

当我的测试程序退出时,我正在努力处理一些调试断言。目的是通过使用 Setup API 获取磁盘驱动器的设备路径。这是我正在做的。我遵循此处为 SetupDiGetDeviceInterfaceDetail描述的规则,即调用 SetupDiGetDeviceInterfaceDetail() 以确定结构所需的大小,并为结构分配内存并再次调用 SetupDiGetDeviceInterfaceDetail()。

这个过程有效,我得到了我需要的数据。不能正常工作的是,当程序退出时,或者我直接删除内存时,我得到了一个调试断言。断言窗口在第 52 行包含发现问题的文件 dbgdel.cpp。问题:“表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”。

我不确定问题是什么。如果我删除我正在使用的所有代码并新建一个 SP_DEVICE_INTERFACE_DETAIL_DATA 对象,而没有所有 Setup API 调用,则删除调用有效。基本上,这就是我正在做的事情:

当程序退出或调用 delete[] 时,前面提到的断言就会出现。请向我解释我做错了什么。

谢谢,安迪

更新:忘记添加 SP_DEVICE_INTERFACE_DETAIL_DATA 的定义。可以在这里找到。但是,它看起来像这样:

0 投票
1 回答
1123 浏览

windows - SetupUninstallOEMInf 何时返回 ERROR_NO_MORE_ITEMS?

SetupUninstallOEMInfSetupAPI的函数在什么情况下设置ERROR_NO_MORE_ITEMS错误码?

MSDN 文档没有详细说明这一点。

0 投票
1 回答
288 浏览

c# - 代码访问安全正在阻止 PInvoking Setup API 调用

我正在重新措辞这个问题,因为我现在了解更多了。本来,我所拥有的太模糊了。我发现我正在被称为“代码访问安全”的东西路由。这对每个阅读本文的人来说都是老生常谈,我敢肯定,但对我来说不是。

该应用程序非常大,所以简而言之,我有两个程序集。一个是在整个程序中使用各种“工具”的实用程序程序集。另一个是调用这些工具以发挥作用。

在实用程序程序集中,有许多 PInvoked 函数,但让我感到悲伤的是:SetupDiGetDeviceInterfaceDetail()(请参见此处)。我的函数原型如下所示:

在使用此功能的程序集中,我使用备注中概述的两步过程,以了解我需要多少空间来存储 SP_DEVICE_INTERFACE_DETAIL_DATA 结构中的 DevicePath(请参见此处)。例如:

最令人沮丧的是,这些程序集被两个不同的程序使用。一种是使用 Visual Studio 隔离 Shell 的 GUI。另一个只是一个命令行程序。当 GUI 运行时,上面的代码被调用并按预期执行。然而,在命令行工具中,它们会失败(如此 Setup API 函数的 MSDN 参考中所述),并提供一些有关发生情况的数据。此时,我只能恢复返回的部分数据。这是从运行时返回的:“stem.Security.PartialTrustVisibilityLevel, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”。

我知道这与代码访问安全性有关,但我完全不确定如何解决。使用到目前为止我发现的一些建议,我尝试了程序集的这个属性(我把它放在代码的命名空间块之前):[程序集:AllowPartiallyTrustedCallers]

但这导致了其他编译​​问题。

拜托,任何事情都会最有帮助和非常感激。

安迪

0 投票
1 回答
3691 浏览

c# - 在 32 位和 64 位运行时编组动态结构

我在这里调用 SetupDiGetDeviceInterfaceDetail()并且 SP_DEVICE_INTERFACE_DETAIL_DATA 结构没有正确编组。结构定义可以在这里找到。我尝试使用来自 PInvoke.net 的此结构的定义,here,但无济于事。

至此,当函数调用成功时(即封送器没有抛出错误),返回值为1784(INVALID_USER_BUFFER)。更重要的是,当这段代码从我的机器上的 32 位进程执行时,所有这些都可以正常工作。当它在 64 位进程中运行时,我遇到了这个问题。

我当前的 SetupDiGetInterfaceDetailData() 签名如下所示:

目前,我正在使用 Marshal.AllocHGlobal() 分配内存,并使用 Marshal.* 系列函数从该缓冲区写入/读取数据。

作为参考,这就是我正在做的事情:

正如我所提到的,我已经尝试为 SP_DEVICE_INTERFACE_DETAIL_DATA 定义 PInvoke.net 概述的结构(参见上面的链接),并创建了一个新的 PInvoke 方法签名来处理它。从 64 位系统运行时,我遇到了同样的问题,即函数返回 1784。原因似乎是 C# 中的引用在 64 位运行时运行时是 8 字节对齐的(发现在另一个StackOverflow 文章)。我已经尝试了对该结构的各种布局,试图将布局(使用显式和字段偏移)强制为 4 字节对齐的结构,但这对我也不起作用。我有编译时问题。

我尝试对 PInvoke 方法签名参数使用各种装饰。例如,我不断不正确配对的 MarshalAs(UnmanagedType.LPStruct)。我现在到了需要帮助的地步。

我真的不明白为什么会这样。即使在 32 位运行时运行时它确实在我的机器上工作,64 位运行时不会简单地将我连接到正确的 64 位版本的 Setup API 吗?有什么问题?

感谢您的帮助,安迪

问题解决了

好消息是,现在已经解决了,烦人的是我不喜欢在发帖后的一两个小时内解决问题。所以,问题确实是它是一个 64 位的问题。Marshal.GetLastWin32Error() 的错误代码告诉我问题所在。cbSize 值不正确。我将其更改为 8,现在一切正常。

请有人向我解释为什么现在 64 位上的大小是 8?该结构现在在上面(一位评论者要求我将其包括在内)。该结构由两个成员组成,一个 DWORD 和一个 TCHAR[ANYSIZE_ARRAY]。ANYSIZE_ARRAY 的计算结果为 1,如果 Unicode,则 TCHAR 始终为 WCHAR,否则为 char。DWORD 始终是 32 位数量(4 个字节),而 Unicode 的单个 TCHAR 是 2 个字节。所以,4 + 2 = 6。为什么是 8?这是因为 64 位结构的字节对齐吗?我真的很想明白这一点。

无论如何,将 cbSize 成员设置为 8(对于 64 位)和 6(对于 32 位)是可行的,并且我能够使用上面定义的结构而不是原始内存分配/解除分配和封送处理。

0 投票
1 回答
1896 浏览

setupapi - 是否可以使用 setup api 来判断设备是否已启用

我知道如何使用 Setup API 来启用和禁用设备。我需要知道的是,我可以使用相同的 API 来确定设备是否启用/禁用?我认为真正的问题是如何使用它,因为 Microsoft 的 devcon 使用 Setup API 来操作硬件,并且该程序会告诉您设备是启用还是禁用(设备管理器也是如此)。这是怎么做到的?到目前为止,我对 Setup API 方法的研究并没有给出明确的答案。

安迪

0 投票
1 回答
1033 浏览

windows - 正确的 Windows API 以查找 CurrentControlSet\Control\MediaProperties?

我希望支持自定义操纵杆设备,但由于项目要求,我不能再使用 DirectInput API。我已经转而使用“经典”的 Windows 多媒体 API(例如joyGetDevCaps和 family),并且除了一个例外,它都能正常工作。

DirectInput DeviceInstance 有两个字段,InstanceNameProductName,它们返回正确的“自定义”设备名称。

对应的joyGetDevCaps产品名称字段 szPname 返回一个通用的“Microsoft PC 游戏杆驱动程序”。

在安装了设备的系统上搜索注册表时,我发现此节点中有一个 REG_SZ OEMName条目,其中包含我想要的字符串:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEM\VID_07C0&PID_1128

JOYCAPS 中返回两个字段,wMid(制造商 ID)和 wPid(产品 ID),它们映射到键名中的两个十六进制值:wMid = 0x07c0,wPid = 0x1128。

此外,我可以在 GUID_DEVINTERFACE_HID 上使用 SetupDiEnumDeviceInfo API 并找到匹配的控制器(尽管此步骤可能不是必需的):

HID\VID_07C0&PID_1128&REV_1032,HID兼容游戏控制器

问题:是否有用于枚举我应该使用的 MediaProperties\PrivateProperties 的 API,或者使用此信息并直接查询注册表是否“安全”?如果有 API,请用参考和/或示例代码回答!我找不到任何相关的东西。

0 投票
2 回答
3631 浏览

c++ - HID 设备编程 - 它是否适用于 C++(SETUPAPI.dll 和 HID.dll)

我在问@Stackoverflow 时有点新意,但是在我大多数科目的最终项目的这些日子里,它是我作为圣经(除了 Ritchie 的 C 书)最接近的东西。无论如何,我的问题是关于与 HID 设备通信的应用程序所需的库以及使用 C++ 进行通信的可能性。

我不需要固件方面的帮助,我的设备已经按照我期望的方式工作。然而,我对 HID 设备编程的唯一经验是使用C(Windows - VS2010),现在我正处于编译器类的最终项目中,我们将信息发送到带有矩阵屏幕的设备以显示“东西”。然而,我的搭档需要在C++中做一些事情,这可以为我们节省大量时间(考虑到它在两天内到期,这很好)。

这样做的全部意义在于询问它是否可以像我在C中已经拥有的方式(具有明显的调整)和C++中的某些部分代码一样完成,并且仍然与 SetupApi.DLL 和 HID.DLL 兼容

任何形式的建议、指示或指示都深表感谢。我包括到目前为止我使用的代码。

请原谅我可能有西班牙语和混乱的所有评论

0 投票
1 回答
517 浏览

c++ - SetupVerifyInfFile 为 windows xp 返回 ERROR_INVALID_PARAMETER (0x57)

此代码在 Vista/Win7 上成功运行,但在 win xp 上失败(返回 ERROR_INVALID_PARAMETER)。互联网上没有关于这个问题的文档。有人知道错误在哪里吗?谢谢。

0 投票
1 回答
658 浏览

wix - WIX 安装程序,根据平台包含不同的合并模块

我正在用 WIX 安装程序编写一个应用程序。该应用程序需要一个驱动程序(我也编写了该驱动程序),它是通过主 WIX 安装程序项目中包含的合并模块安装的。

不同的平台需要不同的驱动程序变体,据我所知,它们需要不同的安装程序包,因为我不能在同一个安装程序中包含 diffxapp_x64 和 diffxapp_x86。

所以,我有一个主安装程序和三个合并模块(用于 x86、x64 和 ia64)。我可以使用目标平台设置有条件地在主安装程序项目中包含正确的合并模块变体,吐出三个包吗?

谢谢

汤姆

0 投票
1 回答
695 浏览

c++ - DiInstallDevice x86 的链接器错误

我正在使用 DiInstallDevice 功能 ( MSDN ) 来安装驱动程序。但是,在 x86 下构建解决方案时出现链接器错误,而 x64 版本是可以的。错误是 LNK2019,链接无法在 x86 版本的 newdev.lib 中找到函数。这是 x86 和 x64 版本的链接器输出:

x86:

搜索 C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\newdev.lib:
找到 _UpdateDriverForPlugAndPlayDevicesW@20
在 KernelDriverInstaller.obj 中引用
加载 newdev.lib(newdev.dll)
找到 __IMPORT_DESCRIPTOR_newdev
在 newdev.lib(newdev. dll)
加载 newdev.lib(newdev.dll)
发现 newdev_NULL_THUNK_DATA
引用在 newdev.lib(newdev.dll)
加载 newdev.lib(newdev.dll)

x64:

搜索 C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64\newdev.lib:
找到在 KernelDriverInstaller.obj
中引用的 DiInstallDevice
已加载 newdev.lib(newdev.dll)
找到在 KernelDriverInstaller.obj
中引用的 UpdateDriverForPlugAndPlayDevicesW
已加载 newdev。 lib(newdev.dll)
发现 __IMPORT_DESCRIPTOR_newdev
在 newdev.lib(newdev.dll)
中引用 在 newdev.lib (newdev.dll) 中引用
已加载 newdev.lib(newdev.dll) 在newdev.lib(newdev.dll) 中引用已
找到 newdev_NULL_THUNK_DATA newdev.lib(newdev.dll)

如您所见,链接器无法找到 x86 库的函数引用。有人知道这个问题以及如何解决它吗?我正在使用 Win7 x64 + VS2008 SP1。

谢谢