WmipQueryAllDataMultiple

__int64 __fastcall WmipQueryAllDataMultiple(
        unsigned int a1,
        __int64 a2,
        _IRP *a3,
        CHAR a4,
        tagWNODE_ALL_DATA *Wnode,
        UINT64 a6,
        __int64 a7,
        __int64 a8){
  tagWNODE_ALL_DATA *v9; 
  __int64 v10; 
  int v11; 
  __int64 v12; 
  VOID **PoolWithTag; 
  VOID **v14; 
  VOID **v15; 
  ULONG v16; 
  char v17; 
  tagWNODE_ALL_DATA *v18; 
  tagWNODE_ALL_DATA *v19; 
  tagWNODE_ALL_DATA *v20; 
  unsigned int v21; 
  _WMIGUIDOBJECT **v22; 
  char *v23; 
  int v24; 
  _KPROCESSOR_MODE v26; 
  bool v27; 
  _WMIGUIDOBJECT *v28; 
  ULONG Flags; 
  int DataBlockOffset; 
  __int64 Linkage; 
  __int64 v32; 
  int v33; 
  UINT64 OutBufferLen; 
  UINT64 RetSize; 
  tagWNODE_ALL_DATA *v37; 
  ULONG v38; 
  __int64 v39; 
  _WMIGUIDOBJECT *GuidObject; 
  __int64 v41; 
  VOID **v42; 
  __int64 v43; 
  _IRP *Irp; 
  tagWNODE_ALL_DATA *v45; 
  _DWORD *v46; 
  char v47[80]; 

  v9 = Wnode;
  v39 = a2;
  Irp = a3;
  v46 = (_DWORD *)a8;
  v45 = Wnode;
  memset(v47, 0i64, 0x48u);
  v10 = v39;
  v11 = 0;
  RetSize = 0i64;
  v38 = 0;
  GuidObject = 0i64;
  if( v39 )
  {
    v14 = 0i64;
    v42 = 0i64;
  }
  else
  {
    a1 = *(_DWORD *)a7;
    v12 = *(unsigned int *)a7;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 8 * v12, 1885957463i64);
    v42 = PoolWithTag;
    v14 = PoolWithTag;
    if( !PoolWithTag )
      return 3221225626i64;
    if( a1 )
    {
      v15 = PoolWithTag;
      do
      {
        *v15 = *(VOID **)((char *)v15 + a7 - (_QWORD)PoolWithTag + 8);
        ++v15;
        --v12;
      }
      while( v12 );
    }
    v10 = v39;
  }
  v16 = 0;
  v17 = 0;
  v18 = 0i64;
  v19 = Wnode;
  v37 = Wnode;
  v20 = Wnode;
  if( !a1 )
    goto LABEL_26;
  v21 = a6;
  v22 = (_WMIGUIDOBJECT **)v10;
  v43 = (__int64)v14 - v10;
  v23 = (char *)v14 - v10;
  v41 = a1;
  do
  {
    if( v20 == (tagWNODE_ALL_DATA *)v47 || v21 < 0x48 )
    {
      v20 = (tagWNODE_ALL_DATA *)v47;
      v24 = 72;
      v18 = 0i64;
    }
    else
    {
      v20 = v19;
      v24 = v21;
    }
    memset(v20, 0i64, 0x48u);
    v27 = v39 == 0;
    v20->WnodeHeader.Flags = 1;
    v20->WnodeHeader.BufferSize = 48;
    if( v27 )
    {
      v20->WnodeHeader.TimeStamp.QuadPart = *(LONGLONG *)((char *)v22 + (_QWORD)v23);
      v28 = GuidObject;
    }
    else
    {
      v28 = *v22;
      GuidObject = *v22;
    }
    LOBYTE(v26) = a4;
    LODWORD(OutBufferLen) = v24;
    if( WmipQueryAllData(v28, Irp, v26, v20, OutBufferLen, &RetSize) < 0 )
      goto LABEL_23;
    Flags = v20->WnodeHeader.Flags;
    if( (Flags & 0x100) != 0 )
      goto LABEL_23;
    ++HIDWORD(RetSize);
    if( (Flags & 0x20) != 0 )
    {
      DataBlockOffset = v20->DataBlockOffset;
      v20 = (tagWNODE_ALL_DATA *)v47;
LABEL_22:
      v17 = 1;
      v16 += (DataBlockOffset + 7) & 0xFFFFFFF8;
LABEL_23:
      v19 = v37;
      goto LABEL_24;
    }
    if( v20 == (tagWNODE_ALL_DATA *)v47 )
    {
      DataBlockOffset = RetSize;
      goto LABEL_22;
    }
    if( v18 )
      v18->WnodeHeader.Linkage = v38;
    Linkage = v20->WnodeHeader.Linkage;
    v18 = v20;
    while( (_DWORD)Linkage )
    {
      v18 = (tagWNODE_ALL_DATA *)((char *)v18 + Linkage);
      Linkage = v18->WnodeHeader.Linkage;
    }
    v32 = ((_DWORD)RetSize + 7) & 0xFFFFFFF8;
    v19 = (tagWNODE_ALL_DATA *)((char *)v37 + v32);
    v16 += v32;
    v21 -= v32;
    v37 = v19;
    v38 = (_DWORD)v19 - (_DWORD)v18;
LABEL_24:
    ++v22;
    --v41;
  }
  while( v41 );
  v14 = v42;
  v9 = v45;
  v11 = HIDWORD(RetSize);
LABEL_26:
  if( v14 )
    ExFreePoolWithTag(v14, 0);
  if( !v11 )
    return 3221226133i64;
  if( v17 )
  {
    v33 = 56;
    v9->WnodeHeader.Flags = 32;
    v9->WnodeHeader.BufferSize = 56;
    v9->DataBlockOffset = v16;
  }
  else
  {
    v33 = v16;
  }
  *v46 = v33;
  return 0i64;
}

Referenced by:

IoWMIQueryAllDataMultiple
WmipIoControl