DBG: implement memcpy command
This commit is contained in:
parent
b23c0dfe37
commit
824100eea8
|
@ -96,6 +96,33 @@ bool cbDebugMemset(int argc, char* argv[])
|
|||
return true;
|
||||
}
|
||||
|
||||
bool cbDebugMemcpy(int argc, char* argv[])
|
||||
{
|
||||
if(IsArgumentsLessThan(argc, 4))
|
||||
return false;
|
||||
|
||||
duint dst = 0, src = 0, size = 0;
|
||||
if(!valfromstring(argv[1], &dst, false) || !valfromstring(argv[2], &src, false) || !valfromstring(argv[3], &size, false))
|
||||
return false;
|
||||
|
||||
duint totalNumberOfBytesWritten = 0;
|
||||
std::vector<uint8_t> buffer;
|
||||
buffer.resize(PAGE_SIZE); //copy a page at a time
|
||||
for(size_t i = 0; i < size; i += buffer.size())
|
||||
{
|
||||
duint NumberOfBytesRead = 0;
|
||||
auto readOk = MemRead(src + i, buffer.data(), min(buffer.size(), size - i), &NumberOfBytesRead);
|
||||
duint NumberOfBytesWritten = 0;
|
||||
auto writeOk = MemWrite(dst + i, buffer.data(), NumberOfBytesRead, &NumberOfBytesWritten);
|
||||
totalNumberOfBytesWritten += NumberOfBytesWritten;
|
||||
if(!readOk || !writeOk)
|
||||
break;
|
||||
}
|
||||
GuiUpdateAllViews();
|
||||
varset("$result", totalNumberOfBytesWritten, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cbDebugGetPageRights(int argc, char* argv[])
|
||||
{
|
||||
duint addr = 0;
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
bool cbDebugAlloc(int argc, char* argv[]);
|
||||
bool cbDebugFree(int argc, char* argv[]);
|
||||
bool cbDebugMemset(int argc, char* argv[]);
|
||||
bool cbDebugMemcpy(int argc, char* argv[]);
|
||||
bool cbDebugGetPageRights(int argc, char* argv[]);
|
||||
bool cbDebugSetPageRights(int argc, char* argv[]);
|
||||
bool cbInstrSavedata(int argc, char* argv[]);
|
|
@ -413,7 +413,7 @@ bool cbInstrMeminfo(int argc, char* argv[])
|
|||
{
|
||||
if(argc < 3)
|
||||
{
|
||||
dputs_untranslated("Usage: meminfo a/r, addr");
|
||||
dputs_untranslated("Usage: meminfo a/r, addr[, size]");
|
||||
return false;
|
||||
}
|
||||
duint addr;
|
||||
|
@ -424,11 +424,17 @@ bool cbInstrMeminfo(int argc, char* argv[])
|
|||
}
|
||||
if(argv[1][0] == 'a')
|
||||
{
|
||||
unsigned char buf = 0;
|
||||
if(!ReadProcessMemory(fdProcessInfo->hProcess, (void*)addr, &buf, sizeof(buf), nullptr))
|
||||
dputs_untranslated("ReadProcessMemory failed!");
|
||||
else
|
||||
dprintf_untranslated("Data: %02X\n", buf);
|
||||
duint size = 1;
|
||||
if(argc > 3 && !valfromstring(argv[3], &size))
|
||||
{
|
||||
dputs_untranslated("Invalid argument");
|
||||
return false;
|
||||
}
|
||||
std::vector<uint8_t> buf;
|
||||
buf.resize(size);
|
||||
SIZE_T NumberOfBytesRead = 0;
|
||||
ReadProcessMemory(fdProcessInfo->hProcess, (const void*)addr, buf.data(), buf.size(), &NumberOfBytesRead);
|
||||
dprintf_untranslated("Data: %s\n", StringUtils::ToHex(buf.data(), NumberOfBytesRead).c_str());
|
||||
}
|
||||
else if(argv[1][0] == 'r')
|
||||
{
|
||||
|
|
|
@ -239,6 +239,7 @@ static void registercommands()
|
|||
dbgcmdnew("alloc", cbDebugAlloc, true); //allocate memory
|
||||
dbgcmdnew("free", cbDebugFree, true); //free memory
|
||||
dbgcmdnew("Fill,memset", cbDebugMemset, true); //memset
|
||||
dbgcmdnew("memcpy", cbDebugMemcpy, true); //memcpy
|
||||
dbgcmdnew("getpagerights,getrightspage", cbDebugGetPageRights, true);
|
||||
dbgcmdnew("setpagerights,setrightspage", cbDebugSetPageRights, true);
|
||||
dbgcmdnew("savedata", cbInstrSavedata, true); //save data to disk
|
||||
|
|
Loading…
Reference in New Issue