NtAlpcQueryInformationMessage

NTSTATUS __stdcall NtAlpcQueryInformationMessage(_HANDLE Handle, _SIZE_T Length, INT64 a3){
  _LUID *v3; 
  _LUID *v4; 
  int v5; 
  VOID *v6; 
  _ETHREAD *CurrentThread; 
  char PreviousMode; 
  UINT64 *v9; 
  __int64 v10; 
  unsigned int v11; 
  int v12; 
  _KALPC_MESSAGE **v13; 
  _ADAPTER_OBJECT *v14; 
  _KALPC_MESSAGE *v15; 
  int v16; 
  int v17; 
  NTSTATUS TokenModifiedIdMessage; 
  UINT64 MessageId; 
  PVOID Object; 
  _KALPC_MESSAGE *Message; 
  unsigned int Lengtha; 
  UINT64 *ReturnLength; 

  v4 = v3;
  v5 = a3;
  v6 = *(VOID **)&Handle;
  Message = 0i64;
  MessageId = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  AlpcpCaptureIdMessage(*(PORT_MESSAGE **)&Length, &MessageId, (UINT64 *)((char *)&MessageId + 4));
  if( PreviousMode )
  {
    ProbeForWrite((UINT64)v4, Lengtha, 4i64);
    v9 = ReturnLength;
    if( ReturnLength )
    {
      v10 = 0x7FFFFFFF0000i64;
      if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
        v10 = (__int64)ReturnLength;
      *(_DWORD *)v10 = *(_DWORD *)v10;
    }
  }
  else
  {
    v9 = ReturnLength;
  }
  v11 = MessageId;
  if( !(_DWORD)MessageId )
  {
    v12 = -1073741811;
    goto LABEL_20;
  }
  Object = 0i64;
  v12 = ObReferenceObjectByHandle(v6, 0x20000ui64, AlpcPortObjectType, PreviousMode, &Object, 0i64);
  if( v12 >= 0 )
  {
    v14 = (_ADAPTER_OBJECT *)Object;
    v12 = AlpcpLookupMessage((_ALPC_PORT *)Object, v11, HIDWORD(MessageId), v13);
    if( v12 < 0 )
    {
LABEL_19:
      HalPutDmaAdapter(v14);
      goto LABEL_20;
    }
    v15 = Message;
    if( !Message->OwnerPort )
    {
      v12 = -1073740029;
      goto LABEL_18;
    }
    if( v5 )
    {
      v16 = v5 - 1;
      if( !v16 )
      {
        TokenModifiedIdMessage = AlpcpQueryTokenModifiedIdMessage((_ALPC_PORT *)v14, Message, v4, Lengtha, v9);
        goto LABEL_17;
      }
      v17 = v16 - 1;
      if( v17 )
      {
        if( v17 == 1 )
        {
          TokenModifiedIdMessage = AlpcpQueryHandleInformationMessage((_ALPC_PORT *)v14, Message, v4, Lengtha, v9);
LABEL_17:
          v12 = TokenModifiedIdMessage;
LABEL_18:
          AlpcpUnlockMessage(v15);
          goto LABEL_19;
        }
      }
      else if( !v4 && !Lengtha && !v9 )
      {
        v12 = (Message->u1.State & 7) != 4 ? 0x103 : 0;
        goto LABEL_18;
      }
      v12 = -1073741811;
      goto LABEL_18;
    }
    TokenModifiedIdMessage = AlpcpQuerySidMessage((_ALPC_PORT *)v14, Message, v4, Lengtha, v9);
    goto LABEL_17;
  }
LABEL_20:
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v12;
}

Referenced by:

No references.