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