resedit 1.6 → 1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/resedit.rb +2 -1
- data/lib/resedit/classes/changeable.rb +28 -4
- data/lib/resedit/convert/codepatch.rb +3 -2
- data/lib/resedit/convert/colors.rb +75 -0
- data/lib/resedit/font/font.rb +34 -8
- data/lib/resedit/font/font_char.rb +25 -20
- data/lib/resedit/mz/mz.rb +4 -0
- data/lib/resedit/mz/mz_body.rb +7 -4
- data/lib/resedit/mz/mz_header.rb +49 -24
- data/lib/resedit/mz/mzenv.rb +7 -2
- data/lib/resedit/text/text.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 778c2b706f9f0dc7daf38221fdd1b31c1bcb24e0
|
4
|
+
data.tar.gz: e55fc3fdbd514f958173df1d9f0f315df937e161
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50651c92183dd3bbdeb1305cb7e6ea03d482f23d2f21bbdc3dc9815b04f9c48e898243f32f21f7237f74ed5fb4028e2c9e08e8dba4c15def232509c61539ca93
|
7
|
+
data.tar.gz: 31a923d1fc346ee0aac0534670d21df368cb97a725a83cb4be6761d98000e86615d903cfe4cf13fbaa65beb58cdc97a518ce8698e4cef2d36e481b216308b86b
|
data/lib/resedit.rb
CHANGED
@@ -10,6 +10,7 @@ require 'resedit/app/font_convert'
|
|
10
10
|
require 'resedit/app/text_convert'
|
11
11
|
require 'resedit/convert/bitconv'
|
12
12
|
require 'resedit/convert/codepatch'
|
13
|
+
require 'resedit/convert/colors'
|
13
14
|
require 'resedit/mz/mz'
|
14
15
|
require 'resedit/classes/colorizer'
|
15
16
|
require 'resedit/classes/hexwriter'
|
@@ -17,5 +18,5 @@ require 'resedit/classes/changeable'
|
|
17
18
|
|
18
19
|
|
19
20
|
module Resedit
|
20
|
-
VERSION = "1.
|
21
|
+
VERSION = "1.7"
|
21
22
|
end
|
@@ -76,17 +76,21 @@ module Resedit
|
|
76
76
|
return ofs
|
77
77
|
end
|
78
78
|
|
79
|
-
def change(ofs, data)
|
80
|
-
return @sz + @n.change(ofs - @sz, data) if ofs > @sz
|
79
|
+
def change(ofs, data, fix=false)
|
80
|
+
return @sz + @n.change(ofs - @sz, data, fix) if ofs > @sz
|
81
81
|
nxt = data.length - @sz + ofs
|
82
82
|
size = nxt>0 ? data.length-nxt : data.length
|
83
|
-
@n.change(0, data[size..-1]) if nxt > 0
|
83
|
+
@n.change(0, data[size..-1], fix) if nxt > 0
|
84
84
|
if @nbuf
|
85
85
|
@nbuf = @nbuf[0,ofs] + data[0, size] + @nbuf[ofs+size..-1]
|
86
86
|
mode()
|
87
87
|
return ofs
|
88
88
|
end
|
89
|
-
|
89
|
+
if fix
|
90
|
+
@obuf = @obuf[0, ofs] + data[0, size] + @obuf[ofs+size..-1]
|
91
|
+
else
|
92
|
+
split(ofs, data[0, size])
|
93
|
+
end
|
90
94
|
mode()
|
91
95
|
return ofs
|
92
96
|
end
|
@@ -186,8 +190,10 @@ module Resedit
|
|
186
190
|
@root = Change.new(data)
|
187
191
|
end
|
188
192
|
|
193
|
+
def setData(data); @root = Change.new(data) end
|
189
194
|
|
190
195
|
def mode(how)
|
196
|
+
return if @mode==how
|
191
197
|
@root.mode(how)
|
192
198
|
@mode = how
|
193
199
|
end
|
@@ -209,6 +215,11 @@ module Resedit
|
|
209
215
|
return ofs
|
210
216
|
end
|
211
217
|
|
218
|
+
def fix(ofs, bytes)
|
219
|
+
@root.change(ofs, bytes, true)
|
220
|
+
return ofs
|
221
|
+
end
|
222
|
+
|
212
223
|
def changed?(ofs, size=1); return @root.changed?(ofs, size) end
|
213
224
|
|
214
225
|
def debug(); LOG.level = Logger::DEBUG end
|
@@ -264,6 +275,19 @@ module Resedit
|
|
264
275
|
return @root.hex(writer, ofs, size, col)
|
265
276
|
end
|
266
277
|
|
278
|
+
def print(what, how)
|
279
|
+
mode(parseHow(how))
|
280
|
+
if what=="changes"
|
281
|
+
getChanges().each{|ofs,bts|
|
282
|
+
printf("%08X: %s -> %s\n", ofs, bts[0].bytes.map { |b| sprintf("%02X",b) }.join,
|
283
|
+
colStr(bts[1].bytes.map { |b| sprintf("%02X",b) }.join))
|
284
|
+
}
|
285
|
+
puts
|
286
|
+
return true
|
287
|
+
end
|
288
|
+
return false
|
289
|
+
end
|
290
|
+
|
267
291
|
|
268
292
|
def saveData(file)
|
269
293
|
mode(HOW_CHANGED)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
|
2
|
+
module Resedit
|
3
|
+
|
4
|
+
class Color
|
5
|
+
attr_accessor :a, :r, :g, :b, :amath
|
6
|
+
|
7
|
+
def initialize(valOrR, g=nil, b=nil, a=0xFF)
|
8
|
+
@amath = false
|
9
|
+
if g == nil
|
10
|
+
@r = (valOrR >> 16) & 0xFF
|
11
|
+
@g = (valOrR >> 8) & 0xFF
|
12
|
+
@b = valOrR & 0xFF
|
13
|
+
@a = (valOrR >> 24) & 0xFF
|
14
|
+
else
|
15
|
+
@r, @g, @b, @a = valOrR, g, b, a
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s()
|
20
|
+
return "[#{@a.to_s(16)} #{@r.to_s(16)} #{@g.to_s(16)} #{@b.to_s(16)}]"
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_i()
|
24
|
+
return (@a<<24)|(@r<<16)|(@g<<8)|@b
|
25
|
+
end
|
26
|
+
|
27
|
+
def add(col)
|
28
|
+
@a = [0xFF, @a + col.a].min if @amath
|
29
|
+
@r = [0xFF, @r + col.r].min
|
30
|
+
@g = [0xFF, @g + col.g].min
|
31
|
+
@b = [0xFF, @b + col.b].min
|
32
|
+
return self
|
33
|
+
end
|
34
|
+
|
35
|
+
def mul(m)
|
36
|
+
@a = [0xFF, (@a * m).to_i()].min if @amath
|
37
|
+
@r = [0xFF, (@r * m).to_i()].min
|
38
|
+
@g = [0xFF, (@g * m).to_i()].min
|
39
|
+
@b = [0xFF, (@b * m).to_i()].min
|
40
|
+
return self
|
41
|
+
end
|
42
|
+
|
43
|
+
def *(m); Color.new(@r,@g,@b,@a).mul(m) end
|
44
|
+
|
45
|
+
def +(col); Color.new(@r,@g,@b,@a).add(col) end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
class ColorMap
|
50
|
+
|
51
|
+
def initialize(from, to)
|
52
|
+
@from = Color.new(from)
|
53
|
+
@to = Color.new(to)
|
54
|
+
end
|
55
|
+
|
56
|
+
def gradient(steps)
|
57
|
+
map = [@from]
|
58
|
+
c = steps-1.0
|
59
|
+
for i in 1..steps-2
|
60
|
+
v = 1.0 * i / c
|
61
|
+
map += [ (@from*(1.0-v) + @to*v).to_i ]
|
62
|
+
end
|
63
|
+
map += [@to]
|
64
|
+
#puts map
|
65
|
+
return map
|
66
|
+
end
|
67
|
+
|
68
|
+
def mapBpp(bpp)
|
69
|
+
return gradient(1<<bpp)
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/lib/resedit/font/font.rb
CHANGED
@@ -1,26 +1,50 @@
|
|
1
1
|
require 'resedit/font/font_char'
|
2
2
|
require 'resedit/image/image_factory'
|
3
|
+
require 'resedit/convert/colors'
|
3
4
|
|
4
5
|
module Resedit
|
5
6
|
|
6
7
|
class Font
|
7
|
-
attr_reader :count, :width, :height
|
8
|
+
attr_reader :count, :width, :height, :bpp
|
8
9
|
attr_accessor :gridColor, :charColor, :userData, :widthColor, :bgColor
|
9
10
|
|
10
11
|
# charWidth, charHeight, characters count
|
11
|
-
def initialize(width, height, count
|
12
|
+
def initialize(width, height, count: 256, bpp: 1)
|
12
13
|
@width, @height, @count = width, height, count
|
13
14
|
@gridColor = 0xFFEEEEEE
|
14
15
|
@charColor = 0xFF000000
|
15
16
|
@bgColor = 0xFFFFFFFF
|
16
17
|
@widthColor = 0xFFFF0000
|
17
18
|
@chars = {}
|
19
|
+
@bpp = bpp
|
18
20
|
@userData = nil
|
21
|
+
@colmap = nil
|
22
|
+
@valmap = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def buildBppMap()
|
26
|
+
return [@bgColor, @charColor] if @bpp==1
|
27
|
+
return ColorMap.new(@bgColor, @charColor).mapBpp(@bpp)
|
28
|
+
end
|
29
|
+
|
30
|
+
def colorMap(val)
|
31
|
+
@colmap = buildBppMap() if !@colmap
|
32
|
+
#@puts "#{val} = #{@colmap[val].to_s(16)}"
|
33
|
+
return @colmap[val]
|
34
|
+
end
|
35
|
+
|
36
|
+
def valueMap(col)
|
37
|
+
if !@valmap
|
38
|
+
@valmap = Hash[buildBppMap().each_with_index.map {|x,i| [x, i]}] if !@valmap
|
39
|
+
end
|
40
|
+
val=@valmap[col]
|
41
|
+
raise "Wrong color in font #{col.to_s(16)}" if val==nil
|
42
|
+
return val
|
19
43
|
end
|
20
44
|
|
21
45
|
def setChar(id, data, width=nil, flags=nil)
|
22
46
|
width=@width if !width
|
23
|
-
@chars[id] = FontChar.new(
|
47
|
+
@chars[id] = FontChar.new(self, @height, id, data, width, flags)
|
24
48
|
end
|
25
49
|
|
26
50
|
def getChar(id)
|
@@ -51,10 +75,10 @@ module Resedit
|
|
51
75
|
img.fill(@bgColor)
|
52
76
|
#draw grid
|
53
77
|
for i in 0..16
|
54
|
-
img.vline(i*(@width+1), gridColor)
|
78
|
+
img.vline(i*(@width+1), @gridColor)
|
55
79
|
end
|
56
80
|
for j in 0..rows
|
57
|
-
img.hline(j*(@height+1), gridColor)
|
81
|
+
img.hline(j*(@height+1), @gridColor)
|
58
82
|
end
|
59
83
|
#draw letters
|
60
84
|
@chars.each { |idx,c|
|
@@ -62,9 +86,10 @@ module Resedit
|
|
62
86
|
y = idx/16
|
63
87
|
x += 1+x*@width
|
64
88
|
y += 1+y*@height
|
65
|
-
c.draw(img,
|
89
|
+
c.draw(img, x, y)
|
66
90
|
}
|
67
91
|
img.save(filename)
|
92
|
+
@colmap = nil
|
68
93
|
end
|
69
94
|
|
70
95
|
def load(filename)
|
@@ -76,10 +101,11 @@ module Resedit
|
|
76
101
|
y = idx/16
|
77
102
|
x += 1+x*@width
|
78
103
|
y += 1+y*@height
|
79
|
-
c = FontChar.new(
|
80
|
-
c.scan(img,
|
104
|
+
c = FontChar.new(self, height, idx)
|
105
|
+
c.scan(img, x, y)
|
81
106
|
@chars[c.index] = c if c.data
|
82
107
|
end
|
108
|
+
@valmap = nil
|
83
109
|
end
|
84
110
|
|
85
111
|
end
|
@@ -3,25 +3,27 @@ module Resedit
|
|
3
3
|
class FontChar
|
4
4
|
attr_accessor :index, :data, :realWidth, :flags
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(font, height, index, data=nil, realWidth=nil, flags=nil)
|
7
|
+
@font = font
|
8
|
+
@width = font.width
|
9
|
+
@height, @index = height, index
|
8
10
|
@realWidth=realWidth
|
9
11
|
@flags = flags
|
10
|
-
@data=data if (data && data.length
|
12
|
+
@data=data if (data && data.length==@width*height)
|
11
13
|
end
|
12
14
|
|
13
|
-
def hasPixel(x, y)
|
14
|
-
|
15
|
-
end
|
15
|
+
def hasPixel(x, y); @data[y*@width+x] != 0 end
|
16
|
+
|
17
|
+
def valueAt(x,y); @data[y*@width+x] end
|
16
18
|
|
17
|
-
def draw(image,
|
19
|
+
def draw(image, x, y)
|
18
20
|
for j in 0..@height-1
|
19
21
|
for i in 0..@width-1
|
20
|
-
image.setPixel(x+i, y+j,
|
22
|
+
image.setPixel(x+i, y+j, @font.colorMap(valueAt(i,j))) if hasPixel(i,j)
|
21
23
|
end
|
22
24
|
end
|
23
25
|
if @realWidth
|
24
|
-
image.setPixel(x+@realWidth, y,
|
26
|
+
image.setPixel(x+@realWidth, y, @font.widthColor)
|
25
27
|
end
|
26
28
|
if @flags && @flags.length>0
|
27
29
|
for i in 0..@flags.length-1
|
@@ -30,13 +32,12 @@ module Resedit
|
|
30
32
|
end
|
31
33
|
end
|
32
34
|
|
33
|
-
def readFlags(image, x, y
|
35
|
+
def readFlags(image, x, y)
|
34
36
|
empty = true
|
35
37
|
flags = []
|
36
38
|
for i in 0..@height-2
|
37
|
-
flags += [bgcolors[0]]
|
38
39
|
col = image.getPixel(x, y+i)
|
39
|
-
if
|
40
|
+
if col==@font.bgColor || col==@font.gridColor
|
40
41
|
next
|
41
42
|
end
|
42
43
|
empty=false
|
@@ -47,24 +48,28 @@ module Resedit
|
|
47
48
|
end
|
48
49
|
|
49
50
|
|
50
|
-
def scan(image,
|
51
|
+
def scan(image, x, y)
|
52
|
+
wColor = @font.widthColor
|
53
|
+
bgColor = @font.bgColor
|
51
54
|
@data=[0]*@width*@height
|
52
55
|
@realWidth = nil
|
56
|
+
width = @width
|
53
57
|
_hasData = false
|
54
58
|
for j in 0..@height-1
|
55
|
-
for i in 0
|
59
|
+
for i in 0..width-1
|
56
60
|
col=image.getPixel(x+i, y+j)
|
57
|
-
if col==
|
58
|
-
@data[j*@width+i]= 1
|
59
|
-
_hasData = true
|
60
|
-
end
|
61
|
-
if col ==wColor
|
61
|
+
if col == wColor
|
62
62
|
@realWidth = i
|
63
|
+
width = @realWidth
|
64
|
+
break
|
65
|
+
elsif col != bgColor
|
66
|
+
@data[j*@width+i] = @font.valueMap(col)
|
67
|
+
_hasData = true
|
63
68
|
end
|
64
69
|
end
|
65
70
|
end
|
66
71
|
fx = x + (@realWidth ? @realWidth : @width)
|
67
|
-
@flags = readFlags(image, fx, y+1
|
72
|
+
@flags = readFlags(image, fx, y+1)
|
68
73
|
@data=nil if !_hasData
|
69
74
|
return @data!=nil
|
70
75
|
end
|
data/lib/resedit/mz/mz.rb
CHANGED
data/lib/resedit/mz/mz_body.rb
CHANGED
@@ -27,7 +27,9 @@ module Resedit
|
|
27
27
|
for i in 0..@mz.header.info[:NumberOfRelocations]-1
|
28
28
|
r = @mz.header.getRelocation(i)
|
29
29
|
@segments.add(r[1])
|
30
|
-
|
30
|
+
sd = segData(r, 2)
|
31
|
+
next if !sd
|
32
|
+
val = sd.unpack('v')[0]
|
31
33
|
@segments.add(val)
|
32
34
|
end
|
33
35
|
end
|
@@ -39,7 +41,7 @@ module Resedit
|
|
39
41
|
@segments.add(r[1])
|
40
42
|
ofs = seg2Linear(r[0], r[1])
|
41
43
|
val = getData(ofs, 2).unpack('v')[0] + add
|
42
|
-
|
44
|
+
fix(ofs, [val].pack('v'))
|
43
45
|
@segments.add(val)
|
44
46
|
end
|
45
47
|
end
|
@@ -68,7 +70,7 @@ module Resedit
|
|
68
70
|
|
69
71
|
def segData(reloc, size, isStr=false)
|
70
72
|
ofs = seg2Linear(reloc[0], reloc[1])
|
71
|
-
|
73
|
+
return nil if ofs > @root.size()
|
72
74
|
return getData(ofs, size) if !isStr
|
73
75
|
return colVal(ofs, size)
|
74
76
|
end
|
@@ -87,6 +89,7 @@ module Resedit
|
|
87
89
|
|
88
90
|
def append(bytes, where=nil)
|
89
91
|
mode(HOW_CHANGED)
|
92
|
+
relfix = @mz.header.relocFix
|
90
93
|
res = @addsz
|
91
94
|
buf = @addsz>0 ? @root.nbuf[0, @addsz] : ''
|
92
95
|
buf += bytes
|
@@ -96,7 +99,7 @@ module Resedit
|
|
96
99
|
insert(0, bytes + "\x00"*(sz-@addsz))
|
97
100
|
seg = linear2seg(res)
|
98
101
|
res = [res, seg, sz/0x10]
|
99
|
-
patchRelocs(sz/0x10)
|
102
|
+
patchRelocs(sz/0x10 - relfix)
|
100
103
|
return res
|
101
104
|
end
|
102
105
|
|
data/lib/resedit/mz/mz_header.rb
CHANGED
@@ -7,8 +7,10 @@ module Resedit
|
|
7
7
|
BLK = 0x200
|
8
8
|
PARA = 0x10
|
9
9
|
HSIZE = 0x1C
|
10
|
+
HDRDESCR = [:Magic, :BytesInLastBlock, :BlocksInFile, :NumberOfRelocations, :HeaderParagraphs, :MinExtraParagraphs, :MaxExtraParagraphs,
|
11
|
+
:SS, :SP, :Checksum, :IP, :CS, :RelocTableOffset, :OverlayNumber]
|
10
12
|
|
11
|
-
attr_reader :info, :mz
|
13
|
+
attr_reader :info, :mz, :relocFix
|
12
14
|
|
13
15
|
def initialize(mz, file, size)
|
14
16
|
raise "Not MZ file" if size < HSIZE
|
@@ -18,6 +20,7 @@ module Resedit
|
|
18
20
|
@_infoOrig = loadInfo()
|
19
21
|
@_info = nil
|
20
22
|
@info = @_infoOrig
|
23
|
+
@relocFix = 0
|
21
24
|
raise "Not MZ file" if MAGIC != @info[:Magic]
|
22
25
|
addData(file, headerSize() - HSIZE)
|
23
26
|
end
|
@@ -42,21 +45,24 @@ module Resedit
|
|
42
45
|
|
43
46
|
def loadInfo()
|
44
47
|
v = getData(0, HSIZE).unpack('v*')
|
45
|
-
return
|
46
|
-
:HeaderParagraphs => v[4], :MinExtraParagraphs => v[5], :MaxExtraParagraphs => v[6],
|
47
|
-
:SS => v[7], :SP => v[8], :Checksum => v[9], :IP => v[10], :CS => v[11],
|
48
|
-
:RelocTableOffset => v[12], :OverlayNumber => v[13]
|
49
|
-
}
|
48
|
+
return HDRDESCR.map.with_index { |x, i| [x, v[i]] }.to_h
|
50
49
|
end
|
51
50
|
|
52
51
|
|
52
|
+
def setInfo(field, values)
|
53
|
+
raise "Unknown header field #{field}" if !HDRDESCR.include?(field)
|
54
|
+
values = [values] if !values.is_a?(Array)
|
55
|
+
change(HDRDESCR.index(field)*2, values.pack('v*'))
|
56
|
+
end
|
57
|
+
|
53
58
|
def changeSize(size)
|
54
59
|
mode(HOW_CHANGED)
|
55
60
|
mod = size % BLK
|
56
|
-
|
57
|
-
change(2, ch.pack('vv'))
|
61
|
+
setInfo(:BytesInLastBlock, [mod, size / BLK + (mod ? 1 : 0)])
|
58
62
|
end
|
59
63
|
|
64
|
+
def setBodySize(size); changeSize(size + headerSize()) end
|
65
|
+
|
60
66
|
def rebuildHeader(codesize)
|
61
67
|
mode(HOW_ORIGINAL)
|
62
68
|
ss = @info[:SS]
|
@@ -65,22 +71,35 @@ module Resedit
|
|
65
71
|
codesize += PARA - codesize % PARA if codesize % PARA!=0
|
66
72
|
changeSize(sz + codesize + headerSize())
|
67
73
|
paras = codesize / PARA
|
68
|
-
|
69
|
-
|
74
|
+
setInfo(:SS, ss+paras)
|
75
|
+
setInfo(:CS, cs+paras)
|
70
76
|
for i in 0..@mz.header.info[:NumberOfRelocations]-1
|
71
77
|
rel = getRelocation(i)
|
72
|
-
rel[1]+=paras
|
73
|
-
|
78
|
+
rel[1] += paras-@relocFix
|
79
|
+
fix(@info[:RelocTableOffset] + i * 4, rel.pack('vv'))
|
74
80
|
end
|
81
|
+
mode(HOW_CHANGED)
|
82
|
+
@relocFix = paras
|
83
|
+
MZEnv.instance().set(:relocFix, paras.to_s)
|
75
84
|
return codesize
|
76
85
|
end
|
77
86
|
|
78
87
|
def addHeaderSize(size)
|
79
88
|
mode(HOW_CHANGED)
|
80
89
|
paras = size/16 + (size%16 == 0 ? 0 : 1)
|
81
|
-
|
90
|
+
insert(headerSize(), "\x00" * (paras * PARA))
|
82
91
|
changeSize(fileSize() + paras * PARA)
|
83
|
-
|
92
|
+
setInfo(:HeaderParagraphs, @info[:HeaderParagraphs] + paras)
|
93
|
+
mode(HOW_CHANGED)
|
94
|
+
end
|
95
|
+
|
96
|
+
def loadChanges(file)
|
97
|
+
super(file)
|
98
|
+
mode(HOW_ORIGINAL)
|
99
|
+
ocs = @info[:CS]
|
100
|
+
mode(HOW_CHANGED)
|
101
|
+
ncs = @info[:CS]
|
102
|
+
@relocFix = ncs - ocs
|
84
103
|
end
|
85
104
|
|
86
105
|
|
@@ -99,12 +118,12 @@ module Resedit
|
|
99
118
|
|
100
119
|
|
101
120
|
def getRelocation(idx)
|
102
|
-
raise "Wrong relocation index " if idx<0 || idx
|
121
|
+
raise "Wrong relocation index " if idx<0 || idx >= @info[:NumberOfRelocations]
|
103
122
|
return getData(@info[:RelocTableOffset] + idx * 4, 4).unpack('vv')
|
104
123
|
end
|
105
124
|
|
106
125
|
def setRelocation(idx, data)
|
107
|
-
raise "Wrong relocation index " if idx<0 || idx
|
126
|
+
raise "Wrong relocation index " if idx<0 || idx >= @info[:NumberOfRelocations]
|
108
127
|
change(@info[:RelocTableOffset] + idx * 4, data.pack('vv'))
|
109
128
|
end
|
110
129
|
|
@@ -114,6 +133,16 @@ module Resedit
|
|
114
133
|
return headerSize() - HSIZE - @info[:NumberOfRelocations] * 4
|
115
134
|
end
|
116
135
|
|
136
|
+
def setSpaceForRelocs(count)
|
137
|
+
add = count - @info[:NumberOfRelocations]
|
138
|
+
return if add<=0
|
139
|
+
add -= freeSpace()/4
|
140
|
+
return if add<=0
|
141
|
+
addHeaderSize(add*4)
|
142
|
+
setInfo(:NumberOfRelocations, count)
|
143
|
+
mode(HOW_CHANGED)
|
144
|
+
end
|
145
|
+
|
117
146
|
def addReloc(ofs)
|
118
147
|
mode(HOW_CHANGED)
|
119
148
|
#check relocation exists
|
@@ -124,15 +153,9 @@ module Resedit
|
|
124
153
|
end
|
125
154
|
end
|
126
155
|
#add relocation
|
127
|
-
|
128
|
-
addHeaderSize(4)
|
129
|
-
mode(HOW_CHANGED)
|
130
|
-
end
|
156
|
+
setSpaceForRelocs(@info[:NumberOfRelocations]+1)
|
131
157
|
val = @mz.body.linear2seg(ofs)
|
132
|
-
|
133
|
-
cnt = @info[:NumberOfRelocations]
|
134
|
-
change(pos, val.pack('vv'))
|
135
|
-
change(6, [cnt+1].pack('v'))
|
158
|
+
setRelocation(@info[:NumberOfRelocations], val)
|
136
159
|
return true
|
137
160
|
end
|
138
161
|
|
@@ -153,6 +176,7 @@ module Resedit
|
|
153
176
|
printf("code size: %s\n", colStr(fsz - hsz, @mz.body.changed?(0)))
|
154
177
|
printf("reloc table size: %s\n", colStr(@info[:NumberOfRelocations] * 4, changed?(6, 2)))
|
155
178
|
printf("free space in header: before relocs 0x%X, after relocs 0x%X\n", freeSpace(true), freeSpace())
|
179
|
+
printf("reloc fix: 0x%X\n", @relocFix)
|
156
180
|
return true
|
157
181
|
end
|
158
182
|
@mz.body.mode(@mode)
|
@@ -167,6 +191,7 @@ module Resedit
|
|
167
191
|
end
|
168
192
|
return true
|
169
193
|
end
|
194
|
+
return super(what, how)
|
170
195
|
end
|
171
196
|
|
172
197
|
|
data/lib/resedit/mz/mzenv.rb
CHANGED
@@ -20,10 +20,15 @@ module Resedit
|
|
20
20
|
|
21
21
|
def s2i(str)
|
22
22
|
ss=str.split(':')
|
23
|
-
if ss.length == 2
|
23
|
+
if ss.length == 2 || ss.length == 3
|
24
24
|
ss[0] = '0x'+ss[0] if ss[0][0,2]!='0x'
|
25
25
|
ss[1] = '0x'+ss[1] if ss[1][0,2]!='0x'
|
26
|
-
|
26
|
+
fix = 0
|
27
|
+
if ss.length == 3
|
28
|
+
raise "Dont known how to #{ss[2]} address" if ss[2]!="fix"
|
29
|
+
fix = relocFix
|
30
|
+
end
|
31
|
+
return ((s2i(ss[0])+fix) << 4) + s2i(ss[1])
|
27
32
|
end
|
28
33
|
return eval(str, binding())
|
29
34
|
end
|
data/lib/resedit/text/text.rb
CHANGED
@@ -58,7 +58,7 @@ module Resedit
|
|
58
58
|
|
59
59
|
def load(filename, count=nil)
|
60
60
|
@lines = @formatter.loadLines(filename)
|
61
|
-
raise "Wrong lines count:
|
61
|
+
raise "Wrong lines count: #{filename} #{count} #{@lines.length}" if count && count!=@lines.length
|
62
62
|
if @escaper
|
63
63
|
nl=[]
|
64
64
|
@lines.each {|l|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resedit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bjfn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chunky_png
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- lib/resedit/classes/hexwriter.rb
|
60
60
|
- lib/resedit/convert/bitconv.rb
|
61
61
|
- lib/resedit/convert/codepatch.rb
|
62
|
+
- lib/resedit/convert/colors.rb
|
62
63
|
- lib/resedit/font/font.rb
|
63
64
|
- lib/resedit/font/font_char.rb
|
64
65
|
- lib/resedit/image/image.rb
|