2013-01-18 67 views
0

我有一個相當有趣的問題,我無法找到解決方案。我使用安裝程序API列出系統中的驅動器。將枚舉器設置爲「IDE」時,使用下面列出的代碼毫無問題。枚舉值設置爲「SCSI」時,我的焦慮來了。重現此問題的代碼如下:SetupDiGetClassDevs列出SCSI驅動器失敗,錯誤代碼13(ERROR_INVALID_DATA)

#include <iostream> 
#include <Windows.h> 
#include <SetupAPI.h> 
#include <cfgmgr32.h> 
#include <devguid.h> 

int main() { 
    std::cout << "Looking for only SCSI disks" << std::endl; 
    HDEVINFO hDevs(SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, "SCSI", NULL, DIGCF_PRESENT)); 
    if(INVALID_HANDLE_VALUE == hDevs) { 
     DWORD error(GetLastError()); 
     std::cout << "Handle returned is invalid. Error code: " << error << std::endl; 
     return 1; 
    } 

    SP_DEVINFO_DATA sp = {sizeof(SP_DEVINFO_DATA)}; 
    char buff[256]; 
    memset(buff, 0, 256); 
    DWORD index(0); 

    std::cout << "The handle is valid, listing drives now" << std::endl; 
    while(SetupDiEnumDeviceInfo(hDevs, index++, &sp)) { 
     CM_Get_Device_ID(sp.DevInst, buff, 256, 0); 
     std::cout << buff << std::endl; 
     memset(buff, 0, 256); 
    } 

    SetupDiDestroyDeviceInfoList(hDevs); 
    return 0; 
} 

正如你所看到的,這段代碼沒有什麼值得注意的。問題是,在某些筆記本電腦上,SetupDiGetClassDevs()的代碼錯誤。檢查GetLastError()會發現它的ERROR_INVALID_DATA(0xd)失敗。我不明白的是爲什麼。這個完全相同的程序,作爲我的用戶(具有管理員權限)和非特權用戶在我的開發框中運行,無論SCSI驅動器是否存在都可以工作。

我知道使用的GUID是正確的。它在devguid.h中定義。 「SCSI」是此MSDN page中引用的有效PnP枚舉器,也是檢查設備管理器中的「枚舉器」屬性。第三個參數可以是NULL,第四個參數是該函數的有效定義標誌。我知道這一點,因爲除了這些筆記本電腦以外,這個系統可以在我嘗試過的所有系統上使用(在我的組織中,這個系統有很多)。我希望這裏的某個人可能知道什麼會導致SetupDiGetClassDevs()在這些情況下失敗,或者至少可以將我指向正確的方向。我不是Windows專家,我可能會錯過系統配置或權限(雖然不是從錯誤中隱含的)。

正如我所希望的那樣,我已經在一臺筆記本電腦上運行這個代碼,我可以作爲具有管理員權限的用戶和管理員用戶進行測試:兩者都具有相同的結果。筆記本電腦是運行Windows 7 64位Service Pack 1的HP EliteBook 8460p。以32位或64位編譯此代碼沒有區別。

+0

您的錯誤處理是borken。在執行其他任何操作前,總是獲取GetLastError()**的值,包括寫入cout。 –

+0

有趣。我不知道,但似乎有理由。我已將代碼更改爲編輯顯示的內容。我仍然收到錯誤代碼13(0xd)。 –

回答

1

我打算髮布我從MSDN支持論壇上的一位研究員那裏得到的答案,以幫助可能被同樣問題困擾的人。顯然,這是Windows 7的預期行爲。如果系統從未見過指定給SetupDiGetClassDevs()的枚舉器的硬件,則會發生故障並預期此錯誤代碼。

作爲參考,我問這個問題的線程是鏈接here

相關問題