2010-04-22 202 views

回答

0

我不認爲你會得到任何人爲你寫代碼:你是一個程序員,這可能是你的工作

但是,您可以從GetLogicalDriveStringsGetDriveType開始。

3

根據GetDriveType的文檔,它說我們應該用SetupDiGetDeviceRegistryProperty的,我引用:

確定驅動器是否爲USB型驅動器,調用SetupDiGetDeviceRegistryProperty並指定SPDRP_REMOVAL_POLICY屬性。

我跑了一些測試,找不到某個設備是USB驅動器的任何跡象。 對於許多設備(以及我的USB驅動器),SPDRP_REMOVAL_POLICY返回2,所以我無法真正使用它。使用SPDRP_CAPABILITIES調用SetupDiGetDeviceRegistryProperty並僅過濾CM_DEVCAP_REMOVABLE也提供了許多設備(即使與刪除策略結合時也沒有給出任何指示如何找到我的USB驅動器 此外,使用SPDRP_DEVTYPE調用SetupDiGetDeviceRegistryProperty始終返回錯誤13(「數據爲。無效「),我不知道爲什麼

下面是一些代碼:

 
void SetupDiInformation() 
{ 
    HDEVINFO hDevInfo = SetupDiGetClassDevsW(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES); 
    if (INVALID_HANDLE_VALUE == hDevInfo) 
    { 
     fwprintf(stderr, L"Error SetupDiCreateDeviceInfoList: %d\n", GetLastError()); 
     return; 
    } 

    SP_DEVINFO_DATA devInfoData; 
    devInfoData.cbSize = sizeof(devInfoData); 
    BOOL success; 
    success = SetupDiEnumDeviceInfo(hDevInfo, 0, &devInfoData); 
    for (int i=1; success; i++) 
    { 
     DWORD regDataType = REG_NONE, reqSize = 0; 
     WCHAR deviceDesc[MAX_PATH+1] = {0}; 
     DWORD deviceType = -1, capabilities = -1; 
     DWORD removalPolicy = CM_REMOVAL_POLICY_EXPECT_NO_REMOVAL; 
     BOOL regPropSuccess = false; 

/* 
     regDataType = REG_NONE; reqSize = 0; 
     regPropSuccess = SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, 
      SPDRP_DEVTYPE, &regDataType, 
      (PBYTE)&deviceType, sizeof(deviceType), &reqSize); 
     if (!regPropSuccess) 
     { 
      fwprintf(stderr, L"Error SetupDiGetDeviceRegistryProperty(SPDRP_DEVTYPE)[%d]: %d\n", i, GetLastError()); 
     } 
*/ 

     regPropSuccess = SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, 
      SPDRP_DEVICEDESC, &regDataType, 
      (PBYTE)deviceDesc, sizeof(deviceDesc), &reqSize); 
     if (!regPropSuccess) 
     { 
      fwprintf(stderr, L"Error SetupDiGetDeviceRegistryProperty(SPDRP_DEVICEDESC)[%d]: %d\n", i, GetLastError()); 
     } 


     regDataType = REG_NONE; reqSize = 0; 
     regPropSuccess = SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, 
      SPDRP_CAPABILITIES, &regDataType, 
      (PBYTE)&capabilities, sizeof(capabilities), &reqSize); 
     if (!regPropSuccess) 
     { 
      fwprintf(stderr, L"Error SetupDiGetDeviceRegistryProperty(SPDRP_CAPABILITIES)[%d]: %d\n", i, GetLastError()); 
     } 

     regDataType = REG_NONE; reqSize = 0; 
     regPropSuccess = SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, 
      SPDRP_REMOVAL_POLICY, &regDataType, 
      (PBYTE)&removalPolicy, sizeof(removalPolicy), &reqSize); 
     if (!regPropSuccess) 
     { 
      fwprintf(stderr, L"Error SetupDiGetDeviceRegistryProperty(SPDRP_REMOVAL_POLICY)[%d]: %d\n", i, GetLastError()); 
     } 

     if ((CM_DEVCAP_REMOVABLE & capabilities) != 0) 
     { 
      wprintf(L"% 4d. ", i); 
      wprintf(L"%X-%04X-%X-", 
       devInfoData.ClassGuid.Data1, 
       devInfoData.ClassGuid.Data2, 
       devInfoData.ClassGuid.Data3); 
      int data4len = sizeof(devInfoData.ClassGuid.Data4)/sizeof(devInfoData.ClassGuid.Data4[0]); 
      for (int j=0; j 30) 
       deviceDesc[30]=L'\0'; 
      //wprintf(L" %-8d%-30s 0x%08X %d [%d] ", devInfoData.DevInst, deviceDesc, deviceType, removalPolicy, capabilities); 
      wprintf(L" %-8d%-30s %d [%d] ", devInfoData.DevInst, deviceDesc, removalPolicy, capabilities); 
      //DisplayCapabilities(capabilities); 
      wprintf(L"\n"); 
     } 

     success = SetupDiEnumDeviceInfo(hDevInfo, i, &devInfoData); 
    } 

    DWORD lastError = GetLastError(); 
    if (lastError != ERROR_NO_MORE_ITEMS) 
    { 
     // error occurred 
     fwprintf(stderr, L"Error SetupDiEnumDeviceInfo: %d\n", lastError); 
    } 

    if (!SetupDiDestroyDeviceInfoList(hDevInfo)) 
    { 
     fwprintf(stderr, L"Error SetupDiDestroyDeviceInfoList: %d\n", GetLastError()); 
     return; 
    } 
}