PiUEventHandleGetEvent

NTSTATUS __stdcall PiUEventHandleGetEvent(
        _FILE_OBJECT *FileObject,
        VOID *Buffer,
        UINT64 OutputBufferLength,
        _IO_STATUS_BLOCK *IoStatus,
        _IO_STATUS_BLOCK *IoStatusa){
  PFAST_MUTEX *FsContext2; 
  NTSTATUS v6; 
  int v7; 
  NTSTATUS v9; 
  unsigned int v10; 
  _QWORD *v11; 
  _QWORD *v12; 
  _FAST_MUTEX *v13; 
  __int64 v14; 
  unsigned int v15; 
  unsigned int v16; 
  _FAST_MUTEX **Owner; 
  void **v19; 
  _QWORD *v20; 
  unsigned int *v21; 
  unsigned int v22; 

  FsContext2 = (PFAST_MUTEX *)FileObject->FsContext2;
  v6 = 0;
  v7 = (int)IoStatus;
  v9 = 0;
  if( !FsContext2 || !Buffer || (unsigned int)IoStatus <= 4 )
    return -1073741811;
  *(_DWORD *)Buffer = 0;
  v21 = (unsigned int *)((char *)Buffer + 4);
  v10 = (_DWORD)IoStatus - 4;
  ExAcquireFastMutex(FsContext2[2]);
  v11 = FsContext2 + 14;
  v12 = FsContext2[14];
  while( v12 != v11 && v9 >= 0 )
  {
    v13 = (_FAST_MUTEX *)v12;
    v20 = v12 + 3;
    v9 = PiUEventCopyEventData((__int64)v21, v10, v12[3]);
    if( v9 < 0 )
    {
      if( !*(_DWORD *)Buffer )
      {
        IoStatusa->Information = 0i64;
        KeReleaseGuardedMutex(FsContext2[2]);
        return v9;
      }
      break;
    }
    v14 = *v21;
    v15 = v10 - v14;
    v22 = v10 - v14;
    if( (unsigned int)v14 > v10 )
      v9 = -1073741789;
    else
      v21 = (unsigned int *)((char *)v21 + v14);
    ++*(_DWORD *)Buffer;
    v12 = (_QWORD *)*v12;
    if( *(_BYTE *)(*v20 + 68i64) )
    {
      if( (_FAST_MUTEX *)v12[1] != v13
        || (Owner = (_FAST_MUTEX **)v13->Owner, *Owner != v13)
        || (*Owner = (_FAST_MUTEX *)v12,
            v12[1] = Owner,
            --*((_DWORD *)FsContext2 + 32),
            v19 = (void **)FsContext2[13],
            *v19 != FsContext2 + 12) )
      {
        __fastfail(3u);
      }
      *(_QWORD *)&v13->Count = FsContext2 + 12;
      v13->Owner = v19;
      *v19 = v13;
      FsContext2[13] = v13;
    }
    else
    {
      PiUEventDequeuePendingEventWorker((__int64)FsContext2, v13, 0);
      v15 = v22;
    }
    v11 = FsContext2 + 14;
    v10 = v15;
  }
  KeReleaseGuardedMutex(FsContext2[2]);
  if( v9 == -1073741789 )
    PiUEventNotifyClientPendingEvent((__int64)FsContext2);
  v16 = v7 - v10;
  if( v9 != -1073741789 )
    v6 = v9;
  v9 = v6;
  IoStatusa->Information = v16;
  return v9;
}

Referenced by:

PiUEventHandleIoctl