Mercurial > projects > ddbg_continued
diff src/dbgthread.d @ 1:4a9dcbd9e54f
-files of 0.13 beta
-fixes so that it now compiles with the current dmd version
author | marton@basel.hu |
---|---|
date | Tue, 05 Apr 2011 20:44:01 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dbgthread.d Tue Apr 05 20:44:01 2011 +0200 @@ -0,0 +1,135 @@ +/* Ddbg - Win32 Debugger for the D programming language + * Copyright (c) 2007 Jascha Wetzel + * All rights reserved. See LICENSE.TXT for details. + */ +module dbgthread; + +import util; + +import win32.winbase; +import win32.windef; + +/************************************************************************************************** + +**************************************************************************************************/ +class DbgThread +{ + HANDLE handle; + uint id, + stack_base; + + /********************************************************************************************** + + **********************************************************************************************/ + this(HANDLE h, uint i) + { + handle = h; + id = i; + + // get current esp as stack base + CONTEXT ctx; + if ( getContext(ctx, CONTEXT_CONTROL) ) + stack_base = ctx.Esp; + } + + int priority() + { + return GetThreadPriority(handle); + } + + bool priorityBoost() + { + int boost; + GetThreadPriorityBoost(handle, &boost); + return cast(bool)boost; + } + + void times(out ulong creation, out ulong exit, out ulong kernel, out ulong user) + { + GetThreadTimes(handle, cast(FILETIME*)&creation, cast(FILETIME*)&exit, cast(FILETIME*)&kernel, cast(FILETIME*)&user); + } + + uint suspendCount() + { + uint count = suspend; + resume; + return count; + } + + uint suspend() + { + return SuspendThread(handle); + } + + uint resume() + { + return ResumeThread(handle); + } + + /********************************************************************************************** + + **********************************************************************************************/ + bool getContext(out CONTEXT ctx, uint flags=CONTEXT_FULL) + { + ctx.ContextFlags = flags; + suspend; + bool res = cast(bool)GetThreadContext(handle, &ctx); + resume; + return res; + } + + /********************************************************************************************** + + **********************************************************************************************/ + bool setContext(ref CONTEXT ctx) + { + suspend; + auto res = cast(bool)SetThreadContext(handle, &ctx); + resume; + return res; + } + + /********************************************************************************************** + + **********************************************************************************************/ + size_t getDsBase() + { + CONTEXT ctx; + getContext(ctx); + + LDT_ENTRY sel_entry; + GetThreadSelectorEntry(handle, ctx.SegDs, &sel_entry); + return (cast(size_t)sel_entry.BaseHi << 24) | (cast(size_t)sel_entry.BaseMid << 16) | cast(size_t)sel_entry.BaseLow; + } + + /********************************************************************************************** + Wrapper function for changing the thread's context. Calls the + modify(ctx) delegate that can do the actual change. + Returns: success + **********************************************************************************************/ + bool changeContext(void delegate(ref CONTEXT ctx) modify, uint flags=CONTEXT_FULL) + { +// if ( 0 > SuspendThread(thread) ) +// { +// DbgIO.println("ERROR: Couldn't SuspendThread to reset instruction pointer: %s", getLastError); +// return false; +// } + + CONTEXT ctx; + if ( getContext(ctx, flags) ) + { + modify(ctx); + if ( !SetThreadContext(handle, &ctx) ) + DbgIO.println("ERROR: Couldn't SetThreadContext to reset instruction pointer: %s", lastError); + } else + DbgIO.println("ERROR: Couldn't GetThreadContext to reset instruction pointer: %s", lastError); + +// if ( 0 > ResumeThread(thread) ) +// { +// DbgIO.println("ERROR: Couldn't ResumeThread to reset instruction pointer: %s", getLastError); +// return false; +// } + + return true; + } +}