CmpLightWeightCommitDeleteValueKeyUoW
VOID __stdcall CmpLightWeightCommitDeleteValueKeyUoW(_CM_KCB_UOW *UoW, _LARGE_INTEGER *CommitTime){
INT64 v2;
UINT64 *PrepareDataPointer;
INT64 v5;
_CM_KEY_CONTROL_BLOCK *KeyControlBlock;
UINT64 KeyHive;
__int64 v9;
UINT64 v10;
_CM_KEY_CONTROL_BLOCK *v11;
unsigned int v12;
int v13;
int v14;
v13 = -1;
PrepareDataPointer = (UINT64 *)UoW->PrepareDataPointer;
v14 = 0;
v5 = v2;
KeyControlBlock = UoW->KeyControlBlock;
KeyHive = (UINT64)KeyControlBlock->KeyHash.KeyHive;
v9 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(KeyHive + 8))(KeyHive, KeyControlBlock->KeyHash.KeyCell, &v13);
CmpFreeValue(KeyHive, UoW->ValueData->OldValueCell);
CmpFreeTransientPoolWithTag(UoW->ValueData, 0x77554D43ui64);
UoW->ValueData = 0i64;
*(_LARGE_INTEGER *)(v9 + 4) = *CommitTime;
UoW->KeyControlBlock->KcbLastWriteTime = *CommitTime;
++UoW->KeyControlBlock->SequenceNumber;
if( *(_DWORD *)PrepareDataPointer == 1 )
{
v10 = *(_QWORD *)(v9 + 36);
*(_QWORD *)(v9 + 36) = *(UINT64 *)((char *)PrepareDataPointer + 4);
*(UINT64 *)((char *)PrepareDataPointer + 4) = v10;
CmpCleanUpKcbCachedSymlink((INT64)UoW->KeyControlBlock, v5);
v11 = UoW->KeyControlBlock;
v12 = *(_DWORD *)(v9 + 40);
v11->ValueList.Count = *(_DWORD *)(v9 + 36);
v11->ValueList.List = v12;
if( !*(_DWORD *)(v9 + 36) )
{
*(_QWORD *)(v9 + 60) = 0i64;
UoW->KeyControlBlock->KcbMaxValueNameLen = 0;
UoW->KeyControlBlock->KcbMaxValueDataLen = 0;
}
}
CmpLightWeightCleanupSetValueKeyUoW(KeyHive, PrepareDataPointer);
UoW->PrepareDataPointer = 0i64;
(*(void(__fastcall **)(UINT64, int *))(KeyHive + 16))(KeyHive, &v13);
}Referenced by:
CmpProcessLightWeightUOW