标签: setupapi

SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

根据MSDN文档,可以传递SetupDiGetClassDevs 设备实例ID以获取特定设备的设备信息集:

要仅返回特定设备,请设置DIFCF_DEVICEINTERFACE标志并使用Enumerator参数提供设备的设备实例ID.

我通过解析WM_DEVICECHANGE消息DBT_DEVICEARRIVAL事件中的符号名称来获取设备实例ID ,并且通过将结果ID与从SetupDiGetDeviceInstanceId返回的ID进行比较来验证结果ID .即使传递操作系统提供的设备实例ID也不起作用(即SetupDiGetClassDevs调用失败ERROR_INVALID_PARAMETER).

我当前SP_DEVINFO_DATA为新到设备获取结构的解决方法是枚举同一类中的所有设备,并将SetupDiGetDeviceInstanceId的结果与符号名称进行比较.但是,根据文件,我不明白为什么这是必要的......

有没有人让SetupDiGetClassDevs以这种方式工作?有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?

windows winapi device hardware-interface setupapi

8
推荐指数
1
解决办法
6988
查看次数

dpinst/DifX不会以静默方式安装已签名的驱动程序

在Windows 7上通过DpInst安装已签名的驱动程序(即使用正确签名的.CAB)时,除非它是WHQL签名的驱动程序,否则无法以静默方式安装它.如果您以非静默模式运行DpInst,它将提示您信任"发布者".如果您以静默模式运行DpInst,它将失败并显示与签名相关的错误代码(类似于0x800b0109 - 请检查您的setupapi.app.log).

device-driver digital-signature setupapi windows-7 driver-signing

6
推荐指数
2
解决办法
8436
查看次数

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

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

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

64-bit winapi 32-bit setupapi

6
推荐指数
1
解决办法
2460
查看次数

如何知道设备是否已被用户明确禁用?

使用设备管理器,用户可以明确启用/禁用设备,如下图所示.

在此输入图像描述

对于给定的设备,我想知道它是否当前处于用户禁用/启用状态.

我尝试了以下方法

  1. CM_Get_DevNode_Status(&status, &problem, data.DevInst, 0);我希望存在DN_STARTED,或者DN_DRIVER_LOADED会告诉我.但是,当设备连接/断开连接时,即使操作系统正在加载/卸载驱动程序,这些也可能为零.例如,已启用并为其加载驱动程序的设备.DN_STARTED将是1,但当我们断开设备时,它将设置为零,然后从设备管理器中删除设备的条目.
  2. SetupDiGetDeviceRegistryProperty(..., SPDRP_INSTALL_STATE, ...)我的状态CM_INSTALL_STATE_INSTALLED应该意味着设备已启用.但即使对于禁用的设备,该函数也会返回此状态.
  3. 使用WMI我能够获得所需的信息,但我在PowerShell中使用了wmi.我不想使用wmi,因为在本机c ++中实现起来非常困难.我使用了以下查询.

    Select Name, Availability, ConfigManagerErrorCode, ConfigManagerUserConfig from Win32_PnPEntity where Name = 'NVIDIA Quadro M1000M'

上述查询中的ConfigManagerErrorCode,如果设置为22,表示设备已被禁用,21表示Windows正在删除设备

我正在寻找一个非wmi解决方案.

c++ wmi device-driver device-manager setupapi

5
推荐指数
1
解决办法
650
查看次数

如何在给定设备路径的情况下获取 USB_DEVICE_DESCRIPTOR

我已经能够使用 SetupAPI 枚举 USB 设备,并且我已经查看了 WDK 中的 usbview 应用程序,但我仍然不知道如何获取USB_DEVICE_DESCRIPTOR

  • 我宁愿避免使用 WMI。
  • DeviceIoControl是示例应用程序 usbview 使用的内容,但这实际上仅在您枚举集线器上的设备时才有效。我想如果我可以在给定设备路径(或 Id)的情况下到达父集线器(和端口),则此方法可能有效,但我也无法确定如何执行此操作。
  • 我有多种设备,我想获取其描述符。其中一些是 HID,有些可能是 WinUsb.sys 设备。如果它们是 WinUsb 设备,我可以使用WinUsb_GetDescriptor,但这不适用于 HID(我猜我不知道如何从 Id 或 Path...Interface 类中区分它们之间的区别?)。
  • 我可以使用SetupDiGetDeviceRegistryProperty,但在可用属性列表中,我可以看到制造商字符串,但看不到供应商 ID。
  • 我可以从设备路径或设备 ID 中解析这个值,但这似乎有点……黑客风格。这就是人们所做的吗?此外,如果我想要制造商等其他字段,它仍然让我采用其他方法,如果我可以获得整个 USB_DEVICE_DESCRIPTOR,我想我就可以获得我需要的一切。
  • LibUsb.Net 显然仅支持 WinUsb 设备。这似乎就是获取描述符的方式。
  • 显然,WinRT 有一些新的 API,因此 Windows 应用商店应用程序有一种获取描述符的好方法。但这绝对不是 Windows 应用商店应用程序,而且我不知道还有其他方法可以使用较新的 API。

