Уважаемые форумчане, подскажите, почему функция 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);
Что я делаю не так?
Заранее большое спасибо!!!
Здравствуйте, 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 ключа надо добавить прав доступа для этой записи. Думаю что первый вариант будет более предпочтителен, просто запускать код из под другого аккаунта