[KERNEL32]

Properly fix GetEnvironmentVariableW and set error in case of RtlInitUnicodeStringEx failure

svn path=/trunk/; revision=54459
This commit is contained in:
Pierre Schweitzer 2011-11-20 17:00:39 +00:00
parent c1f9c89d62
commit 37bc0a5a08

View file

@ -182,24 +182,28 @@ GetEnvironmentVariableW(IN LPCWSTR lpName,
UniSize = UNICODE_STRING_MAX_BYTES - sizeof(UNICODE_NULL); UniSize = UNICODE_STRING_MAX_BYTES - sizeof(UNICODE_NULL);
} }
RtlInitEmptyUnicodeString(&VarValue, lpBuffer, UniSize);
Status = RtlInitUnicodeStringEx(&VarName, lpName); Status = RtlInitUnicodeStringEx(&VarName, lpName);
if (NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
Status = RtlQueryEnvironmentVariable_U(NULL, &VarName, &VarValue); BaseSetLastNTError(Status);
if (!NT_SUCCESS(Status)) return 0;
{
if (Status == STATUS_BUFFER_TOO_SMALL)
{
return (VarValue.Length / sizeof(WCHAR)) + sizeof(ANSI_NULL);
}
BaseSetLastNTError (Status);
return 0;
}
lpBuffer[VarValue.Length / sizeof(WCHAR)] = UNICODE_NULL;
} }
RtlInitEmptyUnicodeString(&VarValue, lpBuffer, UniSize);
Status = RtlQueryEnvironmentVariable_U(NULL, &VarName, &VarValue);
if (!NT_SUCCESS(Status))
{
if (Status == STATUS_BUFFER_TOO_SMALL)
{
return (VarValue.Length / sizeof(WCHAR)) + sizeof(ANSI_NULL);
}
BaseSetLastNTError (Status);
return 0;
}
lpBuffer[VarValue.Length / sizeof(WCHAR)] = UNICODE_NULL;
return (VarValue.Length / sizeof(WCHAR)); return (VarValue.Length / sizeof(WCHAR));
} }