diff --git a/reactos/lib/dbghelp/dbghelp.c b/reactos/lib/dbghelp/dbghelp.c index 982956e5aed..287f5198926 100644 --- a/reactos/lib/dbghelp/dbghelp.c +++ b/reactos/lib/dbghelp/dbghelp.c @@ -230,14 +230,17 @@ BOOL WINAPI SymInitialize(HANDLE hProcess, PSTR UserSearchPath, BOOL fInvadeProc if (fInvadeProcess) { +#ifndef __REACTOS__ if (!elf_read_wine_loader_dbg_info(pcs)) { SymCleanup(hProcess); return FALSE; } +#endif process_invade(hProcess); elf_synchronize_module_list(pcs); } + DbgPrint("SymInitialize - Success\n"); return TRUE; } diff --git a/reactos/lib/dbghelp/stack.c b/reactos/lib/dbghelp/stack.c index 516467c5ec3..5d7e2ec2dcf 100644 --- a/reactos/lib/dbghelp/stack.c +++ b/reactos/lib/dbghelp/stack.c @@ -33,9 +33,7 @@ #include "thread.h" /* FIXME: must be included before winternl.h */ #include "winternl.h" #include "wine/debug.h" -#ifndef __REACTOS__ #include "stackframe.h" -#endif WINE_DEFAULT_DEBUG_CHANNEL(dbghelp); @@ -78,7 +76,6 @@ BOOL WINAPI StackWalk(DWORD MachineType, HANDLE hProcess, HANDLE hThread, PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine, PTRANSLATE_ADDRESS_ROUTINE f_xlat_adr) { -#ifndef __REACTOS__ STACK32FRAME frame32; STACK16FRAME frame16; char ch; @@ -388,8 +385,4 @@ BOOL WINAPI StackWalk(DWORD MachineType, HANDLE hProcess, HANDLE hThread, done_err: curr_mode = stm_done; return FALSE; -#else - /* FIXME */ - return FALSE; -#endif } diff --git a/reactos/lib/dbghelp/stackframe.h b/reactos/lib/dbghelp/stackframe.h new file mode 100644 index 00000000000..c0e3e663a9e --- /dev/null +++ b/reactos/lib/dbghelp/stackframe.h @@ -0,0 +1,94 @@ +/* + * 16-bit and 32-bit mode stack frame layout + * + * Copyright 1995, 1998 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_STACKFRAME_H +#define __WINE_STACKFRAME_H + +#include +#include +#include + +#define SELECTOROF(ptr) (HIWORD(ptr)) +#define OFFSETOF(ptr) (LOWORD(ptr)) + +#include + + /* 32-bit stack layout after CallTo16() */ +typedef struct _STACK32FRAME +{ + DWORD restore_addr; /* 00 return address for restoring code selector */ + DWORD codeselector; /* 04 code selector to restore */ + EXCEPTION_REGISTRATION_RECORD frame; /* 08 Exception frame */ + SEGPTR frame16; /* 10 16-bit frame from last CallFrom16() */ + DWORD edi; /* 14 saved registers */ + DWORD esi; /* 18 */ + DWORD ebx; /* 1c */ + DWORD ebp; /* 20 saved 32-bit frame pointer */ + DWORD retaddr; /* 24 return address */ + DWORD target; /* 28 target address / CONTEXT86 pointer */ + DWORD nb_args; /* 2c number of 16-bit argument bytes */ +} STACK32FRAME; + + /* 16-bit stack layout after CallFrom16() */ +typedef struct _STACK16FRAME +{ + STACK32FRAME *frame32; /* 00 32-bit frame from last CallTo16() */ + DWORD edx; /* 04 saved registers */ + DWORD ecx; /* 08 */ + DWORD ebp; /* 0c */ + WORD ds; /* 10 */ + WORD es; /* 12 */ + WORD fs; /* 14 */ + WORD gs; /* 16 */ + DWORD callfrom_ip; /* 18 callfrom tail IP */ + DWORD module_cs; /* 1c module code segment */ + DWORD relay; /* 20 relay function address */ + WORD entry_ip; /* 22 entry point IP */ + DWORD entry_point; /* 26 API entry point to call, reused as mutex count */ + WORD bp; /* 2a 16-bit stack frame chain */ + WORD ip; /* 2c return address */ + WORD cs; /* 2e */ +} STACK16FRAME; + +#include + +#define CURRENT_STACK16 ((STACK16FRAME*)MapSL(NtCurrentTeb()->cur_stack)) +#define CURRENT_DS (CURRENT_STACK16->ds) + +/* Push bytes on the 16-bit stack of a thread; + * return a segptr to the first pushed byte + */ +static inline SEGPTR stack16_push( int size ) +{ + STACK16FRAME *frame = CURRENT_STACK16; + memmove( (char*)frame - size, frame, sizeof(*frame) ); + NtCurrentTeb()->cur_stack -= size; + return (SEGPTR)(NtCurrentTeb()->cur_stack + sizeof(*frame)); +} + +/* Pop bytes from the 16-bit stack of a thread */ +static inline void stack16_pop( int size ) +{ + STACK16FRAME *frame = CURRENT_STACK16; + memmove( (char*)frame + size, frame, sizeof(*frame) ); + NtCurrentTeb()->cur_stack += size; +} + +#endif /* __WINE_STACKFRAME_H */ diff --git a/reactos/lib/dbghelp/type.c b/reactos/lib/dbghelp/type.c index bad1540a6ae..6c9fd2ed48f 100644 --- a/reactos/lib/dbghelp/type.c +++ b/reactos/lib/dbghelp/type.c @@ -755,9 +755,7 @@ BOOL WINAPI SymGetTypeInfo(HANDLE hProcess, DWORD64 ModBase, module = module_find_by_addr(pcs, ModBase, DMT_UNKNOWN); if (!(module = module_get_debug(pcs, module))) { -#ifndef __REACTOS__ FIXME("Someone didn't properly set ModBase (%s)\n", wine_dbgstr_longlong(ModBase)); -#endif return FALSE; }