PiUEventHandleGetEvent

NTSTATUS __stdcall PiUEventHandleGetEvent(
        FILE_OBJECT *FileObject,
        PVOID Buffer,
        UINT64 OutputBufferLength,
        IO_STATUS_BLOCK *IoStatus){
  FAST_MUTEX **FsContext2; 
  NTSTATUS v5; 
  int v6; 
  NTSTATUS v8; 
  unsigned int v9; 
  INT64 *v10; 
  INT64 *v11; 
  INT64 *v12; 
  __int64 v13; 
  unsigned int v14; 
  unsigned int v15; 
  INT64 **v17; 
  INT64 **v18; 
  _QWORD *v19; 
  unsigned int *v20; 
  unsigned int v21; 
  __int64 v22; 
  FsContext2 = (FAST_MUTEX **)FileObject->FsContext2;
  v5 = 0;
  v6 = (int)IoStatus;
  v8 = 0;
  if( !FsContext2 || !Buffer || (unsigned int)IoStatus <= 4 )
    return -1073741811;
  *(_DWORD *)Buffer = 0;
  v20 = (unsigned int *)((char *)Buffer + 4);
  v9 = (_DWORD)IoStatus - 4;
  ExAcquireFastMutex(FsContext2[2]);
  v10 = (INT64 *)(FsContext2 + 14);
  v11 = (INT64 *)FsContext2[14];
  while( v11 != v10 && v8 >= 0 )
  {
    v12 = v11;
    v19 = v11 + 3;
    v8 = PiUEventCopyEventData((INT64)v20, v9, v11[3]);
    if( v8 < 0 )
    {
      if( !*(_DWORD *)Buffer )
      {
        *(_QWORD *)(v22 + 8) = 0i64;
        KeReleaseGuardedMutex(FsContext2[2]);
        return v8;
      }
      break;
    }
    v13 = *v20;
    v14 = v9 - v13;
    v21 = v9 - v13;
    if( (unsigned int)v13 > v9 )
      v8 = -1073741789;
    else
      v20 = (unsigned int *)((char *)v20 + v13);
    ++*(_DWORD *)Buffer;
    v11 = (INT64 *)*v11;
    if( *(_BYTE *)(*v19 + 68i64) )
    {
      if( (INT64 *)v11[1] != v12
        || (v17 = (INT64 **)v12[1], *v17 != v12)
        || (*v17 = v11,
            v11[1] = (INT64)v17,
            --*((_DWORD *)FsContext2 + 32),
            v18 = (INT64 **)FsContext2[13],
            *v18 != (INT64 *)(FsContext2 + 12)) )
      {
        __fastfail(3u);
      }
      *v12 = (INT64)(FsContext2 + 12);
      v12[1] = (INT64)v18;
      *v18 = v12;
      FsContext2[13] = (FAST_MUTEX *)v12;
    }
    else
    {
      PiUEventDequeuePendingEventWorker((INT64)FsContext2, v12, 0);
      v14 = v21;
    }
    v10 = (INT64 *)(FsContext2 + 14);
    v9 = v14;
  }
  KeReleaseGuardedMutex(FsContext2[2]);
  if( v8 == -1073741789 )
    PiUEventNotifyClientPendingEvent((__int64)FsContext2);
  v15 = v6 - v9;
  if( v8 != -1073741789 )
    v5 = v8;
  v8 = v5;
  *(_QWORD *)(v22 + 8) = v15;
  return v8;
}

Referenced by:

PiUEventHandleIoctl