gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:01:48 27 4
gpt4 key购买 nike

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

安迪

最佳答案

这个来自 MS 的 API 必须是使用最少、理解最少和记录最差的 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 header 中预定义的。然而,在这一点上,我知道的很少,只是偶然偶然发现的。

上面用到的函数的相关链接:
SetupDiDestroyDevieInfoList
CM_Get_DevNode_Status
CM_Get_Device_ID
SetupDiEnumDeviceInfo
SetupDiGetClassDevs
SP_DEVINFO_DATA

我希望这可以帮助别人。

关于setupapi - 可以使用设置 api 来判断设备是否已启用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9933534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com