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