PiDqIrpQueryGetResult

NTSTATUS __stdcall PiDqIrpQueryGetResult(IRP *Irp){
  NTSTATUS v2; 
  __int64 v3; 
  INT64 v4; 
  char v5; 
  _ETHREAD *CurrentThread; 
  int v7; 
  unsigned int v8; 
  _ETHREAD *v9; 
  _ETHREAD *v10; 
  unsigned int v11; 
  _ETHREAD *v13; 
  int v14; 
  _OWORD v15[4]; 
  unsigned int a4; 
  INT64 a5; 
  v2 = 0;
  v3 = *((_QWORD *)Irp + 23);
  v4 = *(_QWORD *)(*(_QWORD *)(v3 + 48) + 32i64);
  v14 = *(_DWORD *)(v3 + 24);
  v5 = 0;
  a4 = 0;
  LODWORD(a5) = 0;
  v15[0] = 0i64;
  if( !v4 )
  {
    v2 = -1073741637;
    goto LABEL_14;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx(v4 + 64, 0i64);
  v7 = *(_DWORD *)(v4 + 216);
  if( (v7 & 8) != 0 )
  {
    v2 = -1073741536;
    goto LABEL_7;
  }
  if( (v7 & 4) == 0 )
    goto LABEL_28;
  if( (v7 & 1) == 0 )
  {
    if( (v7 & 0x10) == 0 )
    {
      *(_DWORD *)(v4 + 216) = v7 | 0x10;
      v5 = 1;
      goto LABEL_7;
    }
LABEL_28:
    v2 = -1073741637;
    goto LABEL_7;
  }
  v2 = -1073741670;
LABEL_7:
  ExReleasePushLockEx(v4 + 64, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( v2 < 0 )
    goto LABEL_13;
  v8 = *(_DWORD *)(v3 + 8);
  if( v8 < 0x10 )
  {
    v2 = -1073741789;
  }
  else
  {
    if( v14 == 4653063 )
    {
      ProbeForWrite(*((VOID **)Irp + 14), v8, 8ui64);
      v2 = PiDqQuerySerializeActionQueue(v4, *((_QWORD *)Irp + 14), *(unsigned int *)(v3 + 8), &a4, (INT64)&a5);
      if( v2 < 0 )
        goto LABEL_13;
      v9 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v9 + 242);
      ExAcquirePushLockExclusiveEx(v4 + 64, 0i64);
      PiDqQueryGetNextIoctlInfo(v4, *(unsigned int *)(v3 + 8), (unsigned int)a5, v15);
LABEL_12:
      ExReleasePushLockEx(v4 + 64, 0i64);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
LABEL_13:
      if( v2 == 259 )
        return v2;
      goto LABEL_14;
    }
    if( *((_QWORD *)Irp + 3) )
    {
      v13 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v13 + 242);
      ExAcquirePushLockExclusiveEx(v4 + 64, 0i64);
      if( !*(_QWORD *)(v4 + 184)
        && *(_QWORD *)(v4 + 192) == v4 + 192
        && (*(_DWORD *)(*(_QWORD *)(v4 + 24) + 40i64) & 1) != 0 )
      {
        _InterlockedExchange64((volatile __int64 *)Irp + 13, (__int64)PiDqIrpCancel);
        if( *((_BYTE *)Irp + 68) )
        {
          v2 = -1073741536;
        }
        else
        {
          *(_QWORD *)(v4 + 176) = Irp;
          *(_BYTE *)(*((_QWORD *)Irp + 23) + 3i64) |= 1u;
          v2 = 259;
        }
      }
      else
      {
        PiDqQueryGetNextIoctlInfo(v4, *(unsigned int *)(v3 + 8), 0i64, v15);
        a4 = 16;
      }
      goto LABEL_12;
    }
    v2 = -1073741811;
  }
LABEL_14:
  if( v5 )
  {
    v10 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v10 + 242);
    ExAcquirePushLockExclusiveEx(v4 + 64, 0i64);
    v11 = *(_DWORD *)(v4 + 216) & 0xFFFFFFEF;
    *(_DWORD *)(v4 + 216) = v11;
    if( v2 < 0 )
    {
      *(_DWORD *)(v4 + 216) = v11 | 1;
      PiDqQueryFreeActiveData(v4);
    }
    ExReleasePushLockEx(v4 + 64, 0i64);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  PiDqIrpComplete((__int64)Irp, v2, a4, v15);
  return v2;
}

Referenced by:

PiDqDispatch