WmipQuerySingleMultiple

NTSTATUS __stdcall WmipQuerySingleMultiple(
        _IRP *Irp,
        INT8 AccessMode,
        UINT8 *BufferPtr,
        UINT64 BufferSize,
        WMIQSIMULTIPLE *QsiMultiple,
        UINT64 QueryCount,
        _WMIGUIDOBJECT **ObjectList,
        _UNICODE_STRING *InstanceNames,
        UINT64 *ReturnSize){
  UINT8 *v9; 
  NTSTATUS v10; 
  _WMIGUIDOBJECT **v11; 
  VOID **PoolWithTag; 
  VOID **v13; 
  int v14; 
  char v15; 
  _WNODE_HEADER *v16; 
  VOID **v17; 
  unsigned int v18; 
  unsigned int v19; 
  unsigned __int16 Length; 
  unsigned int v21; 
  _DWORD *Wnode; 
  VOID *v23; 
  _KPROCESSOR_MODE v24; 
  int v25; 
  __int64 i; 
  __int64 v27; 
  __int64 v28; 
  UINT8 *v29; 
  int v30; 
  UINT64 OutBufferSize; 
  char v33; 
  unsigned __int16 v35; 
  UINT64 ValidSize; 
  unsigned int v37; 
  int v38; 
  _WNODE_HEADER *v39; 
  unsigned int v40; 
  int v41; 
  unsigned int v42; 
  unsigned int v43; 
  VOID *Src; 
  __int64 v45; 
  _WMIGUIDOBJECT **v46; 
  UINT8 *v47; 
  unsigned int v48; 
  _UNICODE_STRING v49; 
  VOID *v50; 
  _WMIGUIDOBJECT *GuidObject; 
  PVOID v52; 
  PVOID v53; 
  UINT64 *v54; 
  _UNICODE_STRING *v55; 
  _IRP *Irpa; 
  UINT8 *v57; 
  UINT64 *v58; 
  char P[592]; 

  v37 = BufferSize;
  v9 = BufferPtr;
  v47 = BufferPtr;
  Irpa = Irp;
  v54 = ReturnSize;
  v58 = ReturnSize;
  v57 = BufferPtr;
  v48 = QueryCount;
  v46 = ObjectList;
  v55 = InstanceNames;
  LODWORD(ValidSize) = 0;
  v41 = 0;
  v49 = 0i64;
  memset(P, 0i64, 0x248u);
  v10 = 0;
  v38 = 0;
  v11 = ObjectList;
  if( ObjectList )
  {
    v13 = 0i64;
    v52 = 0i64;
  }
  else
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 24i64 * (unsigned int)QueryCount, 1885957463i64);
    v13 = PoolWithTag;
    v52 = PoolWithTag;
    if( PoolWithTag )
      memmove(PoolWithTag, QsiMultiple + 2, 24 * QueryCount);
    else
      v10 = -1073741670;
    v9 = v47;
    v11 = v46;
  }
  if( v10 < 0 )
    return v10;
  v14 = 0;
  HIDWORD(ValidSize) = 0;
  v15 = 0;
  v33 = 0;
  v45 = 0i64;
  v16 = (_WNODE_HEADER *)v9;
  v39 = (_WNODE_HEADER *)v9;
  v17 = (VOID **)P;
  v53 = P;
  v18 = 580;
  v43 = 580;
  v19 = 0;
  GuidObject = 0i64;
  while( 1 )
  {
    v42 = v19;
    if( v19 >= v48 )
      break;
    if( v11 )
    {
      v49 = v55[v19];
      GuidObject = v11[v19];
      v50 = 0i64;
      Src = v49.Buffer;
      Length = v49.Length;
    }
    else
    {
      Length = (unsigned __int16)v13[3 * v19 + 1];
      *(_DWORD *)&v49.Length = v13[3 * v19 + 1];
      Src = v13[3 * v19 + 2];
      v49.Buffer = (wchar_t *)Src;
      v50 = v13[3 * v19];
      v16 = v39;
    }
    v35 = Length;
    v21 = (Length + 73) & 0xFFFFFFF8;
    if( v15 || v37 < v21 )
    {
      if( v21 > v18 )
      {
        if( v17 != (VOID **)P )
          ExFreePoolWithTag(v17, 0);
        v17 = ExAllocatePoolWithTag(0x200ui64, v21, 1885957463i64);
        v53 = v17;
        if( !v17 )
        {
          v10 = -1073741670;
          break;
        }
        v43 = v21;
      }
      Wnode = v17;
      v40 = v21;
      v45 = 0i64;
      v33 = 1;
    }
    else
    {
      Wnode = &v16->BufferSize;
      v40 = v37;
    }
    memset(Wnode, 0i64, 0x40u);
    Wnode[11] = 2;
    *Wnode = v21;
    *((_QWORD *)Wnode + 2) = v50;
    Wnode[12] = 64;
    Wnode[14] = v21;
    *((_WORD *)Wnode + 32) = v35;
    if( AccessMode == 1 && v35 )
    {
      if( ((__int64)v49.Buffer & 1) != 0 )
        ExRaiseDatatypeMisalignment();
      v23 = Src;
      if( (unsigned __int64)Src + v35 > 0x7FFFFFFF0000i64 || (char *)Src + v35 < Src )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    else
    {
      v23 = Src;
    }
    memmove((char *)Wnode + 66, v23, v35);
    LODWORD(ValidSize) = *Wnode;
    LODWORD(OutBufferSize) = v40;
    LOBYTE(v24) = AccessMode;
    if( WmipQuerySetExecuteSI(GuidObject, Irpa, v24, 1u, Wnode, OutBufferSize, &ValidSize) < 0 )
      goto LABEL_37;
    v25 = Wnode[11];
    if( (v25 & 0x100) != 0 )
      goto LABEL_37;
    ++v38;
    if( (v25 & 0x20) != 0 )
    {
      v14 += (Wnode[12] + 7) & 0xFFFFFFF8;
      HIDWORD(ValidSize) = v14;
      v15 = 1;
      v33 = 1;
      goto LABEL_38;
    }
    if( v33 )
    {
      v14 += (ValidSize + 7) & 0xFFFFFFF8;
      HIDWORD(ValidSize) = v14;
LABEL_37:
      v15 = v33;
LABEL_38:
      v16 = v39;
      goto LABEL_39;
    }
    if( v45 )
      *(_DWORD *)(v45 + 12) = v41;
    for( i = (__int64)Wnode; ; i += v27 )
    {
      v45 = i;
      v27 = *(unsigned int *)(i + 12);
      if( !(_DWORD)v27 )
        break;
    }
    v28 = ((_DWORD)ValidSize + 7) & 0xFFFFFFF8;
    v14 += v28;
    HIDWORD(ValidSize) = v14;
    v37 -= v28;
    v16 = (_WNODE_HEADER *)((char *)v39 + v28);
    v39 = v16;
    v41 = (_DWORD)v16 - i;
    v15 = 0;
LABEL_39:
    v19 = v42 + 1;
    v18 = v43;
    v11 = v46;
  }
  v29 = v47;
  if( v17 != (VOID **)P )
    ExFreePoolWithTag(v17, 0);
  if( !v38 )
    v10 = -1073741163;
  if( v10 >= 0 && v15 )
  {
    v30 = 56;
    *(_DWORD *)v29 = 56;
    *((_DWORD *)v29 + 11) = 32;
    *((_DWORD *)v29 + 12) = v14;
  }
  else
  {
    v30 = v14;
  }
  *(_DWORD *)v54 = v30;
  if( v13 )
    ExFreePoolWithTag(v13, 0);
  return v10;
}

Referenced by:

IoWMIQuerySingleInstanceMultiple
WmipIoControl