preparing for debugging
parent
adb33b88f9
commit
42e5cdc361
@ -0,0 +1,171 @@
|
||||
/*
|
||||
www.sourceforge.net/projects/dfhack
|
||||
Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any
|
||||
damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any
|
||||
purpose, including commercial applications, and to alter it and
|
||||
redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product documentation
|
||||
would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and
|
||||
must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
|
||||
/**
|
||||
* DO NOT USE THIS FILE DIRECTLY! USE MemAccess.h INSTEAD!
|
||||
*/
|
||||
#include "integers.h"
|
||||
|
||||
inline
|
||||
uint8_t MreadByte (const uint32_t &offset)
|
||||
{
|
||||
return ptrace(PTRACE_PEEKDATA,g_ProcessHandle, offset, NULL);
|
||||
}
|
||||
|
||||
inline
|
||||
void MreadByte (const uint32_t &offset, uint8_t &val )
|
||||
{
|
||||
val = ptrace(PTRACE_PEEKDATA,g_ProcessHandle, offset, NULL);
|
||||
}
|
||||
|
||||
inline
|
||||
uint16_t MreadWord (const uint32_t &offset)
|
||||
{
|
||||
return ptrace(PTRACE_PEEKDATA,g_ProcessHandle, offset, NULL);
|
||||
}
|
||||
|
||||
inline
|
||||
void MreadWord (const uint32_t &offset, uint16_t &val)
|
||||
{
|
||||
val = ptrace(PTRACE_PEEKDATA,g_ProcessHandle, offset, NULL);
|
||||
}
|
||||
|
||||
inline
|
||||
uint32_t MreadDWord (const uint32_t &offset)
|
||||
{
|
||||
return ptrace(PTRACE_PEEKDATA,g_ProcessHandle, offset, NULL);
|
||||
}
|
||||
inline
|
||||
void MreadDWord (const uint32_t &offset, uint32_t &val)
|
||||
{
|
||||
val = ptrace(PTRACE_PEEKDATA,g_ProcessHandle, offset, NULL);
|
||||
}
|
||||
|
||||
// extremely terrible braindamage
|
||||
inline
|
||||
bool Mread ( uint32_t offset, uint32_t size, uint8_t *target)
|
||||
{
|
||||
uint8_t *mover = target;
|
||||
while (size)
|
||||
{
|
||||
if(size >= 4)
|
||||
{
|
||||
* (uint32_t *)mover = MreadDWord(offset);
|
||||
mover+=4;
|
||||
offset +=4;
|
||||
size -=4;
|
||||
}
|
||||
else if(size >= 2)
|
||||
{
|
||||
* (uint16_t *)mover = MreadWord(offset);
|
||||
mover+=2;
|
||||
offset +=2;
|
||||
size -=2;
|
||||
}
|
||||
else if(size == 1)
|
||||
{
|
||||
* (uint8_t *)mover = MreadByte(offset);
|
||||
mover+=1;
|
||||
offset ++;
|
||||
size --;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
void MwriteDWord (uint32_t offset, uint32_t data)
|
||||
{
|
||||
ptrace(PTRACE_POKEDATA,g_ProcessHandle, offset, data);
|
||||
}
|
||||
|
||||
// using these is expensive.
|
||||
inline
|
||||
void MwriteWord (uint32_t offset, uint16_t data)
|
||||
{
|
||||
uint32_t orig = MreadDWord(offset);
|
||||
orig |= 0x0000FFFF;
|
||||
orig &= data;
|
||||
ptrace(PTRACE_POKEDATA,g_ProcessHandle, offset, orig);
|
||||
}
|
||||
|
||||
inline
|
||||
void MwriteByte (uint32_t offset, uint8_t data)
|
||||
{
|
||||
uint32_t orig = MreadDWord(offset);
|
||||
orig |= 0x000000FF;
|
||||
orig &= data;
|
||||
ptrace(PTRACE_POKEDATA,g_ProcessHandle, offset, orig);
|
||||
}
|
||||
|
||||
// blah. I hate the kernel devs for crippling /proc/PID/mem. THIS IS RIDICULOUS
|
||||
inline
|
||||
bool Mwrite (uint32_t offset, uint32_t size, uint8_t *source)
|
||||
{
|
||||
uint32_t indexptr = 0;
|
||||
while (size > 0)
|
||||
{
|
||||
// default: we push 4 bytes
|
||||
if(size >= 4)
|
||||
{
|
||||
MwriteDWord(offset, *(uint32_t *) (source + indexptr));
|
||||
offset +=4;
|
||||
indexptr +=4;
|
||||
size -=4;
|
||||
}
|
||||
// last is either three or 2 bytes
|
||||
else if(size >= 2)
|
||||
{
|
||||
MwriteWord(offset, *(uint16_t *) (source + indexptr));
|
||||
offset +=2;
|
||||
indexptr +=2;
|
||||
size -=2;
|
||||
}
|
||||
// finishing move
|
||||
else if(size == 1)
|
||||
{
|
||||
MwriteByte(offset, *(uint8_t *) (source + indexptr));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
const std::string MreadCString (uint32_t offset)
|
||||
{
|
||||
std::string temp;
|
||||
char temp_c[256];
|
||||
int counter = 0;
|
||||
char r;
|
||||
do
|
||||
{
|
||||
r = MreadByte(offset+counter);
|
||||
temp_c[counter] = r;
|
||||
counter++;
|
||||
} while (r);
|
||||
temp_c[counter] = 0;
|
||||
temp = temp_c;
|
||||
return temp;
|
||||
}
|
Loading…
Reference in New Issue