mirror of
https://github.com/x64dbg/x64dbg.git
synced 2025-02-21 13:33:29 +00:00
DBG: updated XEDParse
This commit is contained in:
parent
5176dd1cd1
commit
0b64b56395
@ -16,7 +16,7 @@
|
||||
#define XEDPARSE_MAXASMSIZE 16
|
||||
|
||||
//typedefs
|
||||
typedef bool (XEDPARSE_CALL *CBXEDPARSE_UNKNOWN)(const char* text, ULONG_PTR* value);
|
||||
typedef bool (XEDPARSE_CALL *CBXEDPARSE_UNKNOWN)(const char* text, ULONGLONG* value);
|
||||
|
||||
//XEDParse enums
|
||||
enum XEDPARSE_STATUS
|
||||
@ -29,7 +29,8 @@ enum XEDPARSE_STATUS
|
||||
#pragma pack(push,8)
|
||||
struct XEDPARSE
|
||||
{
|
||||
ULONG_PTR cip; //instruction pointer (for relative addressing)
|
||||
bool x64; // use 64-bit instructions
|
||||
ULONGLONG cip; //instruction pointer (for relative addressing)
|
||||
unsigned int dest_size; //destination size (returned by XEDParse)
|
||||
CBXEDPARSE_UNKNOWN cbUnknown; //unknown operand callback
|
||||
unsigned char dest[XEDPARSE_MAXASMSIZE]; //destination buffer
|
||||
|
@ -767,7 +767,7 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par
|
||||
|
||||
case DBG_ASSEMBLE_AT:
|
||||
{
|
||||
return assembleat((duint)param1, (const char*)param2);
|
||||
return assembleat((duint)param1, (const char*)param2, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -2,16 +2,39 @@
|
||||
#include "memory.h"
|
||||
#include "debugger.h"
|
||||
#include "XEDParse\XEDParse.h"
|
||||
#include "value.h"
|
||||
|
||||
bool assembleat(uint addr, const char* instruction)
|
||||
static bool cbUnknown(const char* text, ULONGLONG* value)
|
||||
{
|
||||
if(!text or !value)
|
||||
return false;
|
||||
uint val;
|
||||
if(!valfromstring(text, &val))
|
||||
return false;
|
||||
*value=val;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool assembleat(uint addr, const char* instruction, char* error)
|
||||
{
|
||||
if(strlen(instruction)>=XEDPARSE_MAXBUFSIZE)
|
||||
return false;
|
||||
XEDPARSE parse;
|
||||
memset(&parse, 0, sizeof(parse));
|
||||
#ifdef _WIN64
|
||||
parse.x64=true;
|
||||
#else //x86
|
||||
parse.x64=false;
|
||||
#endif
|
||||
parse.cbUnknown=cbUnknown;
|
||||
parse.cip=addr;
|
||||
strcpy(parse.instr, instruction);
|
||||
if(XEDParseAssemble(&parse)==XEDPARSE_ERROR)
|
||||
{
|
||||
if(error)
|
||||
strcpy(error, parse.error);
|
||||
return false;
|
||||
}
|
||||
bool ret=memwrite(fdProcessInfo->hProcess, (void*)addr, parse.dest, parse.dest_size, 0);
|
||||
return ret;
|
||||
}
|
||||
|
@ -3,6 +3,6 @@
|
||||
|
||||
#include "_global.h"
|
||||
|
||||
bool assembleat(uint addr, const char* instruction);
|
||||
bool assembleat(uint addr, const char* instruction, char* error);
|
||||
|
||||
#endif // _ASSEMBLE_H
|
||||
|
@ -369,9 +369,10 @@ CMDRESULT cbAssemble(int argc, char* argv[])
|
||||
dprintf("invalid address: "fhex"!\n", addr);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
if(!assembleat(addr, argv[2]))
|
||||
char error[256]="";
|
||||
if(!assembleat(addr, argv[2], error))
|
||||
{
|
||||
dprintf("failed to assemble \"%s\"\n", argv[2]);
|
||||
dprintf("failed to assemble \"%s\" (%s)\n", argv[2], error);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
GuiUpdateAllViews();
|
||||
|
Loading…
x
Reference in New Issue
Block a user