CmpLightWeightCommitSetValueKeyUoW

VOID __stdcall CmpLightWeightCommitSetValueKeyUoW(_CM_KCB_UOW *UoW, _LARGE_INTEGER *CommitTime){
  INT64 v2; 
  UINT64 *PrepareDataPointer; 
  INT64 v5; 
  _CM_KEY_CONTROL_BLOCK *KeyControlBlock; 
  UINT64 KeyHive; 
  __int64 v9; 
  _CM_UOW_SET_VALUE_KEY_DATA *ValueData; 
  unsigned int NameLength; 
  unsigned int DataSize; 
  _CM_UOW_SET_VALUE_KEY_DATA *v13; 
  INT64 OldValueCell; 
  UINT64 v15; 
  _CM_KEY_CONTROL_BLOCK *v16; 
  unsigned int v17; 
  int v18; 
  int v19; 

  v18 = -1;
  PrepareDataPointer = (UINT64 *)UoW->PrepareDataPointer;
  v19 = 0;
  v5 = v2;
  KeyControlBlock = UoW->KeyControlBlock;
  KeyHive = (UINT64)KeyControlBlock->KeyHash.KeyHive;
  v9 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(KeyHive + 8))(KeyHive, KeyControlBlock->KeyHash.KeyCell, &v18);
  ValueData = UoW->ValueData;
  NameLength = ValueData->NameLength;
  if( *(_DWORD *)(v9 + 60) < NameLength )
  {
    *(_DWORD *)(v9 + 60) = NameLength;
    UoW->KeyControlBlock->KcbMaxValueNameLen = UoW->ValueData->NameLength;
    ValueData = UoW->ValueData;
  }
  DataSize = ValueData->DataSize;
  if( *(_DWORD *)(v9 + 64) < DataSize )
  {
    *(_DWORD *)(v9 + 64) = DataSize;
    UoW->KeyControlBlock->KcbMaxValueDataLen = UoW->ValueData->DataSize;
  }
  *(_LARGE_INTEGER *)(v9 + 4) = *CommitTime;
  UoW->KeyControlBlock->KcbLastWriteTime = *CommitTime;
  ++UoW->KeyControlBlock->SequenceNumber;
  v13 = UoW->ValueData;
  OldValueCell = v13->OldValueCell;
  if( (_DWORD)OldValueCell != -1 )
  {
    CmpFreeValue(KeyHive, OldValueCell);
    v13 = UoW->ValueData;
  }
  CmpFreeTransientPoolWithTag(v13, 0x77554D43ui64);
  UoW->ValueData = 0i64;
  if( *(_DWORD *)PrepareDataPointer == 1 )
  {
    v15 = *(_QWORD *)(v9 + 36);
    *(_QWORD *)(v9 + 36) = *(UINT64 *)((char *)PrepareDataPointer + 4);
    *(UINT64 *)((char *)PrepareDataPointer + 4) = v15;
    CmpCleanUpKcbCachedSymlink((INT64)UoW->KeyControlBlock, v5);
    v16 = UoW->KeyControlBlock;
    v17 = *(_DWORD *)(v9 + 40);
    v16->ValueList.Count = *(_DWORD *)(v9 + 36);
    v16->ValueList.List = v17;
  }
  CmpLightWeightCleanupSetValueKeyUoW(KeyHive, PrepareDataPointer);
  UoW->PrepareDataPointer = 0i64;
  (*(void(__fastcall **)(UINT64, int *))(KeyHive + 16))(KeyHive, &v18);
}

Referenced by:

CmpProcessLightWeightUOW