CmpCmdHiveClose

BOOLEAN __fastcall CmpCmdHiveClose(__int64 a1){
  HANDLE *v2; 
  UINT8 v3; 
  VOID *v4; 
  __int64 v5; 
  unsigned int i; 
  HANDLE v7; 
  __int16 *p_ObjectInformation; 
  __int16 v10; 
  __int16 ObjectInformation; 
  struct _IO_STATUS_BLOCK IoStatusBlock; 
  __int128 FileInformation; 
  __int128 v14; 
  __int64 v15; 
  v15 = 0i64;
  IoStatusBlock = 0i64;
  FileInformation = 0i64;
  v14 = 0i64;
  v2 = (HANDLE *)(a1 + 1536);
  v3 = IoSetThreadHardErrorMode(0);
  v4 = *v2;
  if( *v2 && ZwQueryInformationFile(v4, &IoStatusBlock, &FileInformation, 0x28ui64, FileBasicInformation) >= 0 )
  {
    if( *(_BYTE *)(a1 + 141) )
    {
      *(_QWORD *)&v14 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
    }
    else
    {
      v5 = v14;
      if( *(_QWORD *)(a1 + 4224) )
        v5 = *(_QWORD *)(a1 + 4224);
      *(_QWORD *)&v14 = v5;
    }
    *((_QWORD *)&FileInformation + 1) = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
    ZwSetInformationFile(v4, &IoStatusBlock, &FileInformation, 0x28ui64, FileBasicInformation);
  }
  for( i = 0; i < 6; ++i )
  {
    v7 = *v2;
    if( *v2 )
    {
      if( i )
      {
        ObjectInformation = 0;
        p_ObjectInformation = &ObjectInformation;
      }
      else
      {
        v10 = 0;
        p_ObjectInformation = &v10;
      }
      ZwSetInformationObject(v7, ObjectHandleFlagInformation, p_ObjectInformation, 2ui64);
      ZwClose(*v2);
      *v2 = 0i64;
    }
    ++v2;
  }
  return IoSetThreadHardErrorMode(v3);
}

Referenced by:

CmShutdownSystem
CmpCompleteUnloadKey
CmpDestroyHive