Module: wine Branch: master Commit: 44ab1206617a48aeed01fc1349f8309021a8b818 URL: https://gitlab.winehq.org/wine/wine/-/commit/44ab1206617a48aeed01fc1349f8309...
Author: Eric Pouech epouech@codeweavers.com Date: Fri Oct 13 09:58:23 2023 +0200
winedbg: Correctly read LDT entries for wow64 debuggee.
This mostly matters for Mac as segment CS is handled as a real LDT entry.
Signed-off-by: Eric Pouech epouech@codeweavers.com
---
programs/winedbg/be_i386.c | 7 ++++++- programs/winedbg/tgt_active.c | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/programs/winedbg/be_i386.c b/programs/winedbg/be_i386.c index 9f22dd5f3d4..1bac5f382b2 100644 --- a/programs/winedbg/be_i386.c +++ b/programs/winedbg/be_i386.c @@ -40,7 +40,12 @@ static ADDRESS_MODE get_selector_type(HANDLE hThread, const WOW64_CONTEXT *ctx, /* null or system selector */ if (!(sel & 4) || ((sel >> 3) < first_ldt_entry)) return AddrModeFlat; if (dbg_curr_process->process_io->get_selector(hThread, sel, &le)) - return le.HighWord.Bits.Default_Big ? AddrMode1632 : AddrMode1616; + { + ULONG base = (le.HighWord.Bits.BaseHi << 24) + (le.HighWord.Bits.BaseMid << 16) + le.BaseLow; + if (le.HighWord.Bits.Default_Big) + return base == 0 ? AddrModeFlat : AddrMode1632; + return AddrMode1616; + } /* selector doesn't exist */ return -1; } diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c index 5ac9a4d1229..17578857133 100644 --- a/programs/winedbg/tgt_active.c +++ b/programs/winedbg/tgt_active.c @@ -1067,7 +1067,17 @@ static BOOL tgt_process_active_write(HANDLE hProcess, void* addr,
static BOOL tgt_process_active_get_selector(HANDLE hThread, DWORD sel, LDT_ENTRY* le) { +#ifdef _WIN64 + THREAD_DESCRIPTOR_INFORMATION desc = { .Selector = sel }; + ULONG retlen; + + if (RtlWow64GetThreadSelectorEntry( hThread, &desc, sizeof(desc), &retlen )) + return FALSE; + *le = desc.Entry; + return TRUE; +#else return GetThreadSelectorEntry( hThread, sel, le ); +#endif }
static struct be_process_io be_process_active_io =