mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 00:05:42 +00:00
Rework SetupDiOpenDevRegKey
svn path=/trunk/; revision=30327
This commit is contained in:
parent
69a20f248e
commit
6ec1d71d50
1 changed files with 165 additions and 146 deletions
|
@ -2365,152 +2365,6 @@ cleanup:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* SetupDiOpenDevRegKey (SETUPAPI.@)
|
|
||||||
*/
|
|
||||||
HKEY WINAPI
|
|
||||||
SetupDiOpenDevRegKey(
|
|
||||||
IN HDEVINFO DeviceInfoSet,
|
|
||||||
IN PSP_DEVINFO_DATA DeviceInfoData,
|
|
||||||
IN DWORD Scope,
|
|
||||||
IN DWORD HwProfile,
|
|
||||||
IN DWORD KeyType,
|
|
||||||
IN REGSAM samDesired)
|
|
||||||
{
|
|
||||||
struct DeviceInfoSet *list;
|
|
||||||
HKEY ret = INVALID_HANDLE_VALUE;
|
|
||||||
|
|
||||||
TRACE("%p %p %lu %lu %lu 0x%lx\n", DeviceInfoSet, DeviceInfoData,
|
|
||||||
Scope, HwProfile, KeyType, samDesired);
|
|
||||||
|
|
||||||
if (!DeviceInfoSet)
|
|
||||||
SetLastError(ERROR_INVALID_HANDLE);
|
|
||||||
else if ((list = (struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEVICE_INFO_SET_MAGIC)
|
|
||||||
SetLastError(ERROR_INVALID_HANDLE);
|
|
||||||
else if (!DeviceInfoData)
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
else if (DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA))
|
|
||||||
SetLastError(ERROR_INVALID_USER_BUFFER);
|
|
||||||
else if (Scope != DICS_FLAG_GLOBAL && Scope != DICS_FLAG_CONFIGSPECIFIC)
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
else if (KeyType != DIREG_DEV && KeyType != DIREG_DRV)
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct DeviceInfo *deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
|
|
||||||
LPWSTR DriverKey = NULL;
|
|
||||||
DWORD dwLength = 0;
|
|
||||||
DWORD dwRegType;
|
|
||||||
DWORD rc;
|
|
||||||
HKEY hHWProfileKey = INVALID_HANDLE_VALUE;
|
|
||||||
HKEY hEnumKey = NULL;
|
|
||||||
HKEY hKey = NULL;
|
|
||||||
HKEY RootKey;
|
|
||||||
|
|
||||||
if (Scope == DICS_FLAG_GLOBAL)
|
|
||||||
RootKey = list->HKLM;
|
|
||||||
else /* Scope == DICS_FLAG_CONFIGSPECIFIC */
|
|
||||||
{
|
|
||||||
hHWProfileKey = OpenHardwareProfileKey(list->HKLM, HwProfile, 0);
|
|
||||||
if (hHWProfileKey == INVALID_HANDLE_VALUE)
|
|
||||||
goto cleanup;
|
|
||||||
RootKey = hHWProfileKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = RegOpenKeyExW(
|
|
||||||
RootKey,
|
|
||||||
REGSTR_PATH_SYSTEMENUM,
|
|
||||||
0, /* Options */
|
|
||||||
0,
|
|
||||||
&hEnumKey);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(rc);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
rc = RegOpenKeyExW(
|
|
||||||
hEnumKey,
|
|
||||||
deviceInfo->DeviceName,
|
|
||||||
0, /* Options */
|
|
||||||
KeyType == DIREG_DEV ? samDesired : KEY_QUERY_VALUE,
|
|
||||||
&hKey);
|
|
||||||
RegCloseKey(hEnumKey);
|
|
||||||
hEnumKey = NULL;
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(rc);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
if (KeyType == DIREG_DEV)
|
|
||||||
{
|
|
||||||
/* We're done. Just return the hKey handle */
|
|
||||||
ret = hKey;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
/* Read the 'Driver' key */
|
|
||||||
rc = RegQueryValueExW(hKey, REGSTR_VAL_DRIVER, NULL, &dwRegType, NULL, &dwLength);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(rc);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
else if (dwRegType != REG_SZ)
|
|
||||||
{
|
|
||||||
SetLastError(ERROR_GEN_FAILURE);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
DriverKey = HeapAlloc(GetProcessHeap(), 0, dwLength);
|
|
||||||
if (!DriverKey)
|
|
||||||
{
|
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
rc = RegQueryValueExW(hKey, REGSTR_VAL_DRIVER, NULL, &dwRegType, (LPBYTE)DriverKey, &dwLength);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(rc);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
RegCloseKey(hKey);
|
|
||||||
hKey = NULL;
|
|
||||||
/* Need to open the driver key */
|
|
||||||
rc = RegOpenKeyExW(
|
|
||||||
RootKey,
|
|
||||||
REGSTR_PATH_CLASS_NT,
|
|
||||||
0, /* Options */
|
|
||||||
0,
|
|
||||||
&hEnumKey);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(rc);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
rc = RegOpenKeyExW(
|
|
||||||
hEnumKey,
|
|
||||||
DriverKey,
|
|
||||||
0, /* Options */
|
|
||||||
samDesired,
|
|
||||||
&hKey);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(rc);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
ret = hKey;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
if (hHWProfileKey != INVALID_HANDLE_VALUE)
|
|
||||||
RegCloseKey(hHWProfileKey);
|
|
||||||
if (hEnumKey != NULL)
|
|
||||||
RegCloseKey(hEnumKey);
|
|
||||||
if (hKey != NULL && hKey != ret)
|
|
||||||
RegCloseKey(hKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE("Returning 0x%p\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetupDiCreateDeviceInfoA (SETUPAPI.@)
|
* SetupDiCreateDeviceInfoA (SETUPAPI.@)
|
||||||
*/
|
*/
|
||||||
|
@ -3554,6 +3408,171 @@ cleanup:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HKEY SETUPDI_OpenDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired)
|
||||||
|
{
|
||||||
|
HKEY enumKey, key = INVALID_HANDLE_VALUE;
|
||||||
|
LONG l;
|
||||||
|
|
||||||
|
l = RegOpenKeyExW(RootKey, REGSTR_PATH_SYSTEMENUM, 0, 0, &enumKey);
|
||||||
|
if (!l)
|
||||||
|
{
|
||||||
|
l = RegOpenKeyExW(enumKey, devInfo->DeviceName, 0, samDesired, &key);
|
||||||
|
RegCloseKey(enumKey);
|
||||||
|
}
|
||||||
|
if (l)
|
||||||
|
SetLastError(l);
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HKEY SETUPDI_OpenDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired)
|
||||||
|
{
|
||||||
|
LPWSTR DriverKey = NULL;
|
||||||
|
DWORD dwLength = 0;
|
||||||
|
DWORD dwRegType;
|
||||||
|
DWORD rc;
|
||||||
|
HKEY hEnumKey = NULL;
|
||||||
|
HKEY hKey = NULL;
|
||||||
|
HKEY key = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
|
hKey = SETUPDI_OpenDevKey(RootKey, devInfo, KEY_QUERY_VALUE);
|
||||||
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
|
goto cleanup;
|
||||||
|
/* Read the 'Driver' key */
|
||||||
|
rc = RegQueryValueExW(hKey, REGSTR_VAL_DRIVER, NULL, &dwRegType, NULL, &dwLength);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
else if (dwRegType != REG_SZ)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_GEN_FAILURE);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
DriverKey = HeapAlloc(GetProcessHeap(), 0, dwLength);
|
||||||
|
if (!DriverKey)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
rc = RegQueryValueExW(hKey, REGSTR_VAL_DRIVER, NULL, &dwRegType, (LPBYTE)DriverKey, &dwLength);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
hKey = NULL;
|
||||||
|
/* Need to open the driver key */
|
||||||
|
rc = RegOpenKeyExW(
|
||||||
|
RootKey,
|
||||||
|
REGSTR_PATH_CLASS_NT,
|
||||||
|
0, /* Options */
|
||||||
|
0,
|
||||||
|
&hEnumKey);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
rc = RegOpenKeyExW(
|
||||||
|
hEnumKey,
|
||||||
|
DriverKey,
|
||||||
|
0, /* Options */
|
||||||
|
samDesired,
|
||||||
|
&hKey);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
key = hKey;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (hEnumKey != NULL)
|
||||||
|
RegCloseKey(hEnumKey);
|
||||||
|
if (hKey != NULL && hKey != key)
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetupDiOpenDevRegKey (SETUPAPI.@)
|
||||||
|
*/
|
||||||
|
HKEY WINAPI SetupDiOpenDevRegKey(
|
||||||
|
HDEVINFO DeviceInfoSet,
|
||||||
|
PSP_DEVINFO_DATA DeviceInfoData,
|
||||||
|
DWORD Scope,
|
||||||
|
DWORD HwProfile,
|
||||||
|
DWORD KeyType,
|
||||||
|
REGSAM samDesired)
|
||||||
|
{
|
||||||
|
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||||
|
struct DeviceInfo *devInfo;
|
||||||
|
HKEY key = INVALID_HANDLE_VALUE;
|
||||||
|
HKEY RootKey;
|
||||||
|
|
||||||
|
TRACE("%p %p %d %d %d %x\n", DeviceInfoSet, DeviceInfoData,
|
||||||
|
Scope, HwProfile, KeyType, samDesired);
|
||||||
|
|
||||||
|
if (!DeviceInfoSet || DeviceInfoSet == (HDEVINFO)INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
if (set->magic != SETUP_DEVICE_INFO_SET_MAGIC)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
if (!DeviceInfoData || DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA)
|
||||||
|
|| !DeviceInfoData->Reserved)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
if (Scope != DICS_FLAG_GLOBAL && Scope != DICS_FLAG_CONFIGSPECIFIC)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_FLAGS);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
if (KeyType != DIREG_DEV && KeyType != DIREG_DRV)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_FLAGS);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
devInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
|
||||||
|
if (devInfo->set != set)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
if (Scope != DICS_FLAG_GLOBAL)
|
||||||
|
{
|
||||||
|
RootKey = OpenHardwareProfileKey(set->HKLM, HwProfile, 0);
|
||||||
|
if (RootKey == INVALID_HANDLE_VALUE)
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
RootKey = set->HKLM;
|
||||||
|
switch (KeyType)
|
||||||
|
{
|
||||||
|
case DIREG_DEV:
|
||||||
|
key = SETUPDI_OpenDevKey(RootKey, devInfo, samDesired);
|
||||||
|
break;
|
||||||
|
case DIREG_DRV:
|
||||||
|
key = SETUPDI_OpenDrvKey(RootKey, devInfo, samDesired);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WARN("unknown KeyType %d\n", KeyType);
|
||||||
|
}
|
||||||
|
if (RootKey != set->HKLM)
|
||||||
|
RegCloseKey(RootKey);
|
||||||
|
|
||||||
|
TRACE("Returning 0x%p\n", key);
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetupDiDeleteDevRegKey (SETUPAPI.@)
|
* SetupDiDeleteDevRegKey (SETUPAPI.@)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue