CmpFreeAllMemory
VOID *CmpFreeAllMemory(){
unsigned int v0;
char v1;
_CMHIVE *NextActiveHive;
int KcbCacheTableSize;
int v4;
_CM_KEY_HASH_TABLE_ENTRY *KcbCacheTable;
_CM_KEY_HASH **p_Entry;
__int64 v7;
_CM_KEY_HASH *i;
char v9;
_LIST_ENTRY *Flink;
_LIST_ENTRY *j;
char v12;
UINT64 Count;
_KAPC_STATE ApcState;
memset(&ApcState, 0, sizeof(ApcState));
v0 = 0;
v1 = 0;
NextActiveHive = CmpGetNextActiveHive(0i64);
if( NextActiveHive )
{
do
{
KcbCacheTableSize = NextActiveHive->KcbCacheTableSize;
v4 = 0;
KcbCacheTable = NextActiveHive->KcbCacheTable;
LODWORD(Count) = 0;
if( KcbCacheTableSize > 0 )
{
p_Entry = &KcbCacheTable->Entry;
v7 = (unsigned int)KcbCacheTableSize;
do
{
for( i = *p_Entry; i; i = i->NextHash )
{
v9 = v1;
if( !v1 )
v9 = 1;
v1 = v9;
CmpDumpKeyBodyList((_CM_KEY_CONTROL_BLOCK *)&i[-1].KeyHive, &Count, 0i64);
}
p_Entry += 3;
--v7;
}
while( v7 );
v4 = Count;
}
Flink = NextActiveHive->NotifyList.Flink;
v0 += v4;
v1 = 0;
while( Flink )
{
for( j = Flink[1].Flink; j != &Flink[1]; j = j->Flink )
{
if( j[3].Flink )
{
v12 = v1;
if( !v1 )
v12 = 1;
v1 = v12;
}
}
Flink = Flink->Flink;
}
CmpAttachToRegistryProcess(&ApcState);
CmpDestroyHive(NextActiveHive);
CmpDetachFromRegistryProcess(&ApcState);
NextActiveHive = CmpGetNextActiveHive(NextActiveHive);
}
while( NextActiveHive );
if( v0 )
KeBugCheckEx(0x51u, (PVOID)0xF, (PVOID)1, (PVOID)v0, 0i64);
}
return ExFreePoolWithTag(*(&CmpDummyThreadEvent + 99), 0);
}Referenced by:
CmShutdownSystem