Пишу программу для тестирования работы драйверов. Необходимо чтобы она загружала драйверы и открывала их. С загрузкой всё просто. А вот как открыть драйвер если не знаешь его символьную ссылку?
Это какая такая символьная ссылка, на что? На CDO? Открыть драйвер это как? Быть может, все-таки открыть CDO? Ну очевидно, чтобы открыть CDO драйвера, нужно знать его имя. Не знаешь имя - не откроешь из юзермода.
haxorart Смотри имена драйверов в каталоге объектов Windows \Driver, поможет NtOpenDirectoryObject и NtQueryDirectoryObject
SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces, SetupDiGetDeviceInterfaceDetail, Код (Text): hardwareDeviceInfo = SetupDiGetClassDevsA( (LPGUID)&GUID_DRIVER_INTERFACE_STANDARD, NULL, // Define no enumerator (global) NULL, // no window (DIGCF_PRESENT | // Only Devices present DIGCF_DEVICEINTERFACE) // Function class devices. ); if(hardwareDeviceInfo == INVALID_HANDLE_VALUE) { ICE_LOG_ERROR(( MODULE_NAME_IZSRV, "SetupDiGetClassDevs failed. error (%u)!", GetLastError() )); ///error goto Error; } deviceInterfaceData.cbSize = sizeof(deviceInterfaceData); for(i=0; SetupDiEnumDeviceInterfaces( hardwareDeviceInfo, 0, // No care about specific PDOs (LPGUID)&GUID_XBPIPE_INTERFACE_STANDARD, i, // &deviceInterfaceData ); i++ ) { if(deviceInterfaceDetailData) { free((BYTE*)deviceInterfaceDetailData); } if( !SetupDiGetDeviceInterfaceDetailA( hardwareDeviceInfo, &deviceInterfaceData, NULL, // probing so no output buffer yet 0, // probing so output buffer length of zero &requiredLength, NULL ) && (error = GetLastError()) != ERROR_INSUFFICIENT_BUFFER ) { goto Error; } predictedLength = requiredLength; tempPointer = (PBYTE)malloc(predictedLength)); deviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA_A) tempPointer; if( !deviceInterfaceDetailData ) { ///error goto Error; } memset( deviceInterfaceDetailData, 0, predictedLength ); deviceInterfaceDetailData->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA_A); if( !SetupDiGetDeviceInterfaceDetailA( hardwareDeviceInfo, &deviceInterfaceData, deviceInterfaceDetailData, predictedLength, &requiredLength, NULL ) ) { ///error goto Error; } // // А вот мы и получили путь к устройству, теперь моно делать CreateFile // deviceInterfaceDetailData->DevicePath } if(deviceInterfaceDetailData) { free( (BYTE*) deviceInterfaceDetailData ); } SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); ICE_LOG_EXIT(MODULE_NAME_IZSRV); Error: error = GetLastError(); /// error if(deviceInterfaceDetailData) { free((char*)deviceInterfaceDetailData); } SetupDiDestroyDeviceInfoList (hardwareDeviceInfo); где GUID_DRIVER_INTERFACE_STANDARD - GUID of the driver!
Я слышал есть ф-я QueryDosDеvice или что-то типо того сегодня попробую. А вообще из самого драйвера нельзя эту информацию стянуть? Ведь ссылка и имя драйвера должны быть в самом драйвере для его регистрации.
У меня выбрасывает такое сообщение "querydosdevice failed" и перестают корректно работать некоторые проги.И в конце концов приходится ресетить комп. Подскажите ,пожалуйста,как можно обнаружить источник провоцирующий это сообщение.
Отловил наконец-то с помощью Process Explorer .Это vialogsv.exe. У меня чипсет на материнке от VIA. Значит ли это что что-то с дровами?Или на уровне железа что-то? Писало что-то типа :не хватает системных ресурсов для завершения операции. Я так понял что это связано с RAID´ом.У меня via vt8763 apollo pt800,но к сожалению ни на оффсайте,ни на viaarena.com дров для него нет. Похоже что его нигде нет.Вот это засада...