IoWMIExecuteMethod

INT64 __stdcall IoWMIExecuteMethod(
        PVOID DataBlockObject,
        UNICODE_STRING *InstanceName,
        UINT64 MethodId,
        UINT64 InBufferSize,
        UINT64 *OutBufferSize,
        UINT8 *InOutBuffer){
  UINT64 *v6; 
  int v7; 
  UINT64 v9; 
  unsigned int v11; 
  int v12; 
  _QWORD *a5; 
  int SetExecuteSI; 
  int v15; 
  int v16; 
  int v17; 
  UINT8 *v18; 
  unsigned int v19; 
  UINT8 *v21; 
  UINT64 BufferLength; 
  UINT64 InstanceNameOffset; 
  PVOID P; 
  UINT64 a7; 
  v6 = OutBufferSize;
  LODWORD(a7) = 0;
  v7 = MethodId;
  InstanceNameOffset = 0i64;
  v9 = *(unsigned int *)OutBufferSize;
  P = 0i64;
  v11 = InBufferSize;
  if( (unsigned int)InBufferSize > (unsigned int)v9 )
    v9 = (unsigned int)InBufferSize;
  v12 = WmipAllocateSingleInstanceWnode(
          0x44ui64,
          InstanceName,
          v9,
          &InstanceNameOffset,
          (UINT64 *)((char *)&InstanceNameOffset + 4),
          &a7,
          &P);
  a5 = P;
  SetExecuteSI = v12;
  if( v12 >= 0 )
  {
    v15 = InstanceNameOffset;
    v16 = a7;
    *((_DWORD *)P + 11) = 0x8000;
    a5[2] = 0i64;
    *(_DWORD *)a5 = v16;
    *((_DWORD *)a5 + 3) = 0;
    *((_DWORD *)a5 + 14) = v7;
    v17 = HIDWORD(InstanceNameOffset);
    *((_DWORD *)a5 + 12) = v15;
    *((_DWORD *)a5 + 15) = v17;
    *((_DWORD *)a5 + 16) = v11;
    v18 = (UINT8 *)a5 + *((unsigned int *)a5 + 12);
    *(_WORD *)v18 = InstanceName->Length;
    memmove(v18 + 2, (UINT8 *)InstanceName->Buffer, InstanceName->Length);
    memmove((UINT8 *)a5 + *((unsigned int *)a5 + 15), InOutBuffer, v11);
    LODWORD(a7) = *(_DWORD *)a5;
    LODWORD(BufferLength) = v16;
    SetExecuteSI = WmipQuerySetExecuteSI(
                     (_ADAPTER_OBJECT *)DataBlockObject,
                     0i64,
                     0,
                     9u,
                     (INT64)a5,
                     BufferLength,
                     (INT64)&a7);
    if( SetExecuteSI >= 0 )
    {
      if( (*((_DWORD *)a5 + 11) & 0x20) != 0 )
      {
        v19 = *((_DWORD *)a5 + 12) - v17;
LABEL_7:
        SetExecuteSI = -1073741789;
        *(_DWORD *)v6 = (v19 + 7) & 0xFFFFFFF8;
        goto LABEL_8;
      }
      v19 = *((_DWORD *)a5 + 16);
      if( *(_DWORD *)v6 < v19 )
        goto LABEL_7;
      v21 = InOutBuffer;
      *(_DWORD *)v6 = v19;
      memmove(v21, (UINT8 *)a5 + *((unsigned int *)a5 + 15), *((unsigned int *)a5 + 16));
    }
  }
LABEL_8:
  if( a5 )
    ExFreePoolWithTag(a5, 0);
  return(unsigned int)SetExecuteSI;
}

Referenced by:

No references.