mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 16:32:57 +00:00
After some tests, change SetupDiClassNameFromGuidExW and SetupDiGetClassDescriptionExW to match Windows XP behavior
svn path=/trunk/; revision=22300
This commit is contained in:
parent
b76c5a1315
commit
3e3f927b36
1 changed files with 75 additions and 46 deletions
|
@ -599,14 +599,25 @@ SetupDiClassNameFromGuidExW(
|
||||||
IN PCWSTR MachineName OPTIONAL,
|
IN PCWSTR MachineName OPTIONAL,
|
||||||
IN PVOID Reserved)
|
IN PVOID Reserved)
|
||||||
{
|
{
|
||||||
HKEY hKey;
|
HKEY hKey = INVALID_HANDLE_VALUE;
|
||||||
DWORD dwLength;
|
DWORD dwLength, dwRegType;
|
||||||
LONG rc;
|
LONG rc;
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
TRACE("%s %p %lu %p %s %p\n", debugstr_guid(ClassGuid), ClassName,
|
TRACE("%s %p %lu %p %s %p\n", debugstr_guid(ClassGuid), ClassName,
|
||||||
ClassNameSize, RequiredSize, debugstr_w(MachineName), Reserved);
|
ClassNameSize, RequiredSize, debugstr_w(MachineName), Reserved);
|
||||||
|
|
||||||
|
if (!ClassGuid)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_CLASS);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
else if (!ClassName && ClassNameSize > 0)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
|
hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
|
||||||
KEY_QUERY_VALUE,
|
KEY_QUERY_VALUE,
|
||||||
DIOCR_INSTALLER,
|
DIOCR_INSTALLER,
|
||||||
|
@ -615,38 +626,39 @@ SetupDiClassNameFromGuidExW(
|
||||||
if (hKey == INVALID_HANDLE_VALUE)
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (RequiredSize != NULL)
|
if (ClassNameSize < sizeof(UNICODE_NULL) || !ClassName)
|
||||||
{
|
|
||||||
dwLength = 0;
|
dwLength = 0;
|
||||||
|
else
|
||||||
|
dwLength = ClassNameSize * sizeof(WCHAR) - sizeof(UNICODE_NULL);
|
||||||
|
|
||||||
rc = RegQueryValueExW(hKey,
|
rc = RegQueryValueExW(hKey,
|
||||||
Class,
|
Class,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
&dwRegType,
|
||||||
NULL,
|
|
||||||
&dwLength);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(rc);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
*RequiredSize = dwLength / sizeof(WCHAR);
|
|
||||||
}
|
|
||||||
|
|
||||||
dwLength = ClassNameSize * sizeof(WCHAR);
|
|
||||||
rc = RegQueryValueExW(hKey,
|
|
||||||
Class,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(LPBYTE)ClassName,
|
(LPBYTE)ClassName,
|
||||||
&dwLength);
|
&dwLength);
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
SetLastError(rc);
|
SetLastError(rc);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
else if (dwRegType != REG_SZ)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_GEN_FAILURE);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RequiredSize)
|
||||||
|
*RequiredSize = dwLength / sizeof(WCHAR) + 1;
|
||||||
|
|
||||||
|
if (ClassNameSize * sizeof(WCHAR) >= dwLength + sizeof(UNICODE_STRING))
|
||||||
|
{
|
||||||
|
if (ClassNameSize > sizeof(UNICODE_NULL))
|
||||||
|
ClassName[ClassNameSize / sizeof(WCHAR)] = UNICODE_NULL;
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (hKey != INVALID_HANDLE_VALUE)
|
if (hKey != INVALID_HANDLE_VALUE)
|
||||||
|
@ -755,12 +767,24 @@ SetupDiGetClassDescriptionExW(
|
||||||
IN PVOID Reserved)
|
IN PVOID Reserved)
|
||||||
{
|
{
|
||||||
HKEY hKey = INVALID_HANDLE_VALUE;
|
HKEY hKey = INVALID_HANDLE_VALUE;
|
||||||
DWORD dwLength;
|
DWORD dwLength, dwRegType;
|
||||||
|
LONG rc;
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
TRACE("%s %p %lu %p %s %p\n", debugstr_guid(ClassGuid), ClassDescription,
|
TRACE("%s %p %lu %p %s %p\n", debugstr_guid(ClassGuid), ClassDescription,
|
||||||
ClassDescriptionSize, RequiredSize, debugstr_w(MachineName), Reserved);
|
ClassDescriptionSize, RequiredSize, debugstr_w(MachineName), Reserved);
|
||||||
|
|
||||||
|
if (!ClassGuid)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
else if (!ClassDescription && ClassDescriptionSize > 0)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
|
hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
|
||||||
KEY_QUERY_VALUE,
|
KEY_QUERY_VALUE,
|
||||||
DIOCR_INSTALLER,
|
DIOCR_INSTALLER,
|
||||||
|
@ -772,34 +796,39 @@ SetupDiGetClassDescriptionExW(
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RequiredSize != NULL)
|
if (ClassDescriptionSize < sizeof(UNICODE_NULL) || !ClassDescription)
|
||||||
{
|
|
||||||
dwLength = 0;
|
dwLength = 0;
|
||||||
if (RegQueryValueExW(hKey,
|
else
|
||||||
NULL,
|
dwLength = ClassDescriptionSize * sizeof(WCHAR) - sizeof(UNICODE_NULL);
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
&dwLength) != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
*RequiredSize = dwLength / sizeof(WCHAR);
|
rc = RegQueryValueExW(hKey,
|
||||||
}
|
|
||||||
|
|
||||||
dwLength = ClassDescriptionSize * sizeof(WCHAR);
|
|
||||||
if (RegQueryValueExW(hKey,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
&dwRegType,
|
||||||
(LPBYTE)ClassDescription,
|
(LPBYTE)ClassDescription,
|
||||||
&dwLength) != ERROR_SUCCESS)
|
&dwLength);
|
||||||
|
if (rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
|
SetLastError(rc);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
else if (dwRegType != REG_SZ)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_GEN_FAILURE);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (RequiredSize)
|
||||||
|
*RequiredSize = dwLength / sizeof(WCHAR) + 1;
|
||||||
|
|
||||||
|
if (ClassDescriptionSize * sizeof(WCHAR) >= dwLength + sizeof(UNICODE_STRING))
|
||||||
|
{
|
||||||
|
if (ClassDescriptionSize > sizeof(UNICODE_NULL))
|
||||||
|
ClassDescription[ClassDescriptionSize / sizeof(WCHAR)] = UNICODE_NULL;
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (hKey != INVALID_HANDLE_VALUE)
|
if (hKey != INVALID_HANDLE_VALUE)
|
||||||
|
@ -1877,7 +1906,7 @@ SetupDiOpenClassRegKeyExW(
|
||||||
rc = RegOpenKeyExW(HKLM,
|
rc = RegOpenKeyExW(HKLM,
|
||||||
lpKeyName,
|
lpKeyName,
|
||||||
0,
|
0,
|
||||||
ClassGuid ? 0 : samDesired,
|
ClassGuid ? KEY_ENUMERATE_SUB_KEYS : samDesired,
|
||||||
&hClassesKey);
|
&hClassesKey);
|
||||||
if (MachineName != NULL)
|
if (MachineName != NULL)
|
||||||
RegCloseKey(HKLM);
|
RegCloseKey(HKLM);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue