NtAlpcQueryInformation

NTSTATUS __stdcall NtAlpcQueryInformation(
        VOID *PortHandle,
        _ALPC_PORT_INFORMATION_CLASS PortInformationClass,
        VOID *PortInformation,
        UINT64 Length,
        UINT64 *ReturnLength){
  unsigned int v5; 
  UINT64 *v6; 
  _ETHREAD *CurrentThread; 
  char PreviousMode; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  UINT64 *v14; 
  __int64 v15; 
  _ADAPTER_OBJECT *v16; 
  int v17; 
  int ServerSessionInfo; 
  _ETHREAD *v19; 
  bool v20; 
  __int32 v22; 
  __int32 v23; 
  __int32 v24; 
  PVOID *Object; 
  PVOID v26; 

  v5 = Length;
  v6 = (UINT64 *)PortInformation;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  if( !PortInformation )
  {
    v17 = -1073741811;
    goto LABEL_24;
  }
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    if( ((PortInformationClass - 3) & 0xFFFFFFF7) != 0 && (_DWORD)Length )
    {
      v11 = (unsigned __int64)PortInformation;
      if( ((unsigned __int8)PortInformation & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      v12 = (unsigned __int64)PortInformation + (unsigned int)Length - 1;
      if( (unsigned __int64)PortInformation > v12
        || (PortInformation = (VOID *)0x7FFFFFFF0000i64, v12 >= 0x7FFFFFFF0000i64) )
      {
        ExRaiseAccessViolation();
      }
      v13 = (v12 & 0xFFFFFFFFFFFFF000ui64) + 4096;
      do
      {
        *(_BYTE *)v11 = *(_BYTE *)v11;
        v11 = (v11 & 0xFFFFFFFFFFFFF000ui64) + 4096;
      }
      while( v11 != v13 );
    }
    else
    {
      PortInformation = (VOID *)0x7FFFFFFF0000i64;
    }
    v14 = ReturnLength;
    if( ReturnLength )
    {
      v15 = (__int64)ReturnLength;
      if( (unsigned __int64)ReturnLength >= 0x7FFFFFFF0000i64 )
        v15 = 0x7FFFFFFF0000i64;
      *(_DWORD *)v15 = *(_DWORD *)v15;
    }
  }
  else
  {
    v14 = ReturnLength;
  }
  v16 = 0i64;
  if( !PortHandle
    || (v26 = 0i64,
        v17 = ObReferenceObjectByHandle(PortHandle, 0x20000ui64, AlpcPortObjectType, PreviousMode, &v26, 0i64),
        v16 = (_ADAPTER_OBJECT *)v26,
        v17 >= 0) )
  {
    if( PortInformationClass )
    {
      v22 = PortInformationClass - 3;
      if( v22 )
      {
        v23 = v22 - 1;
        if( v23 )
        {
          v24 = v23 - 7;
          if( v24 )
          {
            if( v24 != 1 )
            {
              v17 = -1073741811;
LABEL_22:
              if( v16 )
                HalPutDmaAdapter(v16);
              goto LABEL_24;
            }
            ServerSessionInfo = AlpcpPortQueryServerSessionInfo((_ALPC_PORT *)v16, v6, v5, v14);
          }
          else
          {
            ServerSessionInfo = AlpcpWaitForPortReferences((_ALPC_PORT *)v16, v6, v5, v14, PreviousMode);
          }
        }
        else
        {
          LOBYTE(Object) = PreviousMode;
          ServerSessionInfo = AlpcpPortQueryServerInfo((INT64)v16, (INT64)v6, v5, v14, (_KPROCESSOR_MODE)Object);
        }
      }
      else
      {
        LOBYTE(Object) = PreviousMode;
        ServerSessionInfo = AlpcpPortQueryConnectedSidInfo((_ALPC_PORT *)v16, v6, PortInformation, v14, (INT64)Object);
      }
    }
    else
    {
      ServerSessionInfo = AlpcpPortQueryBasicInfo(
                            (_ALPC_PORT *)v16,
                            (_ALPC_BASIC_INFORMATION *)v6,
                            v5,
                            v14,
                            (CHAR)Object);
    }
    v17 = ServerSessionInfo;
    goto LABEL_22;
  }
LABEL_24:
  v19 = (_ETHREAD *)KeGetCurrentThread();
  v20 = v19->Tcb.KernelApcDisable++ == -1;
  if( v20
    && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v19->Tcb.ApcState.ApcListHead[0].Flink != &v19->Tcb.152
    && !v19->Tcb.SpecialApcDisable )
  {
    KiCheckForKernelApcDelivery();
  }
  return v17;
}

Referenced by:

No references.