Author: ion
Date: Mon Oct 23 03:47:12 2006
New Revision: 24618
URL:
http://svn.reactos.org/svn/reactos?rev=24618&view=rev
Log:
- Implement WaitForDebugEvent. Calls out to DbgUiConvertWaitStateStructure which is still
unimplemented.
Modified:
trunk/reactos/dll/win32/kernel32/debug/debugger.c
trunk/reactos/include/psdk/ntstatus.h
Modified: trunk/reactos/dll/win32/kernel32/debug/debugger.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/debug/d…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/debug/debugger.c (original)
+++ trunk/reactos/dll/win32/kernel32/debug/debugger.c Mon Oct 23 03:47:12 2006
@@ -465,16 +465,109 @@
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
WaitForDebugEvent(IN LPDEBUG_EVENT lpDebugEvent,
IN DWORD dwMilliseconds)
{
- /* FIXME: TODO */
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ LARGE_INTEGER WaitTime;
+ PLARGE_INTEGER Timeout;
+ DBGUI_WAIT_STATE_CHANGE WaitStateChange;
+ NTSTATUS Status;
+
+ /* Check if this is an infinite wait */
+ if (dwMilliseconds == INFINITE)
+ {
+ /* Under NT, this means no timer argument */
+ Timeout = NULL;
+ }
+ else
+ {
+ /* Otherwise, convert the time to NT Format */
+ WaitTime.QuadPart = UInt32x32To64(-10000, dwMilliseconds);
+ Timeout = &WaitTime;
+ }
+
+ /* Loop while we keep getting interrupted */
+ do
+ {
+ /* Call the native API */
+ Status = DbgUiWaitStateChange(&WaitStateChange, Timeout);
+ } while ((Status == STATUS_ALERTED) || (Status == STATUS_USER_APC));
+
+ /* Check if the wait failed */
+ if (!(NT_SUCCESS(Status)) || (Status != DBG_UNABLE_TO_PROVIDE_HANDLE))
+ {
+ /* Set the error code and quit */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ /* Check if we timed out */
+ if (Status == STATUS_TIMEOUT)
+ {
+ /* Fail with a timeout error */
+ SetLastError(ERROR_SEM_TIMEOUT);
+ return FALSE;
+ }
+
+ /* Convert the structure */
+ Status = DbgUiConvertStateChangeStructure(&WaitStateChange, lpDebugEvent);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Set the error code and quit */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ /* Check what kind of event this was */
+ switch (lpDebugEvent->dwDebugEventCode)
+ {
+ /* New thread was created */
+ case CREATE_THREAD_DEBUG_EVENT:
+
+ /* Setup the thread data */
+ SaveThreadHandle(lpDebugEvent->dwProcessId,
+ lpDebugEvent->dwThreadId,
+ lpDebugEvent->u.CreateThread.hThread);
+ break;
+
+ /* New process was created */
+ case CREATE_PROCESS_DEBUG_EVENT:
+
+ /* Setup the process data */
+ SaveProcessHandle(lpDebugEvent->dwProcessId,
+ lpDebugEvent->u.CreateProcessInfo.hProcess);
+
+ /* Setup the thread data */
+ SaveThreadHandle(lpDebugEvent->dwProcessId,
+ lpDebugEvent->dwThreadId,
+ lpDebugEvent->u.CreateThread.hThread);
+ break;
+
+ /* Process was exited */
+ case EXIT_PROCESS_DEBUG_EVENT:
+
+ /* Mark the thread data as such */
+ MarkProcessHandle(lpDebugEvent->dwProcessId);
+ break;
+
+ /* Thread was exited */
+ case EXIT_THREAD_DEBUG_EVENT:
+
+ /* Mark the thread data */
+ MarkThreadHandle(lpDebugEvent->dwThreadId);
+ break;
+
+ /* Nothing to do for anything else */
+ default:
+ break;
+ }
+
+ /* Return success */
+ return TRUE;
}
/* EOF */
Modified: trunk/reactos/include/psdk/ntstatus.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/ntstatus.h?re…
==============================================================================
--- trunk/reactos/include/psdk/ntstatus.h (original)
+++ trunk/reactos/include/psdk/ntstatus.h Mon Oct 23 03:47:12 2006
@@ -58,6 +58,7 @@
#define STATUS_WAIT_63 ((NTSTATUS)0x0000003f)
#define STATUS_ABANDONED ((NTSTATUS)0x00000080)
#define STATUS_ABANDONED_WAIT_63 ((NTSTATUS)0x000000BF)
+#define STATUS_USER_APC ((NTSTATUS)0x000000C0)
#define STATUS_KERNEL_APC ((NTSTATUS)0x00000100)
#define STATUS_ALERTED ((NTSTATUS)0x00000101)
#define STATUS_TIMEOUT ((NTSTATUS)0x00000102)