CmpLightWeightPrepareDeleteValueKeyUoW

__int64 __fastcall CmpLightWeightPrepareDeleteValueKeyUoW(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        struct _LOOKASIDE_LIST_EX *a4){
  _CM_UOW_SET_VALUE_LIST_DATA *v4; 
  __int64 v6; 
  UINT64 v7; 
  int v8; 
  __int64 v9; 
  _DWORD *v10; 
  _CM_KEY_VALUE *v11; 
  WCHAR *PoolWithTag; 
  WCHAR *v13; 
  unsigned int v14; 
  INT64 v15; 
  _CM_UOW_SET_VALUE_LIST_DATA *Data; 
  _UNICODE_STRING ValueName; 
  UINT64 a6; 
  UINT64 a5; 
  int v21; 
  int v22; 
  int v23; 
  int v24; 
  v4 = *(_CM_UOW_SET_VALUE_LIST_DATA **)(a1 + 104);
  LODWORD(a5) = 0;
  LODWORD(a6) = 0;
  v24 = 0;
  v22 = 0;
  v6 = *(_QWORD *)(a1 + 48);
  v23 = -1;
  v21 = -1;
  Data = v4;
  v7 = *(_QWORD *)(v6 + 32);
  ValueName = 0i64;
  if( !v4 )
  {
    v8 = CmpLightWeightCreateSetValueData((_CM_KCB_UOW *)a1, &Data);
    if( v8 < 0 )
      return(unsigned int)v8;
    v4 = Data;
    CmpLightWeightUpdateSharedSetValueData(Data, *(_CM_KEY_CONTROL_BLOCK **)(a1 + 48));
    --v4->RefCount;
  }
  CmpAllocateTransientPoolWithTag((_HHIVE *)1, 0x10ui64, 0x77554D43ui64, (_CHILD_LIST *)a4);
  v10 = (_DWORD *)v9;
  if( v9 )
  {
    *(_QWORD *)(v9 + 8) = 0i64;
    *(_DWORD *)v9 = -1;
    *(_DWORD *)(v9 + 4) = -1;
    v11 = (_CM_KEY_VALUE *)(*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v7 + 8))(
                             v7,
                             *(unsigned int *)(a1 + 88),
                             &v23);
    if( v11 )
    {
      PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x8000ui64, 0x62534D43ui64);
      v13 = PoolWithTag;
      if( PoolWithTag
        && (CmpInitializeValueNameString(v11, &ValueName, PoolWithTag),
            CmpFindNameInList(v7, (UINT64 *)&v4->ValueList, (WCHAR **)&ValueName, 0i64, &a5, &a6)) )
      {
        v14 = a6;
        v15 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v7 + 8))(v7, (unsigned int)a6, &v21);
        if( CmpMarkValueDataDirty(v7, v15) && HvMarkCellDirty(v7, v14, 0) )
        {
          v8 = CmpRemoveValueFromList(v7, (unsigned int)a5, (UINT64 *)&v4->ValueList);
          if( v8 >= 0 )
          {
            v10[1] = v14;
            v8 = 0;
            *(_QWORD *)(a1 + 112) = v10;
            v10 = 0i64;
          }
        }
        else
        {
          v8 = -1073741443;
        }
        if( v15 )
          (*(void(__fastcall **)(UINT64, int *))(v7 + 16))(v7, &v21);
      }
      else
      {
        v8 = -1073741670;
      }
      (*(void(__fastcall **)(UINT64, int *))(v7 + 16))(v7, &v23);
      if( v13 )
        ExFreePoolWithTag(v13, 0);
    }
    else
    {
      v8 = -1073741670;
    }
    if( v10 )
      CmpFreeTransientPoolWithTag(v10, 0x77554D43ui64);
  }
  else
  {
    return(unsigned int)-1073741670;
  }
  return(unsigned int)v8;
}

Referenced by:

CmpProcessLightWeightUOW