DBG: updated XEDParse

This commit is contained in:
Mr. eXoDia 2014-06-24 19:19:02 +02:00
parent 5176dd1cd1
commit 0b64b56395
5 changed files with 32 additions and 7 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;
}

View File

@ -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

View File

@ -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();