Small fixes and lua port of Process
Signed-off-by: Warmist <Warmist@gmail.com>develop
parent
e30975f8f3
commit
0799cde3af
@ -0,0 +1,13 @@
|
||||
#ifndef LUA_PROCESS_H
|
||||
#define LUA_PROCESS_H
|
||||
|
||||
#include <dfhack/Core.h>
|
||||
#include <dfhack/Process.h>
|
||||
|
||||
#include "luamain.h"
|
||||
|
||||
namespace lua
|
||||
{
|
||||
void RegisterProcess(lua::state &st,DFHack::Process *p);
|
||||
}
|
||||
#endif
|
@ -0,0 +1,293 @@
|
||||
#include "lua_Process.h"
|
||||
|
||||
static DFHack::Process* GetProcessPtr(lua::state &st)
|
||||
{
|
||||
int t=st.gettop();
|
||||
st.getglobal("Process");
|
||||
st.getfield("__pointer");
|
||||
DFHack::Process* c=static_cast<DFHack::Process*>(lua_touserdata(st,-1));
|
||||
st.settop(t);
|
||||
return c;
|
||||
}
|
||||
|
||||
static int lua_Process_readDWord(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
uint32_t ret=c->readDWord(st.as<uint32_t>(1));
|
||||
st.push(ret);
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_writeDWord(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
c->writeDWord(st.as<uint32_t>(1),st.as<uint32_t>(2));
|
||||
return 0;
|
||||
}
|
||||
static int lua_Process_readFloat(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
float ret=c->readFloat(st.as<uint32_t>(1));
|
||||
st.push(ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lua_Process_readWord(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
uint16_t ret=c->readWord(st.as<uint32_t>(1));
|
||||
st.push(ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lua_Process_writeWord(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
c->writeWord(st.as<uint32_t>(1),st.as<uint16_t>(2));
|
||||
return 0;
|
||||
}
|
||||
static int lua_Process_readByte(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
uint8_t ret=c->readByte(st.as<uint32_t>(1));
|
||||
st.push(ret);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lua_Process_writeByte(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
c->writeByte(st.as<uint32_t>(1),st.as<uint8_t>(2));
|
||||
return 0;
|
||||
}
|
||||
static int lua_Process_read(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
size_t len=st.as<uint32_t>(2);
|
||||
uint8_t* buf;
|
||||
|
||||
if(!st.is<lua::nil>(3))
|
||||
buf=(uint8_t*)lua_touserdata(st,3);
|
||||
else
|
||||
buf=new uint8_t[len];
|
||||
c->read(st.as<uint32_t>(1),len,buf);
|
||||
st.pushlightuserdata(buf);
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_write(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
c-> write(st.as<uint32_t>(1),st.as<uint32_t>(2),static_cast<uint8_t*>(lua_touserdata(st,3)));
|
||||
return 0;
|
||||
}
|
||||
static int lua_Process_readSTLString (lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
std::string r=c->readSTLString(st.as<uint32_t>(1));
|
||||
st.push(r);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lua_Process_writeSTLString(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
c->writeSTLString(st.as<uint32_t>(1),st.as<std::string>(2));
|
||||
return 0;
|
||||
}
|
||||
static int lua_Process_copySTLString(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
c->copySTLString(st.as<uint32_t>(1),st.as<uint32_t>(2));
|
||||
return 0;
|
||||
}
|
||||
static int lua_Process_doReadClassName(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
std::string r=c->doReadClassName((void*)st.as<size_t>(1));
|
||||
st.push(r);
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_readClassName(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
std::string r=c->readClassName((void*)st.as<size_t>(1));
|
||||
st.push(r);
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_readCString (lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
std::string r=c->readCString(st.as<uint32_t>(1));
|
||||
st.push(r);
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_isSuspended(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
st.push(c->isSuspended());
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_isIdentified(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
st.push(c->isIdentified());
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_getThreadIDs(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
std::vector<uint32_t> threads;
|
||||
c->getThreadIDs(threads);
|
||||
st.newtable();
|
||||
for(size_t i=0;i<threads.size();i++)
|
||||
{
|
||||
st.push(i);
|
||||
st.push(threads[i]);
|
||||
st.settable();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_getMemRanges(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
std::vector<DFHack::t_memrange> ranges;
|
||||
c->getMemRanges(ranges);
|
||||
st.newtable();
|
||||
for(size_t i=0;i<ranges.size();i++)
|
||||
{
|
||||
st.push(i);
|
||||
st.newtable();
|
||||
st.push(ranges[i].start); // WARNING!! lua has only 32bit numbers, possible loss of data!!
|
||||
st.setfield("start");
|
||||
st.push(ranges[i].end);
|
||||
st.setfield("end");
|
||||
st.push(std::string(ranges[i].name));
|
||||
st.setfield("name");
|
||||
st.push(ranges[i].read);
|
||||
st.setfield("read");
|
||||
st.push(ranges[i].write);
|
||||
st.setfield("write");
|
||||
st.push(ranges[i].execute);
|
||||
st.setfield("execute");
|
||||
st.push(ranges[i].shared);
|
||||
st.setfield("shared");
|
||||
st.push(ranges[i].valid);
|
||||
st.setfield("valid");
|
||||
st.settable();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_getBase(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
uint32_t base=c->getBase();
|
||||
st.push(base);
|
||||
return 1;
|
||||
}
|
||||
/*static int lua_Process_getPID(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
int ret=c->getPID();
|
||||
st.push(ret);
|
||||
return 1;
|
||||
}*/
|
||||
static int lua_Process_getPath(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
std::string ret=c->getPath();
|
||||
st.push(ret);
|
||||
return 1;
|
||||
}
|
||||
static int lua_Process_setPermisions(lua_State *S)
|
||||
{
|
||||
lua::state st(S);
|
||||
DFHack::Process* c=GetProcessPtr(st);
|
||||
DFHack::t_memrange range,trange;
|
||||
|
||||
st.getfield("start",1);
|
||||
range.start=st.as<uint64_t>();
|
||||
st.pop();
|
||||
st.getfield("end",1);
|
||||
range.start=st.as<uint64_t>();
|
||||
st.pop();
|
||||
|
||||
st.getfield("read",2);
|
||||
trange.read=st.as<bool>();
|
||||
st.pop();
|
||||
st.getfield("write",2);
|
||||
trange.write=st.as<bool>();
|
||||
st.pop();
|
||||
st.getfield("execute",2);
|
||||
trange.execute=st.as<bool>();
|
||||
st.pop();
|
||||
|
||||
c->setPermisions(range,trange);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#define PROC_FUNC(name) {#name,lua_Process_ ## name}
|
||||
const luaL_Reg lua_process_func[]=
|
||||
{
|
||||
PROC_FUNC(readDWord),
|
||||
PROC_FUNC(writeDWord),
|
||||
PROC_FUNC(readFloat),
|
||||
PROC_FUNC(readWord),
|
||||
PROC_FUNC(writeWord),
|
||||
PROC_FUNC(readByte),
|
||||
PROC_FUNC(writeByte),
|
||||
PROC_FUNC(read),
|
||||
PROC_FUNC(write),
|
||||
PROC_FUNC(readSTLString),
|
||||
PROC_FUNC(writeSTLString),
|
||||
PROC_FUNC(copySTLString),
|
||||
PROC_FUNC(doReadClassName),
|
||||
PROC_FUNC(readClassName),
|
||||
PROC_FUNC(readCString ),
|
||||
PROC_FUNC(isSuspended),
|
||||
PROC_FUNC(isIdentified),
|
||||
PROC_FUNC(getThreadIDs),
|
||||
PROC_FUNC(getMemRanges),
|
||||
PROC_FUNC(getBase),
|
||||
//PROC_FUNC(getPID), //not implemented
|
||||
PROC_FUNC(getPath),
|
||||
PROC_FUNC(setPermisions),
|
||||
{NULL,NULL}
|
||||
};
|
||||
#undef PROC_FUNC
|
||||
void lua::RegisterProcess(lua::state &st,DFHack::Process *p)
|
||||
{
|
||||
st.getglobal("Process");
|
||||
if(st.is<lua::nil>())
|
||||
{
|
||||
st.pop();
|
||||
st.newtable();
|
||||
}
|
||||
|
||||
st.pushlightuserdata(p);
|
||||
st.setfield("__pointer");
|
||||
|
||||
lua::RegFunctionsLocal(st, lua_process_func);
|
||||
|
||||
st.setglobal("Process");
|
||||
}
|
Loading…
Reference in New Issue