windows-nat.h revision 1.1.1.4 1 1.1 christos /* Internal interfaces for the Windows code
2 1.1.1.3 christos Copyright (C) 1995-2024 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of GDB.
5 1.1 christos
6 1.1 christos This program is free software; you can redistribute it and/or modify
7 1.1 christos it under the terms of the GNU General Public License as published by
8 1.1 christos the Free Software Foundation; either version 3 of the License, or
9 1.1 christos (at your option) any later version.
10 1.1 christos
11 1.1 christos This program is distributed in the hope that it will be useful,
12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 christos GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 1.1 christos
19 1.1.1.4 christos #ifndef GDB_NAT_WINDOWS_NAT_H
20 1.1.1.4 christos #define GDB_NAT_WINDOWS_NAT_H
21 1.1 christos
22 1.1 christos #include <windows.h>
23 1.1.1.2 christos #include <psapi.h>
24 1.1 christos #include <vector>
25 1.1 christos
26 1.1.1.3 christos #include <optional>
27 1.1 christos #include "target/waitstatus.h"
28 1.1 christos
29 1.1 christos #define STATUS_WX86_BREAKPOINT 0x4000001F
30 1.1 christos #define STATUS_WX86_SINGLE_STEP 0x4000001E
31 1.1 christos
32 1.1.1.4 christos #ifndef CONTEXT_EXTENDED_REGISTERS
33 1.1.1.4 christos /* This macro is only defined on ia32. It only makes sense on this target,
34 1.1.1.4 christos so define it as zero if not already defined. */
35 1.1.1.4 christos #define CONTEXT_EXTENDED_REGISTERS 0
36 1.1.1.4 christos #endif
37 1.1.1.4 christos
38 1.1 christos namespace windows_nat
39 1.1 christos {
40 1.1 christos
41 1.1 christos /* Thread information structure used to track extra information about
42 1.1 christos each thread. */
43 1.1 christos struct windows_thread_info
44 1.1 christos {
45 1.1 christos windows_thread_info (DWORD tid_, HANDLE h_, CORE_ADDR tlb)
46 1.1 christos : tid (tid_),
47 1.1 christos h (h_),
48 1.1 christos thread_local_base (tlb)
49 1.1 christos {
50 1.1 christos }
51 1.1 christos
52 1.1 christos DISABLE_COPY_AND_ASSIGN (windows_thread_info);
53 1.1 christos
54 1.1 christos /* Ensure that this thread has been suspended. */
55 1.1 christos void suspend ();
56 1.1 christos
57 1.1 christos /* Resume the thread if it has been suspended. */
58 1.1 christos void resume ();
59 1.1 christos
60 1.1.1.2 christos /* Return the thread's name, or nullptr if not known. The name is
61 1.1.1.2 christos stored in this thread and is guaranteed to live until at least
62 1.1.1.2 christos the next call. */
63 1.1.1.2 christos const char *thread_name ();
64 1.1.1.2 christos
65 1.1 christos /* The Win32 thread identifier. */
66 1.1 christos DWORD tid;
67 1.1 christos
68 1.1 christos /* The handle to the thread. */
69 1.1 christos HANDLE h;
70 1.1 christos
71 1.1 christos /* Thread Information Block address. */
72 1.1 christos CORE_ADDR thread_local_base;
73 1.1 christos
74 1.1 christos /* This keeps track of whether SuspendThread was called on this
75 1.1 christos thread. -1 means there was a failure or that the thread was
76 1.1 christos explicitly not suspended, 1 means it was called, and 0 means it
77 1.1 christos was not. */
78 1.1 christos int suspended = 0;
79 1.1 christos
80 1.1 christos /* The context of the thread, including any manipulations. */
81 1.1 christos union
82 1.1 christos {
83 1.1 christos CONTEXT context {};
84 1.1 christos #ifdef __x86_64__
85 1.1 christos WOW64_CONTEXT wow64_context;
86 1.1 christos #endif
87 1.1 christos };
88 1.1 christos
89 1.1 christos /* Whether debug registers changed since we last set CONTEXT back to
90 1.1 christos the thread. */
91 1.1 christos bool debug_registers_changed = false;
92 1.1 christos
93 1.1 christos /* Nonzero if CONTEXT is invalidated and must be re-read from the
94 1.1 christos inferior thread. */
95 1.1 christos bool reload_context = false;
96 1.1 christos
97 1.1 christos /* True if this thread is currently stopped at a software
98 1.1 christos breakpoint. This is used to offset the PC when needed. */
99 1.1 christos bool stopped_at_software_breakpoint = false;
100 1.1 christos
101 1.1 christos /* True if we've adjusted the PC after hitting a software
102 1.1 christos breakpoint, false otherwise. This lets us avoid multiple
103 1.1 christos adjustments if the registers are read multiple times. */
104 1.1 christos bool pc_adjusted = false;
105 1.1 christos
106 1.1.1.2 christos /* The name of the thread. */
107 1.1 christos gdb::unique_xmalloc_ptr<char> name;
108 1.1 christos };
109 1.1 christos
110 1.1 christos
111 1.1 christos /* Possible values to pass to 'thread_rec'. */
112 1.1 christos enum thread_disposition_type
113 1.1 christos {
114 1.1 christos /* Do not invalidate the thread's context, and do not suspend the
115 1.1 christos thread. */
116 1.1 christos DONT_INVALIDATE_CONTEXT,
117 1.1 christos /* Invalidate the context, but do not suspend the thread. */
118 1.1 christos DONT_SUSPEND,
119 1.1 christos /* Invalidate the context and suspend the thread. */
120 1.1 christos INVALIDATE_CONTEXT
121 1.1 christos };
122 1.1 christos
123 1.1.1.2 christos /* A single pending stop. See "pending_stops" for more
124 1.1.1.2 christos information. */
125 1.1.1.2 christos struct pending_stop
126 1.1.1.2 christos {
127 1.1.1.2 christos /* The thread id. */
128 1.1.1.2 christos DWORD thread_id;
129 1.1 christos
130 1.1.1.2 christos /* The target waitstatus we computed. */
131 1.1.1.2 christos target_waitstatus status;
132 1.1 christos
133 1.1.1.2 christos /* The event. A few fields of this can be referenced after a stop,
134 1.1.1.2 christos and it seemed simplest to store the entire event. */
135 1.1.1.2 christos DEBUG_EVENT event;
136 1.1.1.2 christos };
137 1.1 christos
138 1.1.1.2 christos enum handle_exception_result
139 1.1.1.2 christos {
140 1.1.1.2 christos HANDLE_EXCEPTION_UNHANDLED = 0,
141 1.1.1.2 christos HANDLE_EXCEPTION_HANDLED,
142 1.1.1.2 christos HANDLE_EXCEPTION_IGNORED
143 1.1.1.2 christos };
144 1.1 christos
145 1.1.1.2 christos /* A single Windows process. An object of this type (or subclass) is
146 1.1.1.2 christos created by the client. Some methods must be provided by the client
147 1.1.1.2 christos as well. */
148 1.1 christos
149 1.1.1.2 christos struct windows_process_info
150 1.1.1.2 christos {
151 1.1.1.2 christos /* The process handle */
152 1.1.1.2 christos HANDLE handle = 0;
153 1.1.1.2 christos DWORD main_thread_id = 0;
154 1.1.1.2 christos enum gdb_signal last_sig = GDB_SIGNAL_0;
155 1.1.1.2 christos
156 1.1.1.2 christos /* The current debug event from WaitForDebugEvent or from a pending
157 1.1.1.2 christos stop. */
158 1.1.1.2 christos DEBUG_EVENT current_event {};
159 1.1 christos
160 1.1.1.2 christos /* The ID of the thread for which we anticipate a stop event.
161 1.1.1.2 christos Normally this is -1, meaning we'll accept an event in any
162 1.1.1.2 christos thread. */
163 1.1.1.2 christos DWORD desired_stop_thread_id = -1;
164 1.1 christos
165 1.1.1.2 christos /* A vector of pending stops. Sometimes, Windows will report a stop
166 1.1.1.2 christos on a thread that has been ostensibly suspended. We believe what
167 1.1.1.2 christos happens here is that two threads hit a breakpoint simultaneously,
168 1.1.1.2 christos and the Windows kernel queues the stop events. However, this can
169 1.1.1.2 christos result in the strange effect of trying to single step thread A --
170 1.1.1.2 christos leaving all other threads suspended -- and then seeing a stop in
171 1.1.1.2 christos thread B. To handle this scenario, we queue all such "pending"
172 1.1.1.2 christos stops here, and then process them once the step has completed. See
173 1.1.1.2 christos PR gdb/22992. */
174 1.1.1.2 christos std::vector<pending_stop> pending_stops;
175 1.1 christos
176 1.1.1.2 christos /* Contents of $_siginfo */
177 1.1.1.2 christos EXCEPTION_RECORD siginfo_er {};
178 1.1 christos
179 1.1.1.2 christos #ifdef __x86_64__
180 1.1.1.2 christos /* The target is a WOW64 process */
181 1.1.1.2 christos bool wow64_process = false;
182 1.1.1.2 christos /* Ignore first breakpoint exception of WOW64 process */
183 1.1.1.2 christos bool ignore_first_breakpoint = false;
184 1.1.1.2 christos #endif
185 1.1 christos
186 1.1 christos
187 1.1.1.2 christos /* Find a thread record given a thread id. THREAD_DISPOSITION
188 1.1.1.2 christos controls whether the thread is suspended, and whether the context
189 1.1.1.2 christos is invalidated.
190 1.1 christos
191 1.1.1.2 christos This function must be supplied by the embedding application. */
192 1.1.1.2 christos virtual windows_thread_info *thread_rec (ptid_t ptid,
193 1.1.1.2 christos thread_disposition_type disposition) = 0;
194 1.1 christos
195 1.1.1.2 christos /* Handle OUTPUT_DEBUG_STRING_EVENT from child process. Updates
196 1.1.1.2 christos OURSTATUS and returns the thread id if this represents a thread
197 1.1.1.2 christos change (this is specific to Cygwin), otherwise 0.
198 1.1 christos
199 1.1.1.2 christos Cygwin prepends its messages with a "cygwin:". Interpret this as
200 1.1.1.2 christos a Cygwin signal. Otherwise just print the string as a warning.
201 1.1 christos
202 1.1.1.2 christos This function must be supplied by the embedding application. */
203 1.1.1.2 christos virtual int handle_output_debug_string (struct target_waitstatus *ourstatus) = 0;
204 1.1 christos
205 1.1.1.2 christos /* Handle a DLL load event.
206 1.1 christos
207 1.1.1.2 christos This function assumes that the current event did not occur during
208 1.1.1.2 christos inferior initialization.
209 1.1 christos
210 1.1.1.2 christos DLL_NAME is the name of the library. BASE is the base load
211 1.1.1.2 christos address.
212 1.1 christos
213 1.1.1.2 christos This function must be supplied by the embedding application. */
214 1.1 christos
215 1.1.1.2 christos virtual void handle_load_dll (const char *dll_name, LPVOID base) = 0;
216 1.1 christos
217 1.1.1.2 christos /* Handle a DLL unload event.
218 1.1 christos
219 1.1.1.2 christos This function assumes that this event did not occur during inferior
220 1.1.1.2 christos initialization.
221 1.1 christos
222 1.1.1.2 christos This function must be supplied by the embedding application. */
223 1.1 christos
224 1.1.1.2 christos virtual void handle_unload_dll () = 0;
225 1.1 christos
226 1.1.1.2 christos /* When EXCEPTION_ACCESS_VIOLATION is processed, we give the embedding
227 1.1.1.2 christos application a chance to change it to be considered "unhandled".
228 1.1.1.2 christos This function must be supplied by the embedding application. If it
229 1.1.1.2 christos returns true, then the exception is "unhandled". */
230 1.1 christos
231 1.1.1.2 christos virtual bool handle_access_violation (const EXCEPTION_RECORD *rec) = 0;
232 1.1 christos
233 1.1.1.2 christos handle_exception_result handle_exception
234 1.1.1.2 christos (struct target_waitstatus *ourstatus, bool debug_exceptions);
235 1.1 christos
236 1.1.1.2 christos /* Call to indicate that a DLL was loaded. */
237 1.1 christos
238 1.1.1.2 christos void dll_loaded_event ();
239 1.1 christos
240 1.1.1.2 christos /* Iterate over all DLLs currently mapped by our inferior, and
241 1.1.1.2 christos add them to our list of solibs. */
242 1.1 christos
243 1.1.1.2 christos void add_all_dlls ();
244 1.1 christos
245 1.1.1.2 christos /* Return true if there is a pending stop matching
246 1.1.1.2 christos desired_stop_thread_id. If DEBUG_EVENTS is true, logging will be
247 1.1.1.2 christos enabled. */
248 1.1 christos
249 1.1.1.2 christos bool matching_pending_stop (bool debug_events);
250 1.1.1.2 christos
251 1.1.1.2 christos /* See if a pending stop matches DESIRED_STOP_THREAD_ID. If so,
252 1.1.1.2 christos remove it from the list of pending stops, set 'current_event', and
253 1.1.1.2 christos return it. Otherwise, return an empty optional. */
254 1.1.1.2 christos
255 1.1.1.3 christos std::optional<pending_stop> fetch_pending_stop (bool debug_events);
256 1.1.1.2 christos
257 1.1.1.2 christos const char *pid_to_exec_file (int);
258 1.1.1.2 christos
259 1.1.1.4 christos template<typename Function>
260 1.1.1.4 christos auto with_context (windows_thread_info *th, Function function)
261 1.1.1.4 christos {
262 1.1.1.4 christos #ifdef __x86_64__
263 1.1.1.4 christos if (wow64_process)
264 1.1.1.4 christos return function (th != nullptr ? &th->wow64_context : nullptr);
265 1.1.1.4 christos else
266 1.1.1.4 christos #endif
267 1.1.1.4 christos return function (th != nullptr ? &th->context : nullptr);
268 1.1.1.4 christos }
269 1.1.1.4 christos
270 1.1.1.4 christos DWORD *context_flags_ptr (windows_thread_info *th)
271 1.1.1.4 christos {
272 1.1.1.4 christos return with_context (th, [] (auto *context)
273 1.1.1.4 christos {
274 1.1.1.4 christos return &context->ContextFlags;
275 1.1.1.4 christos });
276 1.1.1.4 christos }
277 1.1.1.4 christos
278 1.1.1.2 christos private:
279 1.1 christos
280 1.1.1.2 christos /* Handle MS_VC_EXCEPTION when processing a stop. MS_VC_EXCEPTION is
281 1.1.1.2 christos somewhat undocumented but is used to tell the debugger the name of
282 1.1.1.2 christos a thread.
283 1.1 christos
284 1.1.1.2 christos Return true if the exception was handled; return false otherwise. */
285 1.1 christos
286 1.1.1.2 christos bool handle_ms_vc_exception (const EXCEPTION_RECORD *rec);
287 1.1.1.2 christos
288 1.1.1.2 christos /* Iterate over all DLLs currently mapped by our inferior, looking for
289 1.1.1.2 christos a DLL which is loaded at LOAD_ADDR. If found, add the DLL to our
290 1.1.1.2 christos list of solibs; otherwise do nothing. LOAD_ADDR NULL means add all
291 1.1.1.2 christos DLLs to the list of solibs; this is used when the inferior finishes
292 1.1.1.2 christos its initialization, and all the DLLs it statically depends on are
293 1.1.1.2 christos presumed loaded. */
294 1.1.1.2 christos
295 1.1.1.2 christos void add_dll (LPVOID load_addr);
296 1.1.1.2 christos
297 1.1.1.2 christos /* Try to determine the executable filename.
298 1.1.1.2 christos
299 1.1.1.2 christos EXE_NAME_RET is a pointer to a buffer whose size is EXE_NAME_MAX_LEN.
300 1.1.1.2 christos
301 1.1.1.2 christos Upon success, the filename is stored inside EXE_NAME_RET, and
302 1.1.1.2 christos this function returns nonzero.
303 1.1.1.2 christos
304 1.1.1.2 christos Otherwise, this function returns zero and the contents of
305 1.1.1.2 christos EXE_NAME_RET is undefined. */
306 1.1.1.2 christos
307 1.1.1.2 christos int get_exec_module_filename (char *exe_name_ret, size_t exe_name_max_len);
308 1.1.1.2 christos };
309 1.1 christos
310 1.1 christos /* A simple wrapper for ContinueDebugEvent that continues the last
311 1.1 christos waited-for event. If DEBUG_EVENTS is true, logging will be
312 1.1 christos enabled. */
313 1.1 christos
314 1.1 christos extern BOOL continue_last_debug_event (DWORD continue_status,
315 1.1 christos bool debug_events);
316 1.1 christos
317 1.1 christos /* A simple wrapper for WaitForDebugEvent that also sets the internal
318 1.1 christos 'last_wait_event' on success. */
319 1.1 christos
320 1.1 christos extern BOOL wait_for_debug_event (DEBUG_EVENT *event, DWORD timeout);
321 1.1 christos
322 1.1.1.2 christos /* Wrappers for CreateProcess. These exist primarily so that the
323 1.1.1.2 christos "disable randomization" feature can be implemented in a single
324 1.1.1.2 christos place. */
325 1.1.1.2 christos
326 1.1.1.2 christos extern BOOL create_process (const char *image, char *command_line,
327 1.1.1.2 christos DWORD flags, void *environment,
328 1.1.1.2 christos const char *cur_dir,
329 1.1.1.2 christos bool no_randomization,
330 1.1.1.2 christos STARTUPINFOA *startup_info,
331 1.1.1.2 christos PROCESS_INFORMATION *process_info);
332 1.1.1.2 christos #ifdef __CYGWIN__
333 1.1.1.2 christos extern BOOL create_process (const wchar_t *image, wchar_t *command_line,
334 1.1.1.2 christos DWORD flags, void *environment,
335 1.1.1.2 christos const wchar_t *cur_dir,
336 1.1.1.2 christos bool no_randomization,
337 1.1.1.2 christos STARTUPINFOW *startup_info,
338 1.1.1.2 christos PROCESS_INFORMATION *process_info);
339 1.1.1.2 christos #endif /* __CYGWIN__ */
340 1.1.1.2 christos
341 1.1.1.2 christos #define AdjustTokenPrivileges dyn_AdjustTokenPrivileges
342 1.1.1.2 christos #define DebugActiveProcessStop dyn_DebugActiveProcessStop
343 1.1.1.2 christos #define DebugBreakProcess dyn_DebugBreakProcess
344 1.1.1.2 christos #define DebugSetProcessKillOnExit dyn_DebugSetProcessKillOnExit
345 1.1.1.2 christos #undef EnumProcessModules
346 1.1.1.2 christos #define EnumProcessModules dyn_EnumProcessModules
347 1.1.1.2 christos #undef EnumProcessModulesEx
348 1.1.1.2 christos #define EnumProcessModulesEx dyn_EnumProcessModulesEx
349 1.1.1.2 christos #undef GetModuleInformation
350 1.1.1.2 christos #define GetModuleInformation dyn_GetModuleInformation
351 1.1.1.2 christos #undef GetModuleFileNameExA
352 1.1.1.2 christos #define GetModuleFileNameExA dyn_GetModuleFileNameExA
353 1.1.1.2 christos #undef GetModuleFileNameExW
354 1.1.1.2 christos #define GetModuleFileNameExW dyn_GetModuleFileNameExW
355 1.1.1.2 christos #define LookupPrivilegeValueA dyn_LookupPrivilegeValueA
356 1.1.1.2 christos #define OpenProcessToken dyn_OpenProcessToken
357 1.1.1.2 christos #define GetConsoleFontSize dyn_GetConsoleFontSize
358 1.1.1.2 christos #define GetCurrentConsoleFont dyn_GetCurrentConsoleFont
359 1.1.1.2 christos #define Wow64SuspendThread dyn_Wow64SuspendThread
360 1.1.1.2 christos #define Wow64GetThreadContext dyn_Wow64GetThreadContext
361 1.1.1.2 christos #define Wow64SetThreadContext dyn_Wow64SetThreadContext
362 1.1.1.2 christos #define Wow64GetThreadSelectorEntry dyn_Wow64GetThreadSelectorEntry
363 1.1.1.2 christos #define GenerateConsoleCtrlEvent dyn_GenerateConsoleCtrlEvent
364 1.1.1.2 christos #define InitializeProcThreadAttributeList dyn_InitializeProcThreadAttributeList
365 1.1.1.2 christos #define UpdateProcThreadAttribute dyn_UpdateProcThreadAttribute
366 1.1.1.2 christos #define DeleteProcThreadAttributeList dyn_DeleteProcThreadAttributeList
367 1.1.1.2 christos
368 1.1.1.2 christos typedef BOOL WINAPI (AdjustTokenPrivileges_ftype) (HANDLE, BOOL,
369 1.1.1.2 christos PTOKEN_PRIVILEGES,
370 1.1.1.2 christos DWORD, PTOKEN_PRIVILEGES,
371 1.1.1.2 christos PDWORD);
372 1.1.1.2 christos extern AdjustTokenPrivileges_ftype *AdjustTokenPrivileges;
373 1.1.1.2 christos
374 1.1.1.2 christos typedef BOOL WINAPI (DebugActiveProcessStop_ftype) (DWORD);
375 1.1.1.2 christos extern DebugActiveProcessStop_ftype *DebugActiveProcessStop;
376 1.1.1.2 christos
377 1.1.1.2 christos typedef BOOL WINAPI (DebugBreakProcess_ftype) (HANDLE);
378 1.1.1.2 christos extern DebugBreakProcess_ftype *DebugBreakProcess;
379 1.1.1.2 christos
380 1.1.1.2 christos typedef BOOL WINAPI (DebugSetProcessKillOnExit_ftype) (BOOL);
381 1.1.1.2 christos extern DebugSetProcessKillOnExit_ftype *DebugSetProcessKillOnExit;
382 1.1.1.2 christos
383 1.1.1.2 christos typedef BOOL WINAPI (EnumProcessModules_ftype) (HANDLE, HMODULE *, DWORD,
384 1.1.1.2 christos LPDWORD);
385 1.1.1.2 christos extern EnumProcessModules_ftype *EnumProcessModules;
386 1.1.1.2 christos
387 1.1.1.2 christos #ifdef __x86_64__
388 1.1.1.2 christos typedef BOOL WINAPI (EnumProcessModulesEx_ftype) (HANDLE, HMODULE *, DWORD,
389 1.1.1.2 christos LPDWORD, DWORD);
390 1.1.1.2 christos extern EnumProcessModulesEx_ftype *EnumProcessModulesEx;
391 1.1.1.2 christos #endif
392 1.1.1.2 christos
393 1.1.1.2 christos typedef BOOL WINAPI (GetModuleInformation_ftype) (HANDLE, HMODULE,
394 1.1.1.2 christos LPMODULEINFO, DWORD);
395 1.1.1.2 christos extern GetModuleInformation_ftype *GetModuleInformation;
396 1.1.1.2 christos
397 1.1.1.2 christos typedef DWORD WINAPI (GetModuleFileNameExA_ftype) (HANDLE, HMODULE, LPSTR,
398 1.1.1.2 christos DWORD);
399 1.1.1.2 christos extern GetModuleFileNameExA_ftype *GetModuleFileNameExA;
400 1.1.1.2 christos
401 1.1.1.2 christos typedef DWORD WINAPI (GetModuleFileNameExW_ftype) (HANDLE, HMODULE,
402 1.1.1.2 christos LPWSTR, DWORD);
403 1.1.1.2 christos extern GetModuleFileNameExW_ftype *GetModuleFileNameExW;
404 1.1.1.2 christos
405 1.1.1.2 christos typedef BOOL WINAPI (LookupPrivilegeValueA_ftype) (LPCSTR, LPCSTR, PLUID);
406 1.1.1.2 christos extern LookupPrivilegeValueA_ftype *LookupPrivilegeValueA;
407 1.1.1.2 christos
408 1.1.1.2 christos typedef BOOL WINAPI (OpenProcessToken_ftype) (HANDLE, DWORD, PHANDLE);
409 1.1.1.2 christos extern OpenProcessToken_ftype *OpenProcessToken;
410 1.1.1.2 christos
411 1.1.1.2 christos typedef BOOL WINAPI (GetCurrentConsoleFont_ftype) (HANDLE, BOOL,
412 1.1.1.2 christos CONSOLE_FONT_INFO *);
413 1.1.1.2 christos extern GetCurrentConsoleFont_ftype *GetCurrentConsoleFont;
414 1.1.1.2 christos
415 1.1.1.2 christos typedef COORD WINAPI (GetConsoleFontSize_ftype) (HANDLE, DWORD);
416 1.1.1.2 christos extern GetConsoleFontSize_ftype *GetConsoleFontSize;
417 1.1.1.2 christos
418 1.1.1.2 christos #ifdef __x86_64__
419 1.1.1.2 christos typedef DWORD WINAPI (Wow64SuspendThread_ftype) (HANDLE);
420 1.1.1.2 christos extern Wow64SuspendThread_ftype *Wow64SuspendThread;
421 1.1.1.2 christos
422 1.1.1.2 christos typedef BOOL WINAPI (Wow64GetThreadContext_ftype) (HANDLE, PWOW64_CONTEXT);
423 1.1.1.2 christos extern Wow64GetThreadContext_ftype *Wow64GetThreadContext;
424 1.1.1.2 christos
425 1.1.1.2 christos typedef BOOL WINAPI (Wow64SetThreadContext_ftype) (HANDLE,
426 1.1.1.2 christos const WOW64_CONTEXT *);
427 1.1.1.2 christos extern Wow64SetThreadContext_ftype *Wow64SetThreadContext;
428 1.1.1.2 christos
429 1.1.1.2 christos typedef BOOL WINAPI (Wow64GetThreadSelectorEntry_ftype) (HANDLE, DWORD,
430 1.1.1.2 christos PLDT_ENTRY);
431 1.1.1.2 christos extern Wow64GetThreadSelectorEntry_ftype *Wow64GetThreadSelectorEntry;
432 1.1.1.2 christos #endif
433 1.1.1.2 christos
434 1.1.1.2 christos typedef BOOL WINAPI (GenerateConsoleCtrlEvent_ftype) (DWORD, DWORD);
435 1.1.1.2 christos extern GenerateConsoleCtrlEvent_ftype *GenerateConsoleCtrlEvent;
436 1.1.1.2 christos
437 1.1.1.2 christos /* We use a local typedef for this type to avoid depending on
438 1.1.1.2 christos Windows 8. */
439 1.1.1.2 christos typedef void *gdb_lpproc_thread_attribute_list;
440 1.1.1.2 christos
441 1.1.1.2 christos typedef BOOL WINAPI (InitializeProcThreadAttributeList_ftype)
442 1.1.1.2 christos (gdb_lpproc_thread_attribute_list lpAttributeList,
443 1.1.1.2 christos DWORD dwAttributeCount, DWORD dwFlags, PSIZE_T lpSize);
444 1.1.1.2 christos extern InitializeProcThreadAttributeList_ftype *InitializeProcThreadAttributeList;
445 1.1.1.2 christos
446 1.1.1.2 christos typedef BOOL WINAPI (UpdateProcThreadAttribute_ftype)
447 1.1.1.2 christos (gdb_lpproc_thread_attribute_list lpAttributeList,
448 1.1.1.2 christos DWORD dwFlags, DWORD_PTR Attribute, PVOID lpValue, SIZE_T cbSize,
449 1.1.1.2 christos PVOID lpPreviousValue, PSIZE_T lpReturnSize);
450 1.1.1.2 christos extern UpdateProcThreadAttribute_ftype *UpdateProcThreadAttribute;
451 1.1.1.2 christos
452 1.1.1.2 christos typedef void WINAPI (DeleteProcThreadAttributeList_ftype)
453 1.1.1.2 christos (gdb_lpproc_thread_attribute_list lpAttributeList);
454 1.1.1.2 christos extern DeleteProcThreadAttributeList_ftype *DeleteProcThreadAttributeList;
455 1.1.1.2 christos
456 1.1.1.2 christos /* Return true if it's possible to disable randomization on this
457 1.1.1.2 christos host. */
458 1.1.1.2 christos
459 1.1.1.2 christos extern bool disable_randomization_available ();
460 1.1.1.2 christos
461 1.1.1.4 christos /* Helper classes to get the correct ContextFlags values based on the
462 1.1.1.4 christos used type (CONTEXT or WOW64_CONTEXT). */
463 1.1.1.4 christos
464 1.1.1.4 christos template<typename Context>
465 1.1.1.4 christos struct WindowsContext;
466 1.1.1.4 christos
467 1.1.1.4 christos template<>
468 1.1.1.4 christos struct WindowsContext<CONTEXT *>
469 1.1.1.4 christos {
470 1.1.1.4 christos static constexpr DWORD control = CONTEXT_CONTROL;
471 1.1.1.4 christos static constexpr DWORD floating = CONTEXT_FLOATING_POINT;
472 1.1.1.4 christos static constexpr DWORD debug = CONTEXT_DEBUG_REGISTERS;
473 1.1.1.4 christos static constexpr DWORD extended = CONTEXT_EXTENDED_REGISTERS;
474 1.1.1.4 christos static constexpr DWORD full = CONTEXT_FULL;
475 1.1.1.4 christos static constexpr DWORD all = (CONTEXT_FULL
476 1.1.1.4 christos | CONTEXT_FLOATING_POINT
477 1.1.1.4 christos | CONTEXT_SEGMENTS
478 1.1.1.4 christos | CONTEXT_DEBUG_REGISTERS
479 1.1.1.4 christos | CONTEXT_EXTENDED_REGISTERS);
480 1.1.1.4 christos };
481 1.1.1.4 christos
482 1.1.1.4 christos #ifdef __x86_64__
483 1.1.1.4 christos template<>
484 1.1.1.4 christos struct WindowsContext<WOW64_CONTEXT *>
485 1.1.1.4 christos {
486 1.1.1.4 christos static constexpr DWORD control = WOW64_CONTEXT_CONTROL;
487 1.1.1.4 christos static constexpr DWORD floating = WOW64_CONTEXT_FLOATING_POINT;
488 1.1.1.4 christos static constexpr DWORD debug = WOW64_CONTEXT_DEBUG_REGISTERS;
489 1.1.1.4 christos static constexpr DWORD extended = WOW64_CONTEXT_EXTENDED_REGISTERS;
490 1.1.1.4 christos static constexpr DWORD full = WOW64_CONTEXT_FULL;
491 1.1.1.4 christos static constexpr DWORD all = WOW64_CONTEXT_ALL;
492 1.1.1.4 christos };
493 1.1.1.4 christos #endif
494 1.1.1.4 christos
495 1.1.1.4 christos /* Overloaded helper functions to call the correct function based on the used
496 1.1.1.4 christos type (CONTEXT or WOW64_CONTEXT). */
497 1.1.1.4 christos
498 1.1.1.4 christos static inline BOOL
499 1.1.1.4 christos get_thread_context (HANDLE h, CONTEXT *context)
500 1.1.1.4 christos {
501 1.1.1.4 christos return GetThreadContext (h, context);
502 1.1.1.4 christos }
503 1.1.1.4 christos
504 1.1.1.4 christos static inline BOOL
505 1.1.1.4 christos set_thread_context (HANDLE h, CONTEXT *context)
506 1.1.1.4 christos {
507 1.1.1.4 christos return SetThreadContext (h, context);
508 1.1.1.4 christos }
509 1.1.1.4 christos
510 1.1.1.4 christos static inline BOOL
511 1.1.1.4 christos get_thread_selector_entry (CONTEXT *, HANDLE thread, DWORD sel,
512 1.1.1.4 christos LDT_ENTRY *info)
513 1.1.1.4 christos {
514 1.1.1.4 christos return GetThreadSelectorEntry (thread, sel, info);
515 1.1.1.4 christos }
516 1.1.1.4 christos
517 1.1.1.4 christos static inline BOOL
518 1.1.1.4 christos enum_process_modules (CONTEXT *, HANDLE process,
519 1.1.1.4 christos HMODULE *modules, DWORD size, LPDWORD needed)
520 1.1.1.4 christos {
521 1.1.1.4 christos return EnumProcessModules (process, modules, size, needed);
522 1.1.1.4 christos }
523 1.1.1.4 christos
524 1.1.1.4 christos #ifdef __x86_64__
525 1.1.1.4 christos static inline BOOL
526 1.1.1.4 christos get_thread_context (HANDLE h, WOW64_CONTEXT *context)
527 1.1.1.4 christos {
528 1.1.1.4 christos return Wow64GetThreadContext (h, context);
529 1.1.1.4 christos }
530 1.1.1.4 christos
531 1.1.1.4 christos static inline BOOL
532 1.1.1.4 christos set_thread_context (HANDLE h, WOW64_CONTEXT *context)
533 1.1.1.4 christos {
534 1.1.1.4 christos return Wow64SetThreadContext (h, context);
535 1.1.1.4 christos }
536 1.1.1.4 christos
537 1.1.1.4 christos static inline BOOL
538 1.1.1.4 christos get_thread_selector_entry (WOW64_CONTEXT *, HANDLE thread, DWORD sel,
539 1.1.1.4 christos LDT_ENTRY *info)
540 1.1.1.4 christos {
541 1.1.1.4 christos return Wow64GetThreadSelectorEntry (thread, sel, info);
542 1.1.1.4 christos }
543 1.1.1.4 christos
544 1.1.1.4 christos static inline BOOL
545 1.1.1.4 christos enum_process_modules (WOW64_CONTEXT *, HANDLE process,
546 1.1.1.4 christos HMODULE *modules, DWORD size, LPDWORD needed)
547 1.1.1.4 christos {
548 1.1.1.4 christos return EnumProcessModulesEx (process, modules, size, needed,
549 1.1.1.4 christos LIST_MODULES_32BIT);
550 1.1.1.4 christos }
551 1.1.1.4 christos #endif
552 1.1.1.4 christos
553 1.1.1.2 christos /* Load any functions which may not be available in ancient versions
554 1.1.1.2 christos of Windows. */
555 1.1.1.2 christos
556 1.1.1.2 christos extern bool initialize_loadable ();
557 1.1.1.2 christos
558 1.1 christos }
559 1.1 christos
560 1.1.1.4 christos #endif /* GDB_NAT_WINDOWS_NAT_H */
561