2 * Wine debugger - loading a module for debug purposes
4 * Copyright 2006 Eric Pouech
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 static struct be_process_io be_process_module_io
;
33 static BOOL
tgt_process_module_read(HANDLE hProcess
, const void* addr
,
34 void* buffer
, SIZE_T len
, SIZE_T
* rlen
)
39 static BOOL
tgt_process_module_write(HANDLE hProcess
, void* addr
,
40 const void* buffer
, SIZE_T len
, SIZE_T
* wlen
)
45 enum dbg_start
tgt_module_load(const char* name
, BOOL keep
)
47 DWORD opts
= SymGetOptions();
49 HANDLE hDummy
= (HANDLE
)0x87654321;
50 enum dbg_start ret
= start_ok
;
54 SymSetOptions((opts
& ~(SYMOPT_UNDNAME
|SYMOPT_DEFERRED_LOADS
)) |
55 SYMOPT_LOAD_LINES
| SYMOPT_AUTO_PUBLICS
);
56 native
= SymSetExtendedOption(SYMOPT_EX_WINE_NATIVE_MODULES
, TRUE
);
57 if (!dbg_init(hDummy
, NULL
, FALSE
))
58 return start_error_init
;
59 len
= MultiByteToWideChar(CP_ACP
, 0, name
, -1, NULL
, 0);
60 nameW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
63 ret
= start_error_init
;
68 len
= MultiByteToWideChar(CP_ACP
, 0, name
, -1, nameW
, len
);
69 if (!dbg_load_module(hDummy
, NULL
, nameW
, 0, 0))
71 ret
= start_error_init
;
74 HeapFree(GetProcessHeap(), 0, nameW
);
79 dbg_printf("Non supported mode... errors may occur\n"
80 "Use at your own risks\n");
81 SymSetExtendedOption(SYMOPT_EX_WINE_NATIVE_MODULES
, TRUE
);
82 dbg_curr_process
= dbg_add_process(&be_process_module_io
, 1, hDummy
);
84 dbg_curr_thread
= dbg_add_thread(dbg_curr_process
, 2, NULL
, NULL
);
86 /* FIXME: missing thread creation, fetching frames, restoring dbghelp's options... */
92 SymSetExtendedOption(SYMOPT_EX_WINE_NATIVE_MODULES
, native
);
98 static BOOL
tgt_process_module_close_process(struct dbg_process
* pcs
, BOOL kill
)
100 SymCleanup(pcs
->handle
);
101 dbg_del_process(pcs
);
105 static BOOL
tgt_process_module_get_selector(HANDLE hThread
, DWORD sel
, LDT_ENTRY
* le
)
110 static struct be_process_io be_process_module_io
=
112 tgt_process_module_close_process
,
113 tgt_process_module_read
,
114 tgt_process_module_write
,
115 tgt_process_module_get_selector
,