2016-12-15 41 views
0

Windows設備CoInstaller功能是這樣的,從微軟WDK Toaster示例:如何從CoInstaller代碼中知道設備是否存在(present = plugged in)?

extern"C" __declspec(dllexport) DWORD CALLBACK 
ToasterCoInstaller (
    __in DI_FUNCTION    InstallFunction, 
    __in HDEVINFO     Dis, 
    __in PSP_DEVINFO_DATA   Did, 
    __inout PCOINSTALLER_CONTEXT_DATA Context 
    ) 
{ 
... 
} 

我知道派息並沒有對用於識別設備節點。即使設備已從系統中拔出(例如拔出USB磁盤),用戶仍可能會告訴設備管理器顯示不存在的設備,然後我們的聯合安裝程序仍然可以從未拔下的設備接收DIS-DID - 因爲該devnode已在註冊表中註冊。

所以我的問題很清楚,我如何從ToasterCoInstaller()確定當前的DIS-DID是指現在還是不存在的設備?我能想到的

一種方法是使用SetupDiGetClassDevs找到所有DIGCF_PRESENT devnodes然後將自己的設備,例如-ID進行比較的查詢之一,如果沒有找到匹配,我可以推斷查詢DIS-DID不存在。

但是有沒有更簡潔的方法?一些特定的SetupDi ...可以直接告訴答案嗎?

回答

1

你需要使用CM_Get_DevNode_Status和地方第三個參數

DEVINST dnDevInst 

使用SP_DEVINFO_DATA.DevInst

一個不透明的設備句柄實例(也稱爲句柄 設備節點)。

某些函數(如SetupDiXxx函數)將整個 SP_DEVINFO_DATA結構作爲輸入來標識設備中的設備 信息集。其他功能,如CM_Xxx功能,如 CM_Get_DevNode_Status,藉此DevInst句柄作爲輸入

ULONG devStatus, devProblemCode; 
switch (CM_Get_DevNode_Status(&devStatus, &devProblemCode, Did->DevInst, 0)) 
{ 
case CR_SUCCESS: 
    if (devStatus & DN_STARTED) 
    { 
     //present, started; 
    } 
    break; 
case CR_NO_SUCH_DEVNODE: 
    // not present 
    break; 
default: 
    // some error 
} 
相關問題