NtInitializeEnclave

NTSTATUS __stdcall NtInitializeEnclave(
        VOID *ProcessHandle,
        VOID *BaseAddress,
        VOID *EnclaveInformation,
        UINT64 EnclaveInformationLength,
        UINT64 *EnclaveError){
  __int64 v5; 
  VOID *Pool; 
  char PreviousMode; 
  __int64 v10; 
  int v11; 
  _ETHREAD *CurrentThread; 
  _EPROCESS *Process; 
  VOID *v14; 
  UINT64 Tag; 
  char v17; 
  PVOID Object; 
  VOID *v19; 
  VOID *v20; 
  UINT64 *v21; 
  UINT64 a2; 
  _KAPC_STATE ApcState; 

  v5 = (unsigned int)EnclaveInformationLength;
  a2 = (UINT64)BaseAddress;
  v20 = ProcessHandle;
  v21 = EnclaveError;
  memset(&ApcState, 0, sizeof(ApcState));
  Object = 0i64;
  Pool = 0i64;
  v19 = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  v17 = PreviousMode;
  if( EnclaveError && PreviousMode == 1 )
  {
    v10 = (__int64)EnclaveError;
    if( (unsigned __int64)EnclaveError >= 0x7FFFFFFF0000i64 )
      v10 = 0x7FFFFFFF0000i64;
    *(_DWORD *)v10 = *(_DWORD *)v10;
  }
  if( !(_DWORD)EnclaveInformationLength )
    goto LABEL_18;
  if( (unsigned int)EnclaveInformationLength <= 0x1000 )
  {
    Pool = MiAllocatePool(256i64, (unsigned int)EnclaveInformationLength, 0x44456D4Dui64);
    v19 = Pool;
    if( !Pool )
    {
      v11 = -1073741670;
      goto LABEL_23;
    }
    if( v17 == 1
      && (unsigned __int64)(v5 - 1) > 0xFFFE
      && (_DWORD)v5
      && ((unsigned __int64)EnclaveInformation + v5 > 0x7FFFFFFF0000i64
       || (char *)EnclaveInformation + v5 < EnclaveInformation) )
    {
      MEMORY[0x7FFFFFFF0000] = 0;
    }
    memmove(Pool, EnclaveInformation, v5);
    PreviousMode = v17;
LABEL_18:
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    Process = CurrentThread->Tcb.ApcState.Process;
    if( ProcessHandle == (VOID *)-1i64 )
    {
      Object = CurrentThread->Tcb.ApcState.Process;
    }
    else
    {
      LODWORD(Tag) = 1834380621;
      v11 = ObReferenceObjectByHandleWithTag(
              ProcessHandle,
              8ui64,
              (_OBJECT_TYPE *)PsProcessType,
              PreviousMode,
              Tag,
              &Object,
              0i64);
      if( v11 < 0 )
        goto LABEL_23;
      KeStackAttachProcess((PRKPROCESS)Object, &ApcState);
    }
    v11 = MiInitializeEnclave(Process, a2, Pool, (unsigned int)v5);
    goto LABEL_23;
  }
  v11 = -1073741820;
LABEL_23:
  v14 = Object;
  if( Object && ProcessHandle != (VOID *)-1i64 )
  {
    KeUnstackDetachProcess(&ApcState);
    ObfDereferenceObjectWithTag(v14, 0x6D566D4Dui64);
  }
  if( EnclaveError )
    *(_DWORD *)EnclaveError = 0;
  if( Pool )
    ExFreePoolWithTag(Pool, 0);
  return v11;
}

Referenced by:

No references.