SHOW:
|
|
- or go back to the newest paste.
| 1 | # This ruby program will patch the linker executable (link.exe) | |
| 2 | # so that linker warning LNK4099 is ignorable. | |
| 3 | # | |
| 4 | # Reference: http://www.bottledlight.com/docs/lnk4099.html | |
| 5 | ||
| 6 | require "fileutils" | |
| 7 | ||
| 8 | def link_exes() | |
| 9 | res = [] | |
| 10 | res << File.join(ENV["VS90COMNTOOLS"], "../../VC/bin/link.exe") if ENV["VS90COMNTOOLS"] | |
| 11 | res << File.join(ENV["VS100COMNTOOLS"], "../../VC/bin/link.exe") if ENV["VS100COMNTOOLS"] | |
| 12 | res << File.join(ENV["XEDK"], "bin/win32/link.exe") if ENV["XEDK"] | |
| 13 | return res | |
| 14 | end | |
| 15 | ||
| 16 | def patch_link_exe(exe) | |
| 17 | data = nil | |
| 18 | File.open(exe, "rb") {|f| data = f.read}
| |
| 19 | - | pattern = [4099].pack("I")
|
| 19 | + | unpatched = [4088, 4099, 4105].pack("III")
|
| 20 | - | offset = 0 |
| 20 | + | patched = [4088, 65535, 4105].pack("III")
|
| 21 | - | i = 0 |
| 21 | + | |
| 22 | - | while true |
| 22 | + | if data.scan(patched).size > 0 |
| 23 | - | i = data.index(pattern, offset) |
| 23 | + | puts "* Already patched #{exe}"
|
| 24 | - | return false unless i |
| 24 | + | return |
| 25 | - | offset = i+1 |
| 25 | + | |
| 26 | - | next unless i%4 == 0 |
| 26 | + | |
| 27 | - | int_before = data[i-4,4].unpack("I")[0]
|
| 27 | + | num_unpatched = data.scan(unpatched).size |
| 28 | - | int_after = data[i+4,4].unpack("I")[0]
|
| 28 | + | raise "Multiple patch locations in #{exe}" if num_unpatched > 1
|
| 29 | - | break if int_before == 4088 && int_after == 4105 |
| 29 | + | raise "Patch location not found in #{exe}" if num_unpatched == 0
|
| 30 | ||
| 31 | - | puts "* Found patch location #{exe}:#{i}"
|
| 31 | + | offset = data.index(unpatched) |
| 32 | puts "* Found patch location #{exe}:#{offset}"
| |
| 33 | bak = exe + "-" + Time.now.strftime("%y%m%d-%H%M%S") + ".bak"
| |
| 34 | puts " Creating backup #{bak}"
| |
| 35 | FileUtils.cp(exe, bak) | |
| 36 | - | data[i,4] = [65535].pack("I")
|
| 36 | + | |
| 37 | data[offset,unpatched.size] = patched | |
| 38 | File.open(exe, "wb") {|f| f.write(data)}
| |
| 39 | return true | |
| 40 | end | |
| 41 | ||
| 42 | link_exes.each do |exe| | |
| 43 | patch_link_exe(exe) | |
| 44 | end |