EtwpProcessEnumCallback
INT64 __fastcall EtwpProcessEnumCallback(_EPROCESS *Process, VOID *Context){
UINT64 *v2;
UINT8 v3;
INT64 *v5;
char v7;
char v8;
__int64 ProcessServerSilo;
_EPROCESS *v10;
char v11;
int v12;
int v13;
int v15;
int v16;
unsigned int v17;
unsigned int i;
__int64 v19;
unsigned int v20;
unsigned int j;
__int64 v22;
__int64 *ServerSiloGlobals;
__int64 v24;
_KAPC_STATE ApcState;
v2 = (UINT64 *)*((_QWORD *)Context + 4);
v3 = *((_BYTE *)Context + 64);
v5 = *(INT64 **)Context;
memset(&ApcState, 0, sizeof(ApcState));
v7 = 0;
v8 = 0;
ProcessServerSilo = PsGetProcessServerSilo((__int64)Process);
if( v2[135] != EtwpHostSiloState )
{
ServerSiloGlobals = PsGetServerSiloGlobals(ProcessServerSilo);
if( ServerSiloGlobals[108] != v24 )
return 0i64;
}
*((_BYTE *)Context + 65) = 0;
if( !(unsigned int)EtwpIsProcessZombie((PEPROCESS)Process) )
{
v11 = 1;
if( Process == PsIdleProcess )
{
v8 = 1;
}
else
{
if( *((_EPROCESS **)KeGetCurrentThread() + 23) == Process )
{
LABEL_7:
*((_BYTE *)Context + 65) = v11;
*((_BYTE *)Context + 67) = v8;
if( v5 )
{
if( v3 )
{
v15 = *(_DWORD *)v5;
if( (*(_DWORD *)v5 & 1) != 0 )
{
EtwpTraceProcessRundown(Process, v2, 0x303u, (INT64)Context);
v15 = *(_DWORD *)v5;
}
if( (v15 & 2) != 0 )
{
if( Process == PsIdleProcess )
{
v17 = KeNumberProcessors_0;
for( i = 0; i < v17; ++i )
{
KeGetPrcb(i);
EtwpThreadEnumCallback(Process, *(_ETHREAD **)(v19 + 24), Context);
}
}
else
{
PsEnumProcessThreads(
(__int64)Process,
(__int64(__fastcall *)(__int64, _QWORD *, __int64))EtwpThreadEnumCallback,
(__int64)Context);
}
}
v16 = *(_DWORD *)v5;
if( (*(_DWORD *)v5 & 0xC004) != 0 )
{
EtwpEnumerateAddressSpace((INT64)Process, (INT64)Context, v5);
v16 = *(_DWORD *)v5;
}
if( (v16 & 4) != 0 && Process == (_EPROCESS *)PsInitialSystemProcess )
EtwpSysModuleRunDown((UINT64)v2, v3);
if( (*((_DWORD *)v5 + 1) & 0x8000000) != 0 )
EtwpEnumerateWorkingSet((__int64)Process, (__int64)Context);
}
else
{
if( (*((_DWORD *)v5 + 1) & 0x8000000) != 0 )
EtwpEnumerateWorkingSet((__int64)Process, (__int64)Context);
v12 = *(_DWORD *)v5;
if( (*(_DWORD *)v5 & 4) != 0 && Process == (_EPROCESS *)PsInitialSystemProcess )
{
EtwpSysModuleRunDown((UINT64)v2, 0);
v12 = *(_DWORD *)v5;
}
if( (v12 & 0xC004) != 0 )
EtwpEnumerateAddressSpace((INT64)Process, (INT64)Context, v5);
if( (v5[2] & 0x40) != 0 && Process != PsIdleProcess )
EtwpObjectHandleRundown(Process, (__int64)Context);
if( (*(_DWORD *)v5 & 2) != 0 )
{
if( Process == PsIdleProcess )
{
v20 = KeNumberProcessors_0;
for( j = 0; j < v20; ++j )
{
KeGetPrcb(j);
EtwpThreadEnumCallback(Process, *(_ETHREAD **)(v22 + 24), Context);
}
}
else
{
PsEnumProcessThreads(
(__int64)Process,
(__int64(__fastcall *)(__int64, _QWORD *, __int64))EtwpThreadEnumCallback,
(__int64)Context);
}
}
v13 = *(_DWORD *)v5;
if( (*(_DWORD *)v5 & 8) != 0 )
{
EtwpProcessPerfCtrsRundown(Process, (UINT64)v2);
v13 = *(_DWORD *)v5;
}
if( (v13 & 1) != 0 )
EtwpTraceProcessRundown(Process, v2, 0x304u, (INT64)Context);
}
}
if( v7 )
{
KiUnstackDetachProcess(&ApcState, 0i64);
ExReleaseRundownProtection((PEX_RUNDOWN_REF)Process + 139);
}
return 0i64;
}
if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)Process + 139) )
{
KiStackAttachProcess((_KPROCESS *)Process, 0i64, &ApcState);
v7 = 1;
goto LABEL_7;
}
}
v11 = 0;
goto LABEL_7;
}
if( v5 && (*(_DWORD *)v5 & 1) != 0 && !v3 )
EtwpTraceProcessRundown(v10, v2, 0x327u, (INT64)Context);
return 0i64;
}Referenced by:
EtwpProcessThreadImageRundown