# ToonBoomPlugInManager.dll - PLUG_Services Class Analysis This document contains reverse engineering analysis of the `PLUG_Services` class hierarchy from `ToonBoomPlugInManager.dll` used in Toon Boom Harmony Premium and Storyboard Pro. ## Overview The plugin services system in Toon Boom uses a singleton pattern to provide access to various application services. The main classes are: - **PLUG_Services** - Static class providing access to service interfaces - **PLUG_ServicesPrivate** - Extended static functionality with setters - **PLUG_ServicesPrivateImpl** - (alias name, same as PLUG_ManagerImpl) - **PLUG_ManagerImpl** - Main singleton implementation containing all service pointers - **PLUG_Manager** - Base class for the manager ## Architecture ``` PLUG_Services (static class) │ │ getters return from ▼ ┌──────────────────────────────────────────────┐ │ PLUG_ManagerImpl (singleton) │ │ (inherits: QObject → PLUG_Manager) │ │ │ │ +0x000: vftable (PLUG_ManagerImpl) │ │ +0x010: embedded interface object │ │ +0x188: QCoreApplication* │ │ +0x190: unknown interface │ │ +0x198-0x240: Service interface pointers │ │ +0x248: QString │ │ +0x260: bool flag │ └──────────────────────────────────────────────┘ │ ┌────────────────┼────────────────┐ │ │ │ ▼ ▼ ▼ AC_Manager* CM_Services* PLUG_ScriptingInterface* ... ``` ## Global Variables | Address | Name | Type | Description | |---------|------|------|-------------| | 0x180016590 | g_PLUG_ManagerImpl_instance | PLUG_ManagerImpl* | Main singleton instance | | 0x180016570 | g_PLUG_ModuleLibraryInterface | PLUG_ModuleLibraryInterface* | Module library (separate global) | | 0x180016578 | g_PLUG_SetupModeQueryInterface | PLUG_SetupModeQueryInterface* | Setup mode query interface | | 0x180016580 | g_PLUG_PlaybackRange | PLUG_PlaybackRange | Static playback range instance | | 0x180016538 | g_PLUG_InteractiveViewManagerImpl | PLUG_InteractiveViewManagerImpl* | Interactive view manager singleton | --- ## Class: PLUG_Services ### Purpose Static utility class providing access to all plugin service interfaces. All methods are static. ### Public Static Methods | Address | Method | Return Type | Offset in Singleton | |---------|--------|-------------|---------------------| | 0x180005a50 | getActionManager() | AC_Manager* | +0x1A0 (416) | | 0x180005a70 | getColorManagerServices() | CM_Services* | +0x218 (536) | | 0x180005a90 | getCurrentFrameInterface() | SC_CurrentFrameInterface* | +0x1B0 (432) | | 0x180005ab0 | getDataToolInterface() | SC_CVDataToolInterface* | +0x220 (544) | | 0x180005ad0 | getDragDropInterface() | PLUG_DragDropInterface* | +0x1F8 (504) | | 0x180005af0 | getEditionStackInterface() | SC_SceneEditionStackInterface* | +0x1B8 (440) | | 0x180005b10 | getExpressionScriptingInterface() | AT_ExprScriptEngine* | +0x200 (512)* | | 0x180005b40 | getHttpAPI() | SC_HttpAPI* | +0x228 (552) | | 0x180005b60 | getImportEngine() | PLUG_ImportEngine* | +0x1E0 (480) | | 0x180005b80 | getInteractiveRenderManager() | SC_InteractiveRenderManagerInterface* | +0x198 (408) | | 0x180005ba0 | getInteractiveViewManager() | PLUG_InteractiveViewManager* | +0x210 (528)** | | 0x180005bf0 | getKeyStateInterface() | PLUG_KeyStateInterface* | +0x1E8 (488) | | 0x180005c10 | getLayoutManager() | TULayoutManager* | +0x1F0 (496) | | 0x180005c30 | getMenuService() | PLUG_MenuService* | +0x1D8 (472) | | 0x180005c50 | getModuleLibraryInterface() | PLUG_ModuleLibraryInterface* | (separate global) | | 0x180005c60 | getNetworkViewInterface() | SC_NetworkViewInterface* | +0x240 (576) | | 0x180005c80 | getOGLRenderPlaybackInterface() | PLUG_OGLRenderPlaybackInterface* | +0x230 (560) | | 0x180005d00 | getPluginPath(const QString&) | QString | via vtable | | 0x180005d50 | getPreference() | PLUG_PreferenceUI* | (thunk to PLUG_PreferenceUIImpl::instance) | | 0x180005d60 | getScriptingInterface() | PLUG_ScriptingInterface* | +0x1C8 (456) | | 0x180005d80 | getSelection() | SL_Selection* | +0x1A8 (424) | | 0x180005da0 | getSessionContext() | SC_SessionContext* | +0x1C0 (448) | | 0x180005dc0 | getToolbarService() | PLUG_ToolbarService* | +0x1D0 (464) | | 0x180005de0 | getVectorizationInterface() | PLUG_VectorizationInterface* | +0x238 (568) | | 0x180005e00 | getWidgetFactoryRegistry() | PLUG_WidgetFactoryRegistry* | +0x208 (520) | \* `getExpressionScriptingInterface()` requires `SC_SessionContext` at +0x1C0 to be non-null \*\* `getInteractiveViewManager()` lazily creates `PLUG_InteractiveViewManagerImpl` if null ### Implementation Pattern Most getters follow this pattern: ```cpp Type* PLUG_Services::getXXX() { if (g_PLUG_ManagerImpl_instance) return g_PLUG_ManagerImpl_instance->m_xxx; // at specific offset return nullptr; // returns 0 if singleton not initialized } ``` --- ## Class: PLUG_ServicesPrivate ### Purpose Extended static class with additional functionality and setters (typically used internally). ### Public Static Methods | Address | Method | Return Type | Description | |---------|--------|-------------|-------------| | 0x180005cb0 | getPluginBinFilePath(const QString&) | QString | Gets binary file path for plugin | | 0x180005fa0 | isSetupMode() | bool | Queries setup mode via g_PLUG_SetupModeQueryInterface | | 0x180007390 | setModuleLibraryInterface(PLUG_ModuleLibraryInterface*) | bool | Sets g_PLUG_ModuleLibraryInterface | | 0x1800073f0 | setSetupModeQueryInterface(PLUG_SetupModeQueryInterface*) | void | Sets g_PLUG_SetupModeQueryInterface | | 0x1800072D0 | setColorManagerServices(CM_Services*) | void | Sets +0x218 offset | | 0x1800072F0 | setDataToolInterface(SC_CVDataToolInterface*) | void | Sets +0x220 offset | | 0x180007330 | setHttpAPI(SC_HttpAPI*) | void | Sets +0x228 offset | | 0x1800073B0 | setOGLRenderPlaybackInterface(PLUG_OGLRenderPlaybackInterface*) | void | Sets +0x230 offset | | 0x180007410 | setVectorizationInterface(PLUG_VectorizationInterface*) | void | Sets +0x238 offset | | 0x180007420 | setWidgetFactoryRegistry(PLUG_WidgetFactoryRegistry*) | void | Sets +0x208 offset | --- ## Class: PLUG_ManagerImpl ### Purpose Main singleton implementation that holds all service interface pointers. Inherits from QObject and PLUG_Manager. ### Constructor **Address**: `0x180004180` **Signature**: ```cpp PLUG_ManagerImpl(QObject* parent, UnknownInterface* iface1, UnknownInterface* iface2); ``` ### Memory Layout (x64 MSVC) | Offset | Hex | Size | Type | Member Name | Description | |--------|-----|------|------|-------------|-------------| | 0 | 0x000 | 8 | ptr | vftable | PLUG_ManagerImpl vtable | | 8 | 0x008 | 8 | | (QObject data) | d_ptr from QObject | | 16 | 0x010 | 8 | ptr | embedded_vftable | Embedded interface vtable | | 24 | 0x018 | 72 | | (reserved) | Zeroed on construction | | 96 | 0x060 | 304 | | (reserved block) | memset to 0, size 0x130 | | 392 | 0x188 | 8 | ptr | m_coreApp | QCoreApplication* instance | | 400 | 0x190 | 8 | ptr | m_unknownInterface | Constructor param a3 | | 408 | 0x198 | 8 | ptr | m_interactiveRenderManager | SC_InteractiveRenderManagerInterface* | | 416 | 0x1A0 | 8 | ptr | m_actionManager | AC_Manager* | | 424 | 0x1A8 | 8 | ptr | m_selection | SL_Selection* | | 432 | 0x1B0 | 8 | ptr | m_currentFrameInterface | SC_CurrentFrameInterface* | | 440 | 0x1B8 | 8 | ptr | m_editionStackInterface | SC_SceneEditionStackInterface* | | 448 | 0x1C0 | 8 | ptr | m_sessionContext | SC_SessionContext* | | 456 | 0x1C8 | 8 | ptr | m_scriptingInterface | PLUG_ScriptingInterface* | | 464 | 0x1D0 | 8 | ptr | m_toolbarService | PLUG_ToolbarService* | | 472 | 0x1D8 | 8 | ptr | m_menuService | PLUG_MenuService* | | 480 | 0x1E0 | 8 | ptr | m_importEngine | PLUG_ImportEngine* | | 488 | 0x1E8 | 8 | ptr | m_keyStateInterface | PLUG_KeyStateInterface* | | 496 | 0x1F0 | 8 | ptr | m_layoutManager | TULayoutManager* | | 504 | 0x1F8 | 8 | ptr | m_dragDropInterface | PLUG_DragDropInterface* | | 512 | 0x200 | 8 | ptr | m_exprScriptEngine | AT_ExprScriptEngine* | | 520 | 0x208 | 8 | ptr | m_widgetFactoryRegistry | PLUG_WidgetFactoryRegistry* | | 528 | 0x210 | 8 | ptr | m_interactiveViewManager | PLUG_InteractiveViewManager* | | 536 | 0x218 | 8 | ptr | m_colorManagerServices | CM_Services* | | 544 | 0x220 | 8 | ptr | m_dataToolInterface | SC_CVDataToolInterface* | | 552 | 0x228 | 8 | ptr | m_httpAPI | SC_HttpAPI* | | 560 | 0x230 | 8 | ptr | m_oglRenderPlaybackInterface | PLUG_OGLRenderPlaybackInterface* | | 568 | 0x238 | 8 | ptr | m_vectorizationInterface | PLUG_VectorizationInterface* | | 576 | 0x240 | 8 | ptr | m_networkViewInterface | SC_NetworkViewInterface* | | 584 | 0x248 | 24 | QString | m_unknownString | QString member | | 608 | 0x260 | 1 | bool | m_flag | Initialized to true | **sizeof(PLUG_ManagerImpl) ≈ 0x268 (616 bytes minimum)** --- ## Class: PLUG_Manager ### Purpose Base class for the manager singleton. ### Constructor **Address**: `0x180001210` ### Memory Layout | Offset | Size | Type | Description | |--------|------|------|-------------| | 0 | 8 | ptr | vftable (PLUG_Manager) | --- ## Class: PLUG_ScriptingInterface ### Purpose Interface for scripting functionality. Base class for script execution. ### Constructor **Address**: `0x180009cd0` ### Memory Layout | Offset | Size | Type | Description | |--------|------|------|-------------| | 0 | 8 | ptr | vftable | ### Nested Struct: Program Represents a script program to be executed. **Memory Layout**: | Offset | Size | Type | Member | Description | |--------|------|------|--------|-------------| | 0 | 24 | QString | path | Script path/name | | 24 | 24 | QString | description | Script description | | 48 | 24 | QString | content | Script content | | 72 | 8+ | QDateTime | timestamp | Modification timestamp | **sizeof(PLUG_ScriptingInterface::Program) ≈ 80+ bytes** --- ## Class: PLUG_InteractiveViewManager / PLUG_InteractiveViewManagerImpl ### Purpose Manages interactive view delegates for drawing and tool handling. ### Constructor **Address**: `0x180001ef0` ### Memory Layout | Offset | Size | Type | Description | |--------|------|------|-------------| | 0 | 8 | ptr | vftable | | 8 | 8 | ptr | m_delegateList (linked list) | | 16 | 8 | ptr | m_delegate2 | ### Key Methods | Address | Method | Description | |---------|--------|-------------| | 0x180003060 | instance() | Returns singleton from g_PLUG_InteractiveViewManagerImpl | | 0x180003180 | registerDelegate(PLUG_InteractiveViewDelegate*) | Registers a view delegate | | 0x180003320 | unregisterDelegate(PLUG_InteractiveViewDelegate*) | Unregisters a view delegate | | 0x1800030a0 | isDelegateTypeRegistered(PLUG_InteractiveViewDelegate*) | Checks if delegate type exists | | 0x180003070 | invalidateAllViews(int) | Invalidates all views | | 0x180003080 | invalidateTimeline() | Invalidates timeline view | | 0x180002e20 | handleMouseDown(...) | Handles mouse down events | | 0x180002ee0 | handleMouseMove(...) | Handles mouse move events | | 0x180002fa0 | handleMouseUp(...) | Handles mouse up events | | 0x180002d60 | handleGetCursor(...) | Gets cursor for position | --- ## Class: PLUG_PreferenceUI / PLUG_PreferenceUIImpl ### Purpose Manages preference panels and UI customization. ### Singleton Access **Address**: `0x180007a20` (PLUG_PreferenceUIImpl::instance) Uses thread-local storage for singleton initialization with `Init_thread_header`/`Init_thread_footer` pattern. ### Key Methods | Address | Method | Description | |---------|--------|-------------| | 0x180007970 | addCustomizer(const PLUG_PreferenceUICustomizerInterface*) | Adds preference customizer | | 0x180007aa0 | onCreateColorPreferencePanel(eAppContext, QWidget*) | Creates color pref panel | | 0x180007b20 | onCreatePreferencePanel(eAppContext, QWidget*) | Creates general pref panel | --- ## Service Interface Types Reference ### Action & Menu System - **AC_Manager** - Action/command manager - **PLUG_MenuService** - Menu service interface - **PLUG_ToolbarService** - Toolbar service interface ### Scene & Session - **SC_SessionContext** - Current session context - **SC_CurrentFrameInterface** - Current frame access - **SC_SceneEditionStackInterface** - Scene edition stack - **SC_NetworkViewInterface** - Network view interface - **SC_HttpAPI** - HTTP API for server communication ### Drawing & Rendering - **SC_InteractiveRenderManagerInterface** - Render management - **SC_CVDataToolInterface** - Drawing data tool interface - **CM_Services** - Color manager services - **PLUG_VectorizationInterface** - Vectorization tools - **PLUG_OGLRenderPlaybackInterface** - OpenGL render playback ### Selection & Layout - **SL_Selection** - Selection management - **TULayoutManager** - Layout system manager - **PLUG_InteractiveViewManager** - Interactive view management ### Scripting - **PLUG_ScriptingInterface** - Script execution interface - **AT_ExprScriptEngine** - Expression script engine ### Import/Export - **PLUG_ImportEngine** - Import functionality - **PLUG_ModuleLibraryInterface** - Module library access ### Input & UI - **PLUG_KeyStateInterface** - Keyboard state tracking - **PLUG_DragDropInterface** - Drag and drop handling - **PLUG_WidgetFactoryRegistry** - Widget factory registration - **PLUG_PreferenceUI** - Preference panels --- ## Environment Variables - **TOONBOOM_PLUGINPATH** - Overrides plugin search path (checked in `sub_180005380`) --- ## Analysis Methodology 1. **Function List Analysis**: Extracted all functions matching `*PLUG_Services*` pattern 2. **Decompilation**: Analyzed each getter method to determine offsets in singleton 3. **Constructor Analysis**: Traced `PLUG_ManagerImpl` constructor to map memory layout 4. **Cross-Reference Analysis**: Found setters and initialization points via xrefs to globals 5. **Pattern Recognition**: Identified common getter/setter patterns 6. **Global Identification**: Named and documented global singleton variables ## Database File - **Source**: `RE/ToonBoomPlugInManager.dll.i64` - **Module Base**: `0x180000000`