NtReplyPort

NTSTATUS __fastcall NtReplyPort(_HANDLE Handle, _PORT_MESSAGE *Message){
  VOID *v3; 
  _ETHREAD *CurrentThread; 
  int v5; 
  _ALPC_DISPATCH_CONTEXT DispatchContext; 
  PVOID Object; 

  v3 = *(VOID **)&Handle;
  memset(&DispatchContext, 0i64, sizeof(DispatchContext));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  Object = 0i64;
  v5 = ObReferenceObjectByHandle(v3, 1ui64, AlpcPortObjectType, KeGetCurrentThread()->PreviousMode, &Object, 0i64);
  if( v5 >= 0 )
  {
    DispatchContext.Flags = 0;
    DispatchContext.PortObject = (_ALPC_PORT *)Object;
    if( (*((_DWORD *)Object + 104) & 0x2000) != 0 )
    {
      v5 = AlpcpReplyLegacySynchronousRequest(
             &DispatchContext,
             (PORT_MESSAGE *)&Message->u1.DataLength,
             KeGetCurrentThread()->PreviousMode);
    }
    else
    {
      DispatchContext.Flags = 65537;
      v5 = AlpcpSendMessage(&DispatchContext, Message, 0i64, KeGetCurrentThread()->PreviousMode);
      if( v5 == -1073740029 )
        v5 = -1073741769;
    }
    HalPutDmaAdapter((PADAPTER_OBJECT)Object);
  }
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v5;
}

Referenced by:

No references.