WmipQuerySingleMultiple

__int64 __fastcall WmipQuerySingleMultiple(
        IRP *a1,
        KPROCESSOR_MODE a2,
        __int64 a3,
        unsigned int a4,
        __int64 a5,
        unsigned int a6,
        __int64 a7,
        __int64 a8,
        int *a9){
  __int64 v9; 
  int v10; 
  __int64 v11; 
  _WORD *PoolWithTag; 
  _WORD *v13; 
  int v14; 
  char v15; 
  INT64 v16; 
  char *v17; 
  unsigned int v18; 
  unsigned int v19; 
  unsigned __int16 v20; 
  unsigned int v21; 
  INT64 v22; 
  UINT8 *v23; 
  int v24; 
  __int64 i; 
  __int64 v26; 
  __int64 v27; 
  _DWORD *v28; 
  int v29; 
  UINT64 BufferLength; 
  char v32; 
  unsigned __int16 v34; 
  int v35; 
  int v36; 
  unsigned int v37; 
  int v38; 
  INT64 result; 
  unsigned int v40; 
  int v41; 
  unsigned int v42; 
  unsigned int v43; 
  void *Src; 
  __int64 v45; 
  __int64 v46; 
  _DWORD *v47; 
  unsigned int v48; 
  __int128 v49; 
  __int64 v50; 
  PADAPTER_OBJECT DmaAdapter; 
  PVOID v52; 
  PVOID v53; 
  int *v54; 
  __int64 v55; 
  PIRP Irp; 
  __int64 v57; 
  int *v58; 
  char P[592]; 
  v37 = a4;
  v9 = a3;
  v47 = (_DWORD *)a3;
  Irp = a1;
  v54 = a9;
  v58 = a9;
  v57 = a3;
  v48 = a6;
  v46 = a7;
  v55 = a8;
  v35 = 0;
  v41 = 0;
  v49 = 0i64;
  memset((INT64)P, 0i64);
  v10 = 0;
  v38 = 0;
  v11 = a7;
  if( a7 )
  {
    v13 = 0i64;
    v52 = 0i64;
  }
  else
  {
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, 24i64 * a6, 0x70696D57ui64);
    v13 = PoolWithTag;
    v52 = PoolWithTag;
    if( PoolWithTag )
      memmove((UINT8 *)PoolWithTag, (UINT8 *)(a5 + 8), 24i64 * a6);
    else
      v10 = -1073741670;
    v9 = (__int64)v47;
    v11 = v46;
  }
  if( v10 < 0 )
    return(unsigned int)v10;
  v14 = 0;
  v36 = 0;
  v15 = 0;
  v32 = 0;
  v45 = 0i64;
  v16 = v9;
  result = v9;
  v17 = P;
  v53 = P;
  v18 = 580;
  v43 = 580;
  v19 = 0;
  DmaAdapter = 0i64;
  while( 1 )
  {
    v42 = v19;
    if( v19 >= v48 )
      break;
    if( v11 )
    {
      v49 = *(_OWORD *)(v55 + 16i64 * v19);
      DmaAdapter = *(PADAPTER_OBJECT *)(v11 + 8i64 * v19);
      v50 = 0i64;
      Src = (void *)*((_QWORD *)&v49 + 1);
      v20 = v49;
    }
    else
    {
      v20 = v13[12 * v19 + 4];
      LODWORD(v49) = *(_DWORD *)&v13[12 * v19 + 4];
      Src = *(void **)&v13[12 * v19 + 8];
      *((_QWORD *)&v49 + 1) = Src;
      v50 = *(_QWORD *)&v13[12 * v19];
      v16 = result;
    }
    v34 = v20;
    v21 = (v20 + 73) & 0xFFFFFFF8;
    if( v15 || v37 < v21 )
    {
      if( v21 > v18 )
      {
        if( v17 != P )
          ExFreePoolWithTag(v17, 0);
        v17 = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, v21, 0x70696D57ui64);
        v53 = v17;
        if( !v17 )
        {
          v10 = -1073741670;
          break;
        }
        v43 = v21;
      }
      v22 = (INT64)v17;
      v40 = v21;
      v45 = 0i64;
      v32 = 1;
    }
    else
    {
      v22 = v16;
      v40 = v37;
    }
    memset(v22, 0i64);
    *(_DWORD *)(v22 + 44) = 2;
    *(_DWORD *)v22 = v21;
    *(_QWORD *)(v22 + 16) = v50;
    *(_DWORD *)(v22 + 48) = 64;
    *(_DWORD *)(v22 + 56) = v21;
    *(_WORD *)(v22 + 64) = v34;
    if( a2 == 1 && v34 )
    {
      if( (BYTE8(v49) & 1) != 0 )
        ExRaiseDatatypeMisalignment();
      v23 = (UINT8 *)Src;
      if( (unsigned __int64)Src + v34 > 0x7FFFFFFF0000i64 || (char *)Src + v34 < Src )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    else
    {
      v23 = (UINT8 *)Src;
    }
    memmove((UINT8 *)(v22 + 66), v23, v34);
    v35 = *(_DWORD *)v22;
    LODWORD(BufferLength) = v40;
    if( (int)WmipQuerySetExecuteSI((_ADAPTER_OBJECT *)DmaAdapter, Irp, a2, 1u, v22, BufferLength, (INT64)&v35) < 0 )
      goto LABEL_37;
    v24 = *(_DWORD *)(v22 + 44);
    if( (v24 & 0x100) != 0 )
      goto LABEL_37;
    ++v38;
    if( (v24 & 0x20) != 0 )
    {
      v14 += (*(_DWORD *)(v22 + 48) + 7) & 0xFFFFFFF8;
      v36 = v14;
      v15 = 1;
      v32 = 1;
      goto LABEL_38;
    }
    if( v32 )
    {
      v14 += (v35 + 7) & 0xFFFFFFF8;
      v36 = v14;
LABEL_37:
      v15 = v32;
LABEL_38:
      v16 = result;
      goto LABEL_39;
    }
    if( v45 )
      *(_DWORD *)(v45 + 12) = v41;
    for( i = v22; ; i += v26 )
    {
      v45 = i;
      v26 = *(unsigned int *)(i + 12);
      if( !(_DWORD)v26 )
        break;
    }
    v27 = (v35 + 7) & 0xFFFFFFF8;
    v14 += v27;
    v36 = v14;
    v37 -= v27;
    v16 = v27 + result;
    result = v16;
    v41 = v16 - i;
    v15 = 0;
LABEL_39:
    v19 = v42 + 1;
    v18 = v43;
    v11 = v46;
  }
  v28 = v47;
  if( v17 != P )
    ExFreePoolWithTag(v17, 0);
  if( !v38 )
    v10 = -1073741163;
  if( v10 >= 0 && v15 )
  {
    v29 = 56;
    *v28 = 56;
    v28[11] = 32;
    v28[12] = v14;
  }
  else
  {
    v29 = v14;
  }
  *v54 = v29;
  if( v13 )
    ExFreePoolWithTag(v13, 0);
  return(unsigned int)v10;
}

Referenced by:

IoWMIQuerySingleInstanceMultiple
WmipIoControl