From 89c1dba6377e69cb91130efbe7777165b6912ddc Mon Sep 17 00:00:00 2001 From: Warmist Date: Thu, 4 Aug 2011 21:52:22 +0300 Subject: [PATCH] .o file reader source files --- plugins/Dfusion/include/OutFile.h | 126 +++++++++++++++++++++++++++ plugins/Dfusion/include/lua_Misc.h | 13 +++ plugins/Dfusion/luafiles/common.lua | 28 ++++-- plugins/Dfusion/luafiles/offsets.lua | 26 ++++-- plugins/Dfusion/src/OutFile.cpp | 100 +++++++++++++++++++++ plugins/Dfusion/src/lua_Misc.cpp | 3 + 6 files changed, 283 insertions(+), 13 deletions(-) create mode 100644 plugins/Dfusion/include/OutFile.h create mode 100644 plugins/Dfusion/include/lua_Misc.h create mode 100644 plugins/Dfusion/src/OutFile.cpp create mode 100644 plugins/Dfusion/src/lua_Misc.cpp diff --git a/plugins/Dfusion/include/OutFile.h b/plugins/Dfusion/include/OutFile.h new file mode 100644 index 000000000..665a1e132 --- /dev/null +++ b/plugins/Dfusion/include/OutFile.h @@ -0,0 +1,126 @@ +#ifndef OUTFILE_H +#define OUTFILE_H +#include +#include +#include +#include +#include +namespace OutFile +{ +struct Header +{ + unsigned short machinetype; + unsigned short sectioncount; + unsigned long time; + unsigned long symbolptr; + unsigned long symbolcount; + unsigned short opthead; + unsigned short flags; + void PrintData() + { + std::cout<<"Symbol start:"< vSymbol; +class File +{ +public: + File(std::string path); + virtual ~File(); + + void GetText(char *ptr); + size_t GetTextSize(); + void LoadSymbols(); + vSymbol GetSymbols(){LoadSymbols();return symbols;}; + void PrintSymbols(); + void PrintRelocations(); +protected: +private: + typedef std::map secMap; + + secMap sections; + vSymbol symbols; + Section &GetSection(std::string name); + + std::fstream mystream; + Header myhead; + // Section Text; + //Section Data; + // Section Bss; +}; +} +#endif // OUTFILE_H diff --git a/plugins/Dfusion/include/lua_Misc.h b/plugins/Dfusion/include/lua_Misc.h new file mode 100644 index 000000000..6859bd0ef --- /dev/null +++ b/plugins/Dfusion/include/lua_Misc.h @@ -0,0 +1,13 @@ +#ifndef LUA_MISC_H +#define LUA_MISC_H + +#include "luamain.h" + +namespace lua +{ + +void RegisterMisc(lua::state &st); + +} + +#endif \ No newline at end of file diff --git a/plugins/Dfusion/luafiles/common.lua b/plugins/Dfusion/luafiles/common.lua index e9b5421d8..ec3463440 100644 --- a/plugins/Dfusion/luafiles/common.lua +++ b/plugins/Dfusion/luafiles/common.lua @@ -5,8 +5,8 @@ WORD=2 BYTE=3 function GetTextRegion() - local ranges=Process.getMemRanges() - for k,v in pairs(ranges) do + ranges__=ranges__ or Process.getMemRanges() + for k,v in pairs(ranges__) do --for k2,v2 in pairs(v) do -- print(string.format("%d %s->%s",k,tostring(k2),tostring(v2))) --end @@ -24,8 +24,8 @@ function GetTextRegion() return nil end function GetRegionIn(pos) - local ranges=Process.getMemRanges() - for k,v in pairs(ranges) do + ranges__=ranges__ or Process.getMemRanges() + for k,v in pairs(ranges__) do --for k2,v2 in pairs(v) do -- print(string.format("%d %s->%s",k,tostring(k2),tostring(v2))) --end @@ -34,13 +34,31 @@ function GetRegionIn(pos) --if(v["read"])then num=num+1 end --if(v["write"])then num=num+10 end --if(v["execute"]) then num=num+100 end - --print(string.format("%d %x->%x %s %d",k,v["start"],v["end"],v.name,num)) + print(string.format("%d %x->%x %s %x",k,v["start"],v["end"],v.name,pos)) if pos>=v.start and pos<=v["end"] then return v end end return nil end +function ValidOffset(pos) + ranges__=ranges__ or Process.getMemRanges() + for k,v in pairs(ranges__) do + --for k2,v2 in pairs(v) do + -- print(string.format("%d %s->%s",k,tostring(k2),tostring(v2))) + --end + --local num + --num=0 + --if(v["read"])then num=num+1 end + --if(v["write"])then num=num+10 end + --if(v["execute"]) then num=num+100 end + --print(string.format("%d %x->%x %s %d",k,v["start"],v["end"],v.name,num)) + if pos>=v.start and pos<=v["end"] then + return true + end + end + return false +end function unlockDF() local reg=GetTextRegion() reg["write"]=true diff --git a/plugins/Dfusion/luafiles/offsets.lua b/plugins/Dfusion/luafiles/offsets.lua index c88602e96..4d5321534 100644 --- a/plugins/Dfusion/luafiles/offsets.lua +++ b/plugins/Dfusion/luafiles/offsets.lua @@ -57,16 +57,26 @@ offsets.new("CreaturePtr",f_creatureptr) function f_creaturegloss() --creature race vector for k,v in pairs(offsets.getvectors()) do - if k~=0 then - --print("Looking into:"..string.format("%x",k).." used:"..v) - + local reg + reg=GetRegionIn(k) + if reg ~=nil then + print(string.format("looking into %x wich is in %s",k,reg.name or "")) + else + print(string.format("looking into %x in nil region",k)) + end + if ValidOffset(k) then + print("Looking into:"..string.format("%x",k).." used:"..v) + local vec=engine.peek(k,ptr_vector) if vec:size()>0 and vec:size()<100000 and vec:getval(0)~=0 then - --print("\tval:"..string.format("%x",vec:getval(0))) - local token=engine.peek(vec:getval(0),ptt_dfstring) - --print("\t\tval:".. token:getval()) - if token:getval()=="TOAD" then -- more offsets could be found this way - return k-offsets.base() + local toff=vec:getval(0) + if ValidOffset(toff) then + print("\tval:"..string.format("%x",vec:getval(0))) + local token=engine.peek(toff,ptt_dfstring) + --print("\t\tval:".. token:getval()) + if token:getval()=="TOAD" then -- more offsets could be found this way + return k-offsets.base() + end end end end diff --git a/plugins/Dfusion/src/OutFile.cpp b/plugins/Dfusion/src/OutFile.cpp new file mode 100644 index 000000000..2d8399b03 --- /dev/null +++ b/plugins/Dfusion/src/OutFile.cpp @@ -0,0 +1,100 @@ +#include "OutFile.h" +using namespace OutFile; +File::File(std::string path) +{ + //mystream.exceptions ( std::fstream::eofbit | std::fstream::failbit | std::fstream::badbit ); + mystream.open(path.c_str(),std::fstream::binary|std::ios::in|std::ios::out); + mystream.read((char*)&myhead,sizeof(myhead)); + for(unsigned i=0;isecond.PrintData(); + }*/ + + } + else + { + std::cout<<"Error opening file!"<first<<":\n"; + for(unsigned i=0;isecond.numRel;i++) + { + Relocation r; + mystream.seekg(it->second.ptrRel+10*i); + mystream.read((char*)&r,10); + std::cout<0) + { + i+=s.auxsymbs; + } + } + +} +void File::LoadSymbols() +{ + symbols.clear(); + for(unsigned i=0;i0) + { + i+=s.auxsymbs; + } + } +} +File::~File() +{ + +} diff --git a/plugins/Dfusion/src/lua_Misc.cpp b/plugins/Dfusion/src/lua_Misc.cpp new file mode 100644 index 000000000..e9b7dd1e9 --- /dev/null +++ b/plugins/Dfusion/src/lua_Misc.cpp @@ -0,0 +1,3 @@ +#include "lua_Misc.h" + +void lua::RegisterMisc(lua::state &st); \ No newline at end of file