WmipQueryAllData

INT64 __fastcall WmipQueryAllData(PVOID Object, _IRP *a2, INT8 a3, _DWORD *a4, UINT64 BufferLength, INT64 a6){
  char v9; 
  void *v10; 
  int v11; 
  int v12; 
  unsigned int v13; 
  char v14; 
  unsigned int v15; 
  int *v16; 
  INT64 *v17; 
  __int128 v18; 
  volatile signed __int64 *v19; 
  volatile signed __int64 **v20; 
  int v21; 
  volatile signed __int64 *v22; 
  __int64 v23; 
  UINT64 v24; 
  _IRP *v25; 
  int v26; 
  int *v27; 
  int v28; 
  bool v29; 
  _DWORD *v30; 
  unsigned int v32; 
  int v33; 
  _DWORD *v34; 
  __int128 v35; 
  PVOID *Objecta; 
  int v37; 
  UINT64 Number; 
  int *v39; 
  volatile signed __int64 *v40; 
  PVOID v41; 
  char *v42; 
  PVOID P; 
  __int64 v44; 
  _QWORD v45[3]; 
  PIRP Irp; 
  _DWORD *v47; 
  INT64 v48[10]; 
  INT64 result[16]; 
  Irp = a2;
  v41 = Object;
  v45[0] = a6;
  v47 = a4;
  memset((INT64)result, 0i64);
  memset((INT64)v48, 0i64);
  v9 = 0;
  LOBYTE(v37) = 0;
  *(_OWORD *)&v45[1] = 0i64;
  if( Object )
  {
    v11 = ObReferenceObjectByPointer(Object, 1u, WmipGuidObjectType, a3);
  }
  else
  {
    v10 = (void *)*((_QWORD *)a4 + 2);
    v41 = 0i64;
    v11 = ObReferenceObjectByHandle(v10, 1u, WmipGuidObjectType, a3, &v41, 0i64);
  }
  if( v11 < 0 )
    return(unsigned int)v11;
  HIDWORD(Number) = 16;
  P = result;
  v11 = WmipPrepareForWnodeAD((__int64)v41, &v45[1], (int *)&Number + 1, &P, &v37);
  if( v11 < 0 )
    goto LABEL_35;
  v12 = a4[11];
  LODWORD(Number) = v12;
  if( (_BYTE)v37 )
  {
    a4[3] = 0;
    v35 = *(_OWORD *)&v45[1];
    a4[11] = v12 | 0x100;
    v11 = 0;
    *(_OWORD *)(a4 + 6) = v35;
    *(_DWORD *)a6 = 48;
    goto LABEL_35;
  }
  v13 = 0;
  v40 = 0i64;
  v14 = 0;
  v15 = BufferLength;
  v16 = a4;
  v17 = (INT64 *)P;
  v11 = -1073741163;
  v39 = a4;
  LOBYTE(v37) = 0;
  if( !HIDWORD(Number) )
    goto LABEL_34;
  v18 = *(_OWORD *)&v45[1];
  v19 = v40;
  v20 = (volatile signed __int64 **)P;
  v21 = Number;
  v42 = (char *)P;
  v44 = HIDWORD(Number);
  do
  {
    v22 = *v20;
    v40 = *v20;
    if( v9 || v14 || v15 < 0x48 )
    {
      v15 = 72;
      v16 = (int *)v48;
      memset((INT64)v48, 0i64);
      v22 = v40;
      LOBYTE(v37) = 1;
    }
    *v16 = 48;
    HIDWORD(Number) = v22[2] & 3;
    v23 = (__int64)v42;
    v16[11] = v21 | (HIDWORD(Number) != 0 ? 0x80 : 0);
    *(_OWORD *)(v16 + 6) = v18;
    v24 = *(unsigned int *)(*(_QWORD *)v23 + 80i64);
    v16[3] = 0;
    v25 = Irp;
    v16[1] = v24;
    if( v25 )
    {
      LODWORD(Objecta) = v15;
      v26 = WmipForwardWmiIrp(v25, 0, (unsigned int)v24, v16 + 6, (UINT64)Objecta, v16);
    }
    else
    {
      v26 = WmipSendWmiIrp(0, v24, v16 + 6, v15, v16, (IO_STATUS_BLOCK *)&v45[1]);
    }
    v16[1] = 0;
    if( v26 < 0 )
      goto LABEL_48;
    if( (v16[11] & 0x20) != 0 )
    {
      if( v16[12] <= v15 )
        v26 = -1073741823;
    }
    else if( !v16[13] )
    {
      v26 = -1073741163;
    }
    if( v26 < 0 )
      goto LABEL_48;
    if( (v16[11] & 0x20) != 0 )
    {
      v32 = v16[12];
    }
    else
    {
      if( !(_BYTE)v37 )
      {
        if( v19 )
          *((_DWORD *)v19 + 3) = (_DWORD)v16 - (_DWORD)v19;
        v19 = (volatile signed __int64 *)v16;
        if( HIDWORD(Number) )
        {
          WmipInsertStaticNames(v16, v15, (__int64)v40);
          if( (v16[11] & 0x20) != 0 )
          {
            v9 = 1;
            v27 = v16 + 12;
          }
          else
          {
            v27 = v16;
          }
          v28 = *v27;
        }
        else
        {
          v28 = *v16;
        }
        HIDWORD(Number) = v28;
        WmipAlign(8ui64, (UINT64 *)((char *)&Number + 4));
        v13 += HIDWORD(Number);
        if( !v9 && v15 >= HIDWORD(Number) )
        {
          v15 -= HIDWORD(Number);
          v16 = (int *)((char *)v39 + HIDWORD(Number));
          v39 = v16;
          goto LABEL_29;
        }
        goto LABEL_47;
      }
      v32 = *v16;
    }
    if( v32 < 0x48 )
      v32 = 72;
    LODWORD(Number) = v32 + v13;
    if( HIDWORD(Number) )
    {
      WmipAlign(4ui64, &Number);
      v33 = WmipStaticInstanceNameSize((__int64)v40);
      LODWORD(Number) = v33 + Number;
    }
    WmipAlign(8ui64, &Number);
    v13 = Number;
LABEL_47:
    v9 = 1;
LABEL_48:
    v16 = v39;
LABEL_29:
    WmipUnreferenceEntry((__int64)&WmipISChunkInfo, v40);
    v14 = v37;
    v20 = (volatile signed __int64 **)(v42 + 8);
    v29 = v44-- == 1;
    v42 += 8;
  }
  while( !v29 );
  v30 = v47;
  v17 = (INT64 *)P;
  if( v13 )
  {
    if( v9 )
    {
      if( v13 <= (unsigned int)BufferLength )
        v13 = BufferLength + 64;
      v34 = (_DWORD *)v45[0];
      *v47 = 56;
      v30[11] = 32;
      v30[12] = v13;
      *v34 = 56;
    }
    else
    {
      *(_DWORD *)v45[0] = v13;
    }
    v11 = 0;
  }
LABEL_34:
  if( v17 != result && v17 )
    ExFreePoolWithTag(v17, 0);
LABEL_35:
  HalPutDmaAdapter((PADAPTER_OBJECT)v41);
  return(unsigned int)v11;
}

Referenced by:

IoWMIQueryAllData
WmipIoControl
WmipQueryAllDataMultiple