PiDqQueryGetNextIoctlInfo

VOID __stdcall PiDqQueryGetNextIoctlInfo(
        _PI_DQ_QUERY *Query,
        UINT64 CurrentBufferSize,
        UINT64 MinBytesNeeded,
        _DEV_QUERY_IOCTL_CONTROL_BLOCK *ControlBlock){
  _PI_DQ_QUERY v4; 
  unsigned int v5; 
  unsigned int v6; 
  unsigned int cbNextBufferSize; 

  if( !*((_QWORD *)Query + 23) && *((_PI_DQ_QUERY **)Query + 24) == Query + 48 && (Query[54] & 0x20) != 0 )
  {
    if( (*(_DWORD *)(*((_QWORD *)Query + 3) + 40i64) & 1) != 0 )
    {
      ControlBlock->NextIoctl = 4653064;
      ControlBlock->cbNextBufferSize = 16;
    }
    else
    {
      *(_QWORD *)&ControlBlock->NextIoctl = 0i64;
    }
  }
  else
  {
    ControlBlock->NextIoctl = 4653063;
    if( (Query[54] & 0x20) != 0 )
    {
      v4 = Query[52];
      if( *((_QWORD *)Query + 23) )
        ++v4;
    }
    else
    {
      v4 = 4;
    }
    if( (_DWORD)MinBytesNeeded )
      v5 = MinBytesNeeded * v4 + 16;
    else
      v5 = v4 << 10;
    v6 = 0x10000;
    ControlBlock->cbNextBufferSize = v5;
    if( v5 > 0x10000 )
      ControlBlock->cbNextBufferSize = 0x10000;
    else
      v6 = v5;
    if( v6 < (unsigned int)MinBytesNeeded )
    {
      ControlBlock->cbNextBufferSize = MinBytesNeeded;
      v6 = MinBytesNeeded;
    }
    cbNextBufferSize = ControlBlock->cbNextBufferSize;
    if( v6 < (unsigned int)CurrentBufferSize )
      cbNextBufferSize = CurrentBufferSize;
    ControlBlock->cbNextBufferSize = cbNextBufferSize;
  }
}

Referenced by:

PiDqIrpQueryCreate
PiDqIrpQueryGetResult
PiDqQueryCompletePendedIrp