CmpFreeCallbackObjectContexts
VOID __stdcall CmpFreeCallbackObjectContexts(CM_KEY_BODY *KeyBody){
char v1;
_ETHREAD *CurrentThread;
_LIST_ENTRY *p_ContextListHead;
_LIST_ENTRY *Flink;
PVOID v6;
__int64 v7;
_LIST_ENTRY *v8;
_LIST_ENTRY *v9;
_LIST_ENTRY *Blink;
PVOID *v11;
int v12[8];
PVOID P;
PVOID *p_P;
v1 = 0;
p_P = &P;
P = &P;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 254, 0i64);
p_ContextListHead = &KeyBody->ContextListHead;
while( 1 )
{
Flink = p_ContextListHead->Flink;
if( p_ContextListHead->Flink == p_ContextListHead )
break;
if( Flink->Blink != p_ContextListHead )
goto LABEL_17;
v8 = Flink->Flink;
if( Flink->Flink->Blink != Flink )
goto LABEL_17;
p_ContextListHead->Flink = v8;
v8->Blink = p_ContextListHead;
v9 = Flink[1].Flink;
if( v9->Blink != &Flink[1] )
goto LABEL_17;
Blink = Flink[1].Blink;
if( Blink->Flink != &Flink[1] )
goto LABEL_17;
Blink->Flink = v9;
v9->Blink = Blink;
if( Blink == v9 )
v1 = 1;
v11 = p_P;
if( *p_P != &P )
LABEL_17:
__fastfail(3u);
Flink->Blink = (_LIST_ENTRY *)p_P;
Flink->Flink = (_LIST_ENTRY *)&P;
*v11 = Flink;
p_P = (PVOID *)&Flink->Flink;
}
ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2032, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( v1 )
{
_InterlockedOr(v12, 0);
if( *(&CmpDummyThreadEvent + 255) )
ExfUnblockPushLock((INT64 *)&CmpDummyThreadEvent + 255, 0i64);
}
while( 1 )
{
v6 = P;
if( P == &P )
break;
if( *((PVOID **)P + 1) != &P )
goto LABEL_17;
v7 = *(_QWORD *)P;
if( *(PVOID *)(*(_QWORD *)P + 8i64) != P )
goto LABEL_17;
P = *(PVOID *)P;
*(_QWORD *)(v7 + 8) = &P;
ExFreePoolWithTag(v6, 0x63634D43u);
}
}Referenced by:
CmpDeleteKeyObject