NtAlpcQueryInformation

INT64 __fastcall NtAlpcQueryInformation(HANDLE Handle, INT64 a2, UINT64 a3, UINT64 a4, UINT64 a5){
  unsigned int v5; 
  UINT64 *v6; 
  int v7; 
  _ETHREAD *CurrentThread; 
  KPROCESSOR_MODE v10; 
  UINT64 v11; 
  UINT64 v12; 
  unsigned __int64 v13; 
  UINT64 *v14; 
  UINT64 v15; 
  struct _DMA_ADAPTER *v16; 
  NTSTATUS v17; 
  NTSTATUS ServerSessionInfo; 
  _ETHREAD *v19; 
  bool v20; 
  int v22; 
  int v23; 
  int v24; 
  PVOID *Object; 
  PVOID v26; 
  v5 = a4;
  v6 = (UINT64 *)a3;
  v7 = a2;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  if( !a3 )
  {
    v17 = -1073741811;
    goto LABEL_24;
  }
  v10 = *((_BYTE *)KeGetCurrentThread() + 562);
  if( v10 )
  {
    if( (((_DWORD)a2 - 3) & 0xFFFFFFF7) != 0 && (_DWORD)a4 )
    {
      v11 = a3;
      if( (a3 & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      v12 = a3 + (unsigned int)a4 - 1i64;
      if( a3 > v12 || (a3 = 0x7FFFFFFF0000i64, v12 >= 0x7FFFFFFF0000i64) )
        ExRaiseAccessViolation();
      v13 = (v12 & 0xFFFFFFFFFFFFF000ui64) + 4096;
      do
      {
        *(_BYTE *)v11 = *(_BYTE *)v11;
        v11 = (v11 & 0xFFFFFFFFFFFFF000ui64) + 4096;
      }
      while( v11 != v13 );
    }
    else
    {
      a3 = 0x7FFFFFFF0000i64;
    }
    v14 = (UINT64 *)a5;
    if( a5 )
    {
      v15 = a5;
      if( a5 >= 0x7FFFFFFF0000i64 )
        v15 = 0x7FFFFFFF0000i64;
      *(_DWORD *)v15 = *(_DWORD *)v15;
    }
  }
  else
  {
    v14 = (UINT64 *)a5;
  }
  v16 = 0i64;
  if( !Handle
    || (v26 = 0i64,
        v17 = ObReferenceObjectByHandle(Handle, 0x20000u, AlpcPortObjectType, v10, &v26, 0i64),
        v16 = (struct _DMA_ADAPTER *)v26,
        v17 >= 0) )
  {
    if( v7 )
    {
      v22 = v7 - 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((INT64)v16, v6, v5, v14);
          }
          else
          {
            LOBYTE(Object) = v10;
            ServerSessionInfo = AlpcpWaitForPortReferences((_ALPC_PORT *)v16, v6, v5, v14, (INT64)Object);
          }
        }
        else
        {
          ServerSessionInfo = AlpcpPortQueryServerInfo((INT64)v16, (INT64)v6, v5, v14, v10);
        }
      }
      else
      {
        LOBYTE(Object) = v10;
        ServerSessionInfo = AlpcpPortQueryConnectedSidInfo((_ALPC_PORT *)v16, v6, (VOID *)a3, v14, (INT64)Object);
      }
    }
    else
    {
      ServerSessionInfo = AlpcpPortQueryBasicInfo((__int64)v16, (__int64)v6, v5, v14);
    }
    v17 = ServerSessionInfo;
    goto LABEL_22;
  }
LABEL_24:
  v19 = (_ETHREAD *)KeGetCurrentThread();
  v20 = (*((_WORD *)v19 + 242))++ == 0xFFFF;
  if( v20 && *((_ETHREAD **)v19 + 19) != (_ETHREAD *)((char *)v19 + 152) && !*((_WORD *)v19 + 243) )
    KiCheckForKernelApcDelivery();
  return(unsigned int)v17;
}

Referenced by:

No references.