diff --git a/pykd/context.cpp b/pykd/context.cpp index 6ca19cf..5246be7 100644 --- a/pykd/context.cpp +++ b/pykd/context.cpp @@ -11,6 +11,7 @@ namespace pykd { + //////////////////////////////////////////////////////////////////////////////// // Fill 32-bit register context //////////////////////////////////////////////////////////////////////////////// @@ -50,77 +51,61 @@ void FillRegistersFromContext32( regValues[CV_REG_EFLAGS] = Context.EFlags; } -//////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////// -namespace I386 { -#include "defctxi386.h" -} +struct CvRegName +{ + CvRegName(CV_HREG_e cvValue, const std::string &name) + : m_cvValue( cvValue ), m_name( boost::to_lower_copy(name) ) + { + } + CV_HREG_e m_cvValue; + std::string m_name; +}; +#define _REG_NAME(prefix, regName) CvRegName(CV_##prefix##regName, #regName) + +///////////////////////////////////////////////////////////////////////////////// +#define _REG_X86(regName) _REG_NAME(REG_, regName) +static const CvRegName g_x86Registers[] = { + _REG_X86(DR0), _REG_X86(DR1), _REG_X86(DR2), _REG_X86(DR3), _REG_X86(DR6), _REG_X86(DR7), + _REG_X86(GS), _REG_X86(FS), _REG_X86(ES), _REG_X86(DS), + _REG_X86(EDI), _REG_X86(EBX), _REG_X86(EDX), _REG_X86(ECX), _REG_X86(EAX), + _REG_X86(EBP), _REG_X86(ESP), _REG_X86(SS), + _REG_X86(EIP), _REG_X86(CS), + CvRegName(CV_REG_EFLAGS, "efl") +}; +#undef _REG_X86 + +///////////////////////////////////////////////////////////////////////////////// +#define _REG_X64(regName) _REG_NAME(AMD64_, regName) +static const CvRegName g_x64Registers[] = { + _REG_X64(MXCSR), + _REG_X64(CS), _REG_X64(DS), _REG_X64(ES), _REG_X64(FS), _REG_X64(GS), _REG_X64(SS), + + _REG_X64(DR0), _REG_X64(DR1), _REG_X64(DR2), _REG_X64(DR3), _REG_X64(DR6), _REG_X64(DR7), + + _REG_X64(RAX), _REG_X64(RCX), _REG_X64(RDX), _REG_X64(RBX), _REG_X64(RSP), _REG_X64(RBP), _REG_X64(RSI), _REG_X64(RDI), + _REG_X64(R8), _REG_X64(R9), _REG_X64(R10), _REG_X64(R11), _REG_X64(R12), _REG_X64(R13), _REG_X64(R14), _REG_X64(R15), + + _REG_X64(RIP), + CvRegName(CV_AMD64_EFLAGS, "efl") +}; +#undef _REG_X64 + +#undef _REG_NAME ///////////////////////////////////////////////////////////////////////////////// void ThreadContext::getI386Context() { - I386::CONTEXT Context = {0}; - - HRESULT hres = m_advanced->GetThreadContext(&Context, sizeof(Context)); - if (S_OK != hres) - throw DbgException( "IDebugAdvanced2::GetThreadContext", hres ); - - FillRegistersFromContext32(m_regValues, Context); -} - -///////////////////////////////////////////////////////////////////////////////// - -namespace AMD64 { -#include "defctxamd64.h" + queryRegisters(g_x86Registers, _countof(g_x86Registers)); } ///////////////////////////////////////////////////////////////////////////////// void ThreadContext::getAmd64Context() { - AMD64::CONTEXT Context = {0}; - - HRESULT hres = m_advanced->GetThreadContext(&Context, sizeof(Context)); - if (S_OK != hres) - throw DbgException( "IDebugAdvanced2::GetThreadContext", hres); - - m_regValues[CV_AMD64_MXCSR] = Context.MxCsr; - - m_regValues[CV_AMD64_CS] = Context.SegCs; - m_regValues[CV_AMD64_DS] = Context.SegDs; - m_regValues[CV_AMD64_ES] = Context.SegEs; - m_regValues[CV_AMD64_FS] = Context.SegFs; - m_regValues[CV_AMD64_GS] = Context.SegGs; - m_regValues[CV_AMD64_SS] = Context.SegSs; - - m_regValues[CV_AMD64_EFLAGS] = Context.EFlags; - - m_regValues[CV_AMD64_DR0] = Context.Dr0; - m_regValues[CV_AMD64_DR1] = Context.Dr1; - m_regValues[CV_AMD64_DR2] = Context.Dr2; - m_regValues[CV_AMD64_DR3] = Context.Dr3; - m_regValues[CV_AMD64_DR6] = Context.Dr6; - m_regValues[CV_AMD64_DR7] = Context.Dr7; - - m_regValues[CV_AMD64_RAX] = Context.Rax; - m_regValues[CV_AMD64_RCX] = Context.Rcx; - m_regValues[CV_AMD64_RDX] = Context.Rdx; - m_regValues[CV_AMD64_RBX] = Context.Rbx; - m_regValues[CV_AMD64_RSP] = Context.Rsp; - m_regValues[CV_AMD64_RBP] = Context.Rbp; - m_regValues[CV_AMD64_RSI] = Context.Rdi; - m_regValues[CV_AMD64_RDI] = Context.Rdi; - m_regValues[CV_AMD64_R8] = Context.R8; - m_regValues[CV_AMD64_R9] = Context.R9; - m_regValues[CV_AMD64_R10] = Context.R10; - m_regValues[CV_AMD64_R11] = Context.R11; - m_regValues[CV_AMD64_R12] = Context.R12; - m_regValues[CV_AMD64_R13] = Context.R13; - m_regValues[CV_AMD64_R14] = Context.R14; - m_regValues[CV_AMD64_R15] = Context.R15; - - m_regValues[CV_AMD64_RIP] = Context.Rip; + queryRegisters(g_x64Registers, _countof(g_x64Registers)); } ///////////////////////////////////////////////////////////////////////////////// @@ -158,6 +143,55 @@ ThreadContext::ThreadContext( ///////////////////////////////////////////////////////////////////////////////// +void ThreadContext::queryRegisters( + const CvRegName *regs, + ULONG countOfRegs +) +{ + HRESULT hres; + + std::vector regIndices( countOfRegs ); + + for (ULONG i = 0; i < countOfRegs; ++i) + { + hres = m_registers->GetIndexByName(regs[i].m_name.c_str(), ®Indices[i]); + if (S_OK != hres) + throw DbgException( "IDebugRegisters::GetIndexByName", hres); + } + + std::vector regValues( countOfRegs ); + hres = + m_registers->GetValues( + static_cast(countOfRegs), + ®Indices[0], + 0, + ®Values[0]); + if (S_OK != hres) + throw DbgException( "IDebugRegisters::GetValues", hres); + + for (ULONG i = 0; i < countOfRegs; ++i) + { + const DEBUG_VALUE ®Value = regValues[i]; + switch (regValue.Type) + { + case DEBUG_VALUE_INT8: + m_regValues[regs[i].m_cvValue] = regValue.I8; + break; + case DEBUG_VALUE_INT16: + m_regValues[regs[i].m_cvValue] = regValue.I16; + break; + case DEBUG_VALUE_INT32: + m_regValues[regs[i].m_cvValue] = regValue.I32; + break; + case DEBUG_VALUE_INT64: + m_regValues[regs[i].m_cvValue] = regValue.I64; + break; + } + } +} + +///////////////////////////////////////////////////////////////////////////////// + ContextPtr ThreadContext::getWow64Context( IDebugClient4 *client ) { ContextPtr ptrContext( new ThreadContext(client, IMAGE_FILE_MACHINE_I386) ); diff --git a/pykd/context.h b/pykd/context.h index f16f255..abd4a59 100644 --- a/pykd/context.h +++ b/pykd/context.h @@ -16,6 +16,7 @@ class ThreadContext; typedef boost::shared_ptr< ThreadContext > ContextPtr; class StackFrame; +struct CvRegName; //////////////////////////////////////////////////////////////////////////////// @@ -67,6 +68,11 @@ protected: ULONG processorType ); + void queryRegisters( + const CvRegName *regs, + ULONG countOfRegs + ); + // query i386 registers void getI386Context(); diff --git a/pykd/defctxamd64.h b/pykd/defctxamd64.h deleted file mode 100644 index fa4404c..0000000 --- a/pykd/defctxamd64.h +++ /dev/null @@ -1,95 +0,0 @@ - -struct DECLSPEC_ALIGN(16) M128A { - ULONGLONG Low; - LONGLONG High; -}; - -struct XMM_SAVE_AREA32 { - USHORT ControlWord; - USHORT StatusWord; - UCHAR TagWord; - UCHAR Reserved1; - USHORT ErrorOpcode; - ULONG ErrorOffset; - USHORT ErrorSelector; - USHORT Reserved2; - ULONG DataOffset; - USHORT DataSelector; - USHORT Reserved3; - ULONG MxCsr; - ULONG MxCsr_Mask; - M128A FloatRegisters[8]; - M128A XmmRegisters[16]; - UCHAR Reserved4[96]; -}; - -struct DECLSPEC_ALIGN(16) CONTEXT { - ULONG64 P1Home; - ULONG64 P2Home; - ULONG64 P3Home; - ULONG64 P4Home; - ULONG64 P5Home; - ULONG64 P6Home; - ULONG ContextFlags; - ULONG MxCsr; - USHORT SegCs; - USHORT SegDs; - USHORT SegEs; - USHORT SegFs; - USHORT SegGs; - USHORT SegSs; - ULONG EFlags; - ULONG64 Dr0; - ULONG64 Dr1; - ULONG64 Dr2; - ULONG64 Dr3; - ULONG64 Dr6; - ULONG64 Dr7; - ULONG64 Rax; - ULONG64 Rcx; - ULONG64 Rdx; - ULONG64 Rbx; - ULONG64 Rsp; - ULONG64 Rbp; - ULONG64 Rsi; - ULONG64 Rdi; - ULONG64 R8; - ULONG64 R9; - ULONG64 R10; - ULONG64 R11; - ULONG64 R12; - ULONG64 R13; - ULONG64 R14; - ULONG64 R15; - ULONG64 Rip; - union { - XMM_SAVE_AREA32 FltSave; - struct { - M128A Header[2]; - M128A Legacy[8]; - M128A Xmm0; - M128A Xmm1; - M128A Xmm2; - M128A Xmm3; - M128A Xmm4; - M128A Xmm5; - M128A Xmm6; - M128A Xmm7; - M128A Xmm8; - M128A Xmm9; - M128A Xmm10; - M128A Xmm11; - M128A Xmm12; - M128A Xmm13; - M128A Xmm14; - M128A Xmm15; - }; - }; - M128A VectorRegister[26]; - ULONG64 VectorControl; - ULONG64 DebugControl; - ULONG64 LastBranchToRip; - ULONG64 LastBranchFromRip; - ULONG64 LastExceptionToRip; - ULONG64 LastExceptionFromRip; -}; diff --git a/pykd/defctxi386.h b/pykd/defctxi386.h deleted file mode 100644 index a25e403..0000000 --- a/pykd/defctxi386.h +++ /dev/null @@ -1,54 +0,0 @@ - - -#define MAXIMUM_SUPPORTED_EXTENSION 512 - -#define SIZE_OF_80387_REGISTERS 80 - -struct FLOATING_SAVE_AREA { - ULONG ControlWord; - ULONG StatusWord; - ULONG TagWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; - ULONG Cr0NpxState; -}; - -struct CONTEXT { - - ULONG ContextFlags; - - ULONG Dr0; - ULONG Dr1; - ULONG Dr2; - ULONG Dr3; - ULONG Dr6; - ULONG Dr7; - - - FLOATING_SAVE_AREA FloatSave; - - - ULONG SegGs; - ULONG SegFs; - ULONG SegEs; - ULONG SegDs; - - ULONG Edi; - ULONG Esi; - ULONG Ebx; - ULONG Edx; - ULONG Ecx; - ULONG Eax; - - ULONG Ebp; - ULONG Eip; - ULONG SegCs; - ULONG EFlags; - ULONG Esp; - ULONG SegSs; - - UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; -}; diff --git a/pykd/pykd_2008.vcproj b/pykd/pykd_2008.vcproj index 3cf6050..418219c 100644 --- a/pykd/pykd_2008.vcproj +++ b/pykd/pykd_2008.vcproj @@ -547,14 +547,6 @@ RelativePath=".\dbgpath.h" > - - - -