diff options
Diffstat (limited to 'src/mir_core/modules.cpp')
-rw-r--r-- | src/mir_core/modules.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/mir_core/modules.cpp b/src/mir_core/modules.cpp index 67cf6ce267..2ff0fabe06 100644 --- a/src/mir_core/modules.cpp +++ b/src/mir_core/modules.cpp @@ -575,6 +575,47 @@ static void DestroyServices() ///////////////////////////////////////////////////////////////////////////////
+static int sttComparePlugins(const HINSTANCE__* p1, const HINSTANCE__* p2)
+{
+ if (p1 == p2)
+ return 0;
+
+ return (p1 < p2) ? -1 : 1;
+}
+
+LIST<HINSTANCE__> pluginListAddr(10, sttComparePlugins);
+
+MIR_CORE_DLL(void) RegisterModule(HINSTANCE hInst)
+{
+ pluginListAddr.insert(hInst);
+}
+
+MIR_CORE_DLL(void) UnregisterModule(HINSTANCE hInst)
+{
+ pluginListAddr.remove(hInst);
+}
+
+MIR_CORE_DLL(HINSTANCE) GetInstByAddress(void* codePtr)
+{
+ if (pluginListAddr.getCount() == 0)
+ return NULL;
+
+ int idx;
+ List_GetIndex((SortedList*)&pluginListAddr, codePtr, &idx);
+ if (idx > 0)
+ idx--;
+
+ HINSTANCE result = pluginListAddr[idx];
+ if (result < hInst && codePtr > hInst)
+ result = hInst;
+ else if (idx == 0 && codePtr < (void*)result)
+ result = NULL;
+
+ return result;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
int InitialiseModularEngine(void)
{
InitializeCriticalSection(&csHooks);
@@ -597,5 +638,7 @@ void DestroyModularEngine(void) services.destroy();
DeleteCriticalSection(&csServices);
+ pluginListAddr.destroy();
+
CloseHandle(hMainThread);
}
|