#include <windows.h>
#include <vector>
+#include "gdbsupport/gdb_optional.h"
#include "target/waitstatus.h"
+#define STATUS_WX86_BREAKPOINT 0x4000001F
+#define STATUS_WX86_SINGLE_STEP 0x4000001E
+
namespace windows_nat
{
breakpoint. This is used to offset the PC when needed. */
bool stopped_at_software_breakpoint = false;
+ /* True if we've adjusted the PC after hitting a software
+ breakpoint, false otherwise. This lets us avoid multiple
+ adjustments if the registers are read multiple times. */
+ bool pc_adjusted = false;
+
/* The name of the thread, allocated by xmalloc. */
gdb::unique_xmalloc_ptr<char> name;
};
This function must be supplied by the embedding application. */
extern int handle_output_debug_string (struct target_waitstatus *ourstatus);
+/* Handle a DLL load event.
+
+ This function assumes that the current event did not occur during
+ inferior initialization.
+
+ This function must be supplied by the embedding application. */
+
+extern void handle_load_dll ();
+
+/* Handle a DLL unload event.
+
+ This function assumes that this event did not occur during inferior
+ initialization.
+
+ This function must be supplied by the embedding application. */
+
+extern void handle_unload_dll ();
+
+/* Handle MS_VC_EXCEPTION when processing a stop. MS_VC_EXCEPTION is
+ somewhat undocumented but is used to tell the debugger the name of
+ a thread.
+
+ Return true if the exception was handled; return false otherwise.
+
+ This function must be supplied by the embedding application. */
+
+extern bool handle_ms_vc_exception (const EXCEPTION_RECORD *rec);
+
+/* When EXCEPTION_ACCESS_VIOLATION is processed, we give the embedding
+ application a chance to change it to be considered "unhandled".
+ This function must be supplied by the embedding application. If it
+ returns true, then the exception is "unhandled". */
+
+extern bool handle_access_violation (const EXCEPTION_RECORD *rec);
+
+
/* Currently executing process */
extern HANDLE current_process_handle;
extern DWORD current_process_id;
stop. */
extern DEBUG_EVENT current_event;
-/* The most recent event from WaitForDebugEvent. Unlike
- current_event, this is guaranteed never to come from a pending
- stop. This is important because only data from the most recent
- event from WaitForDebugEvent can be used when calling
- ContinueDebugEvent. */
-extern DEBUG_EVENT last_wait_event;
-
-/* Info on currently selected thread */
-extern windows_thread_info *current_windows_thread;
-
/* The ID of the thread for which we anticipate a stop event.
Normally this is -1, meaning we'll accept an event in any
thread. */
/* Contents of $_siginfo */
extern EXCEPTION_RECORD siginfo_er;
+#ifdef __x86_64__
+/* Ignore first breakpoint exception of WOW64 process */
+extern bool ignore_first_breakpoint;
+#endif
+
/* Return the name of the DLL referenced by H at ADDRESS. UNICODE
determines what sort of string is read from the inferior. Returns
the name of the DLL, or NULL on error. If a name is returned, it
get_image_name. */
extern const char *get_image_name (HANDLE h, void *address, int unicode);
+typedef enum
+{
+ HANDLE_EXCEPTION_UNHANDLED = 0,
+ HANDLE_EXCEPTION_HANDLED,
+ HANDLE_EXCEPTION_IGNORED
+} handle_exception_result;
+
+extern handle_exception_result handle_exception
+ (struct target_waitstatus *ourstatus, bool debug_exceptions);
+
+/* Return true if there is a pending stop matching
+ desired_stop_thread_id. If DEBUG_EVENTS is true, logging will be
+ enabled. */
+
+extern bool matching_pending_stop (bool debug_events);
+
+/* See if a pending stop matches DESIRED_STOP_THREAD_ID. If so,
+ remove it from the list of pending stops, set 'current_event', and
+ return it. Otherwise, return an empty optional. */
+
+extern gdb::optional<pending_stop> fetch_pending_stop (bool debug_events);
+
+/* A simple wrapper for ContinueDebugEvent that continues the last
+ waited-for event. If DEBUG_EVENTS is true, logging will be
+ enabled. */
+
+extern BOOL continue_last_debug_event (DWORD continue_status,
+ bool debug_events);
+
+/* A simple wrapper for WaitForDebugEvent that also sets the internal
+ 'last_wait_event' on success. */
+
+extern BOOL wait_for_debug_event (DEBUG_EVENT *event, DWORD timeout);
+
}
#endif