有人能指出我正确的方向吗?如果不从 Hub 启动,是否就无法以良好的方式从 WinAPI 获取此信息?

c# windows usb winapi setupapi

5
推荐指数
1
解决办法
6475
查看次数

SetupAPI(setupdi 函数)不链接

我想要一个函数来枚举 Windows 上的串行 (COM) 端口。为此,我主要从http://www.codeguru.com/cpp/wp/system/hardwareinformation/article.php/c5721/Determining-What-Serial-Ports-Are-Available-on-a-Windows-复制代码机器.htm

在头文件中:

#include "SerialPort.h"
#include <list>
#include <objbase.h>
#include <initguid.h>
#include <Setupapi.h>
typedef std::list<SerialPort> PortList;
class SerialConnection
{
private:
static PortList availible_ports;
public:
static void enumerateSerialPorts(bool);
static const PortList& getPortList(){ return availible_ports; }
}
Run Code Online (Sandbox Code Playgroud)

执行:

void SerialConnection::enumerateSerialPorts(bool check)
{
    availible_ports.clear();
    CString strErr;
    // Create a device information set that will be the container for 
    // the device interfaces.
    GUID *guidDev = (GUID*)&GUID_CLASS_COMPORT;

    HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
    SP_DEVICE_INTERFACE_DETAIL_DATA *pDetData = NULL;

    try {
        hDevInfo …
Run Code Online (Sandbox Code Playgroud)

windows linker serial-port setupapi visual-c++

4
推荐指数
1
解决办法
6787
查看次数

设置api可用于判断设备是否已启用

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

安迪

setupapi

3
推荐指数
1
解决办法
1573
查看次数

通过.inf安装程序化驱动程序导致重启

我正在尝试使用此命令通过inf文件安装驱动程序:

rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 .\my_driver.inf
Run Code Online (Sandbox Code Playgroud)

根据MSDN(http://msdn.microsoft.com/en-us/library/aa376957%28v=vs.85%29.aspx),通过提供128作为参数,除了"设置安装的默认路径"到INF的位置.这是典型设置",安装应该(+0)不要求用户重启.但是,就我而言,它始终如此.

我究竟做错了什么?

cmd driver setupapi

2
推荐指数
1
解决办法
6110
查看次数

未解析的外部符号 _DEVPKEY_Device_BusReportedDeviceDesc

对于连接到我的机器的设备,我想检索 device-property Bus Reported Device Description。为此,我使用了Setup API 的SetupDiGetDeviceProperty函数。在devpkey.h 中,我找到了定义DEVPKEY_Device_BusReportedDeviceDesc

但是,如果我使用DEVPKEY_Device_BusReportedDeviceDesc,我会在链接时收到未解析的外部符号 _DEVPKEY_Device_BusReportedDeviceDesc

这是我的代码(仅包含重现问题的最少代码):

#include "stdafx.h"

#include <Windows.h>
#include <devpropdef.h>
#include <devpkey.h>

int main()
{
    DEVPROPKEY x = DEVPKEY_Device_BusReportedDeviceDesc;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是完整的错误代码:

错误 LNK2001:未解析的外部符号 _DEVPKEY_Device_BusReportedDeviceDesc

我该如何解决这个问题?

c++ linker driver setupapi visual-studio

2
推荐指数
1
解决办法
1029
查看次数

使用 Windows SetupAPI 获取 USB 设备描述符

我想知道是否可以使用 SetupAPI 函数(如SetupDiGetDeviceRegistryProperty)获取 USB 设备描述符?谢谢你!

编辑

到目前为止,我只能收到 Windows友好名称:

SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,
            &dwPropertyRegDataType, (BYTE*)szDesc, sizeof(szDesc), &dwSize)
Run Code Online (Sandbox Code Playgroud)

windows setupapi

1
推荐指数
1
解决办法
3778
查看次数