Module: wine Branch: master Commit: bce64150eb108ea6c32d1d023e7f214a1fee4d86 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bce64150eb108ea6c32d1d023e...
Author: Eric Pouech eric.pouech@orange.fr Date: Sun Jan 13 17:02:55 2008 +0100
winedbg: Added a way to support differently selector information depending on current target.
---
programs/winedbg/be_i386.c | 4 ++-- programs/winedbg/debugger.h | 1 + programs/winedbg/info.c | 2 +- programs/winedbg/tgt_active.c | 1 + programs/winedbg/tgt_minidump.c | 9 +++++++++ programs/winedbg/tgt_module.c | 6 ++++++ 6 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/programs/winedbg/be_i386.c b/programs/winedbg/be_i386.c index fe8b087..a4eb251 100644 --- a/programs/winedbg/be_i386.c +++ b/programs/winedbg/be_i386.c @@ -40,7 +40,7 @@ static ADDRESS_MODE get_selector_type(HANDLE hThread, const CONTEXT* ctx, WORD s if (IS_VM86_MODE(ctx)) return AddrModeReal; /* null or system selector */ if (!(sel & 4) || ((sel >> 3) < 17)) return AddrModeFlat; - if (GetThreadSelectorEntry(hThread, sel, &le)) + if (dbg_curr_process->process_io->get_selector(hThread, sel, &le)) return le.HighWord.Bits.Default_Big ? AddrMode1632 : AddrMode1616; /* selector doesn't exist */ return -1; @@ -59,7 +59,7 @@ static void* be_i386_linearize(HANDLE hThread, const ADDRESS64* addr) return (void*)(DWORD)addr->Offset; /* fall through */ case AddrMode1616: - if (!GetThreadSelectorEntry(hThread, addr->Segment, &le)) return NULL; + if (!dbg_curr_process->process_io->get_selector(hThread, addr->Segment, &le)) return NULL; return (void*)((le.HighWord.Bits.BaseHi << 24) + (le.HighWord.Bits.BaseMid << 16) + le.BaseLow + (DWORD)addr->Offset); diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h index 556bc08..cb327fe 100644 --- a/programs/winedbg/debugger.h +++ b/programs/winedbg/debugger.h @@ -234,6 +234,7 @@ struct be_process_io BOOL (*close_process)(struct dbg_process*, BOOL); BOOL (WINAPI *read)(HANDLE, const void*, void*, SIZE_T, SIZE_T*); BOOL (WINAPI *write)(HANDLE, void*, const void*, SIZE_T, SIZE_T*); + BOOL (WINAPI *get_selector)(HANDLE, DWORD, LDT_ENTRY*); };
extern struct dbg_process* dbg_curr_process; diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c index 2c56d8f..fe0292d 100644 --- a/programs/winedbg/info.c +++ b/programs/winedbg/info.c @@ -584,7 +584,7 @@ void info_win32_segments(DWORD start, int length)
for (i = start; i < start + length; i++) { - if (!GetThreadSelectorEntry(dbg_curr_thread->handle, (i << 3) | 7, &le)) + if (!dbg_curr_process->process_io->get_selector(dbg_curr_thread->handle, (i << 3) | 7, &le)) continue;
if (le.HighWord.Bits.Type & 0x08) diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c index f75f744..d334d17 100644 --- a/programs/winedbg/tgt_active.c +++ b/programs/winedbg/tgt_active.c @@ -984,4 +984,5 @@ static struct be_process_io be_process_active_io = tgt_process_active_close_process, ReadProcessMemory, WriteProcessMemory, + GetThreadSelectorEntry, }; diff --git a/programs/winedbg/tgt_minidump.c b/programs/winedbg/tgt_minidump.c index 26da1e7..db0daf6 100644 --- a/programs/winedbg/tgt_minidump.c +++ b/programs/winedbg/tgt_minidump.c @@ -452,9 +452,18 @@ static BOOL tgt_process_minidump_close_process(struct dbg_process* pcs, BOOL kil return TRUE; }
+static BOOL WINAPI tgt_process_minidump_get_selector(HANDLE hThread, DWORD sel, LDT_ENTRY* le) +{ + /* so far, pretend all selectors are valid, and mapped to a 32bit flat address space */ + memset(le, 0, sizeof(*le)); + le->HighWord.Bits.Default_Big = 1; + return TRUE; +} + static struct be_process_io be_process_minidump_io = { tgt_process_minidump_close_process, tgt_process_minidump_read, tgt_process_minidump_write, + tgt_process_minidump_get_selector, }; diff --git a/programs/winedbg/tgt_module.c b/programs/winedbg/tgt_module.c index 043d051..ced9d85 100644 --- a/programs/winedbg/tgt_module.c +++ b/programs/winedbg/tgt_module.c @@ -90,9 +90,15 @@ static BOOL tgt_process_module_close_process(struct dbg_process* pcs, BOOL kill) return TRUE; }
+static BOOL WINAPI tgt_process_module_get_selector(HANDLE hThread, DWORD sel, LDT_ENTRY* le) +{ + return FALSE; +} + static struct be_process_io be_process_module_io = { tgt_process_module_close_process, tgt_process_module_read, tgt_process_module_write, + tgt_process_module_get_selector, };