MiInitializeEnclaveMetadataPage

NTSTATUS __stdcall MiInitializeEnclaveMetadataPage(){
  UINT64 v0; 
  _DWORD *Pool; 
  _KTBFLUSH_TYPE v2; 
  _QWORD *v3; 
  _DWORD *v4; 
  INT64 v5; 
  UINT64 v6; 
  __int64 v7; 
  __int64 v8; 
  int v9; 
  __int64 v10; 
  NTSTATUS result; 

  v0 = (UINT64)MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 1ui64);
  if( v0 )
  {
    Pool = MiAllocatePool(64i64, 0x50ui64, 0x4D424D45ui64);
    v3 = Pool;
    if( Pool )
    {
      *Pool = 512;
      v4 = Pool + 4;
      v3[1] = v4;
      *v4 |= 1u;
      LODWORD(v5) = MiGetEnclavePage(&Irp, 0i64);
      v6 = v5;
      if( v5 != -1 )
      {
        LODWORD(v7) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v0, v5, 3221225476i64);
        v8 = v7;
        LOBYTE(v9) = MiPteInShadowRange(v0);
        if( v9 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v8 & 1) != 0 )
          v8 |= 0x8000000000000000ui64;
        *(_QWORD *)v0 = v8;
        v10 = (__int64)((v0 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
        if( KeCreateEnclaveMetadataPage() >= 0 )
        {
          *(&stru_140C4DB30 + 533) = 0i64;
          result = 1;
          *(&stru_140C4DB30 + 531) = v10;
          *(&stru_140C4DB30 + 532) = v3;
          *(&stru_140C4DB30 + 1068) = 0;
          return result;
        }
      }
      ExFreePoolWithTag(v3, 0);
      if( v6 != -1i64 )
        MiReturnEnclavePage(v6);
    }
    MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (_MMPTE *)v0, 1ui64, v2);
  }
  return 0;
}

Referenced by:

MiCreateEnclaveRegions