After some tests, change SetupDiClassNameFromGuidExW and SetupDiGetClassDescriptionExW to match Windows XP behavior

svn path=/trunk/; revision=22300
This commit is contained in:
Hervé Poussineau 2006-06-10 20:51:18 +00:00
parent b76c5a1315
commit 3e3f927b36

View file

@ -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);