CmFreezeRegistry
__int64 __fastcall CmFreezeRegistry(int a1){
_ETHREAD *CurrentThread;
NTSTATUS v2;
_CMHIVE *i;
_CMHIVE *NextActiveHive;
_CMHIVE *v6;
int v7;
_ETHREAD *v8;
_CMHIVE *j;
_CMHIVE *v10;
_EX_RUNDOWN_REF *v11;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v2 = 0;
--CurrentThread->Tcb.KernelApcDisable;
if( ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132) )
{
CmpLockRegistryExclusive();
if( *(&stru_140CF2E80 + 1623) )
{
v2 = -1073741431;
CmpUnlockRegistry();
}
else
{
for( i = 0i64; ; i = v6 )
{
NextActiveHive = CmpGetNextActiveHive(i);
v6 = NextActiveHive;
if( !NextActiveHive )
break;
if( (NextActiveHive->Hive.HiveFlags & 3) == 0 )
{
NextActiveHive->Hive.BaseBlock->ThawRmId = NextActiveHive->Hive.BaseBlock->RmId;
NextActiveHive->Hive.BaseBlock->ThawTmId = NextActiveHive->Hive.BaseBlock->TmId;
NextActiveHive->Hive.BaseBlock->ThawLogId = NextActiveHive->Hive.BaseBlock->LogId;
NextActiveHive->Hive.BaseBlock->RmId = 0i64;
NextActiveHive->Hive.BaseBlock->TmId = 0i64;
NextActiveHive->Hive.BaseBlock->LogId = 0i64;
NextActiveHive->Hive.BaseBlock->GuidSignature = 0;
if( (NextActiveHive->Flags & 0x300) != 256 && !NextActiveHive->Hive.DirtyCount )
{
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&NextActiveHive->Hive.WriterLock, 0i64);
HvMarkBaseBlockDirty(&v6->Hive);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&v6->Hive.WriterLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&v6->Hive.WriterLock);
KeAbPostRelease(&v6->Hive.WriterLock);
}
}
}
v7 = CmFreezeThawTimeoutInSeconds;
*(&stru_140CF2E80 + 1623) = 1;
if( a1 )
v7 = a1;
KiSetTimerEx(
(_KTIMER *)((char *)&CmpDummyThreadEvent + 416),
(_LARGE_INTEGER)(-10000000i64 * v7),
0i64,
0,
(_KDPC *)((char *)&CmpDummyThreadEvent + 544));
CmpDisableLazyFlush(2ui64);
CmpUnlockRegistry();
v8 = (_ETHREAD *)KeGetCurrentThread();
--v8->Tcb.KernelApcDisable;
for( j = 0i64; ; j = (_CMHIVE *)v11 )
{
v10 = CmpGetNextActiveHive(j);
v11 = (_EX_RUNDOWN_REF *)v10;
if( !v10 )
break;
if( (v10->Hive.HiveFlags & 3) == 0 )
{
v2 = CmpFlushHive(v10, 0xDui64);
if( v2 < 0 )
{
ExReleaseRundownProtection(v11 + 204);
CmThawRegistry();
v2 = -1073741491;
break;
}
}
}
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
else
{
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return(unsigned int)-1073741431;
}
return(unsigned int)v2;
}Referenced by:
NtFreezeRegistry