CmSetLastWriteTimeKey
__int64 __fastcall CmSetLastWriteTimeKey(__int64 *a1, _QWORD *a2){
INT64 v2;
INT64 v5;
char v6;
int started;
INT64 v8;
CM_TRANS *v9;
int v10;
__int64 v11;
__int64 v12;
__int64 v13;
_CM_KCB_UOW *UnitOfWork;
INT64 v16;
INT64 v17[2];
__int128 v18;
int v19;
INT64 v20[2];
CM_TRANS *CmTrans;
_KAPC_STATE ApcState;
CmTrans = 0i64;
v19 = 0;
v2 = 0i64;
v16 = 0xFFFFFFFFi64;
*(_OWORD *)v17 = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
WORD1(v17[0]) = -1;
v18 = 0i64;
*(_OWORD *)v20 = 0i64;
CmpAttachToRegistryProcess(&ApcState);
while( (*(&CmpDummyThreadEvent + 1056) & 1) == 0 )
{
CmpLockRegistry();
v5 = a1[1];
v6 = 1;
if( (*(_DWORD *)(*(_QWORD *)(v5 + 32) + 160i64) & 0x100000) != 0 )
{
started = -1073741790;
goto LABEL_39;
}
started = CmpStartKcbStackForTopLayerKcb((INT64)v17, a1[1]);
if( started < 0 )
goto LABEL_39;
CmpLockKcbStackTopExclusiveRestShared((INT64)v17);
started = CmpPerformKeyBodyDeletionCheck((CM_KEY_BODY *)a1, 0i64);
if( started < 0 )
goto LABEL_36;
if( *(_BYTE *)(v5 + 65) == 1 )
{
started = -1073741790;
goto LABEL_36;
}
if( a1[7] || a1[8] )
{
started = CmpTransSearchAddTransFromKeyBody((_CM_KEY_BODY *)a1, &CmTrans);
if( started < 0 )
goto LABEL_36;
v9 = CmTrans;
started = CmpPerformKeyBodyDeletionCheck((CM_KEY_BODY *)a1, CmTrans);
if( started < 0 )
goto LABEL_36;
if( (*(_DWORD *)(*(_QWORD *)(v5 + 32) + 160i64) & 2) != 0 )
{
started = -1072103423;
goto LABEL_36;
}
if( v9 )
{
UnitOfWork = CmpAllocateUnitOfWork();
v2 = (INT64)UnitOfWork;
if( !UnitOfWork )
{
started = -1073741670;
LABEL_36:
CmpUnlockKcbStack((INT64)v17);
goto LABEL_39;
}
CmpTransEnlistUowInKcb((_CM_KCB_UOW *__ptr32)UnitOfWork, (_CM_KEY_CONTROL_BLOCK *__ptr32)v5);
started = CmpTransEnlistUowInCmTrans((CM_KCB_UOW *)v2, v9);
if( started >= 0 )
{
if( CmpLockIXLockIntent((UINT64 *)(v5 + 248), v2) && CmpLockIXLockExclusive(v5 + 264, v2, 1i64) )
{
*(_DWORD *)(v2 + 68) = 8;
*(_QWORD *)(v2 + 88) = *a2;
started = CmAddLogForAction((CM_KCB_UOW *)v2);
if( started >= 0 )
{
started = 0;
goto LABEL_36;
}
}
else
{
started = -1072103423;
}
}
LABEL_32:
if( v2 )
{
CmpRundownUnitOfWork((PVOID)v2);
CmpFreeUnitOfWork((VOID *)v2);
}
goto LABEL_36;
}
}
v10 = CmpTryAcquireKcbIXLocks(v5, 0, v8, (UINT64 *)v20);
started = v10;
if( v10 == -1073741267 )
{
CmpLogTransactionAbortedForRollbackPacket(v5, 2, (unsigned int *)v20, v11);
CmpUnlockKcbStack((INT64)v17);
CmpCleanupKcbStack((INT64)v17);
*(_OWORD *)v17 = 0i64;
WORD1(v17[0]) = -1;
v18 = 0i64;
CmpUnlockRegistry();
v6 = 0;
started = CmpAbortRollbackPacket((INT64)v20);
if( started < 0 )
goto LABEL_39;
CmpRetryBackOff(&v19);
CmpCleanupRollbackPacket((INT64)v20);
*(_OWORD *)v20 = 0i64;
}
else
{
if( v10 < 0 )
goto LABEL_36;
if( *(_DWORD *)(v5 + 40) != -1 )
{
HvLockHiveFlusherShared(*(_QWORD *)(v5 + 32));
if( HvMarkCellDirty(*(PVOID *)(v5 + 32), (PVOID)*(unsigned int *)(v5 + 40), 0) )
{
*(_QWORD *)(CmpGetKeyNodeForKcb(v5, (INT64)&v16, 1) + 4) = *a2;
v12 = *a2;
v13 = *(_QWORD *)(v5 + 32);
++*(_QWORD *)(v5 + 304);
*(_QWORD *)(v5 + 168) = v12;
(*(void(__fastcall **)(__int64, INT64 *))(v13 + 16))(v13, &v16);
started = 0;
}
else
{
started = -1073741443;
}
HvUnlockHiveFlusherShared(*(_QWORD *)(v5 + 32));
goto LABEL_32;
}
CmpUnlockKcbStack((INT64)v17);
started = CmpPromoteKey((__int64)v17, 0, 0);
if( started < 0 )
goto LABEL_39;
CmpUnlockRegistry();
CmpCleanupKcbStack((INT64)v17);
*(_OWORD *)v17 = 0i64;
WORD1(v17[0]) = -1;
v18 = 0i64;
}
}
started = -1073741431;
v6 = 0;
LABEL_39:
CmpCleanupKcbStack((INT64)v17);
CmpCleanupRollbackPacket((INT64)v20);
if( v6 )
CmpUnlockRegistry();
CmpDetachFromRegistryProcess(&ApcState);
return(unsigned int)started;
}Referenced by:
NtSetInformationKey