mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[SETUPAPI] Replace the remaining internal calls to SetupDiOpenDevRegKey and SetupDiCreateDevRegKeyW by calls to SETUPDI_OpenDrvKey, SETUPDI_CreateDevKey or SETUPDI_CreateDrvKey.
This commit is contained in:
parent
3d3bd4e77e
commit
df36ee9fe2
2 changed files with 218 additions and 173 deletions
|
@ -1414,17 +1414,8 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
|
|||
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||
struct DeviceInfo *deviceInfo;
|
||||
HKEY key = INVALID_HANDLE_VALUE;
|
||||
LPWSTR lpGuidString = NULL;
|
||||
LPWSTR DriverKey = NULL; /* {GUID}\Index */
|
||||
LPWSTR pDeviceInstance; /* Points into DriverKey, on the Index field */
|
||||
DWORD Index; /* Index used in the DriverKey name */
|
||||
DWORD dwSize;
|
||||
DWORD Disposition;
|
||||
DWORD rc;
|
||||
HKEY hHWProfileKey = INVALID_HANDLE_VALUE;
|
||||
HKEY hEnumKey = NULL;
|
||||
HKEY hClassKey = NULL;
|
||||
HKEY hDeviceKey = INVALID_HANDLE_VALUE;
|
||||
HKEY hKey = NULL;
|
||||
HKEY RootKey;
|
||||
|
||||
|
@ -1482,41 +1473,13 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
|
|||
|
||||
if (KeyType == DIREG_DEV)
|
||||
{
|
||||
|
||||
rc = RegCreateKeyExW(
|
||||
RootKey,
|
||||
REGSTR_PATH_SYSTEMENUM,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_CREATE_SUB_KEY,
|
||||
NULL,
|
||||
&hEnumKey,
|
||||
NULL);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
rc = RegCreateKeyExW(
|
||||
hEnumKey,
|
||||
deviceInfo->instanceId,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
#if _WIN32_WINNT >= 0x502
|
||||
KEY_READ | KEY_WRITE,
|
||||
hKey = SETUPDI_CreateDevKey(RootKey, deviceInfo, KEY_READ | KEY_WRITE);
|
||||
#else
|
||||
KEY_ALL_ACCESS,
|
||||
hKey = SETUPDI_CreateDevKey(RootKey, deviceInfo, KEY_ALL_ACCESS);
|
||||
#endif
|
||||
NULL,
|
||||
&hKey,
|
||||
NULL);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
if (hKey == INVALID_HANDLE_VALUE)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (Scope == DICS_FLAG_GLOBAL)
|
||||
{
|
||||
|
@ -1541,123 +1504,13 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
|
|||
}
|
||||
else /* KeyType == DIREG_DRV */
|
||||
{
|
||||
/* Open device key, to read Driver value */
|
||||
hDeviceKey = SETUPDI_OpenDevKey(RootKey, deviceInfo, KEY_QUERY_VALUE | KEY_SET_VALUE);
|
||||
if (hDeviceKey == INVALID_HANDLE_VALUE)
|
||||
goto cleanup;
|
||||
|
||||
rc = RegOpenKeyExW(RootKey, REGSTR_PATH_CLASS_NT, 0, KEY_CREATE_SUB_KEY, &hClassKey);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
rc = RegQueryValueExW(hDeviceKey, REGSTR_VAL_DRIVER, NULL, NULL, NULL, &dwSize);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
/* Create a new driver key */
|
||||
|
||||
if (UuidToStringW((UUID*)&DeviceInfoData->ClassGuid, &lpGuidString) != RPC_S_OK)
|
||||
goto cleanup;
|
||||
|
||||
/* The driver key is in \System\CurrentControlSet\Control\Class\{GUID}\Index */
|
||||
DriverKey = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpGuidString) + 7) * sizeof(WCHAR) + sizeof(UNICODE_NULL));
|
||||
if (!DriverKey)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
DriverKey[0] = '{';
|
||||
strcpyW(&DriverKey[1], lpGuidString);
|
||||
pDeviceInstance = &DriverKey[strlenW(DriverKey)];
|
||||
*pDeviceInstance++ = '}';
|
||||
*pDeviceInstance++ = '\\';
|
||||
|
||||
/* Try all values for Index between 0 and 9999 */
|
||||
Index = 0;
|
||||
while (Index <= 9999)
|
||||
{
|
||||
sprintfW(pDeviceInstance, InstanceKeyFormat, Index);
|
||||
rc = RegCreateKeyExW(hClassKey,
|
||||
DriverKey,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
#if _WIN32_WINNT >= 0x502
|
||||
KEY_READ | KEY_WRITE,
|
||||
hKey = SETUPDI_CreateDrvKey(RootKey, deviceInfo, (UUID*)&DeviceInfoData->ClassGuid, KEY_READ | KEY_WRITE);
|
||||
#else
|
||||
KEY_ALL_ACCESS,
|
||||
hKey = SETUPDI_CreateDrvKey(RootKey, deviceInfo, (UUID*)&DeviceInfoData->ClassGuid, KEY_ALL_ACCESS);
|
||||
#endif
|
||||
NULL,
|
||||
&hKey,
|
||||
&Disposition);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
if (Disposition == REG_CREATED_NEW_KEY)
|
||||
break;
|
||||
RegCloseKey(hKey);
|
||||
hKey = NULL;
|
||||
Index++;
|
||||
}
|
||||
|
||||
if (Index > 9999)
|
||||
{
|
||||
/* Unable to create more than 9999 devices within the same class */
|
||||
SetLastError(ERROR_GEN_FAILURE);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Write the new Driver value */
|
||||
rc = RegSetValueExW(hDeviceKey, REGSTR_VAL_DRIVER, 0, REG_SZ, (const BYTE *)DriverKey, (strlenW(DriverKey) + 1) * sizeof(WCHAR));
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Open the existing driver key */
|
||||
|
||||
DriverKey = HeapAlloc(GetProcessHeap(), 0, dwSize);
|
||||
if (!DriverKey)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
rc = RegQueryValueExW(hDeviceKey, REGSTR_VAL_DRIVER, NULL, NULL, (LPBYTE)DriverKey, &dwSize);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
rc = RegCreateKeyExW(hClassKey,
|
||||
DriverKey,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
#if _WIN32_WINNT >= 0x502
|
||||
KEY_READ | KEY_WRITE,
|
||||
#else
|
||||
KEY_ALL_ACCESS,
|
||||
#endif
|
||||
NULL,
|
||||
&hKey,
|
||||
&Disposition);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
if (hKey == INVALID_HANDLE_VALUE)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Do installation of the specified section */
|
||||
|
@ -1669,17 +1522,8 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
|
|||
key = hKey;
|
||||
|
||||
cleanup:
|
||||
if (lpGuidString)
|
||||
RpcStringFreeW(&lpGuidString);
|
||||
HeapFree(GetProcessHeap(), 0, DriverKey);
|
||||
if (hHWProfileKey != INVALID_HANDLE_VALUE)
|
||||
RegCloseKey(hHWProfileKey);
|
||||
if (hEnumKey != NULL)
|
||||
RegCloseKey(hEnumKey);
|
||||
if (hClassKey != NULL)
|
||||
RegCloseKey(hClassKey);
|
||||
if (hDeviceKey != INVALID_HANDLE_VALUE)
|
||||
RegCloseKey(hDeviceKey);
|
||||
if (hKey != NULL && hKey != key)
|
||||
RegCloseKey(hKey);
|
||||
|
||||
|
@ -4315,7 +4159,6 @@ BOOL WINAPI SetupDiCallClassInstaller(
|
|||
|
||||
if (CanHandle & DEVICE_COINSTALLER)
|
||||
{
|
||||
// hKey = SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_QUERY_VALUE);
|
||||
hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM, (struct DeviceInfo *)DeviceInfoData->Reserved, KEY_QUERY_VALUE);
|
||||
if (hKey != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
|
@ -5218,8 +5061,10 @@ SetupDiChangeState(
|
|||
IN HDEVINFO DeviceInfoSet,
|
||||
IN OUT PSP_DEVINFO_DATA DeviceInfoData)
|
||||
{
|
||||
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||
struct DeviceInfo *deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
|
||||
PSP_PROPCHANGE_PARAMS PropChange;
|
||||
HKEY hKey = INVALID_HANDLE_VALUE;
|
||||
HKEY hRootKey = INVALID_HANDLE_VALUE, hKey = INVALID_HANDLE_VALUE;
|
||||
LPCWSTR RegistryValueName;
|
||||
DWORD dwConfigFlags, dwLength, dwRegType;
|
||||
LONG rc;
|
||||
|
@ -5247,10 +5092,19 @@ SetupDiChangeState(
|
|||
case DICS_ENABLE:
|
||||
case DICS_DISABLE:
|
||||
{
|
||||
if (PropChange->Scope == DICS_FLAG_GLOBAL)
|
||||
hRootKey = set->HKLM;
|
||||
else /* PropChange->Scope == DICS_FLAG_CONFIGSPECIFIC */
|
||||
{
|
||||
hRootKey = OpenHardwareProfileKey(set->HKLM, PropChange->HwProfile, KEY_CREATE_SUB_KEY);
|
||||
if (hRootKey == INVALID_HANDLE_VALUE)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Enable/disable device in registry */
|
||||
hKey = SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, PropChange->Scope, PropChange->HwProfile, DIREG_DEV, KEY_QUERY_VALUE | KEY_SET_VALUE);
|
||||
hKey = SETUPDI_OpenDrvKey(hRootKey, deviceInfo, KEY_QUERY_VALUE | KEY_SET_VALUE);
|
||||
if (hKey == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND)
|
||||
hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData, PropChange->Scope, PropChange->HwProfile, DIREG_DEV, NULL, NULL);
|
||||
hKey = SETUPDI_CreateDevKey(hRootKey, deviceInfo, KEY_QUERY_VALUE | KEY_SET_VALUE);
|
||||
if (hKey == INVALID_HANDLE_VALUE)
|
||||
break;
|
||||
dwLength = sizeof(DWORD);
|
||||
|
@ -5315,6 +5169,9 @@ SetupDiChangeState(
|
|||
}
|
||||
|
||||
cleanup:
|
||||
if (hRootKey != INVALID_HANDLE_VALUE && hRootKey != set->HKLM)
|
||||
RegCloseKey(hRootKey);
|
||||
|
||||
if (hKey != INVALID_HANDLE_VALUE)
|
||||
RegCloseKey(hKey);
|
||||
|
||||
|
@ -5344,6 +5201,8 @@ SetupDiRegisterCoDeviceInstallers(
|
|||
IN HDEVINFO DeviceInfoSet,
|
||||
IN PSP_DEVINFO_DATA DeviceInfoData)
|
||||
{
|
||||
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||
struct DeviceInfo *deviceInfo;
|
||||
BOOL ret = FALSE; /* Return value */
|
||||
|
||||
TRACE("%p %p\n", DeviceInfoSet, DeviceInfoData);
|
||||
|
@ -5390,14 +5249,20 @@ SetupDiRegisterCoDeviceInstallers(
|
|||
goto cleanup;
|
||||
lstrcatW(SectionName, DotCoInstallers);
|
||||
|
||||
deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
|
||||
|
||||
/* Open/Create driver key information */
|
||||
#if _WIN32_WINNT >= 0x502
|
||||
hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM, (struct DeviceInfo *)DeviceInfoData->Reserved, KEY_READ | KEY_WRITE);
|
||||
hKey = SETUPDI_OpenDrvKey(set->HKLM, deviceInfo, KEY_READ | KEY_WRITE);
|
||||
#else
|
||||
hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM, (struct DeviceInfo *)DeviceInfoData->Reserved, KEY_ALL_ACCESS);
|
||||
hKey = SETUPDI_OpenDrvKey(set->HKLM, deviceInfo, KEY_ALL_ACCESS);
|
||||
#endif
|
||||
if (hKey == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND)
|
||||
hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL);
|
||||
#if _WIN32_WINNT >= 0x502
|
||||
hKey = SETUPDI_CreateDrvKey(set->HKLM, deviceInfo, (UUID*)&DeviceInfoData->ClassGuid, KEY_READ | KEY_WRITE);
|
||||
#else
|
||||
hKey = SETUPDI_CreateDrvKey(set->HKLM, deviceInfo, (UUID*)&DeviceInfoData->ClassGuid, KEY_ALL_ACCESS);
|
||||
#endif
|
||||
if (hKey == INVALID_HANDLE_VALUE)
|
||||
goto cleanup;
|
||||
|
||||
|
@ -5490,6 +5355,8 @@ SetupDiInstallDevice(
|
|||
IN HDEVINFO DeviceInfoSet,
|
||||
IN OUT PSP_DEVINFO_DATA DeviceInfoData)
|
||||
{
|
||||
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||
struct DeviceInfo *deviceInfo;
|
||||
SP_DEVINSTALL_PARAMS_W InstallParams;
|
||||
struct DriverInfoElement *SelectedDriver;
|
||||
SYSTEMTIME DriverDate;
|
||||
|
@ -5633,14 +5500,20 @@ SetupDiInstallDevice(
|
|||
strcpyW(SelectedDriver->Details.InfFileName, NewFileName);
|
||||
}
|
||||
|
||||
deviceInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
|
||||
|
||||
/* Open/Create driver key information */
|
||||
#if _WIN32_WINNT >= 0x502
|
||||
hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM, (struct DeviceInfo *)DeviceInfoData->Reserved, KEY_READ | KEY_WRITE);
|
||||
hKey = SETUPDI_OpenDrvKey(set->HKLM, deviceInfo, KEY_READ | KEY_WRITE);
|
||||
#else
|
||||
hKey = SETUPDI_OpenDrvKey(((struct DeviceInfoSet *)DeviceInfoSet)->HKLM, (struct DeviceInfo *)DeviceInfoData->Reserved, KEY_ALL_ACCESS);
|
||||
hKey = SETUPDI_OpenDrvKey(set->HKLM, deviceInfo, KEY_ALL_ACCESS);
|
||||
#endif
|
||||
if (hKey == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND)
|
||||
hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL);
|
||||
#if _WIN32_WINNT >= 0x502
|
||||
hKey = SETUPDI_CreateDrvKey(set->HKLM, deviceInfo, (UUID*)&DeviceInfoData->ClassGuid, KEY_READ | KEY_WRITE);
|
||||
#else
|
||||
hKey = SETUPDI_CreateDrvKey(set->HKLM, deviceInfo, (UUID*)&DeviceInfoData->ClassGuid, KEY_ALL_ACCESS);
|
||||
#endif
|
||||
if (hKey == INVALID_HANDLE_VALUE)
|
||||
goto cleanup;
|
||||
|
||||
|
@ -5780,6 +5653,176 @@ cleanup:
|
|||
return ret;
|
||||
}
|
||||
|
||||
HKEY SETUPDI_CreateDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired)
|
||||
{
|
||||
HKEY enumKey, key = INVALID_HANDLE_VALUE;
|
||||
LONG l;
|
||||
|
||||
l = RegCreateKeyExW(RootKey, REGSTR_PATH_SYSTEMENUM, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, NULL, &enumKey, NULL);
|
||||
if (!l)
|
||||
{
|
||||
l = RegCreateKeyExW(enumKey, devInfo->instanceId, 0, NULL, REG_OPTION_NON_VOLATILE, samDesired, NULL, &key, NULL);
|
||||
RegCloseKey(enumKey);
|
||||
}
|
||||
if (l)
|
||||
SetLastError(l);
|
||||
return key;
|
||||
}
|
||||
|
||||
HKEY SETUPDI_CreateDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, UUID *ClassGuid, REGSAM samDesired)
|
||||
{
|
||||
HKEY key = INVALID_HANDLE_VALUE;
|
||||
LPWSTR lpGuidString = NULL;
|
||||
LPWSTR DriverKey = NULL; /* {GUID}\Index */
|
||||
LPWSTR pDeviceInstance; /* Points into DriverKey, on the Index field */
|
||||
DWORD Index; /* Index used in the DriverKey name */
|
||||
DWORD dwSize;
|
||||
DWORD Disposition;
|
||||
DWORD rc;
|
||||
HKEY hHWProfileKey = INVALID_HANDLE_VALUE;
|
||||
HKEY hEnumKey = NULL;
|
||||
HKEY hClassKey = NULL;
|
||||
HKEY hDeviceKey = INVALID_HANDLE_VALUE;
|
||||
HKEY hKey = NULL;
|
||||
|
||||
/* Open device key, to read Driver value */
|
||||
hDeviceKey = SETUPDI_OpenDevKey(RootKey, devInfo, KEY_QUERY_VALUE | KEY_SET_VALUE);
|
||||
if (hDeviceKey == INVALID_HANDLE_VALUE)
|
||||
goto cleanup;
|
||||
|
||||
rc = RegOpenKeyExW(RootKey, REGSTR_PATH_CLASS_NT, 0, KEY_CREATE_SUB_KEY, &hClassKey);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
rc = RegQueryValueExW(hDeviceKey, REGSTR_VAL_DRIVER, NULL, NULL, NULL, &dwSize);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
/* Create a new driver key */
|
||||
|
||||
if (UuidToStringW(ClassGuid, &lpGuidString) != RPC_S_OK)
|
||||
goto cleanup;
|
||||
|
||||
/* The driver key is in \System\CurrentControlSet\Control\Class\{GUID}\Index */
|
||||
DriverKey = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpGuidString) + 7) * sizeof(WCHAR) + sizeof(UNICODE_NULL));
|
||||
if (!DriverKey)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
DriverKey[0] = '{';
|
||||
strcpyW(&DriverKey[1], lpGuidString);
|
||||
pDeviceInstance = &DriverKey[strlenW(DriverKey)];
|
||||
*pDeviceInstance++ = '}';
|
||||
*pDeviceInstance++ = '\\';
|
||||
|
||||
/* Try all values for Index between 0 and 9999 */
|
||||
Index = 0;
|
||||
while (Index <= 9999)
|
||||
{
|
||||
sprintfW(pDeviceInstance, InstanceKeyFormat, Index);
|
||||
rc = RegCreateKeyExW(hClassKey,
|
||||
DriverKey,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
#if _WIN32_WINNT >= 0x502
|
||||
KEY_READ | KEY_WRITE,
|
||||
#else
|
||||
KEY_ALL_ACCESS,
|
||||
#endif
|
||||
NULL,
|
||||
&hKey,
|
||||
&Disposition);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
if (Disposition == REG_CREATED_NEW_KEY)
|
||||
break;
|
||||
RegCloseKey(hKey);
|
||||
hKey = NULL;
|
||||
Index++;
|
||||
}
|
||||
|
||||
if (Index > 9999)
|
||||
{
|
||||
/* Unable to create more than 9999 devices within the same class */
|
||||
SetLastError(ERROR_GEN_FAILURE);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Write the new Driver value */
|
||||
rc = RegSetValueExW(hDeviceKey, REGSTR_VAL_DRIVER, 0, REG_SZ, (const BYTE *)DriverKey, (strlenW(DriverKey) + 1) * sizeof(WCHAR));
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Open the existing driver key */
|
||||
|
||||
DriverKey = HeapAlloc(GetProcessHeap(), 0, dwSize);
|
||||
if (!DriverKey)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
rc = RegQueryValueExW(hDeviceKey, REGSTR_VAL_DRIVER, NULL, NULL, (LPBYTE)DriverKey, &dwSize);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
rc = RegCreateKeyExW(hClassKey,
|
||||
DriverKey,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
#if _WIN32_WINNT >= 0x502
|
||||
KEY_READ | KEY_WRITE,
|
||||
#else
|
||||
KEY_ALL_ACCESS,
|
||||
#endif
|
||||
NULL,
|
||||
&hKey,
|
||||
&Disposition);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
key = hKey;
|
||||
|
||||
cleanup:
|
||||
if (lpGuidString)
|
||||
RpcStringFreeW(&lpGuidString);
|
||||
HeapFree(GetProcessHeap(), 0, DriverKey);
|
||||
if (hHWProfileKey != INVALID_HANDLE_VALUE)
|
||||
RegCloseKey(hHWProfileKey);
|
||||
if (hEnumKey != NULL)
|
||||
RegCloseKey(hEnumKey);
|
||||
if (hClassKey != NULL)
|
||||
RegCloseKey(hClassKey);
|
||||
if (hDeviceKey != INVALID_HANDLE_VALUE)
|
||||
RegCloseKey(hDeviceKey);
|
||||
if (hKey != NULL && hKey != key)
|
||||
RegCloseKey(hKey);
|
||||
|
||||
TRACE("Returning 0x%p\n", hKey);
|
||||
return hKey;
|
||||
}
|
||||
|
||||
HKEY SETUPDI_OpenDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired)
|
||||
{
|
||||
HKEY enumKey, key = INVALID_HANDLE_VALUE;
|
||||
|
|
|
@ -312,6 +312,8 @@ SETUP_CreateDevicesList(
|
|||
IN CONST GUID *Class OPTIONAL,
|
||||
IN PCWSTR Enumerator OPTIONAL);
|
||||
|
||||
HKEY SETUPDI_CreateDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired);
|
||||
HKEY SETUPDI_CreateDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, UUID *ClassGuid, REGSAM samDesired);
|
||||
HKEY SETUPDI_OpenDevKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired);
|
||||
HKEY SETUPDI_OpenDrvKey(HKEY RootKey, struct DeviceInfo *devInfo, REGSAM samDesired);
|
||||
|
||||
|
|
Loading…
Reference in a new issue