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