-2
我想檢查每個設備(如wifi或藍牙)的狀態,知道他們工作正常或沒有或他們失去了當我做重新啓動壓力測試時,我如何獲得設備狀態(如設備的屬性設備管理)?窗口是否有API來獲取?如何檢查PC重啓時的Windows設備狀態?
我想檢查每個設備(如wifi或藍牙)的狀態,知道他們工作正常或沒有或他們失去了當我做重新啓動壓力測試時,我如何獲得設備狀態(如設備的屬性設備管理)?窗口是否有API來獲取?如何檢查PC重啓時的Windows設備狀態?
爲得到得到你需要調用CM_Get_DevNode_Status
設備地位得到DEVINST dnDevInst
你可以用CM_Get_Device_ID_ListW
+ CM_Locate_DevNode
或交替使用CM_Locate_DevNode
+ CM_Get_Child
+ CM_Get_Sibling
枚舉所有的設備,例如:
void enumDN(DEVINST dnDevInst)
{
union {
PVOID buf;
PBYTE pb;
PWSTR sz;
};
ULONG cb = 0, rcb = 256;
static volatile UCHAR guz;
PVOID stack = alloca(guz);
WCHAR Name[MAX_DEVICE_ID_LEN];
CONFIGRET err;
if (CM_Get_Device_ID(dnDevInst, Name, RTL_NUMBER_OF(Name), 0) == CR_SUCCESS)
{
DEVPROPTYPE PropertyType;
ULONG Status, ulProblemNumber;
if (CM_Get_DevInst_Status(&Status, &ulProblemNumber, dnDevInst, 0) == CR_SUCCESS)
{
PWSTR FriendlyName = NULL;
do
{
if (cb < rcb)
{
rcb = cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
}
if ((err = CM_Get_DevNode_PropertyW(dnDevInst, &DEVPKEY_Device_FriendlyName,
&PropertyType, pb, &rcb, 0)) == CR_SUCCESS)
{
if (PropertyType == DEVPROP_TYPE_STRING)
{
FriendlyName = sz;
}
}
} while (err == CR_BUFFER_SMALL);
DbgPrint("%08x %S %S\n", Status, Name, FriendlyName);
}
}
if ((err = CM_Get_Child(&dnDevInst, dnDevInst, 0)) == CR_SUCCESS)
{
do
{
enumDN(dnDevInst);
} while ((err = CM_Get_Sibling(&dnDevInst, dnDevInst, 0)) == CR_SUCCESS);
}
}
void enumDN()
{
DEVINST dnDevInst;
if (CM_Locate_DevInstW(&dnDevInst, NULL, 0) == CR_SUCCESS)
{
enumDN(dnDevInst);
}
}