CmpCleanupLightWeightPrepare

VOID __stdcall CmpCleanupLightWeightPrepare(_CM_TRANS *CmTrans, UINT64 CommitSucceeded){
  _LIST_ENTRY *p_KCBUoWListHead; 
  __int64 v3; 
  __int64 v4; 
  UINT64 *v5; 
  int v6; 
  _CMP_DISCARD_AND_REPLACE_KCB_CONTEXT *v7; 
  unsigned int *v8; 
  INT64 v9; 
  LIST_ENTRY *ListIterator; 

  if( CmTrans )
  {
    ListIterator = 0i64;
    p_KCBUoWListHead = &CmTrans->KCBUoWListHead;
    while( 1 )
    {
      while( 1 )
      {
        while( 1 )
        {
          do
          {
            LODWORD(v3) = CmListGetNextElement(p_KCBUoWListHead, &ListIterator, 0i64);
            v4 = v3;
            if( !v3 )
              return;
            v5 = *(UINT64 **)(v3 + 104);
          }
          while( !v5 );
          v6 = *(_DWORD *)(v3 + 68);
          if( !v6 )
          {
LABEL_16:
            CmpFreeKeyByCell(
              *(_QWORD *)(*(_QWORD *)(v4 + 48) + 32i64),
              *(unsigned int *)(*(_QWORD *)(v4 + 48) + 40i64),
              0);
            v5 = *(UINT64 **)(v4 + 104);
            goto LABEL_17;
          }
          if( v6 != 1 )
            break;
LABEL_23:
          *(_QWORD *)(v4 + 104) = 0i64;
        }
        if( v6 != 2 )
          break;
LABEL_17:
        if( v5 )
        {
          CmpLightWeightCleanupModifyKeyDataUoW(*(_QWORD *)(*(_QWORD *)(v4 + 48) + 32i64), v5);
          *(_QWORD *)(v4 + 104) = 0i64;
        }
        v7 = *(_CMP_DISCARD_AND_REPLACE_KCB_CONTEXT **)(v4 + 112);
        if( v7 )
        {
          CmpCleanupDiscardReplaceContext(v7);
          CmSiFreeMemory(*(PPRIVILEGE_SET *)(v4 + 112));
          goto LABEL_21;
        }
      }
      if( v6 == 3 )
        goto LABEL_23;
      if( v6 > 3 )
      {
        if( v6 <= 6 )
        {
          CmpLightWeightCleanupSetValueKeyUoW(*(_QWORD *)(*(_QWORD *)(v4 + 48) + 32i64), v5);
          v8 = *(unsigned int **)(v4 + 112);
          *(_QWORD *)(v4 + 104) = 0i64;
          if( v8 )
          {
            v9 = *v8;
            if( (_DWORD)v9 != -1 )
            {
              CmpFreeValue(*(_QWORD *)(*(_QWORD *)(v4 + 48) + 32i64), v9);
              v8 = *(unsigned int **)(v4 + 112);
            }
            CmpFreeTransientPoolWithTag(v8, 0x77554D43ui64);
LABEL_21:
            *(_QWORD *)(v4 + 112) = 0i64;
          }
        }
        else
        {
          switch( v6 )
          {
            case 9:
              ExFreePoolWithTag(v5, 0x77554D43u);
              goto LABEL_23;
            case 10:
              goto LABEL_23;
            case 12:
              goto LABEL_16;
          }
        }
      }
    }
  }
}

Referenced by:

CmpCommitLightWeightTransaction
CmpPrepareLightWeightTransaction