NtSetSystemEnvironmentValue
NTSTATUS __stdcall NtSetSystemEnvironmentValue(
_UNICODE_STRING *VariableName,
_UNICODE_STRING *VariableValue,
INT64 a3,
INT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
unsigned __int16 v8;
wchar_t *v10;
unsigned __int16 v11;
wchar_t *v12;
unsigned int v13;
unsigned __int16 v14;
int v15;
unsigned int v16;
unsigned __int16 v17;
int v18;
_ETHREAD *CurrentThread;
NTSTATUS v20;
_STRING DestinationString;
_STRING v22;
unsigned int v23;
unsigned int v24;
int v25;
_UNICODE_STRING UnicodeString;
_UNICODE_STRING SourceString[3];
CHAR PreviousMode;
v23 = 0;
v24 = 0;
*(_QWORD *)&DestinationString.Length = 0i64;
*(_QWORD *)&v22.Length = 0i64;
UnicodeString = 0i64;
SourceString[0] = 0i64;
DestinationString.Buffer = 0i64;
v22.Buffer = 0i64;
SourceString[1].Buffer = (wchar_t *)KeGetCurrentThread();
PreviousMode = *((_BYTE *)SourceString[1].Buffer + 562);
if( PreviousMode )
{
if( ((unsigned __int8)VariableName & 3) != 0 )
goto LABEL_20;
UnicodeString = *VariableName;
v8 = _mm_cvtsi128_si32((__m128i)UnicodeString);
if( !v8 )
return -1073741670;
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;
if( ((unsigned __int8)VariableValue & 3) != 0 )
LABEL_20:
ExRaiseDatatypeMisalignment();
SourceString[0] = *VariableValue;
v11 = _mm_cvtsi128_si32((__m128i)SourceString[0]);
if( !v11 )
return -1073741670;
if( ((__int64)SourceString[0].Buffer & 1) != 0 )
ExRaiseDatatypeMisalignment();
v12 = (wchar_t *)((char *)SourceString[0].Buffer + v11);
if( (unsigned __int64)v12 > 0x7FFFFFFF0000i64 || v12 < SourceString[0].Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeSystemEnvironmentPrivilege, PreviousMode) )
return -1073741727;
}
else
{
UnicodeString = *VariableName;
SourceString[0] = *VariableValue;
}
v13 = RtlxUnicodeStringToAnsiSize(&UnicodeString);
v14 = v13;
v23 = v13;
DestinationString.Buffer = (char *)ExAllocatePoolWithTag(0x200ui64, v13, 1920364101i64);
if( !DestinationString.Buffer )
return -1073741670;
DestinationString.MaximumLength = v14;
v15 = RtlUnicodeStringToAnsiString(&DestinationString, &UnicodeString, 0);
v25 = v15;
if( v15 >= 0 )
{
v16 = RtlxUnicodeStringToAnsiSize(SourceString);
v17 = v16;
v24 = v16;
v22.Buffer = (char *)ExAllocatePoolWithTag(0x200ui64, v16, 1920364101i64);
if( v22.Buffer )
{
v22.MaximumLength = v17;
v18 = RtlUnicodeStringToAnsiString(&v22, SourceString, 0);
v25 = v18;
if( v18 >= 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&WheapDeferredInternalLogsEventLock + 2752));
v20 = HalSetEnvironmentVariable(DestinationString.Buffer, v22.Buffer);
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&WheapDeferredInternalLogsEventLock + 2752));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
ExFreePoolWithTag(DestinationString.Buffer, 0);
ExFreePoolWithTag(v22.Buffer, 0);
return v20 != 0 ? 0xC000009A : 0;
}
else
{
ExFreePoolWithTag(DestinationString.Buffer, 0);
ExFreePoolWithTag(v22.Buffer, 0);
return v18;
}
}
else
{
ExFreePoolWithTag(DestinationString.Buffer, 0);
return -1073741670;
}
}
else
{
ExFreePoolWithTag(DestinationString.Buffer, 0);
return v15;
}
}Referenced by:
No references.