WmipQuerySetExecuteSI

NTSTATUS __stdcall WmipQuerySetExecuteSI(
        VOID *GuidObject,
        PIRP Irp,
        _KPROCESSOR_MODE AccessMode,
        UINT8 MinorFunction,
        VOID *Wnode,
        UINT64 OutBufferSize,
        UINT64 *ValidSize){
  UINT64 *v7; 
  INT8 v8; 
  __int64 v11; 
  UINT64 v12; 
  int v13; 
  NTSTATUS v14; 
  int v15; 
  tagInstanceSet **v16; 
  UINT64 v17; 
  NTSTATUS v18; 
  unsigned __int64 *p_Information; 
  __int64 v20; 
  volatile signed __int64 **v21; 
  VOID *v23; 
  UINT64 v24; 
  NTSTATUS v25; 
  unsigned __int64 *v26; 
  UINT8 *IsDynamic; 
  UINT8 InternalGuid; 
  char v29[7]; 
  UINT64 ProviderIdCount; 
  UINT64 *v31; 
  tagInstanceSet **ProviderIdList; 
  _IO_STATUS_BLOCK Iosb; 
  char v34[128]; 

  v7 = ValidSize;
  v8 = AccessMode;
  v31 = ValidSize;
  v11 = MinorFunction;
  memset(v34, 0i64, sizeof(v34));
  v12 = *((unsigned int *)DesiredAccessForFunction + v11);
  v13 = 0;
  v29[0] = 0;
  InternalGuid = 0;
  Iosb = 0i64;
  if( GuidObject )
  {
    v14 = ObReferenceObjectByPointer(GuidObject, v12, WmipGuidObjectType, v8);
  }
  else
  {
    v23 = (VOID *)*((_QWORD *)Wnode + 2);
    ProviderIdCount = 0i64;
    v14 = ObReferenceObjectByHandle(v23, v12, WmipGuidObjectType, v8, (VOID **)&ProviderIdCount, 0i64);
    GuidObject = (VOID *)ProviderIdCount;
  }
  v15 = v14;
  if( v14 < 0 )
    return v15;
  LODWORD(ProviderIdCount) = 16;
  ProviderIdList = (tagInstanceSet **)v34;
  v15 = WmipPrepareWnodeSI(
          (_WMIGUIDOBJECT *)GuidObject,
          (tagWNODE_SINGLE_INSTANCE *)Wnode,
          &ProviderIdCount,
          (VOID **)&ProviderIdList,
          v29,
          &InternalGuid);
  if( v15 >= 0 )
  {
    if( InternalGuid )
    {
      *((_DWORD *)Wnode + 11) |= 0x100u;
      *(_DWORD *)Wnode = 48;
      Irp->IoStatus.Information = 48i64;
    }
    else if( v29[0] )
    {
      if( (_BYTE)v11 == 3 || (v15 = -1073741162, (_BYTE)v11 == 9) )
        v15 = -1073741161;
      v16 = ProviderIdList;
      if( (_DWORD)ProviderIdCount )
      {
        while( 1 )
        {
          v17 = (unsigned int)v16[v13][20];
          *((_DWORD *)Wnode + 1) = v17;
          if( Irp )
          {
            LODWORD(IsDynamic) = OutBufferSize;
            v18 = WmipForwardWmiIrp(Irp, v11, (unsigned int)v17, (char *)Wnode + 24, (UINT64)IsDynamic, Wnode);
            p_Information = &Irp->IoStatus.Information;
          }
          else
          {
            v18 = WmipSendWmiIrp(v11, v17, (char *)Wnode + 24, (unsigned int)OutBufferSize, Wnode, &Iosb);
            p_Information = &Iosb.Information;
          }
          if( v18 >= 0 )
            *(_DWORD *)v31 = *(_DWORD *)p_Information;
          if( (unsigned int)(v18 + 1073741163) > 1 )
            break;
          if( ++v13 >= (unsigned int)ProviderIdCount )
            goto LABEL_18;
        }
        v15 = v18;
LABEL_18:
        v20 = (unsigned int)ProviderIdCount;
        v21 = (volatile signed __int64 **)v16;
        do
        {
          WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4496, *v21++);
          --v20;
        }
        while( v20 );
      }
      if( v16 != (tagInstanceSet **)v34 && v16 )
        ExFreePoolWithTag(v16, 0);
      v7 = v31;
    }
    else
    {
      v24 = *((unsigned int *)Wnode + 1);
      if( Irp )
      {
        LODWORD(IsDynamic) = OutBufferSize;
        v25 = WmipForwardWmiIrp(Irp, v11, (unsigned int)v24, (char *)Wnode + 24, (UINT64)IsDynamic, Wnode);
        v26 = &Irp->IoStatus.Information;
      }
      else
      {
        v25 = WmipSendWmiIrp(v11, v24, (char *)Wnode + 24, (unsigned int)OutBufferSize, Wnode, &Iosb);
        v26 = &Iosb.Information;
      }
      v15 = v25;
      if( v25 < 0 )
      {
LABEL_25:
        *((_DWORD *)Wnode + 1) = 0;
        goto LABEL_26;
      }
      *(_DWORD *)ValidSize = *(_DWORD *)v26;
    }
    if( v15 >= 0 && *(_DWORD *)v7 > (unsigned int)OutBufferSize )
      v15 = -1073741811;
    goto LABEL_25;
  }
LABEL_26:
  if( GuidObject )
    HalPutDmaAdapter((PADAPTER_OBJECT)GuidObject);
  return v15;
}

Referenced by:

IoWMIExecuteMethod
IoWMIQuerySingleInstance
IoWMISetSingleInstance
IoWMISetSingleItem
WmipIoControl
WmipQuerySingleMultiple