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