SetupDiOpenDevRegKey не работает
От: Vladi_2K7  
Дата: 10.04.09 09:05
Оценка:
Уважаемые форумчане, подскажите, почему функция SetupDiOpenDevRegKey возвращает значение (к примеру) HKEY = 0x00000f54 {unused = ???}, но при проверке на ошибку все прокатывает. Соответственно, при использовании полученного значения в функции RegQueryValueEx, она мне выдает ошибку. В дополнение к сказанному привожу свой код:

// Получить класс сетевых устройств
HDEVINFO hDeviceInfoSet = SetupDiGetClassDevs(
    &GUID_DEVCLASS_NET,    // GUID сетевых устройств
    NULL,
    NULL,
    DIGCF_PRESENT);        // Устройства, в настоящее время присутствующие в системе
if (hDeviceInfoSet == INVALID_HANDLE_VALUE)
{
    TRACE(_T("\n\tSetupDiGetClassDevs failed.\n"));
    return FALSE;
}

SP_DEVINFO_DATA DeviceInfoData;

// Подготавливаем структуру для получения информации об устройстве
memset(&DeviceInfoData, 0, sizeof(SP_DEVINFO_DATA));
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

DWORD dwDeviceIndex = 0;    // Номер устройства

// Перечислить все сетевые устройства
while (SetupDiEnumDeviceInfo(
    hDeviceInfoSet,
    dwDeviceIndex,
    &DeviceInfoData))
{
    WCHAR szDeviceDescription[255];
    DWORD dwDeviceDescriptionSize = (DWORD) (sizeof(szDeviceDescription) / sizeof(szDeviceDescription[0]));

    BOOL bResult = SetupDiGetDeviceRegistryProperty(
        hDeviceInfoSet,
        &DeviceInfoData,
        SPDRP_DEVICEDESC,
        NULL,
        (PBYTE) szDeviceDescription,
        dwDeviceDescriptionSize,
        &dwDeviceDescriptionSize);
    if (!bResult)
    {
        TRACE(_T("\n\tSetupDiGetDeviceRegistryProperty failed.\n"));
        break;
    }
        
    HKEY hDeviceKey = SetupDiOpenDevRegKey(
        hDeviceInfoSet,
        &DeviceInfoData,
        DICS_FLAG_GLOBAL,
        0,
        DIREG_DEV,
        KEY_READ);
!!!! -> После выполнения этого кода и появляется в отладчике значени 0x00000f54 {unused=???}
!!!! -> Естественно, после вызова, функция RegQueryValueEx выдает ошибку
    if (hDeviceKey == INVALID_HANDLE_VALUE)
    {
        TRACE(_T("\n\tSetupDiOpenDevRegKey failed.\n"));
        break;
    }

    WCHAR szBuffer[80];
    DWORD dwBufferSize = (DWORD) (sizeof(szBuffer) / sizeof(szBuffer[0]));

    if (RegQueryValueEx(hDeviceKey, _T("InfPath"), NULL, NULL, (LPBYTE) szBuffer, &dwBufferSize) == ERROR_SUCCESS)
    {
            ...
    }

    RegCloseKey(hDeviceKey);

    dwDeviceIndex++;
}
    
SetupDiDestroyDeviceInfoList(hDeviceInfoSet);


Что я делаю не так?

Заранее большое спасибо!!!
visual studio c++
Re: SetupDiOpenDevRegKey не работает
От: Unhandled_Exception Россия  
Дата: 10.04.09 11:12
Оценка:
Здравствуйте, Vladi_2K7, Вы писали:

V_K>Уважаемые форумчане, подскажите, почему функция SetupDiOpenDevRegKey возвращает значение (к примеру) HKEY = 0x00000f54 {unused = ???}, но при проверке на ошибку все прокатывает.


а чем тебе значение не понравилось?

V_K>!!!! -> После выполнения этого кода и появляется в отладчике значени 0x00000f54 {unused=???}

V_K>!!!! -> Естественно, после вызова, функция RegQueryValueEx выдает ошибку
V_K> if (hDeviceKey == INVALID_HANDLE_VALUE)
V_K> {
V_K> TRACE(_T("\n\tSetupDiOpenDevRegKey failed.\n"));
V_K> break;
V_K> }

ничего не естественно. что за ошибка, что GetLastError() говорит?
думаю, что access violation, попробуй добавить прав (KEY_*).
Re[2]: SetupDiOpenDevRegKey не работает
От: Alexey Frolov Беларусь  
Дата: 10.04.09 13:34
Оценка: +1
Здравствуйте, Unhandled_Exception, Вы писали:

U_E>а чем тебе значение не понравилось?


Согласен, вполне себе валидное значение

U_E>ничего не естественно. что за ошибка, что GetLastError() говорит?


GetLastError ничего не скажет

If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.

RegQueryValueEx сама возвращает значение ошибки, вот его и надо смотреть

U_E>думаю, что access violation, попробуй добавить прав (KEY_*).


Возможно вы имели ввиду Access denied (5). Скорее всего так и есть, только вот добавить прав с помощью KEY_* не поможет, для RegQueryValueEx больше чем KEY_READ и не надо. Если нет доступа, то значит его нет. Нужна либо более привилегированая учетная запись, под которой выполняется код, либо в security descriptor ключа надо добавить прав доступа для этой записи. Думаю что первый вариант будет более предпочтителен, просто запускать код из под другого аккаунта
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.