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