CmpLightWeightPrepareDeleteKeyUoW

__int64 __fastcall CmpLightWeightPrepareDeleteKeyUoW(
        ULONG_PTR *a1,
        __int64 a2,
        __int64 a3,
        struct _LOOKASIDE_LIST_EX *a4){
  ULONG_PTR *v4; 
  UINT64 v7; 
  UINT64 *v8; 
  int ModificationData; 
  int v10; 
  unsigned __int64 v11; 
  _CHILD_LIST *v12; 
  __int64 v13; 
  INT64 v14; 
  INT64 v15; 
  _QWORD *v16; 
  UINT64 *v18; 
  int v19; 
  int v20; 
  v19 = -1;
  v20 = 0;
  v4 = 0i64;
  v7 = *(_QWORD *)(a1[6] + 32);
  v8 = *(UINT64 **)(a1[10] + 104);
  v18 = v8;
  if( v8 )
  {
    ++*(_DWORD *)v8;
LABEL_5:
    v11 = *(unsigned int *)(a1[6] + 40);
    if( !(*(__int64(__fastcall **)(UINT64, unsigned __int64, int *))(v7 + 8))(v7, v11, &v19) )
    {
LABEL_6:
      v10 = -1073741670;
      goto LABEL_18;
    }
    (*(void(__fastcall **)(UINT64, int *))(v7 + 16))(v7, &v19);
    if( !CmpMarkKeyDirty(v7, (unsigned int)v11, 0)
      || !HvMarkCellDirty(v7, *(unsigned int *)(*(_QWORD *)(a1[6] + 72) + 40i64), 0) )
    {
      v10 = -1073741443;
      goto LABEL_18;
    }
    v13 = *(_QWORD *)(a1[6] + 192);
    if( !v13 || *(_QWORD *)(v13 + 32) == v13 + 32 )
      goto LABEL_24;
    CmpAllocateTransientPoolWithTag((_HHIVE *)1, 0x20ui64, 0x31374D43ui64, v12);
    v4 = (ULONG_PTR *)v14;
    if( !v14 )
      goto LABEL_6;
    *(_QWORD *)v14 = 0i64;
    v15 = v14;
    *(_DWORD *)(v14 + 12) = 0;
    *(_QWORD *)(v14 + 24) = 0i64;
    *(_DWORD *)(v14 + 8) = -1073741823;
    v16 = (_QWORD *)(v14 + 16);
    v16[1] = v16;
    *v16 = v16;
    v10 = CmpPrepareDiscardAndReplaceKcbAndUnbackedHigherLayers(a1[6], v15);
    if( v10 >= 0 )
    {
LABEL_24:
      if( CmpRemoveSubKeyFromList((_HHIVE *)v7, (UINT64 *)((char *)v8 + 4 * (v11 >> 31) + 12), (unsigned int)v11) )
      {
        --*((_DWORD *)v8 + (v11 >> 31) + 1);
        v10 = 0;
        a1[13] = (ULONG_PTR)v8;
        a1[14] = (ULONG_PTR)v4;
        return(unsigned int)v10;
      }
      v10 = -1073741670;
    }
    if( v4 )
    {
      CmpCleanupDiscardReplaceContext(v4, a2);
      CmSiFreeMemory((PPRIVILEGE_SET)v4);
    }
    goto LABEL_18;
  }
  ModificationData = CmpLightWeightCreateModificationData((__int64)a1, (unsigned int **)&v18, a3, a4);
  v8 = v18;
  v10 = ModificationData;
  if( ModificationData >= 0 )
    goto LABEL_5;
LABEL_18:
  if( v8 )
    CmpLightWeightCleanupModifyKeyDataUoW(v7, v8);
  return(unsigned int)v10;
}

Referenced by:

CmpProcessLightWeightUOW