IoWMIExecuteMethod

NTSTATUS __stdcall IoWMIExecuteMethod(
        VOID *DataBlockObject,
        _UNICODE_STRING *InstanceName,
        UINT64 MethodId,
        UINT64 InBufferSize,
        UINT64 *OutBufferSize,
        UINT8 *InOutBuffer){
  UINT64 *v6; 
  int v7; 
  UINT64 v9; 
  size_t v11; 
  NTSTATUS v12; 
  _DWORD *Wnode; 
  int v14; 
  int v15; 
  int v16; 
  int v17; 
  unsigned __int16 *v18; 
  unsigned int v19; 
  UINT8 *v21; 
  UINT64 v22; 
  UINT64 InstanceNameOffset; 
  PVOID P; 
  UINT64 ValidSize; 

  v6 = OutBufferSize;
  LODWORD(ValidSize) = 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),
          &ValidSize,
          &P);
  Wnode = P;
  v14 = v12;
  if( v12 >= 0 )
  {
    v15 = InstanceNameOffset;
    v16 = ValidSize;
    *((_DWORD *)P + 11) = 0x8000;
    *((_QWORD *)Wnode + 2) = 0i64;
    *Wnode = v16;
    Wnode[3] = 0;
    Wnode[14] = v7;
    v17 = HIDWORD(InstanceNameOffset);
    Wnode[12] = v15;
    Wnode[15] = v17;
    Wnode[16] = v11;
    v18 = (unsigned __int16 *)((char *)Wnode + (unsigned int)Wnode[12]);
    *v18 = InstanceName->Length;
    memmove(v18 + 1, InstanceName->Buffer, InstanceName->Length);
    memmove((char *)Wnode + (unsigned int)Wnode[15], InOutBuffer, v11);
    LODWORD(ValidSize) = *Wnode;
    LODWORD(v22) = v16;
    v14 = WmipQuerySetExecuteSI(DataBlockObject, 0i64, 0, 9u, Wnode, v22, &ValidSize);
    if( v14 >= 0 )
    {
      if( (Wnode[11] & 0x20) != 0 )
      {
        v19 = Wnode[12] - v17;
LABEL_7:
        v14 = -1073741789;
        *(_DWORD *)v6 = (v19 + 7) & 0xFFFFFFF8;
        goto LABEL_8;
      }
      v19 = Wnode[16];
      if( *(_DWORD *)v6 < v19 )
        goto LABEL_7;
      v21 = InOutBuffer;
      *(_DWORD *)v6 = v19;
      memmove(v21, (char *)Wnode + (unsigned int)Wnode[15], Wnode[16]);
    }
  }
LABEL_8:
  if( Wnode )
    ExFreePoolWithTag(Wnode, 0);
  return v14;
}

Referenced by:

No references.