class TurboRex::MSRPC::MIDL::OifParamDesc

Constants

FS_LENGTH

Attributes

param_attrs[R]
typefs[R]

Public Instance Methods

decompile() click to toggle source

return Parameter object

# File lib/turborex/msrpc/midl.rb, line 300
def decompile
  raw = @stream.read(FS_LENGTH)
  header = @cparser.decode_c_struct('Oif_ParamDesc_Header_t', raw)

  @param_attrs = header.ParamAttributes
  @stack_offset = header.StackOffset

  case @cparser.cpu.size
  when 32
    ptr_len = 4
  when 64
    ptr_len = 8
  end

  virtual_stack_index = @stack_offset / ptr_len 
  param_name = "arg_#{virtual_stack_index}"

  parameter = Parameter.new(param_name)

  if @param_attrs.IsBasetype == 1
    struct = @cparser.decode_c_struct('Oif_Param_Desc_BaseType_t', raw)
    _stream = @stream.dup
    _stream.base_drift(4)
    data_type = TypeFormatString::SimpleType.new(_stream, @cparser).decompile
  else
    struct = @cparser.decode_c_struct('Oif_Param_Desc_Other_t', raw)
    typefs_offset = struct.TypeOffset
    _typefs_stream = @typefs_stream.dup
    _typefs_stream.base_drift(typefs_offset)
    @typefs = TypeFormatString.new(_typefs_stream, @cparser)

    begin
      data_type = @typefs.decompile
    rescue TurboRex::Exception::MSRPC::InvalidTypeFormatString
      raise TurboRex::Exception::MSRPC::InvalidParamDescriptor
    end
  end

  if @param_attrs.IsSimpleRef == 1 # First-level refenrence pointer
    data_type = DataType::Pointer.new(data_type, :ref)
  end

  parameter.set_data_type(data_type)

  if @param_attrs.IsReturn == 1
    parameter.type_return
    parameter.name = nil
  else
    if @param_attrs.IsIn == 1
      parameter.attributes << :in
    end
  
    if @param_attrs.IsOut == 1
      parameter.attributes << :out
    end
  end


  parameter
end
fs_length() click to toggle source
# File lib/turborex/msrpc/midl.rb, line 361
def fs_length
  FS_LENGTH
end