PoHandleIrp
UINT8 __stdcall PoHandleIrp(IRP *Irp, INT64 *Status){
__int64 v2;
__int64 v5;
__int64 v6;
DEVICE_OBJECT *v7;
_DWORD *v8;
int v9;
_DWORD *v10;
UINT8 v11;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v2 = *((_QWORD *)Irp + 23);
memset(&LockHandle, 0, sizeof(LockHandle));
v5 = *(_QWORD *)(v2 + 40);
v6 = *((_QWORD *)Irp + 9 * *((char *)Irp + 66) + 25);
v7 = *(DEVICE_OBJECT **)(v6 + 40);
if( v7 )
{
PoDeviceReleaseIrp(Irp, *(_BYTE *)(v6 + 184), v7);
v8 = (_DWORD *)(v5 + 48);
v9 = *(_DWORD *)(v5 + 48);
v10 = (_DWORD *)(v5 + 48);
if( (v9 & 0x8000) == 0 && ((v9 & 0x2000) == 0 || KeGetCurrentIrql() != 2) )
{
v11 = 0;
goto LABEL_5;
}
}
else
{
v10 = (_DWORD *)(v5 + 48);
}
v8 = v10;
v11 = 1;
if( (*v10 & 0x8000) != 0 )
{
LABEL_5:
PoDeviceAcquireIrp((__int64)Irp, *(_BYTE *)(v2 + 1), v5);
if( !v11 )
return v11;
}
if( (*v8 & 0x8000) != 0 )
{
*((_DWORD *)Irp + 12) = 0;
*((_QWORD *)Irp + 7) = 0i64;
IofCompleteRequest(Irp, 0);
*(_DWORD *)Status = 0;
}
else
{
KeAcquireInStackQueuedSpinLock(&PopIrpLock, &LockHandle);
PopDispatchQuerySetIrp(Irp);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
*(_DWORD *)Status = 259;
}
return v11;
}Referenced by:
IopPoHandleIrp