diff --git a/TitanEngine/Global.Engine.Threading.cpp b/TitanEngine/Global.Engine.Threading.cpp
new file mode 100644
index 0000000..c88c30a
--- /dev/null
+++ b/TitanEngine/Global.Engine.Threading.cpp
@@ -0,0 +1,30 @@
+#include "stdafx.h"
+#include "definitions.h"
+#include "Global.Engine.Threading.h"
+
+MutexLocker::MutexLocker(const char* name)
+{
+ gMutex=CreateMutexA(0, false, name);
+ bUnlocked=false;
+ WaitForSingleObject(gMutex, INFINITE);
+}
+
+MutexLocker::~MutexLocker()
+{
+ ReleaseMutex(gMutex);
+}
+
+void MutexLocker::relock()
+{
+ if(bUnlocked)
+ {
+ bUnlocked=false;
+ WaitForSingleObject(gMutex, INFINITE);
+ }
+}
+
+void MutexLocker::unlock()
+{
+ ReleaseMutex(gMutex);
+ bUnlocked=true;
+}
\ No newline at end of file
diff --git a/TitanEngine/Global.Engine.Threading.h b/TitanEngine/Global.Engine.Threading.h
new file mode 100644
index 0000000..4c75983
--- /dev/null
+++ b/TitanEngine/Global.Engine.Threading.h
@@ -0,0 +1,16 @@
+#ifndef _GLOBAL_ENGINE_THREADING_H
+#define _GLOBAL_ENGINE_THREADING_H
+
+class MutexLocker
+{
+public:
+ MutexLocker(const char* name);
+ ~MutexLocker();
+ void relock();
+ void unlock();
+private:
+ HANDLE gMutex;
+ bool bUnlocked;
+};
+
+#endif //_GLOBAL_ENGINE_THREADING_H
\ No newline at end of file
diff --git a/TitanEngine/TitanEngine.Debugger.Context.cpp b/TitanEngine/TitanEngine.Debugger.Context.cpp
index bf5e7d3..5798eee 100644
--- a/TitanEngine/TitanEngine.Debugger.Context.cpp
+++ b/TitanEngine/TitanEngine.Debugger.Context.cpp
@@ -3,36 +3,36 @@
#include "Global.Debugger.h"
#include "Global.Engine.h"
#include "Global.Handle.h"
+#include "Global.Engine.Threading.h"
static CONTEXT DBGContext = {};
__declspec(dllexport) bool TITCALL GetContextFPUDataEx(HANDLE hActiveThread, void* FPUSaveArea)
{
-
- if(FPUSaveArea != NULL)
+ MutexLocker locker("DBGContext"); //lock DBGContext
+ if(FPUSaveArea)
{
RtlZeroMemory(&DBGContext, sizeof CONTEXT);
DBGContext.ContextFlags = CONTEXT_ALL;
if(!GetThreadContext(hActiveThread, &DBGContext))
- return(false);
-#if !defined (_WIN64)
+ return false;
+#ifndef _WIN64
RtlMoveMemory(FPUSaveArea, &DBGContext.FloatSave, sizeof FLOATING_SAVE_AREA);
#else
RtlMoveMemory(FPUSaveArea, &DBGContext.FltSave, sizeof XMM_SAVE_AREA32);
#endif
- return(true);
- }
- else
- {
- return(false);
+ return true;
}
+ return false;
}
+
__declspec(dllexport) long long TITCALL GetContextDataEx(HANDLE hActiveThread, DWORD IndexOfRegister)
{
+ MutexLocker locker("DBGContext"); //lock DBGContext
RtlZeroMemory(&DBGContext, sizeof CONTEXT);
DBGContext.ContextFlags = CONTEXT_ALL;
-#if defined(_WIN64)
GetThreadContext(hActiveThread, &DBGContext);
+#ifdef _WIN64
if(IndexOfRegister == UE_EAX)
{
return((DWORD)DBGContext.Rax);
@@ -202,7 +202,6 @@ __declspec(dllexport) long long TITCALL GetContextDataEx(HANDLE hActiveThread, D
return(DBGContext.SegSs);
}
#else
- GetThreadContext(hActiveThread, &DBGContext);
if(IndexOfRegister == UE_EAX)
{
return(DBGContext.Eax);
@@ -300,51 +299,47 @@ __declspec(dllexport) long long TITCALL GetContextDataEx(HANDLE hActiveThread, D
return(DBGContext.SegSs);
}
#endif
- return(NULL);
+ return NULL;
}
+
__declspec(dllexport) long long TITCALL GetContextData(DWORD IndexOfRegister)
{
-
- HANDLE hActiveThread = 0;
- long long ContextReturn;
-
- hActiveThread = OpenThread(THREAD_GET_CONTEXT|THREAD_SET_CONTEXT|THREAD_QUERY_INFORMATION, false, DBGEvent.dwThreadId);
- ContextReturn = GetContextDataEx(hActiveThread, IndexOfRegister);
+ MutexLocker locker("DBGContext"); //lock DBGContext
+ HANDLE hActiveThread = OpenThread(THREAD_GET_CONTEXT, false, DBGEvent.dwThreadId);
+ long long ContextReturn = GetContextDataEx(hActiveThread, IndexOfRegister);
EngineCloseHandle(hActiveThread);
return(ContextReturn);
}
+
__declspec(dllexport) bool TITCALL SetContextFPUDataEx(HANDLE hActiveThread, void* FPUSaveArea)
{
-
- if(FPUSaveArea != NULL)
+ MutexLocker locker("DBGContext"); //lock DBGContext
+ if(FPUSaveArea)
{
RtlZeroMemory(&DBGContext, sizeof CONTEXT);
DBGContext.ContextFlags = CONTEXT_ALL;
if(!GetThreadContext(hActiveThread, &DBGContext))
return(false);
-#if !defined (_WIN64)
+#ifndef _WIN64
RtlMoveMemory(&DBGContext.FloatSave, FPUSaveArea, sizeof FLOATING_SAVE_AREA);
#else
RtlMoveMemory(&DBGContext.FltSave, FPUSaveArea, sizeof XMM_SAVE_AREA32);
#endif
if(SetThreadContext(hActiveThread, &DBGContext))
- {
- return(true);
- }
+ return true;
}
- return(false);
+ return false;
}
+
__declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD IndexOfRegister, ULONG_PTR NewRegisterValue)
{
- SuspendThread(hActiveThread);
+ MutexLocker locker("DBGContext"); //lock DBGContext
RtlZeroMemory(&DBGContext, sizeof CONTEXT);
DBGContext.ContextFlags = CONTEXT_ALL;
-#ifdef _WIN64
if(!GetThreadContext(hActiveThread, &DBGContext))
- {
- ResumeThread(hActiveThread);
- return(false);
- }
+ return false;
+ SuspendThread(hActiveThread);
+#ifdef _WIN64
if(IndexOfRegister == UE_EAX)
{
NewRegisterValue = DBGContext.Rax - (DWORD)DBGContext.Rax + NewRegisterValue;
@@ -522,22 +517,7 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD
{
DBGContext.SegSs = (WORD)NewRegisterValue;
}
- else
- {
- ResumeThread(hActiveThread);
- return(false);
- }
- if(SetThreadContext(hActiveThread, &DBGContext))
- {
- ResumeThread(hActiveThread);
- return(true);
- }
#else
- if(!GetThreadContext(hActiveThread, &DBGContext))
- {
- ResumeThread(hActiveThread);
- return(false);
- }
if(IndexOfRegister == UE_EAX)
{
DBGContext.Eax = NewRegisterValue;
@@ -634,28 +614,26 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD
{
DBGContext.SegSs = NewRegisterValue;
}
+#endif
else
{
ResumeThread(hActiveThread);
- return(false);
+ return false;
}
if(SetThreadContext(hActiveThread, &DBGContext))
{
ResumeThread(hActiveThread);
- return(true);
+ return true;
}
-#endif
ResumeThread(hActiveThread);
- return(false);
+ return false;
}
+
__declspec(dllexport) bool TITCALL SetContextData(DWORD IndexOfRegister, ULONG_PTR NewRegisterValue)
{
-
- HANDLE hActiveThread = 0;
- bool ContextReturn;
-
- hActiveThread = OpenThread(THREAD_ALL_ACCESS, false, DBGEvent.dwThreadId);
- ContextReturn = SetContextDataEx(hActiveThread, IndexOfRegister, NewRegisterValue);
+ MutexLocker locker("DBGContext"); //lock DBGContext
+ HANDLE hActiveThread = OpenThread(THREAD_SUSPEND_RESUME|THREAD_SET_CONTEXT|THREAD_GET_CONTEXT, false, DBGEvent.dwThreadId);
+ bool ContextReturn = SetContextDataEx(hActiveThread, IndexOfRegister, NewRegisterValue);
EngineCloseHandle(hActiveThread);
return(ContextReturn);
}
\ No newline at end of file
diff --git a/TitanEngine/TitanEngine.vcxproj b/TitanEngine/TitanEngine.vcxproj
index 5c771d8..a238f5a 100644
--- a/TitanEngine/TitanEngine.vcxproj
+++ b/TitanEngine/TitanEngine.vcxproj
@@ -223,6 +223,7 @@
+
@@ -284,6 +285,7 @@
+
diff --git a/TitanEngine/TitanEngine.vcxproj.filters b/TitanEngine/TitanEngine.vcxproj.filters
index 4f7592f..f480f26 100644
--- a/TitanEngine/TitanEngine.vcxproj.filters
+++ b/TitanEngine/TitanEngine.vcxproj.filters
@@ -198,6 +198,9 @@
Source Files\TitanEngine
+
+ Source Files\TitanEngine
+
@@ -278,6 +281,9 @@
Header Files\TitanEngine
+
+ Header Files\TitanEngine
+