1
0
Fork 0

Finish cleaning up registers setting code

This commit is contained in:
torusrxxx 2025-11-27 19:27:21 +08:00
parent 2fe189dcd6
commit 3b8c001d6e
2 changed files with 367 additions and 225 deletions

View File

@ -842,6 +842,12 @@ bool ExpressionParser::Calculate(duint & value, bool signedcalc, bool allowassig
{
// Just a number, optimize this very common case for tracing performance
value = mTokens[0].info();
if(isvar)
*isvar = false;
if(value_size)
*value_size = sizeof(duint);
if(hexonly)
*hexonly = false;
return true;
}
EvalValue evalue(0);

View File

@ -968,223 +968,363 @@ duint getregister(int* size, const char* string)
*/
bool setregister(const char* string, duint value)
{
if(scmp(string, "eax"))
return SetContextDataEx(hActiveThread, UE_EAX, value & 0xFFFFFFFF);
if(scmp(string, "ebx"))
return SetContextDataEx(hActiveThread, UE_EBX, value & 0xFFFFFFFF);
if(scmp(string, "ecx"))
return SetContextDataEx(hActiveThread, UE_ECX, value & 0xFFFFFFFF);
if(scmp(string, "edx"))
return SetContextDataEx(hActiveThread, UE_EDX, value & 0xFFFFFFFF);
if(scmp(string, "edi"))
return SetContextDataEx(hActiveThread, UE_EDI, value & 0xFFFFFFFF);
if(scmp(string, "esi"))
return SetContextDataEx(hActiveThread, UE_ESI, value & 0xFFFFFFFF);
if(scmp(string, "ebp"))
return SetContextDataEx(hActiveThread, UE_EBP, value & 0xFFFFFFFF);
if(scmp(string, "esp"))
return SetContextDataEx(hActiveThread, UE_ESP, value & 0xFFFFFFFF);
if(scmp(string, "eip"))
return SetContextDataEx(hActiveThread, UE_EIP, value & 0xFFFFFFFF);
if(scmp(string, "eflags"))
return SetContextDataEx(hActiveThread, UE_EFLAGS, value & 0xFFFFFFFF);
TitanRegister titanIndex = UE_XMM0;
const int string_int = read_string_4char_ucase(string);
switch(string_int)
{
case MAKE_WORD_INTO_INT(EAX):
titanIndex = UE_EAX;
break;
case MAKE_WORD_INTO_INT(EBX):
titanIndex = UE_EBX;
break;
case MAKE_WORD_INTO_INT(ECX):
titanIndex = UE_ECX;
break;
case MAKE_WORD_INTO_INT(EDX):
titanIndex = UE_EDX;
break;
case MAKE_WORD_INTO_INT(EDI):
titanIndex = UE_EDI;
break;
case MAKE_WORD_INTO_INT(ESI):
titanIndex = UE_ESI;
break;
case MAKE_WORD_INTO_INT(EBP):
titanIndex = UE_EBP;
break;
case MAKE_WORD_INTO_INT(ESP):
titanIndex = UE_ESP;
break;
case MAKE_WORD_INTO_INT(EIP):
titanIndex = UE_EIP;
break;
default:
if(scmp(string, "eflags"))
titanIndex = UE_EFLAGS;
else
titanIndex = UE_XMM0;
}
if(titanIndex != UE_XMM0)
return SetContextDataEx(hActiveThread, titanIndex, value & 0xFFFFFFFF);
switch(string_int)
{
case MAKE_WORD_INTO_INT(CAX):
titanIndex = ArchValue(UE_EAX, UE_RAX);
break;
case MAKE_WORD_INTO_INT(CBX):
titanIndex = ArchValue(UE_EBX, UE_RBX);
break;
case MAKE_WORD_INTO_INT(CCX):
titanIndex = ArchValue(UE_ECX, UE_RCX);
break;
case MAKE_WORD_INTO_INT(CDX):
titanIndex = ArchValue(UE_EDX, UE_RDX);
break;
case MAKE_WORD_INTO_INT(CDI):
titanIndex = ArchValue(UE_EDI, UE_RDI);
break;
case MAKE_WORD_INTO_INT(CSI):
titanIndex = ArchValue(UE_ESI, UE_RSI);
break;
case MAKE_WORD_INTO_INT(CBP):
titanIndex = ArchValue(UE_EBP, UE_RBP);
break;
case MAKE_WORD_INTO_INT(CSP):
titanIndex = UE_CSP;
break;
case MAKE_WORD_INTO_INT(CIP):
titanIndex = UE_CIP;
break;
#ifdef _WIN64
case MAKE_WORD_INTO_INT(RAX):
titanIndex = UE_RAX;
break;
case MAKE_WORD_INTO_INT(RBX):
titanIndex = UE_RBX;
break;
case MAKE_WORD_INTO_INT(RCX):
titanIndex = UE_RCX;
break;
case MAKE_WORD_INTO_INT(RDX):
titanIndex = UE_RDX;
break;
case MAKE_WORD_INTO_INT(RDI):
titanIndex = UE_RDI;
break;
case MAKE_WORD_INTO_INT(RSI):
titanIndex = UE_RSI;
break;
case MAKE_WORD_INTO_INT(RBP):
titanIndex = UE_RBP;
break;
case MAKE_WORD_INTO_INT(RSP):
titanIndex = UE_RSP;
break;
case MAKE_WORD_INTO_INT(RIP):
titanIndex = UE_RIP;
break;
case MAKE_WORD_INTO_INT(R9):
titanIndex = UE_R9;
break;
case MAKE_WORD_INTO_INT(R10):
titanIndex = UE_R10;
break;
case MAKE_WORD_INTO_INT(R11):
titanIndex = UE_R11;
break;
case MAKE_WORD_INTO_INT(R12):
titanIndex = UE_R12;
break;
case MAKE_WORD_INTO_INT(R13):
titanIndex = UE_R13;
break;
case MAKE_WORD_INTO_INT(R14):
titanIndex = UE_R14;
break;
case MAKE_WORD_INTO_INT(R15):
titanIndex = UE_R15;
break;
#endif //_WIN64
default:
if(scmp(string, "cflags"))
titanIndex = UE_CFLAGS;
#ifdef _WIN64
else if(scmp(string, "rflags"))
titanIndex = UE_RFLAGS;
#endif //_WIN64
else
titanIndex = UE_XMM0;
}
if(titanIndex != UE_XMM0)
return SetContextDataEx(hActiveThread, titanIndex, value);
switch(string_int)
{
case MAKE_WORD_INTO_INT(AX):
titanIndex = UE_EAX;
break;
case MAKE_WORD_INTO_INT(BX):
titanIndex = UE_EBX;
break;
case MAKE_WORD_INTO_INT(CX):
titanIndex = UE_ECX;
break;
case MAKE_WORD_INTO_INT(DX):
titanIndex = UE_EDX;
break;
case MAKE_WORD_INTO_INT(SI):
titanIndex = UE_ESI;
break;
case MAKE_WORD_INTO_INT(DI):
titanIndex = UE_EDI;
break;
case MAKE_WORD_INTO_INT(SP):
titanIndex = UE_ESP;
break;
case MAKE_WORD_INTO_INT(BP):
titanIndex = UE_EBP;
break;
case MAKE_WORD_INTO_INT(IP):
titanIndex = UE_EIP;
break;
default:
titanIndex = UE_XMM0;
}
if(titanIndex != UE_XMM0)
return SetContextDataEx(hActiveThread, titanIndex, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, titanIndex) & 0xFFFF0000));
switch(string_int)
{
case MAKE_WORD_INTO_INT(AH):
titanIndex = UE_EAX;
break;
case MAKE_WORD_INTO_INT(BH):
titanIndex = UE_EBX;
break;
case MAKE_WORD_INTO_INT(CH):
titanIndex = UE_ECX;
break;
case MAKE_WORD_INTO_INT(DH):
titanIndex = UE_EDX;
break;
case MAKE_WORD_INTO_INT(SIH):
titanIndex = UE_ESI;
break;
case MAKE_WORD_INTO_INT(DIH):
titanIndex = UE_EDI;
break;
case MAKE_WORD_INTO_INT(BPH):
titanIndex = UE_EBP;
break;
case MAKE_WORD_INTO_INT(SPH):
titanIndex = UE_ESP;
break;
case MAKE_WORD_INTO_INT(IPH):
titanIndex = UE_EIP;
break;
default:
titanIndex = UE_XMM0;
}
if(titanIndex != UE_XMM0)
return SetContextDataEx(hActiveThread, titanIndex, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, titanIndex) & 0xFFFF00FF));
switch(string_int)
{
case MAKE_WORD_INTO_INT(AL):
titanIndex = UE_EAX;
break;
case MAKE_WORD_INTO_INT(BL):
titanIndex = UE_EBX;
break;
case MAKE_WORD_INTO_INT(CL):
titanIndex = UE_ECX;
break;
case MAKE_WORD_INTO_INT(DL):
titanIndex = UE_EDX;
break;
case MAKE_WORD_INTO_INT(SIL):
titanIndex = UE_ESI;
break;
case MAKE_WORD_INTO_INT(DIL):
titanIndex = UE_EDI;
break;
case MAKE_WORD_INTO_INT(BPL):
titanIndex = UE_EBP;
break;
case MAKE_WORD_INTO_INT(SPL):
titanIndex = UE_ESP;
break;
case MAKE_WORD_INTO_INT(IPL):
titanIndex = UE_EIP;
break;
default:
titanIndex = UE_XMM0;
}
if(titanIndex != UE_XMM0)
return SetContextDataEx(hActiveThread, titanIndex, (value & 0xFF) | (GetContextDataEx(hActiveThread, titanIndex) & 0xFFFFFF00));
#ifdef _WIN64
switch(string_int)
{
case MAKE_WORD_INTO_INT(R9D):
case MAKE_WORD_INTO_INT(R9W):
case MAKE_WORD_INTO_INT(R9B):
titanIndex = UE_R9;
break;
case MAKE_WORD_INTO_INT(R10D):
case MAKE_WORD_INTO_INT(R10W):
case MAKE_WORD_INTO_INT(R10B):
titanIndex = UE_R10;
break;
case MAKE_WORD_INTO_INT(R11D):
case MAKE_WORD_INTO_INT(R11W):
case MAKE_WORD_INTO_INT(R11B):
titanIndex = UE_R11;
break;
case MAKE_WORD_INTO_INT(R12D):
case MAKE_WORD_INTO_INT(R12W):
case MAKE_WORD_INTO_INT(R12B):
titanIndex = UE_R12;
break;
case MAKE_WORD_INTO_INT(R13D):
case MAKE_WORD_INTO_INT(R13W):
case MAKE_WORD_INTO_INT(R13B):
titanIndex = UE_R13;
break;
case MAKE_WORD_INTO_INT(R14D):
case MAKE_WORD_INTO_INT(R14W):
case MAKE_WORD_INTO_INT(R14B):
titanIndex = UE_R14;
break;
case MAKE_WORD_INTO_INT(R15D):
case MAKE_WORD_INTO_INT(R15W):
case MAKE_WORD_INTO_INT(R15B):
titanIndex = UE_R15;
break;
default:
titanIndex = UE_XMM0;
}
if(titanIndex != UE_XMM0)
{
duint mask;
if((string_int & 0xFF0000) == 0x440000 || (string_int & 0xFF000000) == 0x44000000) // contains D
{
mask = 0xFFFFFFFF;
}
else if((string_int & 0xFF0000) == 0x570000 || (string_int & 0xFF000000) == 0x57000000) // contains W
{
mask = 0xFFFF;
}
else if((string_int & 0xFF0000) == 0x420000 || (string_int & 0xFF000000) == 0x42000000) // contains B
{
mask = 0xFF;
}
else
{
return false; // not possible
}
return SetContextDataEx(hActiveThread, titanIndex, (value & mask) | (GetContextDataEx(hActiveThread, titanIndex) & ~mask));
}
#endif // _WIN64
switch(string_int)
{
case MAKE_WORD_INTO_INT(DR0):
titanIndex = UE_DR0;
break;
case MAKE_WORD_INTO_INT(DR1):
titanIndex = UE_DR1;
break;
case MAKE_WORD_INTO_INT(DR2):
titanIndex = UE_DR2;
break;
case MAKE_WORD_INTO_INT(DR3):
titanIndex = UE_DR3;
break;
case MAKE_WORD_INTO_INT(DR4):
case MAKE_WORD_INTO_INT(DR6):
titanIndex = UE_DR6;
break;
case MAKE_WORD_INTO_INT(DR5):
case MAKE_WORD_INTO_INT(DR7):
titanIndex = UE_DR7;
break;
default:
titanIndex = UE_XMM0;
}
if(titanIndex != UE_XMM0)
return SetContextDataEx(hActiveThread, titanIndex, value);
if(scmp(string, "lasterror"))
return MemWrite((duint)GetTEBLocation(hActiveThread) + ArchValue(0x34, 0x68), &value, 4);
if(scmp(string, "laststatus"))
return MemWrite((duint)GetTEBLocation(hActiveThread) + ArchValue(0xBF4, 0x1250), &value, 4);
if(scmp(string, "gs"))
return SetContextDataEx(hActiveThread, UE_SEG_GS, value & 0xFFFF);
if(scmp(string, "fs"))
return SetContextDataEx(hActiveThread, UE_SEG_FS, value & 0xFFFF);
if(scmp(string, "es"))
return SetContextDataEx(hActiveThread, UE_SEG_ES, value & 0xFFFF);
if(scmp(string, "ds"))
return SetContextDataEx(hActiveThread, UE_SEG_DS, value & 0xFFFF);
if(scmp(string, "cs"))
return SetContextDataEx(hActiveThread, UE_SEG_CS, value & 0xFFFF);
if(scmp(string, "ss"))
return SetContextDataEx(hActiveThread, UE_SEG_SS, value & 0xFFFF);
if(scmp(string, "ax"))
return SetContextDataEx(hActiveThread, UE_EAX, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_EAX) & 0xFFFF0000));
if(scmp(string, "bx"))
return SetContextDataEx(hActiveThread, UE_EBX, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_EBX) & 0xFFFF0000));
if(scmp(string, "cx"))
return SetContextDataEx(hActiveThread, UE_ECX, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_ECX) & 0xFFFF0000));
if(scmp(string, "dx"))
return SetContextDataEx(hActiveThread, UE_EDX, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_EDX) & 0xFFFF0000));
if(scmp(string, "si"))
return SetContextDataEx(hActiveThread, UE_ESI, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_ESI) & 0xFFFF0000));
if(scmp(string, "di"))
return SetContextDataEx(hActiveThread, UE_EDI, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_EDI) & 0xFFFF0000));
if(scmp(string, "bp"))
return SetContextDataEx(hActiveThread, UE_EBP, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_EBP) & 0xFFFF0000));
if(scmp(string, "sp"))
return SetContextDataEx(hActiveThread, UE_ESP, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_ESP) & 0xFFFF0000));
if(scmp(string, "ip"))
return SetContextDataEx(hActiveThread, UE_EIP, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_EIP) & 0xFFFF0000));
if(scmp(string, "ah"))
return SetContextDataEx(hActiveThread, UE_EAX, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, UE_EAX) & 0xFFFF00FF));
if(scmp(string, "al"))
return SetContextDataEx(hActiveThread, UE_EAX, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_EAX) & 0xFFFFFF00));
if(scmp(string, "bh"))
return SetContextDataEx(hActiveThread, UE_EBX, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, UE_EBX) & 0xFFFF00FF));
if(scmp(string, "bl"))
return SetContextDataEx(hActiveThread, UE_EBX, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_EBX) & 0xFFFFFF00));
if(scmp(string, "ch"))
return SetContextDataEx(hActiveThread, UE_ECX, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, UE_ECX) & 0xFFFF00FF));
if(scmp(string, "cl"))
return SetContextDataEx(hActiveThread, UE_ECX, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_ECX) & 0xFFFFFF00));
if(scmp(string, "dh"))
return SetContextDataEx(hActiveThread, UE_EDX, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, UE_EDX) & 0xFFFF00FF));
if(scmp(string, "dl"))
return SetContextDataEx(hActiveThread, UE_EDX, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_EDX) & 0xFFFFFF00));
if(scmp(string, "sih"))
return SetContextDataEx(hActiveThread, UE_ESI, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, UE_ESI) & 0xFFFF00FF));
if(scmp(string, "sil"))
return SetContextDataEx(hActiveThread, UE_ESI, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_ESI) & 0xFFFFFF00));
if(scmp(string, "dih"))
return SetContextDataEx(hActiveThread, UE_EDI, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, UE_EDI) & 0xFFFF00FF));
if(scmp(string, "dil"))
return SetContextDataEx(hActiveThread, UE_EDI, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_EDI) & 0xFFFFFF00));
if(scmp(string, "bph"))
return SetContextDataEx(hActiveThread, UE_EBP, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, UE_EBP) & 0xFFFF00FF));
if(scmp(string, "bpl"))
return SetContextDataEx(hActiveThread, UE_EBP, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_EBP) & 0xFFFFFF00));
if(scmp(string, "sph"))
return SetContextDataEx(hActiveThread, UE_ESP, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, UE_ESP) & 0xFFFF00FF));
if(scmp(string, "spl"))
return SetContextDataEx(hActiveThread, UE_ESP, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_ESP) & 0xFFFFFF00));
if(scmp(string, "iph"))
return SetContextDataEx(hActiveThread, UE_EIP, ((value & 0xFF) << 8) | (GetContextDataEx(hActiveThread, UE_EIP) & 0xFFFF00FF));
if(scmp(string, "ipl"))
return SetContextDataEx(hActiveThread, UE_EIP, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_EIP) & 0xFFFFFF00));
if(scmp(string, "dr0"))
return SetContextDataEx(hActiveThread, UE_DR0, value);
if(scmp(string, "dr1"))
return SetContextDataEx(hActiveThread, UE_DR1, value);
if(scmp(string, "dr2"))
return SetContextDataEx(hActiveThread, UE_DR2, value);
if(scmp(string, "dr3"))
return SetContextDataEx(hActiveThread, UE_DR3, value);
if(scmp(string, "dr6") || scmp(string, "dr4"))
return SetContextDataEx(hActiveThread, UE_DR6, value);
if(scmp(string, "dr7") || scmp(string, "dr5"))
return SetContextDataEx(hActiveThread, UE_DR7, value);
if(scmp(string, "cax"))
return SetContextDataEx(hActiveThread, ArchValue(UE_EAX, UE_RAX), value);
if(scmp(string, "cbx"))
return SetContextDataEx(hActiveThread, ArchValue(UE_EBX, UE_RBX), value);
if(scmp(string, "ccx"))
return SetContextDataEx(hActiveThread, ArchValue(UE_ECX, UE_RCX), value);
if(scmp(string, "cdx"))
return SetContextDataEx(hActiveThread, ArchValue(UE_EDX, UE_RDX), value);
if(scmp(string, "csi"))
return SetContextDataEx(hActiveThread, ArchValue(UE_ESI, UE_RSI), value);
if(scmp(string, "cdi"))
return SetContextDataEx(hActiveThread, ArchValue(UE_EDI, UE_RDI), value);
if(scmp(string, "cip"))
return SetContextDataEx(hActiveThread, UE_CIP, value);
if(scmp(string, "csp"))
return SetContextDataEx(hActiveThread, UE_CSP, value);
if(scmp(string, "cbp"))
return SetContextDataEx(hActiveThread, ArchValue(UE_EBP, UE_RBP), value);
if(scmp(string, "cflags"))
return SetContextDataEx(hActiveThread, UE_CFLAGS, value);
#ifdef _WIN64
if(scmp(string, "rax"))
return SetContextDataEx(hActiveThread, UE_RAX, value);
if(scmp(string, "rbx"))
return SetContextDataEx(hActiveThread, UE_RBX, value);
if(scmp(string, "rcx"))
return SetContextDataEx(hActiveThread, UE_RCX, value);
if(scmp(string, "rdx"))
return SetContextDataEx(hActiveThread, UE_RDX, value);
if(scmp(string, "rdi"))
return SetContextDataEx(hActiveThread, UE_RDI, value);
if(scmp(string, "rsi"))
return SetContextDataEx(hActiveThread, UE_RSI, value);
if(scmp(string, "rbp"))
return SetContextDataEx(hActiveThread, UE_RBP, value);
if(scmp(string, "rsp"))
return SetContextDataEx(hActiveThread, UE_RSP, value);
if(scmp(string, "rip"))
return SetContextDataEx(hActiveThread, UE_RIP, value);
if(scmp(string, "rflags"))
return SetContextDataEx(hActiveThread, UE_RFLAGS, value);
if(scmp(string, "r8"))
return SetContextDataEx(hActiveThread, UE_R8, value);
if(scmp(string, "r9"))
return SetContextDataEx(hActiveThread, UE_R9, value);
if(scmp(string, "r10"))
return SetContextDataEx(hActiveThread, UE_R10, value);
if(scmp(string, "r11"))
return SetContextDataEx(hActiveThread, UE_R11, value);
if(scmp(string, "r12"))
return SetContextDataEx(hActiveThread, UE_R12, value);
if(scmp(string, "r13"))
return SetContextDataEx(hActiveThread, UE_R13, value);
if(scmp(string, "r14"))
return SetContextDataEx(hActiveThread, UE_R14, value);
if(scmp(string, "r15"))
return SetContextDataEx(hActiveThread, UE_R15, value);
if(scmp(string, "r8d"))
return SetContextDataEx(hActiveThread, UE_R8, (value & 0xFFFFFFFF) | (GetContextDataEx(hActiveThread, UE_R8) & 0xFFFFFFFF00000000));
if(scmp(string, "r9d"))
return SetContextDataEx(hActiveThread, UE_R9, (value & 0xFFFFFFFF) | (GetContextDataEx(hActiveThread, UE_R9) & 0xFFFFFFFF00000000));
if(scmp(string, "r10d"))
return SetContextDataEx(hActiveThread, UE_R10, (value & 0xFFFFFFFF) | (GetContextDataEx(hActiveThread, UE_R10) & 0xFFFFFFFF00000000));
if(scmp(string, "r11d"))
return SetContextDataEx(hActiveThread, UE_R11, (value & 0xFFFFFFFF) | (GetContextDataEx(hActiveThread, UE_R11) & 0xFFFFFFFF00000000));
if(scmp(string, "r12d"))
return SetContextDataEx(hActiveThread, UE_R12, (value & 0xFFFFFFFF) | (GetContextDataEx(hActiveThread, UE_R12) & 0xFFFFFFFF00000000));
if(scmp(string, "r13d"))
return SetContextDataEx(hActiveThread, UE_R13, (value & 0xFFFFFFFF) | (GetContextDataEx(hActiveThread, UE_R13) & 0xFFFFFFFF00000000));
if(scmp(string, "r14d"))
return SetContextDataEx(hActiveThread, UE_R14, (value & 0xFFFFFFFF) | (GetContextDataEx(hActiveThread, UE_R14) & 0xFFFFFFFF00000000));
if(scmp(string, "r15d"))
return SetContextDataEx(hActiveThread, UE_R15, (value & 0xFFFFFFFF) | (GetContextDataEx(hActiveThread, UE_R15) & 0xFFFFFFFF00000000));
if(scmp(string, "r8w"))
return SetContextDataEx(hActiveThread, UE_R8, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_R8) & 0xFFFFFFFFFFFF0000));
if(scmp(string, "r9w"))
return SetContextDataEx(hActiveThread, UE_R9, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_R9) & 0xFFFFFFFFFFFF0000));
if(scmp(string, "r10w"))
return SetContextDataEx(hActiveThread, UE_R10, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_R10) & 0xFFFFFFFFFFFF0000));
if(scmp(string, "r11w"))
return SetContextDataEx(hActiveThread, UE_R11, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_R11) & 0xFFFFFFFFFFFF0000));
if(scmp(string, "r12w"))
return SetContextDataEx(hActiveThread, UE_R12, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_R12) & 0xFFFFFFFFFFFF0000));
if(scmp(string, "r13w"))
return SetContextDataEx(hActiveThread, UE_R13, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_R13) & 0xFFFFFFFFFFFF0000));
if(scmp(string, "r14w"))
return SetContextDataEx(hActiveThread, UE_R14, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_R14) & 0xFFFFFFFFFFFF0000));
if(scmp(string, "r15w"))
return SetContextDataEx(hActiveThread, UE_R15, (value & 0xFFFF) | (GetContextDataEx(hActiveThread, UE_R15) & 0xFFFFFFFFFFFF0000));
if(scmp(string, "r8b"))
return SetContextDataEx(hActiveThread, UE_R8, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_R8) & 0xFFFFFFFFFFFFFF00));
if(scmp(string, "r9b"))
return SetContextDataEx(hActiveThread, UE_R9, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_R9) & 0xFFFFFFFFFFFFFF00));
if(scmp(string, "r10b"))
return SetContextDataEx(hActiveThread, UE_R10, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_R10) & 0xFFFFFFFFFFFFFF00));
if(scmp(string, "r11b"))
return SetContextDataEx(hActiveThread, UE_R11, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_R11) & 0xFFFFFFFFFFFFFF00));
if(scmp(string, "r12b"))
return SetContextDataEx(hActiveThread, UE_R12, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_R12) & 0xFFFFFFFFFFFFFF00));
if(scmp(string, "r13b"))
return SetContextDataEx(hActiveThread, UE_R13, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_R13) & 0xFFFFFFFFFFFFFF00));
if(scmp(string, "r14b"))
return SetContextDataEx(hActiveThread, UE_R14, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_R14) & 0xFFFFFFFFFFFFFF00));
if(scmp(string, "r15b"))
return SetContextDataEx(hActiveThread, UE_R15, (value & 0xFF) | (GetContextDataEx(hActiveThread, UE_R15) & 0xFFFFFFFFFFFFFF00));
#endif // _WIN64
switch(string_int)
{
case MAKE_WORD_INTO_INT(GS):
titanIndex = UE_SEG_GS;
break;
case MAKE_WORD_INTO_INT(FS):
titanIndex = UE_SEG_FS;
break;
case MAKE_WORD_INTO_INT(ES):
titanIndex = UE_SEG_ES;
break;
case MAKE_WORD_INTO_INT(DS):
titanIndex = UE_SEG_DS;
break;
case MAKE_WORD_INTO_INT(CS):
titanIndex = UE_SEG_CS;
break;
case MAKE_WORD_INTO_INT(SS):
titanIndex = UE_SEG_SS;
break;
}
if(titanIndex != UE_XMM0)
return SetContextDataEx(hActiveThread, titanIndex, value & 0xFFFF);
return false;
}
@ -1476,6 +1616,7 @@ bool valfromstring_noexpr(const char* string, duint* value, bool silent, bool ba
*isvar = true;
break;
}
int len = (int)strlen(string);
if(string[0] == '['
|| (isdigitduint(string[0]) && string[1] == ':' && string[2] == '[')
|| (string[1] == 's' && (string[0] == 'c' || string[0] == 'd' || string[0] == 'e' || string[0] == 'f' || string[0] == 'g' || string[0] == 's') && string[2] == ':' && string[3] == '[') //memory location
@ -1492,19 +1633,18 @@ bool valfromstring_noexpr(const char* string, duint* value, bool silent, bool ba
*value_size = 0;
return true;
}
int len = (int)strlen(string);
int read_size = sizeof(duint);
int prefix_size = 1;
size_t seg_offset = 0;
if(string[1] == ':') //n:[ (number of bytes to read)
if(len > 3 && string[1] == ':') //n:[ (number of bytes to read)
{
prefix_size = 3;
int new_size = string[0] - '0';
if(new_size < read_size)
read_size = new_size;
}
else if(string[1] == 's' && string[2] == ':')
else if(len > 4 && string[1] == 's' && string[2] == ':')
{
prefix_size = 4;
if(string[0] == 'f') // fs:[...]
@ -1525,7 +1665,7 @@ bool valfromstring_noexpr(const char* string, duint* value, bool silent, bool ba
#endif //_WIN64
}
}
else if(string[0] == 'b'
else if(len > 6 && string[0] == 'b'
&& string[1] == 'y'
&& string[2] == 't'
&& string[3] == 'e'
@ -1537,7 +1677,7 @@ bool valfromstring_noexpr(const char* string, duint* value, bool silent, bool ba
if(new_size < read_size)
read_size = new_size;
}
else if(string[0] == 'w'
else if(len > 6 && string[0] == 'w'
&& string[1] == 'o'
&& string[2] == 'r'
&& string[3] == 'd'
@ -1549,7 +1689,7 @@ bool valfromstring_noexpr(const char* string, duint* value, bool silent, bool ba
if(new_size < read_size)
read_size = new_size;
}
else if(string[0] == 'd'
else if(len > 7 && string[0] == 'd'
&& string[1] == 'w'
&& string[2] == 'o'
&& string[3] == 'r'
@ -1563,7 +1703,7 @@ bool valfromstring_noexpr(const char* string, duint* value, bool silent, bool ba
read_size = new_size;
}
#ifdef _WIN64
else if(string[0] == 'q'
else if(len > 7 && string[0] == 'q'
&& string[1] == 'w'
&& string[2] == 'o'
&& string[3] == 'r'
@ -1628,7 +1768,7 @@ bool valfromstring_noexpr(const char* string, duint* value, bool silent, bool ba
*value = getregister(value_size, string);
return true;
}
else if(*string == '_' && isflag(string + 1)) //flag
else if(len > 1 && *string == '_' && isflag(string + 1)) //flag
{
if(!DbgIsDebugging())
{
@ -1676,13 +1816,9 @@ bool valfromstring_noexpr(const char* string, duint* value, bool silent, bool ba
return true;
else if(SymAddrFromName(string, value)) //then come symbols
return true;
else if(strstr(string, "sub_") == string) //then come sub_ functions
else if(len > 4 && string[0] == 's' && string[1] == 'u' && string[2] == 'b' && string[3] == '_') //then come sub_ functions
{
#ifdef _WIN64
bool result = sscanf_s(string, "sub_%llX", value) == 1;
#else //x86
bool result = sscanf_s(string, "sub_%X", value) == 1;
#endif //_WIN64
bool result = convertNumber(string + 4, *value, 16);
duint start;
return result && FunctionGet(*value, &start, nullptr) && *value == start;
}