NtGetNextProcess
NTSTATUS __stdcall NtGetNextProcess(
VOID *ProcessHandle,
UINT64 DesiredAccess,
UINT64 HandleAttributes,
UINT64 Flags,
VOID **NewProcessHandle){
int v5;
int v6;
char PreviousMode;
unsigned int v9;
__int64 v10;
NTSTATUS result;
int v12;
_LIST_ENTRY *NextProcess;
_EPROCESS *v14;
_ETHREAD *CurrentThread;
_EJOB *CurrentServerSilo;
int v17;
_LIST_ENTRY *v18;
bool v19;
UINT64 Tag;
_KPROCESSOR_MODE Object;
bool v22;
unsigned int DesiredAccessa;
PVOID v24;
VOID *Handle;
_EJOB *v26;
_ETHREAD *v27;
int v28[40];
_AUX_ACCESS_DATA AuxData;
v5 = Flags;
v6 = HandleAttributes;
DesiredAccessa = DesiredAccess;
v24 = 0i64;
memset(v28, 0i64, sizeof(v28));
memset(&AuxData, 0i64, sizeof(AuxData));
Handle = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
v9 = v6 & (PreviousMode != 0 ? 7666 : 73714);
if( PreviousMode )
{
v10 = (__int64)NewProcessHandle;
if( (unsigned __int64)NewProcessHandle >= 0x7FFFFFFF0000i64 )
v10 = 0x7FFFFFFF0000i64;
*(_QWORD *)v10 = *(_QWORD *)v10;
}
*NewProcessHandle = 0i64;
if( (v5 & 0xFFFFFFFE) != 0 )
return -1073741811;
if( !ProcessHandle
|| (LODWORD(Tag) = 1850045264,
result = ObReferenceObjectByHandleWithTag(
ProcessHandle,
0i64,
(_OBJECT_TYPE *)PsProcessType,
PreviousMode,
Tag,
&v24,
0i64),
result >= 0) )
{
v12 = v5 & 1;
if( v12 )
LODWORD(NextProcess) = PsGetPreviousProcess(v24);
else
NextProcess = PsGetNextProcess((_EPROCESS *)v24);
v14 = (_EPROCESS *)NextProcess;
if( !NextProcess )
return -2147483622;
v22 = SeSinglePrivilegeCheck(*(_QWORD *)&SeDebugPrivilege, PreviousMode) != 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v27 = CurrentThread;
CurrentServerSilo = PsGetCurrentServerSilo();
v26 = CurrentServerSilo;
while( 1 )
{
if( (v14->Flags & 0x4000000) != 0 )
goto LABEL_13;
PspLockUnlockProcessExclusive(v14, CurrentThread);
if( (v14->Flags & 0x4000000) != 0 )
break;
LABEL_27:
if( v12 )
LODWORD(v18) = PsGetPreviousProcess(v14);
else
v18 = PsGetNextProcess(v14);
v14 = (_EPROCESS *)v18;
v19 = v18 == 0i64;
CurrentServerSilo = v26;
if( v19 )
{
v17 = -2147483622;
LABEL_21:
if( v14 )
ObfDereferenceObjectWithTag(v14, 0x6E457350ui64);
return v17;
}
}
CurrentServerSilo = v26;
LABEL_13:
if( PsIsProcessInSilo(v14, CurrentServerSilo) )
{
v17 = SeCreateAccessState(
(_ACCESS_STATE *)v28,
&AuxData,
DesiredAccessa,
(_GENERIC_MAPPING *)((char *)PsProcessType + 76));
if( v17 < 0 )
goto LABEL_21;
if( v22 )
{
if( (v28[4] & 0x2000000) != 0 )
v28[5] |= 0x1FFFFFu;
else
v28[5] |= v28[4];
v28[4] = 0;
}
LOBYTE(Object) = PreviousMode;
v17 = ObOpenObjectByPointer(v14, v9, (PACCESS_STATE)v28, 0, (POBJECT_TYPE)PsProcessType, Object, &Handle);
SeDeleteAccessState((_ACCESS_STATE *)v28);
if( v17 >= 0 )
{
*NewProcessHandle = Handle;
goto LABEL_21;
}
if( v17 != -1073741790 )
goto LABEL_21;
CurrentThread = v27;
}
goto LABEL_27;
}
return result;
}Referenced by:
No references.