2016-12-15 56 views
0

A Windowsのデバイスコインストーラ機能には、Microsoft WDK Toasterサンプルから、このようなものです:CoInstallerコードからデバイスが存在するかどうかを知る方法(存在する場合)

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

は私がディスとDIDペアがのdevnodeを識別するために使用されていることを知っています。たとえデバイスがシステムから抜かれていても(例えばUSBディスクのプラグを抜いても)、デバイスマネージャにまだ存在しないデバイスを表示するよう指示することがあります。その場合、Co-installerは引き続きそのプラグが差し込まれたデバイスからDIS-そのdevnodeがレジストリに登録されているためです。

私の質問は明らかです。現在のDIS-DIDが現在のデバイスとは存在しないデバイスかどうかをToasterCoInstaller()からどのように判断するのですか?

を使用してすべてのDIGCF_PRESENT devnodesを見つけて、Device-instance-idを照会するものと比較します。一致するものが見つからなければ、DIS-DIDが存在しないことを推測できます。

もっと簡潔な方法がありますか?いくつかの特定のSetupDi ...直接答えを伝えることができますか?

答えて

1

あなたは(も のdevnodeに対するハンドルとして知られている)デバイスインスタンスへの不透明なハンドルSP_DEVINFO_DATA.DevInst

を使用

DEVINST dnDevInst 

CM_Get_DevNode_Statusと場所で三番目のパラメータを使用する必要があります。

SetupDiXxx関数などの一部の関数は、 SP_DEVINFO_DATA構造体を入力とし、デバイス 情報セット内のデバイスを識別します。このよう CM_Get_DevNode_StatusようCM_Xxx機能などのその他の機能は、入力

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 
} 
としてこのDevInstハンドルを取ります
関連する問題