if (!NT_SUCCESS(Status))
{
- *nSize = ReturnSize;
+ *nSize = (ReturnSize - FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data)) / sizeof(WCHAR);
goto failed;
}
if (!lpBuffer || *nSize < (KeyInfo->DataLength / sizeof(WCHAR)))
{
- *nSize = ReturnSize;
+ *nSize = (ReturnSize - FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data)) / sizeof(WCHAR);
Status = STATUS_BUFFER_OVERFLOW;
goto failed;
}
BOOL ret = TRUE;
DWORD HostSize;
+ if ((nSize == NULL) ||
+ (lpBuffer == NULL && *nSize > 0))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
switch (NameType)
{
case ComputerNameNetBIOS:
UNICODE_STRING UnicodeString;
ANSI_STRING AnsiString;
BOOL Result;
- PWCHAR TempBuffer;
+ PWCHAR TempBuffer = NULL;
- if (!lpBuffer)
+ if ((nSize == NULL) ||
+ (lpBuffer == NULL && *nSize > 0))
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
- TempBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, *nSize * sizeof(WCHAR));
- if (!TempBuffer)
+ if (*nSize > 0)
{
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
+ TempBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, *nSize * sizeof(WCHAR));
+ if (!TempBuffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
}
AnsiString.MaximumLength = (USHORT)*nSize;
if (Result)
{
UnicodeString.MaximumLength = (USHORT)*nSize * sizeof(WCHAR) + sizeof(WCHAR);
- UnicodeString.Length = (USHORT)*nSize * sizeof(WCHAR) + sizeof(WCHAR);
+ UnicodeString.Length = (USHORT)*nSize * sizeof(WCHAR);
UnicodeString.Buffer = TempBuffer;
RtlUnicodeStringToAnsiString(&AnsiString,