CmFreezeRegistry
INT64 __stdcall CmFreezeRegistry(UINT64 TimeOutInSeconds){
_ETHREAD *CurrentThread;
int v2;
int v3;
_CMHIVE *i;
_CMHIVE *NextActiveHive;
_CMHIVE *v6;
int v7;
_ETHREAD *v8;
_CMHIVE *j;
_CMHIVE *v10;
EVENT_DESCRIPTOR *v11;
struct _EX_RUNDOWN_REF *v12;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v2 = 0;
v3 = TimeOutInSeconds;
--*((_WORD *)CurrentThread + 242);
if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown) )
{
CmpLockRegistryExclusive();
if( CmpFreezeThawState )
{
v2 = -1073741431;
CmpUnlockRegistry();
}
else
{
for( i = 0i64; ; i = v6 )
{
NextActiveHive = CmpGetNextActiveHive(i);
v6 = NextActiveHive;
if( !NextActiveHive )
break;
if( (*((_DWORD *)NextActiveHive + 40) & 3) == 0 )
{
*(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 4056i64) = *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 112i64);
*(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 4040i64) = *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 148i64);
*(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 4072i64) = *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 128i64);
*(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 112i64) = 0i64;
*(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 148i64) = 0i64;
*(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 128i64) = 0i64;
*(_DWORD *)(*((_QWORD *)NextActiveHive + 8) + 164i64) = 0;
if( (*((_DWORD *)NextActiveHive + 1038) & 0x300) != 256 && !*((_DWORD *)NextActiveHive + 26) )
{
ExAcquirePushLockExclusiveEx((UINT64)NextActiveHive + 80, 0i64);
HvMarkBaseBlockDirty((_HHIVE *)v6);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v6 + 10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)v6 + 10);
KeAbPostRelease((char *)v6 + 80);
}
}
}
v7 = CmFreezeThawTimeoutInSeconds;
CmpFreezeThawState = 1;
if( v3 )
v7 = v3;
KiSetTimerEx((_KTIMER *)CmpFreezeThawTimer, (_LARGE_INTEGER)(-10000000i64 * v7), 0i64, 0, &CmpFreezeThawDpc);
CmpDisableLazyFlush(2ui64);
CmpUnlockRegistry();
v8 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v8 + 242);
for( j = 0i64; ; j = (_CMHIVE *)v12 )
{
v10 = CmpGetNextActiveHive(j);
v12 = (struct _EX_RUNDOWN_REF *)v10;
if( !v10 )
break;
if( (*((_DWORD *)v10 + 40) & 3) == 0 )
{
v2 = CmpFlushHive((ULONG_PTR)v10, 13, v11);
if( v2 < 0 )
{
ExReleaseRundownProtection(v12 + 204);
CmThawRegistry();
v2 = -1073741491;
break;
}
}
}
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
ExReleaseRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
else
{
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return(unsigned int)-1073741431;
}
return(unsigned int)v2;
}Referenced by:
NtFreezeRegistry