EtwpTrackGuidEntryRegistrations
NTSTATUS __fastcall EtwpTrackGuidEntryRegistrations(_WMI_LOGGER_CONTEXT *LoggerContext, _EX_PUSH_LOCK *a2, CHAR a3){
_ETHREAD *CurrentThread;
ULONG_PTR v7;
_EX_PUSH_LOCK *v8;
unsigned int v9;
_EX_PUSH_LOCK *i;
_ETHREAD *v11;
_EX_PUSH_LOCK *v12;
INT64 bf_0;
INT64 v14;
_EJOB *v15;
_EJOB *v16;
_KAPC_STATE ApcState;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v7 = (_DWORD)a2 + 408;
ExAcquirePushLockExclusiveEx(a2 + 51, 0i64);
v8 = a2 + 16;
a2[52]._bf_0 = (__int64)KeGetCurrentThread();
v9 = 0;
while( !LODWORD(v8->_bf_0) || HIWORD(v8->Ptr) != LoggerContext->LoggerId )
{
++v9;
v8 += 4;
if( v9 >= 8 )
goto LABEL_18;
}
for( i = (_EX_PUSH_LOCK *)a2[7]._bf_0; i != &a2[7]; i = (_EX_PUSH_LOCK *)i->_bf_0 )
{
if( a3 == 2 )
{
v11 = (_ETHREAD *)KeGetCurrentThread();
v12 = i - 2;
--v11->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(i[2]._bf_0 + 408), 0i64);
*(_QWORD *)(i[2]._bf_0 + 416) = KeGetCurrentThread();
}
else
{
v12 = i;
}
if( (v12[12].Value & 0x10000) != 0 )
{
EtwpProviderArrivalCallback(LoggerContext, 0, (_ETW_REG_ENTRY *)v12);
}
else if( ExAcquireRundownProtection((_EX_RUNDOWN_REF *)(v12[10]._bf_0 + 1112)) )
{
bf_0 = v12[10]._bf_0;
memset(&ApcState, 0, sizeof(ApcState));
LODWORD(v14) = PsGetProcessServerSilo(bf_0);
LODWORD(v15) = PsAttachSiloToCurrentThread(v14);
v16 = v15;
KiStackAttachProcess(v12[10].Ptr, 0i64, &ApcState);
EtwpProviderArrivalCallback(LoggerContext, 1, (_ETW_REG_ENTRY *)v12);
KiUnstackDetachProcess(&ApcState, 0i64);
PsDetachSiloFromCurrentThread(v16);
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)(v12[10]._bf_0 + 1112));
}
if( a3 == 2 )
{
*(_QWORD *)(v12[4]._bf_0 + 416) = 0i64;
ExReleasePushLockEx(v12[4]._bf_0 + 408, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
}
LABEL_18:
a2[52]._bf_0 = 0i64;
ExReleasePushLockEx(v7, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return 0;
}Referenced by:
EtwpSetProviderBinaryTracking