NtSetSystemEnvironmentValue
NTSTATUS __stdcall NtSetSystemEnvironmentValue(UNICODE_STRING *VariableName, UNICODE_STRING *VariableValue){
unsigned __int16 v2;
wchar_t *v4;
unsigned __int16 v5;
wchar_t *v6;
unsigned int v7;
unsigned __int16 v8;
int v9;
unsigned int v10;
unsigned __int16 v11;
int v12;
_ETHREAD *v13;
int v14;
struct _STRING DestinationString;
STRING v16;
unsigned int v17;
unsigned int v18;
int v19;
UNICODE_STRING UnicodeString;
UNICODE_STRING SourceString;
_ETHREAD *CurrentThread;
INT8 PreviousMode;
v17 = 0;
v18 = 0;
*(_QWORD *)&DestinationString.Length = 0i64;
*(_QWORD *)&v16.Length = 0i64;
UnicodeString = 0i64;
SourceString = 0i64;
DestinationString.Buffer = 0i64;
v16.Buffer = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PreviousMode = *((_BYTE *)CurrentThread + 562);
if( PreviousMode )
{
if( ((unsigned __int8)VariableName & 3) != 0 )
goto LABEL_20;
UnicodeString = *VariableName;
v2 = _mm_cvtsi128_si32((__m128i)UnicodeString);
if( !v2 )
return -1073741670;
if( ((__int64)UnicodeString.Buffer & 1) != 0 )
ExRaiseDatatypeMisalignment();
v4 = (wchar_t *)((char *)UnicodeString.Buffer + v2);
if( (unsigned __int64)v4 > 0x7FFFFFFF0000i64 || v4 < UnicodeString.Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
if( ((unsigned __int8)VariableValue & 3) != 0 )
LABEL_20:
ExRaiseDatatypeMisalignment();
SourceString = *VariableValue;
v5 = _mm_cvtsi128_si32((__m128i)SourceString);
if( !v5 )
return -1073741670;
if( ((__int64)SourceString.Buffer & 1) != 0 )
ExRaiseDatatypeMisalignment();
v6 = (wchar_t *)((char *)SourceString.Buffer + v5);
if( (unsigned __int64)v6 > 0x7FFFFFFF0000i64 || v6 < SourceString.Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeSystemEnvironmentPrivilege, PreviousMode) )
return -1073741727;
}
else
{
UnicodeString = *VariableName;
SourceString = *VariableValue;
}
v7 = RtlxUnicodeStringToAnsiSize(&UnicodeString);
v8 = v7;
v17 = v7;
DestinationString.Buffer = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, v7, 0x72766E45ui64);
if( !DestinationString.Buffer )
return -1073741670;
DestinationString.MaximumLength = v8;
v9 = RtlUnicodeStringToAnsiString(&DestinationString, &UnicodeString, 0);
v19 = v9;
if( v9 >= 0 )
{
v10 = RtlxUnicodeStringToAnsiSize(&SourceString);
v11 = v10;
v18 = v10;
v16.Buffer = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, v10, 0x72766E45ui64);
if( v16.Buffer )
{
v16.MaximumLength = v11;
v12 = RtlUnicodeStringToAnsiString(&v16, &SourceString, 0);
v19 = v12;
if( v12 >= 0 )
{
v13 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v13 + 242);
ExAcquireFastMutexUnsafe(&ExpEnvironmentLock);
v14 = HalSetEnvironmentVariable(DestinationString.Buffer, v16.Buffer);
ExReleaseFastMutexUnsafe(&ExpEnvironmentLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
ExFreePoolWithTag(DestinationString.Buffer, 0);
ExFreePoolWithTag(v16.Buffer, 0);
return v14 != 0 ? 0xC000009A : 0;
}
else
{
ExFreePoolWithTag(DestinationString.Buffer, 0);
ExFreePoolWithTag(v16.Buffer, 0);
return v12;
}
}
else
{
ExFreePoolWithTag(DestinationString.Buffer, 0);
return -1073741670;
}
}
else
{
ExFreePoolWithTag(DestinationString.Buffer, 0);
return v9;
}
}Referenced by:
No references.