我知道如何使用Setup API启用和禁用设备。我需要知道的是,我可以使用相同的API来确定设备是否已启用/禁用?我认为真正的问题是如何使用它,因为Microsoft的devcon使用Setup API来操作硬件,该程序将告诉您设备是启用还是禁用(与设备管理器一样)。这是怎么做到的?到目前为止,我对Setup API方法的研究并没有给出明确的答案。
安迪
答案 0 :(得分:5)
来自MS的这个API必须是最少使用,理解和最差记录的。正如我在原始帖子中提到的,Setup API可用于启用/禁用硬件。所以,我想我会花一些时间向社区提供如何最终弄清楚如何检查硬件状态。
因此,简短的回答是:您不是从Setup API执行此操作。当然,这是有道理的。毕竟,由于您可以使用Setup API更改设备状态,即启用或禁用:因此,您必须使用完全不同的API来确定设备的当前状态。现在,输入Configuration Manager 32 API。要启用/禁用硬件,您必须使用Setup API,但要确定硬件的状态,您必须使用ConfigMgr 32 API(#include cfgmgr32.h)。有道理,对吧?
可能有其他方法可以做到这一点,但这就是我所做的。
#include <Windows.h>
#include <cstdlib>
#include <setupapi.h>
#include <cfgmgr32.h>
GUID driveGuid = {0x4d36e967, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};
// first, get a list of hardware you're interested in using Setup API
HDEVINFO hDevs(SetupDiGetClassDevs(&driveGuid, NULL, NULL, DIGCF_PRESENT));
if(INVALID_HANDLE_VALUE == hDevs)
{
throw std::runtime_error("unable to build a list of hardware");
}
// this struct has the dev instance ID that the CFG MGR API wants. The struct must be
// must be inited to the size of the struct, the cbSize member, all others should be 0
SP_DEVINFO_DATA devInfo = {sizeof(SP_DEVINFO_DATA)};
DWORD index(0);
LONG devStatus(0), devProblemCode(0);
char devId[256];
memset(devId, 0, 256)
while(SetupDiEnumDeviceInfo(hDevs, index++, &devInfo))
{
// use Config Mgr to get a nice string to compare against
CM_Get_Device_ID(devInfo.DevInst, devId, 256, 0);
// use whatever mechanism you like to search the string to find out
// if it's the hardware you're after
if((std::string(devId)).find("MyHardware") != std::string::npos)
{
// goody, it's the hardware we're looking for
CM_Get_DevNode_Status(&devStatus, &devProblemCode, devInfo.DevInst, 0);
// if the call to getting the status code was successful, do something
// meaningful with the data returned. The fun part of this is that the
// return codes aren't really documented on MSDN. You'll have to look
// through the CfgMgr32.h file. Incidentally, these values are what
// are shown in the Device Manager when you look at the device's status.
}
}
SetupDiDestroyDeviceInfoList(hDevs);
通过搜索找到的here列表,您必须找出所用硬件的GUID。其中一些,至少是在各种Windows标头中预定义的。然而,在这一点上,我知道的很少,偶然偶然发现了他们。
上述功能的相关链接: SetupDiDestroyDevieInfoList CM_Get_DevNode_Status CM_Get_Device_ID SetupDiEnumDeviceInfo SetupDiGetClassDevs SP_DEVINFO_DATA
我希望这有助于某人。