WmipQueryAllData

NTSTATUS __stdcall WmipQueryAllData(
        VOID *GuidObject,
        _IRP *Irp,
        _KPROCESSOR_MODE AccessMode,
        tagWNODE_ALL_DATA *Wnode,
        UINT64 OutBufferLen,
        UINT64 *RetSize){
  INT8 v6; 
  char v9; 
  VOID *KernelHandle; 
  int v11; 
  ULONG Flags; 
  unsigned int v13; 
  UINT8 v14; 
  unsigned int v15; 
  tagWNODE_ALL_DATA *v16; 
  tagInstanceSet **v17; 
  GUID v18; 
  tagInstanceSet *v19; 
  tagInstanceSet **v20; 
  int v21; 
  tagInstanceSet *v22; 
  __int64 v23; 
  UINT64 v24; 
  _IRP *v25; 
  NTSTATUS v26; 
  tagWNODE_ALL_DATA *p_DataBlockOffset; 
  ULONG BufferSize; 
  bool v29; 
  tagWNODE_ALL_DATA *v30; 
  unsigned int DataBlockOffset; 
  int v33; 
  _DWORD *v34; 
  GUID v35; 
  PVOID *Object; 
  UINT8 InternalGuid[4]; 
  UINT64 Number; 
  tagWNODE_ALL_DATA *v39; 
  tagInstanceSet *InstanceSet; 
  PVOID v41; 
  tagInstanceSet **v42; 
  tagInstanceSet **ProviderIdList; 
  __int64 v44; 
  _QWORD Guid[3]; 
  _IRP *Irpa; 
  tagWNODE_ALL_DATA *v47; 
  char v48[80]; 
  char v49[128]; 

  v6 = AccessMode;
  Irpa = Irp;
  v41 = GuidObject;
  Guid[0] = RetSize;
  v47 = Wnode;
  memset(v49, 0i64, sizeof(v49));
  memset(v48, 0i64, 0x48u);
  v9 = 0;
  InternalGuid[0] = 0;
  *(_OWORD *)&Guid[1] = 0i64;
  if( GuidObject )
  {
    v11 = ObReferenceObjectByPointer(GuidObject, 1ui64, WmipGuidObjectType, v6);
  }
  else
  {
    KernelHandle = Wnode->WnodeHeader.KernelHandle;
    v41 = 0i64;
    v11 = ObReferenceObjectByHandle(KernelHandle, 1ui64, WmipGuidObjectType, v6, &v41, 0i64);
  }
  if( v11 < 0 )
    return v11;
  HIDWORD(Number) = 16;
  ProviderIdList = (tagInstanceSet **)v49;
  v11 = WmipPrepareForWnodeAD(
          (_WMIGUIDOBJECT *)v41,
          (_GUID *)&Guid[1],
          (UINT64 *)((char *)&Number + 4),
          &ProviderIdList,
          InternalGuid);
  if( v11 < 0 )
    goto LABEL_35;
  Flags = Wnode->WnodeHeader.Flags;
  LODWORD(Number) = Flags;
  if( InternalGuid[0] )
  {
    Wnode->WnodeHeader.Linkage = 0;
    v35 = *(GUID *)&Guid[1];
    Wnode->WnodeHeader.Flags = Flags | 0x100;
    v11 = 0;
    Wnode->WnodeHeader.Guid = v35;
    *(_DWORD *)RetSize = 48;
    goto LABEL_35;
  }
  v13 = 0;
  InstanceSet = 0i64;
  v14 = 0;
  v15 = OutBufferLen;
  v16 = Wnode;
  v17 = ProviderIdList;
  v11 = -1073741163;
  v39 = Wnode;
  InternalGuid[0] = 0;
  if( !HIDWORD(Number) )
    goto LABEL_34;
  v18 = *(GUID *)&Guid[1];
  v19 = InstanceSet;
  v20 = ProviderIdList;
  v21 = Number;
  v42 = ProviderIdList;
  v44 = HIDWORD(Number);
  do
  {
    v22 = *v20;
    InstanceSet = *v20;
    if( v9 || v14 || v15 < 0x48 )
    {
      v15 = 72;
      v16 = (tagWNODE_ALL_DATA *)v48;
      memset(v48, 0i64, 0x48u);
      v22 = InstanceSet;
      InternalGuid[0] = 1;
    }
    v16->WnodeHeader.BufferSize = 48;
    HIDWORD(Number) = v22[4] & 3;
    v23 = (__int64)v42;
    v16->WnodeHeader.Flags = v21 | (HIDWORD(Number) != 0 ? 0x80 : 0);
    v16->WnodeHeader.Guid = v18;
    v24 = *(unsigned int *)(*(_QWORD *)v23 + 80i64);
    v16->WnodeHeader.Linkage = 0;
    v25 = Irpa;
    v16->WnodeHeader.ProviderId = v24;
    if( v25 )
    {
      LODWORD(Object) = v15;
      v26 = WmipForwardWmiIrp(v25, 0, (unsigned int)v24, &v16->WnodeHeader.Guid, (UINT64)Object, v16);
    }
    else
    {
      v26 = WmipSendWmiIrp(0, v24, &v16->WnodeHeader.Guid, v15, v16, (_IO_STATUS_BLOCK *)&Guid[1]);
    }
    v16->WnodeHeader.ProviderId = 0;
    if( v26 < 0 )
      goto LABEL_48;
    if( (v16->WnodeHeader.Flags & 0x20) != 0 )
    {
      if( v16->DataBlockOffset <= v15 )
        v26 = -1073741823;
    }
    else if( !v16->InstanceCount )
    {
      v26 = -1073741163;
    }
    if( v26 < 0 )
      goto LABEL_48;
    if( (v16->WnodeHeader.Flags & 0x20) != 0 )
    {
      DataBlockOffset = v16->DataBlockOffset;
    }
    else
    {
      if( !InternalGuid[0] )
      {
        if( v19 )
          v19[3] = (_DWORD)v16 - (_DWORD)v19;
        v19 = (tagInstanceSet *)v16;
        if( HIDWORD(Number) )
        {
          WmipInsertStaticNames(v16, v15, InstanceSet);
          if( (v16->WnodeHeader.Flags & 0x20) != 0 )
          {
            v9 = 1;
            p_DataBlockOffset = (tagWNODE_ALL_DATA *)&v16->DataBlockOffset;
          }
          else
          {
            p_DataBlockOffset = v16;
          }
          BufferSize = p_DataBlockOffset->WnodeHeader.BufferSize;
        }
        else
        {
          BufferSize = v16->WnodeHeader.BufferSize;
        }
        HIDWORD(Number) = BufferSize;
        WmipAlign(8ui64, (UINT64 *)((char *)&Number + 4));
        v13 += HIDWORD(Number);
        if( !v9 && v15 >= HIDWORD(Number) )
        {
          v15 -= HIDWORD(Number);
          v16 = (tagWNODE_ALL_DATA *)((char *)v39 + HIDWORD(Number));
          v39 = v16;
          goto LABEL_29;
        }
        goto LABEL_47;
      }
      DataBlockOffset = v16->WnodeHeader.BufferSize;
    }
    if( DataBlockOffset < 0x48 )
      DataBlockOffset = 72;
    LODWORD(Number) = DataBlockOffset + v13;
    if( HIDWORD(Number) )
    {
      WmipAlign(4ui64, &Number);
      v33 = WmipStaticInstanceNameSize(InstanceSet);
      LODWORD(Number) = v33 + Number;
    }
    WmipAlign(8ui64, &Number);
    v13 = Number;
LABEL_47:
    v9 = 1;
LABEL_48:
    v16 = v39;
LABEL_29:
    WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4496, (volatile signed __int64 *)InstanceSet);
    v14 = InternalGuid[0];
    v20 = v42 + 1;
    v29 = v44-- == 1;
    ++v42;
  }
  while( !v29 );
  v30 = v47;
  v17 = ProviderIdList;
  if( v13 )
  {
    if( v9 )
    {
      if( v13 <= (unsigned int)OutBufferLen )
        v13 = OutBufferLen + 64;
      v34 = (_DWORD *)Guid[0];
      v47->WnodeHeader.BufferSize = 56;
      v30->WnodeHeader.Flags = 32;
      v30->DataBlockOffset = v13;
      *v34 = 56;
    }
    else
    {
      *(_DWORD *)Guid[0] = v13;
    }
    v11 = 0;
  }
LABEL_34:
  if( v17 != (tagInstanceSet **)v49 && v17 )
    ExFreePoolWithTag(v17, 0);
LABEL_35:
  HalPutDmaAdapter((PADAPTER_OBJECT)v41);
  return v11;
}

Referenced by:

IoWMIQueryAllData
WmipIoControl
WmipQueryAllDataMultiple