MiInitializeVsmEnclave

NTSTATUS __stdcall MiInitializeVsmEnclave(PEPROCESS Process){
  _MMVAD_SHORT *v1; 
  __int64 v2; 
  unsigned int v3; 
  __int64 ExtraCreateInfo; 
  unsigned int v5; 
  __int64 v6; 
  _MMVAD_SHORT *v7; 
  VOID **v9; 
  _ETHREAD *CurrentThread; 
  NTSTATUS v11; 
  VOID *v12; 
  _ADAPTER_OBJECT *v13; 
  _KPROCESSOR_MODE v14; 
  _ADAPTER_OBJECT *v15; 
  __int64 v17[2]; 
  INT64 v18; 

  ExtraCreateInfo = (__int64)v1[1].ExtraCreateInfo;
  v17[0] = 0i64;
  v5 = v3;
  v18 = 0i64;
  v6 = v2;
  v7 = v1;
  v9 = 0i64;
  if( _InterlockedIncrement64((volatile signed __int64 *)(ExtraCreateInfo + 16)) <= 1 )
    __fastfail(0xEu);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  MiUnlockVad(CurrentThread, v1);
  if( *(_BYTE *)(ExtraCreateInfo + 76) )
  {
    if( v5 < 0x38 )
    {
      v11 = -1073741820;
      goto LABEL_10;
    }
    v12 = *(VOID **)(v6 + 48);
    if( v12 )
    {
      v13 = (_ADAPTER_OBJECT *)PsReferencePrimaryToken(Process);
      LOBYTE(v14) = CurrentThread->Tcb.PreviousMode;
      v15 = v13;
      v11 = MiMapImageForEnclaveUse(v12, (INT64)v13, v14, &v18, v17);
      HalPutDmaAdapter(v15);
      if( v11 < 0 )
        goto LABEL_10;
      v9 = *(VOID ***)(*(_QWORD *)(v17[0] + 96) + 56i64);
    }
  }
  v11 = PsInitializeVsmEnclave(ExtraCreateInfo, (_DWORD *)v6, v5, v9, (UINT64 *)v18);
LABEL_10:
  PsDereferenceVsmEnclave((PVOID)ExtraCreateInfo);
  if( v18 )
    MiUnmapImageForEnclaveUse((VOID *)v18);
  MiLockVad(CurrentThread, v7);
  return v11;
}

Referenced by:

MiInitializeEnclave