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



224
225
226
227
228
229
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 224

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



231
232
233
234
235
236
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 231

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



252
253
254
255
256
257
258
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 252

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

#process_referent?Boolean

Returns:

  • (Boolean)


260
261
262
263
264
265
266
267
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 260

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



238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/ruby_smb/dcerpc/ndr.rb', line 238

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