Fixed embark anywhere to use more sane code segment search

develop
Warmist 2012-09-05 21:52:54 +03:00
parent 2574bb1e3d
commit 6fc10fc268
2 changed files with 12 additions and 41 deletions

@ -196,48 +196,25 @@ function MemoryArea:delete()
end end
-- Static code segment search -- Static code segment search
local function find_code_segment()
local code_start, code_end
for i,mem in ipairs(dfhack.internal.getMemRanges()) do
if code_end then
if mem.start_addr == code_end and mem.read and not mem.write then
code_end = mem.end_addr
else
break
end
elseif mem.read and not mem.write
and (string.match(mem.name,'/dwarfort%.exe$')
or string.match(mem.name,'/Dwarf_Fortress$')
or string.match(mem.name,'Dwarf Fortress%.exe'))
then
code_start = mem.start_addr
code_end = mem.end_addr
end
end
return code_start,code_end
end
function get_code_segment() function get_code_segment()
local s, e = find_code_segment() local cstart, cend
if s and e then
return MemoryArea.new(s, e)
end
end
function get_code_segments()
local ret={}
for i,mem in ipairs(dfhack.internal.getMemRanges()) do for i,mem in ipairs(dfhack.internal.getMemRanges()) do
if mem.read and not mem.write if mem.read and mem.execute
and (string.match(mem.name,'/dwarfort%.exe$') and (string.match(mem.name,'/dwarfort%.exe$')
or string.match(mem.name,'/Dwarf_Fortress$') or string.match(mem.name,'/Dwarf_Fortress$')
or string.match(mem.name,'Dwarf Fortress%.exe')) or string.match(mem.name,'Dwarf Fortress%.exe'))
then then
table.insert(ret,MemoryArea.new(mem.start_addr,mem.end_addr)) cstart = mem.start_addr
cend = mem.end_addr
end end
end end
return ret if cstart and cend then
return MemoryArea.new(cstart, cend)
end
end end
-- Static data segment search -- Static data segment search
local function find_data_segment() local function find_data_segment()

@ -61,17 +61,11 @@ function tools.GiveSentience(names)
end end
end end
tools.menu:add("Give Sentience",tools.GiveSentience) tools.menu:add("Give Sentience",tools.GiveSentience)
function embark() --windows only? function tools.embark() --windows only?
local seg=ms.get_code_segments() local seg=ms.get_code_segment()
printall(seg)
local idx,off local idx,off
for k,v in ipairs(seg) do
idx,off=v.uint8_t:find_one{0x66, 0x83, 0x7F ,0x1A ,0xFF,0x74,0x04}
if idx then
break
end
end
idx,off=seg.uint8_t:find_one{0x66, 0x83, 0x7F ,0x1A ,0xFF,0x74,0x04}
if idx then if idx then
local tmp_val=df.new('uint8_t',2) local tmp_val=df.new('uint8_t',2)
tmp_val[0]=0x90 tmp_val[0]=0x90