mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 06:05:58 -06:00
75 lines
1.4 KiB
C++
75 lines
1.4 KiB
C++
#include "Debuggers.h"
|
|
|
|
#ifdef PLATFORM_WIN32
|
|
|
|
#define LLOG(x) // DLOG(x)
|
|
|
|
int Pdb::Byte(adr_t addr)
|
|
{
|
|
if(!win64)
|
|
addr &= 0xffffffff;
|
|
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)) {
|
|
LLOG("ReadProcessMemory " << Hex(addr) << " OK");
|
|
memcpy(mempage.Add(page).data, data, 1024);
|
|
return (byte)data[pos];
|
|
}
|
|
LLOG("ReadProcessMemory " << Hex(addr) << ": " << 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, bool allowzero)
|
|
{
|
|
String r;
|
|
while(r.GetLength() < maxlen) {
|
|
int q = Byte(addr++);
|
|
if(q < 0)
|
|
break;
|
|
if(!q && !allowzero)
|
|
break;
|
|
r.Cat(q);
|
|
}
|
|
return r;
|
|
}
|
|
|
|
WString Pdb::ReadWString(adr_t addr, int maxlen, bool allowzero)
|
|
{
|
|
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 && !allowzero)
|
|
break;
|
|
r.Cat(w);
|
|
}
|
|
return r;
|
|
}
|
|
|
|
#endif
|