[KERNEL32]

* Properly check if buffer given to GetComputerName is too small. Fixes hostname.exe if computer name is MAX_COMPUTERNAME_LENGTH long (the default for bootcd since it's generated randomly in Setup).
* Simplify it a bit

svn path=/trunk/; revision=51412
This commit is contained in:
Rafal Harabien 2011-04-20 21:31:41 +00:00
parent be4bb69ef8
commit a861f7c282

View file

@ -39,7 +39,7 @@ BOOL
GetComputerNameFromRegistry(LPWSTR RegistryKey, GetComputerNameFromRegistry(LPWSTR RegistryKey,
LPWSTR ValueNameStr, LPWSTR ValueNameStr,
LPWSTR lpBuffer, LPWSTR lpBuffer,
LPDWORD nSize ) LPDWORD nSize)
{ {
PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; PKEY_VALUE_PARTIAL_INFORMATION KeyInfo;
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
@ -50,7 +50,7 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
ULONG ReturnSize; ULONG ReturnSize;
NTSTATUS Status; NTSTATUS Status;
RtlInitUnicodeString(&KeyName,RegistryKey); RtlInitUnicodeString(&KeyName, RegistryKey);
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
&KeyName, &KeyName,
OBJ_CASE_INSENSITIVE, OBJ_CASE_INSENSITIVE,
@ -75,7 +75,7 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
return FALSE; return FALSE;
} }
RtlInitUnicodeString(&ValueName,ValueNameStr); RtlInitUnicodeString(&ValueName, ValueNameStr);
Status = ZwQueryValueKey(KeyHandle, Status = ZwQueryValueKey(KeyHandle,
&ValueName, &ValueName,
@ -83,35 +83,40 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
KeyInfo, KeyInfo,
KeyInfoSize, KeyInfoSize,
&ReturnSize); &ReturnSize);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
ZwClose(KeyHandle);
*nSize = ReturnSize;
SetLastErrorByStatus(Status);
return FALSE;
}
if (lpBuffer && *nSize > (KeyInfo->DataLength / sizeof(WCHAR)))
{
*nSize = KeyInfo->DataLength / sizeof(WCHAR) - 1;
lpBuffer[*nSize] = 0;
}
else
{
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
ZwClose(KeyHandle);
*nSize = ReturnSize;
SetLastErrorByStatus(STATUS_BUFFER_OVERFLOW);
return FALSE;
}
RtlCopyMemory(lpBuffer, KeyInfo->Data, *nSize * sizeof(WCHAR));
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
ZwClose(KeyHandle); ZwClose(KeyHandle);
if (!NT_SUCCESS(Status))
{
*nSize = ReturnSize;
goto failed;
}
if (KeyInfo->Type != REG_SZ)
{
Status = STATUS_UNSUCCESSFUL;
goto failed;
}
if (!lpBuffer || *nSize < (KeyInfo->DataLength / sizeof(WCHAR)))
{
*nSize = ReturnSize;
Status = STATUS_BUFFER_OVERFLOW;
goto failed;
}
*nSize = KeyInfo->DataLength / sizeof(WCHAR) - 1;
RtlCopyMemory(lpBuffer, KeyInfo->Data, KeyInfo->DataLength);
lpBuffer[*nSize] = 0;
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
return TRUE; return TRUE;
failed:
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
SetLastErrorByStatus(Status);
return FALSE;
} }
/* /*