Class: RubySMB::Dcerpc::Ndr::NdrPointer

Inherits:
BinData::Primitive
  • Object
show all
Defined in:
lib/ruby_smb/dcerpc/ndr.rb

Overview

An NDR Top-level Full Pointers representation as defined in Transfer Syntax NDR - Top-level Full Pointers This class must be inherited and the subclass must have a #referent property

Instance Method Summary collapse

Instance Method Details

#do_read(io) ⇒ Object



127
128
129
130
131
132
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 127

def do_read(io)
  self.referent_id.do_read(io)
  if process_referent?
    self.referent.do_read(io) unless self.referent_id == 0
  end
end

#do_write(io) ⇒ Object



134
135
136
137
138
139
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 134

def do_write(io)
  self.referent_id.do_write(io)
  if process_referent?
    self.referent.do_write(io) unless self.referent_id == 0
  end
end

#getObject



155
156
157
158
159
160
161
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 155

def get
  if self.referent_id == 0
    :null
  else
    self.referent
  end
end

#process_referent?Boolean

Returns:

  • (Boolean)


163
164
165
166
167
168
169
170
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 163

def process_referent?
  current_parent = parent
  loop do
    return true unless current_parent
    return false if current_parent.is_a?(NdrStruct)
    current_parent = current_parent.parent
  end
end

#set(v) ⇒ Object



141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 141

def set(v)
  if v == :null
    self.referent.clear
    self.referent_id = 0
  else
    if self.referent.respond_to?(:set)
      self.referent.set(v)
    else
      self.referent = v
    end
    self.referent_id = rand(0xFFFFFFFF) if self.referent_id == 0
  end
end