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