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

时间:2012-03-29 21:05:34

标签: setupapi

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

安迪

1 个答案:

答案 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

我希望这有助于某人。