ultimatepp/uppsrc/ide/Debuggers/Mem.cpp
mdelfede 263ff5f895 changed svn layout
git-svn-id: svn://ultimatepp.org/upp/trunk@281 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-06-07 22:31:27 +00:00

70 lines
1.2 KiB
C++

#include "Debuggers.h"
#ifdef COMPILER_MSC
#define LLOG(x) // LOG(x)
int Pdb::Byte(adr_t addr)
{
int page = (int) (addr >> 10);
if(invalidpage.Find(page) >= 0)
return -1;
int pos = (int) (addr & 1023);
int q = mempage.Find(page);
if(q >= 0)
return (byte)mempage[q].data[pos];
if(mempage.GetCount() > 1024)
mempage.Clear();
byte data[1024];
if(ReadProcessMemory(hProcess, (LPCVOID) (addr & ~1023), data, 1024, NULL)) {
memcpy(mempage.Add(page).data, data, 1024);
return (byte)data[pos];
}
LLOG("ReadProcessMemory: " << GetLastErrorMessage());
invalidpage.Add(page);
return -1;
}
bool Pdb::Copy(adr_t addr, void *ptr, int count)
{
byte *s = (byte *)ptr;
while(count--) {
int q = Byte(addr++);
if(q < 0)
return false;
*s++ = (byte)q;
}
return true;
}
String Pdb::ReadString(adr_t addr, int maxlen)
{
String r;
while(r.GetLength() < maxlen) {
int q = Byte(addr++);
if(q <= 0)
break;
r.Cat(q);
}
return r;
}
WString Pdb::ReadWString(adr_t addr, int maxlen)
{
WString r;
while(r.GetLength() < maxlen) {
int q = Byte(addr++);
if(q < 0)
break;
int w = Byte(addr++);
if(w < 0)
break;
w = MAKEWORD(q, w);
if(w == 0)
break;
r.Cat(w);
}
return r;
}
#endif