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
21 #define NONAMELESSUNION
22 #define NONAMELESSSTRUCT
34 static struct be_process_io be_process_module_io
;
36 static BOOL
tgt_process_module_read(HANDLE hProcess
, const void* addr
,
37 void* buffer
, SIZE_T len
, SIZE_T
* rlen
)
42 static BOOL
tgt_process_module_write(HANDLE hProcess
, void* addr
,
43 const void* buffer
, SIZE_T len
, SIZE_T
* wlen
)
48 enum dbg_start
tgt_module_load(const char* name
, BOOL keep
)
50 DWORD opts
= SymGetOptions();
51 HANDLE hDummy
= (HANDLE
)0x87654321;
52 enum dbg_start ret
= start_ok
;
56 SymSetOptions((opts
& ~(SYMOPT_UNDNAME
|SYMOPT_DEFERRED_LOADS
)) |
57 SYMOPT_LOAD_LINES
| SYMOPT_AUTO_PUBLICS
| 0x40000000);
58 if (!dbg_init(hDummy
, NULL
, FALSE
))
59 return start_error_init
;
60 len
= MultiByteToWideChar(CP_ACP
, 0, name
, -1, NULL
, 0);
61 nameW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
64 ret
= start_error_init
;
69 len
= MultiByteToWideChar(CP_ACP
, 0, name
, -1, nameW
, len
);
70 if (!dbg_load_module(hDummy
, NULL
, nameW
, 0, 0))
72 ret
= start_error_init
;
75 HeapFree(GetProcessHeap(), 0, nameW
);
80 dbg_printf("Non supported mode... errors may occur\n"
81 "Use at your own risks\n");
82 SymSetOptions(SymGetOptions() | 0x40000000);
83 dbg_curr_process
= dbg_add_process(&be_process_module_io
, 1, hDummy
);
85 dbg_curr_thread
= dbg_add_thread(dbg_curr_process
, 2, NULL
, NULL
);
87 /* FIXME: missing thread creation, fetching frames, restoring dbghelp's options... */
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
,