2017-03-09 95 views
-2

我想檢查每個設備(如wifi或藍牙)的狀態,知道他們工作正常或沒有或他們失去了當我做重新啓動壓力測試時,我如何獲得設備狀態(如設備的屬性設備管理)?窗口是否有API來獲取?如何檢查PC重啓時的Windows設備狀態?

回答

0

爲得到得到你需要調用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); 
    } 
}