CmpLightWeightPrepareSetValueKeyUoW

__int64 __fastcall CmpLightWeightPrepareSetValueKeyUoW(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        struct _LOOKASIDE_LIST_EX *a4){
  _CM_UOW_SET_VALUE_LIST_DATA *v4; 
  PVOID p_Data; 
  __int64 v7; 
  UINT64 v8; 
  NTSTATUS v9; 
  _DWORD *v10; 
  _WORD *v11; 
  __int64 v12; 
  _CM_KEY_VALUE *v13; 
  unsigned int v14; 
  unsigned int v15; 
  void *PoolWithTag; 
  unsigned int v17; 
  unsigned int v18; 
  INT64 v19; 
  int v20; 
  unsigned int v21; 
  INT64 v23; 
  INT64 v24; 
  unsigned int a6; 
  _CM_UOW_SET_VALUE_LIST_DATA *Data; 
  PVOID P; 
  int v28[2]; 
  int v29[2]; 
  INT64 v30; 
  int v31[2]; 
  INT64 v32; 
  _UNICODE_STRING ValueName; 
  INT64 p_ValueList; 
  char v35; 
  char v36; 
  UINT64 a5; 
  v4 = *(_CM_UOW_SET_VALUE_LIST_DATA **)(a1 + 104);
  LODWORD(a5) = 0;
  a6 = 0;
  p_Data = 0i64;
  v32 = 0i64;
  v31[1] = 0;
  v29[1] = 0;
  v28[1] = 0;
  v7 = *(_QWORD *)(a1 + 48);
  v31[0] = -1;
  v29[0] = -1;
  v30 = 0xFFFFFFFFi64;
  v28[0] = -1;
  v8 = *(_QWORD *)(v7 + 32);
  P = 0i64;
  v35 = 0;
  v36 = 0;
  LOBYTE(p_ValueList) = 0;
  Data = v4;
  ValueName = 0i64;
  if( !v4 )
  {
    v9 = CmpLightWeightCreateSetValueData((_CM_KCB_UOW *)a1, &Data);
    if( v9 < 0 )
      return(unsigned int)v9;
    v4 = Data;
    CmpLightWeightUpdateSharedSetValueData(Data, *(_CM_KEY_CONTROL_BLOCK **)(a1 + 48));
    --v4->RefCount;
  }
  CmpAllocateTransientPoolWithTag((_HHIVE *)1, 0x10ui64, 0x77554D43ui64, (_CHILD_LIST *)a4);
  v11 = v10;
  if( !v10 )
    return(unsigned int)-1073741670;
  *((_QWORD *)v10 + 1) = 0i64;
  *v10 = -1;
  v10[1] = -1;
  v12 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v8 + 8))(v8, *(unsigned int *)(a1 + 92), v31);
  v13 = (_CM_KEY_VALUE *)v12;
  if( v12 )
  {
    v14 = *(_DWORD *)(v12 + 4);
    v15 = v14 + 0x80000000;
    if( v14 < 0x80000000 )
      v15 = v14;
    LODWORD(Data) = v15;
    if( v15 )
    {
      if( v14 >= 0x80000000 )
      {
        p_Data = &v13->Data;
      }
      else
      {
        if( !CmpGetValueData(
                v8,
                *(unsigned int *)(a1 + 92),
                (INT64)v13,
                (UINT64 *)&Data,
                (INT64)&P,
                (INT64)&p_ValueList,
                (INT64)&v30) )
        {
          v9 = -1073741670;
LABEL_34:
          (*(void(__fastcall **)(UINT64, int *))(v8 + 16))(v8, v31);
          goto LABEL_35;
        }
        p_Data = P;
        v15 = (unsigned int)Data;
        v36 = p_ValueList;
        v35 = 1;
      }
    }
    if( !HvMarkCellDirty(v8, *(unsigned int *)(*(_QWORD *)(a1 + 48) + 40i64), 0) )
    {
      v9 = -1073741443;
LABEL_30:
      if( v35 && p_Data )
      {
        if( v36 )
          ExFreePoolWithTag(p_Data, 0);
        else(*(void(__fastcall **)(UINT64, INT64 *))(v8 + 16))(v8, &v30);
      }
      goto LABEL_34;
    }
    Data = (_CM_UOW_SET_VALUE_LIST_DATA *)(*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v8 + 8))(
                                            v8,
                                            *(unsigned int *)(*(_QWORD *)(a1 + 48) + 40i64),
                                            v29);
    *(_DWORD *)(a1 + 72) = *(_DWORD *)(*(_QWORD *)(a1 + 48) + 40i64) >> 31;
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x8000ui64, 0x62534D43ui64);
    P = PoolWithTag;
    if( !PoolWithTag )
    {
      v9 = -1073741670;
LABEL_28:
      if( Data )
        (*(void(__fastcall **)(UINT64, int *))(v8 + 16))(v8, v29);
      goto LABEL_30;
    }
    CmpInitializeValueNameString(v13, &ValueName, (WCHAR *)PoolWithTag);
    p_ValueList = (INT64)&v4->ValueList;
    if( !CmpFindNameInList(v8, (UINT64 *)&v4->ValueList, (WCHAR **)&ValueName, 0i64, &a5, &a6)
      || (LODWORD(v24) = *(_DWORD *)(a1 + 72),
          LODWORD(v23) = v15,
          v17 = CmpAddValueKeyNew((_HHIVE *)v8, &ValueName, v13->Type, p_Data, v23, v24),
          v17 == -1) )
    {
      v9 = -1073741670;
LABEL_27:
      ExFreePoolWithTag(P, 0);
      goto LABEL_28;
    }
    v18 = a6;
    if( a6 != -1 )
    {
      if( HvMarkCellDirty(v8, a6, 0) )
      {
        v19 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v8 + 8))(v8, v18, v28);
        v32 = v19;
        if( v19 )
        {
          if( !CmpMarkValueDataDirty(v8, v19) )
          {
            v9 = -1073741443;
LABEL_23:
            if( v32 )
              (*(void(__fastcall **)(UINT64, int *))(v8 + 16))(v8, v28);
            goto LABEL_25;
          }
          CmpSwapValueInList((_HHIVE *)v8, v17, (unsigned int)a5, (_CHILD_LIST *)p_ValueList);
LABEL_21:
          v9 = v20;
          if( v20 >= 0 )
          {
            v9 = 0;
            v11[4] = ValueName.Length;
            v21 = a6;
            *(_DWORD *)v11 = v17;
            *((_DWORD *)v11 + 1) = v21;
            *((_DWORD *)v11 + 3) = v15;
            *(_QWORD *)(a1 + 112) = v11;
            v11 = 0i64;
            v17 = -1;
          }
          goto LABEL_23;
        }
        v9 = -1073741670;
      }
      else
      {
        v9 = -1073741443;
      }
LABEL_25:
      if( v17 != -1 )
        CmpFreeValue(v8, v17);
      goto LABEL_27;
    }
    v20 = CmpAddValueToList(v8, v17, (unsigned int)a5, *(unsigned int *)(a1 + 72), (UINT64 *)p_ValueList);
    goto LABEL_21;
  }
  v9 = -1073741670;
LABEL_35:
  if( v11 )
    CmpFreeTransientPoolWithTag(v11, 0x77554D43ui64);
  return(unsigned int)v9;
}

Referenced by:

CmpProcessLightWeightUOW