#include "ScriptHookPlugin.h" #include "Logging.h" #include "RegistryConfig.h" ScriptHookPlugin::ScriptHookPlugin() = default; ScriptHookPlugin::~ScriptHookPlugin() = default; HRESULT STDMETHODCALLTYPE ScriptHookPlugin::QueryInterface(REFIID riid, void** ppvObject) { if (ppvObject == nullptr) { return E_POINTER; } *ppvObject = nullptr; if (riid == __uuidof(IUnknown) || riid == __uuidof(IWTSPlugin)) { *ppvObject = static_cast(this); AddRef(); return S_OK; } return E_NOINTERFACE; } ULONG STDMETHODCALLTYPE ScriptHookPlugin::AddRef() { return static_cast(InterlockedIncrement(&refCount_)); } ULONG STDMETHODCALLTYPE ScriptHookPlugin::Release() { ULONG remaining = static_cast(InterlockedDecrement(&refCount_)); if (remaining == 0) { delete this; } return remaining; } HRESULT STDMETHODCALLTYPE ScriptHookPlugin::Initialize(IWTSVirtualChannelManager* channelManager) { UNREFERENCED_PARAMETER(channelManager); const hook::HookConfig config = hook::LoadConfig(); hook::Log(config.enableLogging, L"IWTSPlugin::Initialize aufgerufen."); return S_OK; } HRESULT STDMETHODCALLTYPE ScriptHookPlugin::Connected() { const hook::HookConfig config = hook::LoadConfig(); hook::Log(config.enableLogging, L"RDP-Verbindung hergestellt (IWTSPlugin::Connected)."); if (!config.enabled || !config.startOnConnect) { hook::Log(config.enableLogging, L"Start ist in der Konfiguration deaktiviert."); return S_OK; } // Nur Registry lesen + CreateProcess aufrufen. Es wird niemals auf das Script gewartet. launcher_.Start(config); return S_OK; } HRESULT STDMETHODCALLTYPE ScriptHookPlugin::Disconnected(DWORD disconnectCode) { const hook::HookConfig config = hook::LoadConfig(); hook::Log(config.enableLogging, L"RDP-Verbindung getrennt (IWTSPlugin::Disconnected), Code=" + std::to_wstring(disconnectCode) + L"."); if (config.stopOnDisconnect) { launcher_.Stop(config.enableLogging); } return S_OK; } HRESULT STDMETHODCALLTYPE ScriptHookPlugin::Terminated() { const hook::HookConfig config = hook::LoadConfig(); hook::Log(config.enableLogging, L"IWTSPlugin::Terminated aufgerufen."); if (config.stopOnDisconnect) { launcher_.Stop(config.enableLogging); } else { launcher_.Detach(config.enableLogging); } return S_OK; }