NAKANO Kouichi
knuck****@f8*****
2002年 5月 18日 (土) 16:46:00 JST
なかのです。 パッチを送ります。 以前の送ったr2e.rbに対するパッチをあてたあとに、 package、rb2exe、ruby-1.6.5を含むディレクトリで ここに添付するパッチをあててください。 ひょっとするとTab問題で途中に手修正が必要かもし れません。また、長い行が切れてるかもしれません。 申し訳ない。 いいメーラーないのかなぁ。 diff -rcw ./package/r2e.rb ../exerb/package/r2e.rb *** ./package/r2e.rb Sat May 18 16:30:30 2002 --- ../exerb/package/r2e.rb Sat May 18 16:33:18 2002 *************** *** 542,548 **** def initialize(binary) @binary = binary ! analyze end #==============================================================# --- 542,549 ---- def initialize(binary) @binary = binary ! @pe_header = PEHeader.new(@binary, offset_to_pe) ! @sections = Sections.new(@binary, @pe_header) end #==============================================================# *************** *** 589,618 **** io.print(pack) end - def analyze - analyze_offset_to_pe - analyze_pe_header - analyze_sections - end - - def analyze_offset_to_pe - @offset_to_pe = @binary[0x3c,4].unpack('L')[0] - end - - def analyze_pe_header - @pe_header = PEHeader.new(@binary, @offset_to_pe) - end - - def analyze_sections - @sections = Sections.new(@binary, @pe_header) - end - def insert!(archive) ! @sections.replace('.ruby', archive, @binary, section_alignment) end def pack - @binary[@pe_header.offset_to_section_headers, @pe_header.number_of_sections * 40] =****@secti*****_headers return @binary end --- 590,601 ---- io.print(pack) end def insert!(archive) ! infomation_of_replacing =****@secti*****('.ruby', archive, @binary, @pe_header.section_alignment) ! @pe_header.update(infomation_of_replacing) end def pack return @binary end *************** *** 621,642 **** end def offset_to_section_alignment ! @offset_to_pe + @pe_header.size_of_pe_signature + @pe_header.size + 32 end end # Core #================================================================# # PEHeader Class class PEHeader ! ! attr_reader :number_of_sections, :size_of_optional_header def initialize(core, offset) @offset_to_me = offset ! @number_of_sections = core[offset + offset_to_number_of_sections, 2].unpack('S')[0] ! @size_of_optional_header = core[offset + offset_to_size_of_optional_header, 2].unpack('S')[0] end def offset_to_number_of_sections --- 604,652 ---- end def offset_to_section_alignment ! @pe_header.offset_to_section_alignment ! end ! ! def offset_to_pe ! @binary[0x3c, 4].unpack('L')[0] end end # Core + module BinaryAccess + def get(offset, size, type) + @core[offset, size].unpack(type)[0] + end + + def put(offset, size, type, value) + @core[offset, size] = [value].pack(type) + end + end #================================================================# # PEHeader Class class PEHeader ! include BinaryAccess def initialize(core, offset) @offset_to_me = offset ! @core = core ! end ! ! def number_of_sections ! get(@offset_to_me + offset_to_number_of_sections, 2, 'S') ! end ! ! def size_of_optional_header ! get(@offset_to_me + offset_to_size_of_optional_header, 2, 'S') ! end ! ! def size_of_image ! get(offset_to_size_of_image, 4, 'L') ! end ! ! def set_size_of_image(number) ! put(offset_to_size_of_image, 4, 'L', number) end def offset_to_number_of_sections *************** *** 652,663 **** end def offset_to_section_headers ! return @offset_to_me + size_of_pe_signature + 20 + size_of_optional_header end ! def size 20 end end #================================================================# --- 662,690 ---- end def offset_to_section_headers ! return @offset_to_me + size_of_pe_signature + size_of_coff_header + size_of_optional_header end ! def offset_to_size_of_image ! @offset_to_me + size_of_pe_signature + size_of_coff_header + 56 ! end ! ! def update(replace_result) ! result = size_of_image + replace_result.gain_of_raw_data ! set_size_of_image(result) ! end ! ! def size_of_coff_header 20 end + + def offset_to_section_alignment + @offset_to_me + size_of_pe_signature + size_of_coff_header + 32 + end + + def section_alignment + get(offset_to_section_alignment, 4, 'L') + end end #================================================================# *************** *** 683,694 **** increment = section.replace(archive, binary, alignment) next_sections = next_section_by_pointer_of section next_sections.each{ |next_section| ! next_section.move_pointer!(increment[0]) } next_sections = next_section_by_address_of section next_sections.each{ |next_section| ! next_section.move_address!(increment[1]) } end def section_named(section_name) --- 710,722 ---- increment = section.replace(archive, binary, alignment) next_sections = next_section_by_pointer_of section next_sections.each{ |next_section| ! next_section.move_pointer!(increment.gain_of_raw_data) } next_sections = next_section_by_address_of section next_sections.each{ |next_section| ! next_section.move_address!(increment.gain_of_virtual_size) } + return increment end def section_named(section_name) *************** *** 706,719 **** def pack_bodies_to(binary) end - def packed_headers - packed = '' - @sections.each{ |section| - packed.concat section.header.pack - } - return packed - end - def packed_bodies sorted =****@secti*****{ |x, y| x.header.pinter_to_raw_data - y.header.pointer_to_raw_data } packed = '' --- 734,739 ---- *************** *** 739,770 **** #================================================================# # a header of Section class Header ! attr_accessor :name, :pointer_to_raw_data, :size_of_raw_data, :virtual_size, :virtual_address def initialize(core, offset) ! @name = core[offset, 8] ! @virtual_size = core[offset + 8, 4].unpack('L')[0] ! @virtual_address = core[offset + 12, 4].unpack('L')[0] ! @size_of_raw_data = core[offset + 16, 4].unpack('L')[0] ! @pointer_to_raw_data = core[offset + 20, 4].unpack('L')[0] ! @pointer_to_relocations = core[offset + 24, 4].unpack('L')[0] ! @pointer_to_line_numbers = core[offset + 28, 4].unpack('L')[0] ! @number_of_relocations = core[offset + 32, 2].unpack('S')[0] ! @number_of_line_numbers = core[offset + 34, 2].unpack('S')[0] ! @characteristics = core[offset + 36, 4].unpack('L')[0] end ! def pack ! packed = @name ! packed.concat [@virtual_size].pack('L') ! packed.concat [@virtual_address].pack('L') ! packed.concat [@size_of_raw_data].pack('L') ! packed.concat [@pointer_to_raw_data].pack('L') ! packed.concat [@pointer_to_relocations].pack('L') ! packed.concat [@pointer_to_line_numbers].pack('L') ! packed.concat [@number_of_relocations].pack('S') ! packed.concat [@number_of_line_numbers].pack('S') ! packed.concat [@characteristics].pack('L') ! return packed end end --- 759,805 ---- #================================================================# # a header of Section class Header ! include BinaryAccess ! def initialize(core, offset) ! @core = core ! @offset = offset end ! def name ! @core[@offset, 8] ! end ! ! def pointer_to_raw_data ! get(@offset + 20, 4, 'L') ! end ! ! def pointer_to_raw_data=(number) ! put(@offset + 20, 4, 'L', number) ! end ! ! def size_of_raw_data ! get(@offset + 16, 4, 'L') ! end ! ! def size_of_raw_data=(number) ! put(@offset + 16, 4, 'L', number) ! end ! ! def virtual_size ! get(@offset + 8, 4, 'L') ! end ! ! def virtual_size=(number) ! put(@offset + 8, 4, 'L', number) ! end ! ! def virtual_address ! get(@offset + 12, 4, 'L') ! end ! ! def virtual_address=(number) ! put(@offset + 12, 4, 'L', number) end end *************** *** 791,797 **** if increment > 0 @header.size_of_raw_data = aligned_size end ! return [increment, self.aligned_size(new_size - old_size, alignment)] end def move_pointer!(distance) --- 826,832 ---- if increment > 0 @header.size_of_raw_data = aligned_size end ! return ReplaceResult.new(increment, self.aligned_size(new_size - old_size, alignment)) end def move_pointer!(distance) diff -rcw ./rb2exe/rb2exe.cpp ../exerb/rb2exe/rb2exe.cpp *** ./rb2exe/rb2exe.cpp Sat May 18 16:30:30 2002 --- ../exerb/rb2exe/rb2exe.cpp Wed May 15 22:29:32 2002 *************** *** 179,191 **** { // アーカイブヘッダのオフセットとサイズをチェック g_pDOSHeader = (PR2E_DOS_HEADER)g_dwFileBase; ! if ( !g_pDOSHeader->OffsetToArchive || !g_pDOSHeader->SizeOfArchive ) { ! ::r2e_error_message("アーカイブヘッダが見つかりません。アーカイブを結合していないコアを実行しようとしている可能性があります。"); ! return false; ! } // アーカイブ内のスクリプト数をチェック ! g_pArchive = (PR2E_ARCHIVE_HEADER)(g_dwFileBase + g_pDOSHeader->OffsetToArchive); if ( g_pArchive->NumberOfScript == 0 ) { ::r2e_error_message("実行するスクリプトが見つかりません。アーカイブ内には最低1つのスクリプトが必要です。"); return false; --- 179,191 ---- { // アーカイブヘッダのオフセットとサイズをチェック g_pDOSHeader = (PR2E_DOS_HEADER)g_dwFileBase; ! // if ( !g_pDOSHeader->OffsetToArchive || !g_pDOSHeader->SizeOfArchive ) { ! // ::r2e_error_message("アーカイブヘッダが見つかりません。アーカイブを結合していないコアを実行しようとしている可能性があります。 "); ! // return false; ! // } // アーカイブ内のスクリプト数をチェック ! g_pArchive = &ArchiveHeader;//(PR2E_ARCHIVE_HEADER)(g_dwFileBase + g_pDOSHeader->OffsetToArchive); if ( g_pArchive->NumberOfScript == 0 ) { ::r2e_error_message("実行するスクリプトが見つかりません。アーカイブ内には最低1つのスクリプトが必要です。"); return false;