NtEnumerateSystemEnvironmentValuesEx
NTSTATUS __stdcall NtEnumerateSystemEnvironmentValuesEx(
UINT64 InformationClass,
VOID *Buffer,
UINT64 *BufferLength,
INT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
unsigned int v10;
NTSTATUS result;
INT8 PreviousMode;
__int64 v13;
unsigned int v14;
_ETHREAD *v15;
NTSTATUS v16;
VOID **LockedBuffer;
char Length[12];
VOID *LockVariable;
_ETHREAD *CurrentThread;
v10 = InformationClass;
memset(Length, 0, sizeof(Length));
LockVariable = 0i64;
if( *(&ExBootDevicesRemovedEvent + 276) != 2 )
return -1073741822;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PreviousMode = CurrentThread->Tcb.PreviousMode;
if( PreviousMode )
{
v13 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)BufferLength < 0x7FFFFFFF0000i64 )
v13 = (__int64)BufferLength;
*(_DWORD *)v13 = *(_DWORD *)v13;
v14 = *(_DWORD *)BufferLength;
*(_DWORD *)Length = *(_DWORD *)BufferLength;
if( !Buffer )
{
*(_DWORD *)Length = 0;
v14 = 0;
}
if( v14 )
ProbeForWrite((UINT64)Buffer, v14, 4i64);
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeSystemEnvironmentPrivilege, PreviousMode) )
return -1073741727;
}
else
{
*(_DWORD *)Length = Buffer != 0i64 ? *(_DWORD *)BufferLength : 0;
}
if( !*(_DWORD *)Length
|| (result = ExLockUserBuffer(
Buffer,
*(unsigned int *)Length,
PreviousMode,
IoWriteAccess,
(VOID **)&Length[4],
&LockVariable),
result >= 0) )
{
v15 = (_ETHREAD *)KeGetCurrentThread();
--v15->Tcb.KernelApcDisable;
ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&WheapDeferredInternalLogsEventLock + 2752));
v16 = IoEnumerateEnvironmentVariablesEx(
(WCHAR *)v10,
0i64,
*(PVOID *)&Length[4],
(UINT64 *)Length,
(UINT64 *)LockedBuffer);
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&WheapDeferredInternalLogsEventLock + 2752));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( LockVariable )
ExUnlockUserBuffer(LockVariable);
*(_DWORD *)BufferLength = *(_DWORD *)Length;
return v16;
}
return result;
}Referenced by:
No references.