lib/ruby_smb/dcerpc/ndr.rb in ruby_smb-3.1.7 vs lib/ruby_smb/dcerpc/ndr.rb in ruby_smb-3.2.0

- old
+ new

@@ -1206,17 +1206,53 @@ class NdrWideStringzPtr < NdrConfVarWideStringz extend PointerClassPlugin end + + # ArrayPtr definitions: + # If the type is Ndr*ArrayPtr, it's a ConfVarArray (Uni-dimensional Conformant-varying Array) + # If the type is Ndr*ConfArrayPtr, it's a ConfArray (Uni-dimensional Conformant Array) class NdrByteArrayPtr < NdrConfVarArray default_parameters type: :ndr_uint8 extend PointerClassPlugin + + def assign(val) + val = val.bytes if val.is_a?(String) + super(val.to_ary) + end end - class NdrUint16ArrayPtr < NdrConfVarArray - default_parameters type: :ndr_uint16 + class NdrByteConfArrayPtr < NdrConfArray + default_parameters type: :ndr_uint8 extend PointerClassPlugin + + def assign(val) + val = val.bytes if val.is_a?(String) + super(val.to_ary) + end + end + + %i[ Uint8 Uint16 Uint32 Uint64 ].each do |klass| + new_klass_name = "Ndr#{klass}ArrayPtr" + unless self.const_defined?(new_klass_name) + new_klass = Class.new(NdrConfVarArray) do + default_parameters type: "ndr_#{klass}".downcase.to_sym + extend PointerClassPlugin + end + self.const_set(new_klass_name, new_klass) + BinData::RegisteredClasses.register(new_klass_name, new_klass) + end + + new_klass_name = "Ndr#{klass}ConfArrayPtr" + unless self.const_defined?(new_klass_name) + new_klass = Class.new(NdrConfArray) do + default_parameters type: "ndr_#{klass}".downcase.to_sym + extend PointerClassPlugin + end + self.const_set(new_klass_name, new_klass) + BinData::RegisteredClasses.register(new_klass_name, new_klass) + end end class NdrFileTimePtr < NdrFileTime extend PointerClassPlugin end