class TurboRex::MSRPC::MIDL::TypeFormatString::FixedSizedArray
Public Instance Methods
decompile()
click to toggle source
# File lib/turborex/msrpc/midl.rb, line 573 def decompile offset = 0 type = @typefs_stream.read(1).unpack('C').first case type when FC_SMFARRAY size = @cparser.sizeof(@cparser.find_c_struct('SM_FArray_Header_t')) header = @cparser.decode_c_struct('SM_FArray_Header_t', @typefs_stream.read(size)) when FC_LGFARRAY size = @cparser.sizeof(@cparser.find_c_struct('LG_FArray_Header_t')) header = @cparser.decode_c_struct('LG_FArray_Header_t', @typefs_stream.read(size)) end total_size = header.TotalSize offset += size _stream = @typefs_stream.dup _stream.base_drift(offset) if @typefs_stream.read(1, offset).unpack('C').first == FC_PP # Pointer layout ptr_layout = PointerLayout.new(_stream, @cparser) # TODO: How to handle when the count of pointer instance greater than one? layout = ptr_layout.decompile.first offset += ptr_layout.fs_length _stream.base_drift(ptr_layout.fs_length) element = TypeFormatString.new(_stream, @cparser).decompile ary = ::Array.new(layout[:repeat], element) case layout[:type] when :fixed return DataType::Array.new(*ary) end end element = TypeFormatString.new(_stream, @cparser).decompile if (element_size = element.bytesize) == :variable case @cparser.cpu.size when 32 element_size = 4 when 64 element_size = 8 end end ary_len = total_size / element_size ary = ::Array.new(ary_len, element) DataType::Array.new(*ary) end