EtwpProcessEnumCallback
NTSTATUS __stdcall EtwpProcessEnumCallback(ULONG_PTR Process, VOID *Context){
UINT64 *v2;
UINT8 v3;
PERFINFO_GROUPMASK *v5;
_EPROCESS *v6;
char v7;
char v8;
_EJOB *v9;
_EPROCESS *v10;
_ETHREAD *v11;
char v12;
PERFINFO_GROUPMASK v13;
PERFINFO_GROUPMASK v14;
PERFINFO_GROUPMASK v16;
PERFINFO_GROUPMASK v17;
unsigned int v18;
unsigned int i;
_KPRCB *Prcb;
unsigned int v21;
unsigned int j;
_KPRCB *v23;
_ESERVERSILO_GLOBALS *ServerSiloGlobals;
_ETW_SILODRIVERSTATE *v25;
_KAPC_STATE ApcState;
v2 = (UINT64 *)*((_QWORD *)Context + 4);
v3 = *((_BYTE *)Context + 64);
v5 = *(PERFINFO_GROUPMASK **)Context;
v6 = *(_EPROCESS **)&Process;
memset(&ApcState, 0, sizeof(ApcState));
v7 = 0;
v8 = 0;
LODWORD(v9) = PsGetProcessServerSilo(*(INT64 *)&Process);
if( v2[135] != EtwpHostSiloState )
{
ServerSiloGlobals = PsGetServerSiloGlobals(v9);
if( ServerSiloGlobals->EtwSiloState != v25 )
return 0;
}
*((_BYTE *)Context + 65) = 0;
if( !(unsigned int)EtwpIsProcessZombie(v6) )
{
v12 = 1;
if( v6 == *(_EPROCESS **)&PsIdleProcess )
{
v8 = 1;
}
else
{
if( KeGetCurrentThread()->ApcState.Process == v6 )
{
LABEL_7:
*((_BYTE *)Context + 65) = v12;
*((_BYTE *)Context + 67) = v8;
if( v5 )
{
if( v3 )
{
v16 = *v5;
if( (*v5 & 1) != 0 )
{
EtwpTraceProcessRundown(v6, v2, 0x303u, (_ETW_RUNDOWN_CONTEXT *)Context);
v16 = *v5;
}
if( (v16 & 2) != 0 )
{
if( v6 == *(_EPROCESS **)&PsIdleProcess )
{
v18 = KeNumberProcessors_0;
for( i = 0; i < v18; ++i )
{
Prcb = KeGetPrcb(i);
EtwpThreadEnumCallback(v6, Prcb->IdleThread, Context);
}
}
else
{
PsEnumProcessThreads(
v6,
(INT64 *)EtwpThreadEnumCallback,
(_EPROCESS *)Context,
v11,
ApcState.ApcListHead[0].Flink,
ApcState.ApcListHead[0].Blink);
}
}
v17 = *v5;
if( (*v5 & 0xC004) != 0 )
{
EtwpEnumerateAddressSpace(v6, (_ETW_RUNDOWN_CONTEXT *)Context, v5);
v17 = *v5;
}
if( (v17 & 4) != 0 && v6 == PsInitialSystemProcess )
EtwpSysModuleRunDown((UINT64)v2, v3);
if( (v5[1] & 0x8000000) != 0 )
EtwpEnumerateWorkingSet(v6, (_ETW_RUNDOWN_CONTEXT *)Context);
}
else
{
if( (v5[1] & 0x8000000) != 0 )
EtwpEnumerateWorkingSet(v6, (_ETW_RUNDOWN_CONTEXT *)Context);
v13 = *v5;
if( (*v5 & 4) != 0 && v6 == PsInitialSystemProcess )
{
EtwpSysModuleRunDown((UINT64)v2, 0);
v13 = *v5;
}
if( (v13 & 0xC004) != 0 )
EtwpEnumerateAddressSpace(v6, (_ETW_RUNDOWN_CONTEXT *)Context, v5);
if( (v5[4] & 0x40) != 0 && v6 != *(_EPROCESS **)&PsIdleProcess )
EtwpObjectHandleRundown(v6, (_ETW_RUNDOWN_CONTEXT *)Context);
if( (*v5 & 2) != 0 )
{
if( v6 == *(_EPROCESS **)&PsIdleProcess )
{
v21 = KeNumberProcessors_0;
for( j = 0; j < v21; ++j )
{
v23 = KeGetPrcb(j);
EtwpThreadEnumCallback(v6, v23->IdleThread, Context);
}
}
else
{
PsEnumProcessThreads(
v6,
(INT64 *)EtwpThreadEnumCallback,
(_EPROCESS *)Context,
v11,
ApcState.ApcListHead[0].Flink,
ApcState.ApcListHead[0].Blink);
}
}
v14 = *v5;
if( (*v5 & 8) != 0 )
{
EtwpProcessPerfCtrsRundown(v6, (UINT64)v2);
v14 = *v5;
}
if( (v14 & 1) != 0 )
EtwpTraceProcessRundown(v6, v2, 0x304u, (_ETW_RUNDOWN_CONTEXT *)Context);
}
}
if( v7 )
{
KiUnstackDetachProcess(&ApcState, 0i64);
ExReleaseRundownProtection(&v6->RundownProtect);
}
return 0;
}
if( ExAcquireRundownProtection(&v6->RundownProtect) )
{
KiStackAttachProcess(v6, 0i64, &ApcState);
v7 = 1;
goto LABEL_7;
}
}
v12 = 0;
goto LABEL_7;
}
if( v5 && (*v5 & 1) != 0 && !v3 )
EtwpTraceProcessRundown(v10, v2, 0x327u, (_ETW_RUNDOWN_CONTEXT *)Context);
return 0;
}Referenced by:
EtwpProcessThreadImageRundown