NtQuerySystemEnvironmentValue
NTSTATUS __stdcall NtQuerySystemEnvironmentValue(
_UNICODE_STRING *VariableName,
PWCHAR VariableValue,
UINT16 ValueLength,
UINT16 *ReturnLength){
__int64 v7;
unsigned __int16 v8;
wchar_t *v10;
unsigned int v11;
unsigned __int16 v12;
int v13;
void *PoolWithTag;
_ETHREAD *v15;
NTSTATUS EnvironmentVariable;
INT8 v17;
int v18;
INT8 PreviousMode;
UNICODE_STRING UnicodeString;
struct _STRING DestinationString;
unsigned int v22;
int v23;
PVOID P;
_ETHREAD *CurrentThread;
v22 = 0;
*(_QWORD *)&DestinationString.Length = 0i64;
UnicodeString = 0i64;
DestinationString.Buffer = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PreviousMode = *((_BYTE *)CurrentThread + 562);
if( PreviousMode )
{
if( ((unsigned __int8)VariableName & 3) != 0 )
ExRaiseDatatypeMisalignment();
v7 = 0x7FFFFFFF0000i64;
UnicodeString = *VariableName;
v8 = _mm_cvtsi128_si32((__m128i)UnicodeString);
if( !v8 )
return -1073741819;
if( ((__int64)UnicodeString.Buffer & 1) != 0 )
ExRaiseDatatypeMisalignment();
v10 = (wchar_t *)((char *)UnicodeString.Buffer + v8);
if( (unsigned __int64)v10 > 0x7FFFFFFF0000i64 || v10 < UnicodeString.Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
ProbeForWrite(VariableValue, ValueLength, 2ui64);
if( ReturnLength )
{
if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
v7 = (__int64)ReturnLength;
*(_WORD *)v7 = *(_WORD *)v7;
}
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeSystemEnvironmentPrivilege, PreviousMode) )
return -1073741727;
}
else
{
UnicodeString = *VariableName;
}
v11 = RtlxUnicodeStringToAnsiSize(&UnicodeString);
v12 = v11;
v22 = v11;
DestinationString.Buffer = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, v11, 0x72766E45ui64);
if( !DestinationString.Buffer )
return -1073741670;
DestinationString.MaximumLength = v12;
v13 = RtlUnicodeStringToAnsiString(&DestinationString, &UnicodeString, 0);
v23 = v13;
if( v13 >= 0 )
{
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x400ui64, 0x72766E45ui64);
P = PoolWithTag;
if( PoolWithTag )
{
v15 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v15 + 242);
ExAcquireFastMutexUnsafe(&ExpEnvironmentLock);
EnvironmentVariable = HalGetEnvironmentVariable((UINT8 *)DestinationString.Buffer, (UINT8 *)0x400);
ExReleaseFastMutexUnsafe(&ExpEnvironmentLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
ExFreePoolWithTag(DestinationString.Buffer, 0);
if( EnvironmentVariable )
{
ExFreePoolWithTag(PoolWithTag, 0);
return -1073741823;
}
else
{
RtlInitAnsiString(&DestinationString, (PCSZ)PoolWithTag, v17);
UnicodeString.Buffer = VariableValue;
UnicodeString.MaximumLength = ValueLength;
UnicodeString.Length = 0;
v18 = RtlAnsiStringToUnicodeString(&UnicodeString, &DestinationString, 0);
v23 = v18;
if( ReturnLength )
*ReturnLength = UnicodeString.Length;
ExFreePoolWithTag(PoolWithTag, 0);
return v18;
}
}
else
{
ExFreePoolWithTag(DestinationString.Buffer, 0);
return -1073741670;
}
}
else
{
ExFreePoolWithTag(DestinationString.Buffer, 0);
return v13;
}
}Referenced by:
No references.