mirror of
https://github.com/reactos/reactos.git
synced 2024-10-04 16:36:11 +00:00
- Implement WaitForDebugEvent. Calls out to DbgUiConvertWaitStateStructure which is still unimplemented.
svn path=/trunk/; revision=24618
This commit is contained in:
parent
aced9b0023
commit
1c38e47592
|
@ -465,16 +465,109 @@ IsDebuggerPresent(VOID)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
WINAPI
|
WINAPI
|
||||||
WaitForDebugEvent(IN LPDEBUG_EVENT lpDebugEvent,
|
WaitForDebugEvent(IN LPDEBUG_EVENT lpDebugEvent,
|
||||||
IN DWORD dwMilliseconds)
|
IN DWORD dwMilliseconds)
|
||||||
{
|
{
|
||||||
/* FIXME: TODO */
|
LARGE_INTEGER WaitTime;
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
PLARGE_INTEGER Timeout;
|
||||||
return FALSE;
|
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 */
|
/* EOF */
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
#define STATUS_WAIT_63 ((NTSTATUS)0x0000003f)
|
#define STATUS_WAIT_63 ((NTSTATUS)0x0000003f)
|
||||||
#define STATUS_ABANDONED ((NTSTATUS)0x00000080)
|
#define STATUS_ABANDONED ((NTSTATUS)0x00000080)
|
||||||
#define STATUS_ABANDONED_WAIT_63 ((NTSTATUS)0x000000BF)
|
#define STATUS_ABANDONED_WAIT_63 ((NTSTATUS)0x000000BF)
|
||||||
|
#define STATUS_USER_APC ((NTSTATUS)0x000000C0)
|
||||||
#define STATUS_KERNEL_APC ((NTSTATUS)0x00000100)
|
#define STATUS_KERNEL_APC ((NTSTATUS)0x00000100)
|
||||||
#define STATUS_ALERTED ((NTSTATUS)0x00000101)
|
#define STATUS_ALERTED ((NTSTATUS)0x00000101)
|
||||||
#define STATUS_TIMEOUT ((NTSTATUS)0x00000102)
|
#define STATUS_TIMEOUT ((NTSTATUS)0x00000102)
|
||||||
|
|
Loading…
Reference in a new issue