CmpTransMgrSyncHive
NTSTATUS __stdcall CmpTransMgrSyncHive(_CMHIVE *CmHive){
volatile signed __int64 *v2;
char v3;
EVENT_DESCRIPTOR *v4;
NTSTATUS v5;
CHAR v7;
char v8;
CmpLockRegistry();
v2 = (volatile signed __int64 *)((char *)CmHive + 72);
ExAcquirePushLockExclusiveEx((UINT64)CmHive + 72, 0i64);
if( (*(_DWORD *)(*((_QWORD *)CmHive + 8) + 144i64) & 1) != 0 )
goto LABEL_2;
ExAcquirePushLockExclusiveEx((UINT64)CmHive + 80, 0i64);
v7 = HvpMarkDirty((INT64)CmHive, 0i64, 32i64);
v8 = _InterlockedExchangeAdd64((volatile signed __int64 *)CmHive + 10, 0xFFFFFFFFFFFFFFFFui64);
if( (v8 & 2) != 0 && (v8 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)CmHive + 10);
KeAbPostRelease((char *)CmHive + 80);
if( v7 )
{
*(_DWORD *)(*((_QWORD *)CmHive + 8) + 144i64) |= 1u;
LABEL_2:
v3 = _InterlockedExchangeAdd64(v2, 0xFFFFFFFFFFFFFFFFui64);
if( (v3 & 2) != 0 && (v3 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)CmHive + 9);
KeAbPostRelease((char *)CmHive + 72);
CmpUnlockRegistry();
v5 = CmpFlushHive((ULONG_PTR)CmHive, 0, v4);
if( v5 < 0 )
return -1073741670;
return v5;
}
v5 = -1073741670;
if( (_InterlockedExchangeAdd64(v2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v2);
KeAbPostRelease((PVOID)v2);
CmpUnlockRegistry();
return v5;
}Referenced by:
CmpTransMgrCommit
CmpTransMgrPrepare