WmipQuerySetExecuteSI

INT64 __fastcall WmipQuerySetExecuteSI(
        _ADAPTER_OBJECT *DmaAdapter,
        IRP *Irp,
        KPROCESSOR_MODE AccessMode,
        UINT8 a4,
        INT64 a5,
        UINT64 BufferLength,
        INT64 a7){
  _DWORD *v7; 
  __int64 v11; 
  ACCESS_MASK v12; 
  int v13; 
  NTSTATUS v14; 
  int v15; 
  INT64 *v16; 
  UINT64 v17; 
  int v18; 
  unsigned __int64 *p_Information; 
  __int64 v20; 
  volatile signed __int64 **v21; 
  void *v23; 
  UINT64 v24; 
  int v25; 
  unsigned __int64 *v26; 
  PVOID *Object; 
  BYTE v28; 
  char v29[7]; 
  PVOID v30; 
  _DWORD *v31; 
  PVOID P; 
  IO_STATUS_BLOCK Iosb; 
  INT64 result[16]; 
  v7 = (_DWORD *)a7;
  v31 = (_DWORD *)a7;
  v11 = a4;
  memset((INT64)result, 0i64);
  v12 = *((_DWORD *)DesiredAccessForFunction + v11);
  v13 = 0;
  v29[0] = 0;
  v28 = 0;
  Iosb = 0i64;
  if( DmaAdapter )
  {
    v14 = ObReferenceObjectByPointer(DmaAdapter, v12, WmipGuidObjectType, AccessMode);
  }
  else
  {
    v23 = *(void **)(a5 + 16);
    v30 = 0i64;
    v14 = ObReferenceObjectByHandle(v23, v12, WmipGuidObjectType, AccessMode, &v30, 0i64);
    DmaAdapter = (_ADAPTER_OBJECT *)v30;
  }
  v15 = v14;
  if( v14 < 0 )
    return(unsigned int)v15;
  LODWORD(v30) = 16;
  P = result;
  v15 = WmipPrepareWnodeSI((INT64)DmaAdapter, a5, (UINT64 *)&v30, &P, (BYTE *)v29, &v28);
  if( v15 >= 0 )
  {
    if( v28 )
    {
      *(_DWORD *)(a5 + 44) |= 0x100u;
      *(_DWORD *)a5 = 48;
      *((_QWORD *)Irp + 7) = 48i64;
    }
    else if( v29[0] )
    {
      if( (_BYTE)v11 == 3 || (v15 = -1073741162, (_BYTE)v11 == 9) )
        v15 = -1073741161;
      v16 = (INT64 *)P;
      if( (_DWORD)v30 )
      {
        while( 1 )
        {
          v17 = *(unsigned int *)(v16[v13] + 80);
          *(_DWORD *)(a5 + 4) = v17;
          if( Irp )
          {
            LODWORD(Object) = BufferLength;
            v18 = WmipForwardWmiIrp(Irp, v11, (unsigned int)v17, (VOID *)(a5 + 24), (UINT64)Object, (VOID *)a5);
            p_Information = (unsigned __int64 *)((char *)Irp + 56);
          }
          else
          {
            v18 = WmipSendWmiIrp(v11, v17, (VOID *)(a5 + 24), (unsigned int)BufferLength, (VOID *)a5, &Iosb);
            p_Information = &Iosb.Information;
          }
          if( v18 >= 0 )
            *v31 = *(_DWORD *)p_Information;
          if( (unsigned int)(v18 + 1073741163) > 1 )
            break;
          if( ++v13 >= (unsigned int)v30 )
            goto LABEL_18;
        }
        v15 = v18;
LABEL_18:
        v20 = (unsigned int)v30;
        v21 = (volatile signed __int64 **)v16;
        do
        {
          WmipUnreferenceEntry((__int64)&WmipISChunkInfo, *v21++);
          --v20;
        }
        while( v20 );
      }
      if( v16 != result && v16 )
        ExFreePoolWithTag(v16, 0);
      v7 = v31;
    }
    else
    {
      v24 = *(unsigned int *)(a5 + 4);
      if( Irp )
      {
        LODWORD(Object) = BufferLength;
        v25 = WmipForwardWmiIrp(Irp, v11, (unsigned int)v24, (VOID *)(a5 + 24), (UINT64)Object, (VOID *)a5);
        v26 = (unsigned __int64 *)((char *)Irp + 56);
      }
      else
      {
        v25 = WmipSendWmiIrp(v11, v24, (VOID *)(a5 + 24), (unsigned int)BufferLength, (VOID *)a5, &Iosb);
        v26 = &Iosb.Information;
      }
      v15 = v25;
      if( v25 < 0 )
      {
LABEL_25:
        *(_DWORD *)(a5 + 4) = 0;
        goto LABEL_26;
      }
      *(_DWORD *)a7 = *(_DWORD *)v26;
    }
    if( v15 >= 0 && *v7 > (unsigned int)BufferLength )
      v15 = -1073741811;
    goto LABEL_25;
  }
LABEL_26:
  if( DmaAdapter )
    HalPutDmaAdapter((PADAPTER_OBJECT)DmaAdapter);
  return(unsigned int)v15;
}

Referenced by:

IoWMIExecuteMethod
IoWMIQuerySingleInstance
IoWMISetSingleInstance
IoWMISetSingleItem
WmipIoControl
WmipQuerySingleMultiple