2016-12-15 2 views
0

под управлением Windows функция устройства CoInstaller как это, от образца Microsoft WDK Тостер:Как узнать, присутствует ли устройство или нет (присутствует = подключено) от кода 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 
    ) 
{ 
... 
} 

Я знаю, что Dis и ли пара используется для идентификации devnode. Даже если устройство было отключено от системы (например, отключите USB-диск), пользователь все равно может сообщить диспетчеру устройств показывать не существующие устройства, а затем наш Co-installer может по-прежнему получать DIS-DID с этого устройства без подключения - потому что этот devnode был зарегистрирован в реестре.

Итак, мой вопрос ясен, как определить из ToasterCoInstaller(), относится ли текущий DIS-DID к настоящему или неустановленному устройству?

Один из способов я могу думать используют SetupDiGetClassDevs, чтобы найти все DIGCF_PRESENT devnodes, а затем сравнить их устройства-экземпляр-идентификатор к поиску информации один, если не найдено, я могу сделать вывод, что запрос ДИС-DID нет.

Но есть ли более сжатый способ? Некоторые конкретные SetupDi ... могут напрямую ответить на ответ?

ответ

1

вам необходимо использовать CM_Get_DevNode_Status и вместо третьего параметра

DEVINST dnDevInst 

использование SP_DEVINFO_DATA.DevInst

Непрозрачный дескриптор экземпляра устройства (также известный как ручки к devnode).

Некоторые функции, такие как функции 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 
} 
Смежные вопросы