MiShareExistingControlArea

NTSTATUS __fastcall MiShareExistingControlArea(INT64 a1){
  INT64 v1; 
  _FILE_OBJECT *v3; 
  NTSTATUS v4; 
  __int64 v5; 
  NTSTATUS v6; 
  _LARGE_INTEGER v7; 
  NTSTATUS result; 
  _LARGE_INTEGER v9; 
  _LARGE_INTEGER FileSize; 

  v1 = *(_QWORD *)(a1 + 64);
  FileSize.QuadPart = 0i64;
  v3 = *(_FILE_OBJECT **)(a1 + 56);
  v4 = MiValidateControlAreaPartition(a1, v1);
  if( v4 < 0 )
  {
    if( (*(_DWORD *)a1 & 2) != 0 )
    {
      IoSetTopLevelIrp(*(_IRP **)(a1 + 184));
      FsRtlReleaseFile(v3);
      *(_DWORD *)a1 &= ~2u;
    }
    return v4;
  }
  else
  {
    if( (*(_DWORD *)(v1 + 56) & 0x200) != 0 && !PsIsCurrentThreadPrefetching() )
      MmChangeSectionBackingFile(0i64, v3, (unsigned int)((*(_DWORD *)(a1 + 16) & 0x1000000) != 0) + 1);
    *(_DWORD *)a1 |= 4u;
    v5 = *(_QWORD *)v1;
    if( (*(_DWORD *)a1 & 1) == 0 && (*(_BYTE *)(v1 + 56) & 0x20) == 0 )
    {
      v6 = FsRtlGetFileSize(v3, &FileSize);
      IoSetTopLevelIrp(*(_IRP **)(a1 + 184));
      FsRtlReleaseFile(v3);
      *(_DWORD *)a1 &= ~2u;
      if( v6 < 0 )
        return v6;
      v7 = FileSize;
      if( !FileSize.QuadPart && !*(_QWORD *)(a1 + 152) )
        return -1073741538;
    }
    else
    {
      if( (*(_DWORD *)a1 & 2) != 0 )
      {
        IoSetTopLevelIrp(*(_IRP **)(a1 + 184));
        FsRtlReleaseFile(v3);
        *(_DWORD *)a1 &= ~2u;
      }
      if( (*(_DWORD *)(a1 + 16) & 0x1000000) != 0 )
      {
        result = MiValidateExistingImage((unsigned int *)a1);
        if( result < 0 )
          return result;
      }
      v7.QuadPart = _InterlockedCompareExchange64((volatile signed __int64 *)(v5 + 24), -1i64, -1i64);
    }
    v9 = *(_LARGE_INTEGER *)(a1 + 152);
    if( v9.QuadPart )
    {
      if( v7.QuadPart < (unsigned __int64)v9.QuadPart )
      {
        if( (*(_DWORD *)(a1 + 28) & 0x44) == 0 )
          return -1073741760;
      }
      else
      {
        *(_DWORD *)a1 |= 8u;
      }
      *(_LARGE_INTEGER *)(a1 + 128) = v9;
    }
    else
    {
      *(_DWORD *)a1 |= 8u;
      *(_LARGE_INTEGER *)(a1 + 128) = v7;
    }
    return 0;
  }
}

Referenced by:

MiCreateImageOrDataSection