AlpcpWaitForPortReferences

INT64 __fastcall AlpcpWaitForPortReferences(
        _ALPC_PORT *PortObject,
        UINT64 *DesiredReferenceNo,
        UINT64 Length,
        UINT64 *ReturnLength,
        INT64 PreviousMode){
  __int64 v6; 
  volatile signed __int64 *v8; 
  unsigned int v9; 
  __int128 Event; 
  __int128 Event_16; 
  Event = 0i64;
  Event_16 = 0i64;
  if( !PortObject || (_DWORD)Length != 4 )
    return 3221225485i64;
  if( (_BYTE)PreviousMode )
  {
    v6 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)DesiredReferenceNo < 0x7FFFFFFF0000i64 )
      v6 = (__int64)DesiredReferenceNo;
    DWORD2(Event_16) = *(_DWORD *)v6;
    if( ReturnLength )
      *(_DWORD *)ReturnLength = 0;
  }
  else
  {
    DWORD2(Event_16) = *(_DWORD *)DesiredReferenceNo;
    if( ReturnLength )
      *(_DWORD *)ReturnLength = 0;
  }
  if( *((_DWORD *)PortObject + 101) == DWORD2(Event_16) )
    return 0i64;
  KeInitializeEvent((_KEVENT *)&Event, SynchronizationEvent, 0);
  v8 = (volatile signed __int64 *)((char *)PortObject + 352);
  ExAcquirePushLockExclusiveEx((UINT64)PortObject + 352, 0i64);
  if( *((_QWORD *)PortObject + 51) )
  {
    v9 = -1073741811;
  }
  else if( *((_DWORD *)PortObject + 101) == DWORD2(Event_16) )
  {
    v9 = 0;
  }
  else
  {
    *((_QWORD *)PortObject + 51) = &Event;
    if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)PortObject + 44);
    KeAbPostRelease((char *)PortObject + 352);
    while( 1 )
    {
      v9 = KeWaitForSingleObject(&Event, WrUserRequest, 0, 1u, 0i64);
      if( !v9 )
        break;
      if( (*((_DWORD *)KeGetCurrentThread() + 324) & 1) != 0 )
      {
        v9 = -1073741749;
        break;
      }
    }
    ExAcquirePushLockExclusiveEx((UINT64)PortObject + 352, 0i64);
    *((_QWORD *)PortObject + 51) = 0i64;
  }
  if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)PortObject + 44);
  KeAbPostRelease((char *)PortObject + 352);
  return v9;
}

Referenced by:

NtAlpcQueryInformation