CmpCmdHiveClose

VOID __stdcall CmpCmdHiveClose(_CMHIVE *CmHive){
  void **FileHandles; 
  char v3; 
  char v4; 
  VOID *v5; 
  _LARGE_INTEGER LastWriteTime; 
  unsigned int i; 
  VOID *v8; 
  __int16 *p_ObjectInformation; 
  UINT64 FileInformationClass; 
  __int16 v11; 
  __int16 ObjectInformation; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  __int128 FileInformation; 
  __int128 v15; 
  __int64 v16; 

  v16 = 0i64;
  IoStatusBlock = 0i64;
  FileInformation = 0i64;
  v15 = 0i64;
  IoSetThreadHardErrorMode(0);
  FileHandles = CmHive->FileHandles;
  v4 = v3;
  v5 = CmHive->FileHandles[0];
  if( v5 && ZwQueryInformationFile(v5, &IoStatusBlock, &FileInformation, 0x28ui64, FileBasicInformation) >= 0 )
  {
    if( CmHive->Hive.DirtyFlag )
    {
      *(_QWORD *)&v15 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
    }
    else
    {
      LastWriteTime.QuadPart = v15;
      if( CmHive->LastWriteTime.QuadPart )
        LastWriteTime = CmHive->LastWriteTime;
      *(_LARGE_INTEGER *)&v15 = LastWriteTime;
    }
    *((_QWORD *)&FileInformation + 1) = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
    LODWORD(FileInformationClass) = 4;
    ZwSetInformationFile((UINT64)v5, (UINT64)&IoStatusBlock, (INT8 *)&FileInformation, 0x28ui64, FileInformationClass);
  }
  for( i = 0; i < 6; ++i )
  {
    v8 = *FileHandles;
    if( *FileHandles )
    {
      if( i )
      {
        ObjectInformation = 0;
        p_ObjectInformation = &ObjectInformation;
      }
      else
      {
        v11 = 0;
        p_ObjectInformation = &v11;
      }
      ZwSetInformationObject(v8, ObjectHandleFlagInformation, p_ObjectInformation, 2ui64);
      ZwClose((_HANDLE)*FileHandles);
      *FileHandles = 0i64;
    }
    ++FileHandles;
  }
  LOBYTE(v8) = v4;
  IoSetThreadHardErrorMode((INT16)v8);
}

Referenced by:

CmShutdownSystem
CmpCompleteUnloadKey
CmpDestroyHive