根据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 7上通过DpInst安装已签名的驱动程序(即使用正确签名的.CAB)时,除非它是WHQL签名的驱动程序,否则无法以静默方式安装它.如果您以非静默模式运行DpInst,它将提示您信任"发布者".如果您以静默模式运行DpInst,它将失败并显示与签名相关的错误代码(类似于0x800b0109 - 请检查您的setupapi.app.log).
device-driver digital-signature setupapi windows-7 driver-signing
尝试从32位模式编译的程序调用SetupDiCallClassInstaller在64位Windows上失败.
显然这是设计,但我想知道原因.
使用设备管理器,用户可以明确启用/禁用设备,如下图所示.
对于给定的设备,我想知道它是否当前处于用户禁用/启用状态.
我尝试了以下方法
CM_Get_DevNode_Status(&status, &problem, data.DevInst, 0);我希望存在DN_STARTED,或者DN_DRIVER_LOADED会告诉我.但是,当设备连接/断开连接时,即使操作系统正在加载/卸载驱动程序,这些也可能为零.例如,已启用并为其加载驱动程序的设备.DN_STARTED将是1,但当我们断开设备时,它将设置为零,然后从设备管理器中删除设备的条目.SetupDiGetDeviceRegistryProperty(..., SPDRP_INSTALL_STATE, ...)我的状态CM_INSTALL_STATE_INSTALLED应该意味着设备已启用.但即使对于禁用的设备,该函数也会返回此状态.使用WMI我能够获得所需的信息,但我在PowerShell中使用了wmi.我不想使用wmi,因为在本机c ++中实现起来非常困难.我使用了以下查询.
Select Name, Availability, ConfigManagerErrorCode, ConfigManagerUserConfig from Win32_PnPEntity where Name = 'NVIDIA Quadro M1000M'
上述查询中的ConfigManagerErrorCode,如果设置为22,表示设备已被禁用,21表示Windows正在删除设备
我正在寻找一个非wmi解决方案.
我已经能够使用 SetupAPI 枚举 USB 设备,并且我已经查看了 WDK 中的 usbview 应用程序,但我仍然不知道如何获取USB_DEVICE_DESCRIPTOR。
有人能指出我正确的方向吗?如果不从 Hub 启动,是否就无法以良好的方式从 WinAPI 获取此信息?
我想要一个函数来枚举 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) 我知道如何使用Setup API来启用和禁用设备.我需要知道的是,我可以使用相同的API来确定设备是否已启用/禁用?我认为真正的问题是如何使用它因为Microsoft的devcon使用Setup API来操作硬件,该程序将告诉您设备是启用还是禁用(与设备管理器一样).这是怎么做到的?到目前为止,我对Setup API方法的研究并没有给出明确的答案.
安迪
我正在尝试使用此命令通过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)不要求用户重启.但是,就我而言,它始终如此.
我究竟做错了什么?
对于连接到我的机器的设备,我想检索 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
我该如何解决这个问题?
我想知道是否可以使用 SetupAPI 函数(如SetupDiGetDeviceRegistryProperty)获取 USB 设备描述符?谢谢你!
编辑
到目前为止,我只能收到 Windows友好名称:
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,
&dwPropertyRegDataType, (BYTE*)szDesc, sizeof(szDesc), &dwSize)
Run Code Online (Sandbox Code Playgroud)