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