class TurboRex::MSRPC::MIDL::TypeFormatString::CommonPtr

Constants

FC_ALLOCATE_ALL_NODES
FC_ALLOCED_ON_STACK
FC_DONT_FREE
FC_POINTER_DEREF
FC_SIMPLE_POINTER

Public Instance Methods

decompile() click to toggle source
# File lib/turborex/msrpc/midl.rb, line 539
def decompile
  raw = @typefs_stream.read(4)
  header = @cparser.decode_c_struct('CommonPtr_Header_t', raw)

  case  header.PointerType
  when FC_RP
    pointer_type = :ref
  when FC_UP
    pointer_type = :unique
  when FC_FP
    pointer_type = :full
  when FC_OP
    pointer_type = :unknown # Not Implement
  end

  if (header.PointerAttributes & FC_SIMPLE_POINTER) == FC_SIMPLE_POINTER
    struct = @cparser.decode_c_struct('CommonPtr_Simple_t', raw)
    simple_type = struct.SimpleType
    _stream = @typefs_stream.dup
    _stream.base_drift(2)
    pointee = SimpleType.new(_stream, @cparser).decompile
    return DataType::Pointer.new(pointee, pointer_type)
  else
    cstruct = @cparser.find_c_struct('CommonPtr_Complex_t')
    struct = @cparser.decode_c_struct('CommonPtr_Complex_t', raw)
    desc_offset = struct.Offset
    _stream = @typefs_stream.dup
    _stream.base_drift(cstruct.offsetof(@cparser, 'Offset')+desc_offset)
    return TypeFormatString.new(_stream, @cparser).decompile
  end
end