svcmain.cpp revision a97f26ece82a85f69a131fb74b057774c85db9c8
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @file
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * SVCMAIN - COM out-of-proc server main entry
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * available from http://www.virtualbox.org. This file is free software;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * additional information or have any questions.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync */
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync#include <stdio.h>
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync#include "VBox/com/defs.h"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include "VBox/com/VirtualBox.h"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include "VirtualBoxImpl.h"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include "Logging.h"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include "svchlp.h"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync#include <VBox/err.h>
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync#include <iprt/initterm.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <atlbase.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <atlcom.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define _ATL_FREE_THREADED
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncclass CExeModule : public CComModule
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncpublic:
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync LONG Unlock();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DWORD dwThreadID;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync HANDLE hEventShutdown;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync void MonitorShutdown();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync bool StartMonitor();
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync bool bActivity;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync};
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncconst DWORD dwTimeOut = 5000; /* time for EXE to be idle before shutting down */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncconst DWORD dwPause = 1000; /* time to wait for threads to finish up */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/* Passed to CreateThread to monitor the shutdown event */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic DWORD WINAPI MonitorProc(void* pv)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync CExeModule* p = (CExeModule*)pv;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync p->MonitorShutdown();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return 0;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncLONG CExeModule::Unlock()
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync LONG l = CComModule::Unlock();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (l == 0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync bActivity = true;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync SetEvent(hEventShutdown); /* tell monitor that we transitioned to zero */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return l;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/* Monitors the shutdown event */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncvoid CExeModule::MonitorShutdown()
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync while (1)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync WaitForSingleObject(hEventShutdown, INFINITE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DWORD dwWait=0;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync bActivity = false;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync dwWait = WaitForSingleObject(hEventShutdown, dwTimeOut);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (dwWait == WAIT_OBJECT_0);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* timed out */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (!bActivity && m_nLockCnt == 0) /* if no activity let's really bail */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync CoSuspendClassObjects();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (!bActivity && m_nLockCnt == 0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync break;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync CloseHandle(hEventShutdown);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncbool CExeModule::StartMonitor()
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync hEventShutdown = CreateEvent(NULL, false, false, NULL);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (hEventShutdown == NULL)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return false;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DWORD dwThreadID;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync HANDLE h = CreateThread(NULL, 0, MonitorProc, this, 0, &dwThreadID);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return (h != NULL);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncCExeModule _Module;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncBEGIN_OBJECT_MAP(ObjectMap)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync OBJECT_ENTRY(CLSID_VirtualBox, VirtualBox)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncEND_OBJECT_MAP()
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncLPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync while (p1 != NULL && *p1 != NULL)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync LPCTSTR p = p2;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync while (p != NULL && *p != NULL)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (*p1 == *p)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return CharNext(p1);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync p = CharNext(p);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
cf3aad827eee194a3e6e68796710074b44164371vboxsync p1 = CharNext(p1);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return NULL;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int WordCmpI(LPCTSTR psz1, LPCTSTR psz2) throw()
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync TCHAR c1 = (TCHAR)CharUpper((LPTSTR)*psz1);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync TCHAR c2 = (TCHAR)CharUpper((LPTSTR)*psz2);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync while (c1 != NULL && c1 == c2 && c1 != ' ' && c1 != '\t')
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync {
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync psz1 = CharNext(psz1);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync psz2 = CharNext(psz2);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync c1 = (TCHAR)CharUpper((LPTSTR)*psz1);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync c2 = (TCHAR)CharUpper((LPTSTR)*psz2);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if ((c1 == NULL || c1 == ' ' || c1 == '\t') && (c2 == NULL || c2 == ' ' || c2 == '\t'))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return 0;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return (c1 < c2) ? -1 : 1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/////////////////////////////////////////////////////////////////////////////
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync//
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncextern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /*
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Initialize the VBox runtime without loading
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * the support driver.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTR3Init();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync lpCmdLine = GetCommandLine(); /* this line necessary for _ATL_MIN_CRT */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#else
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync HRESULT hRes = CoInitialize(NULL);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _ASSERTE(SUCCEEDED(hRes));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.Init(ObjectMap, hInstance, &LIBID_VirtualBox);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.dwThreadID = GetCurrentThreadId();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync TCHAR szTokens[] = _T("-/");
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync int nRet = 0;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync BOOL bRun = TRUE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync while (lpszToken != NULL)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (WordCmpI(lpszToken, _T("UnregServer")) == 0)
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, FALSE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync nRet = _Module.UnregisterServer(TRUE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync bRun = FALSE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync break;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync else if (WordCmpI(lpszToken, _T("RegServer")) == 0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, TRUE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync nRet = _Module.RegisterServer(TRUE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync bRun = FALSE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync break;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync else if (WordCmpI(lpszToken, _T("ReregServer")) == 0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, FALSE);
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync nRet = _Module.UnregisterServer(TRUE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, TRUE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync nRet = _Module.RegisterServer(TRUE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync bRun = FALSE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync break;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync else if ( (WordCmpI(lpszToken, _T("h")) == 0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync || (WordCmpI(lpszToken, _T("?")) == 0))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync TCHAR txt[]= L"Options:\n\n"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync L"/RegServer:\tregister COM out-of-proc server\n"
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync L"/UnregServer:\tunregister COM out-of-proc server\n"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync L"/ReregServer:\tunregister and register COM server\n"
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync L"no options:\trun the server";
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync TCHAR title[]=_T("Usage");
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync nRet = -1;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync bRun = FALSE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync MessageBox(NULL, txt, title, MB_OK);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync break;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync else if (WordCmpI (lpszToken, _T("Helper")) == 0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Log (("SVCMAIN: Processing Helper request (cmdline=\"%ls\")...\n",
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync lpszToken + 6));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync TCHAR szTokens[] = _T (" \t");
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync int vrc = VINF_SUCCESS;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync Utf8Str pipeName;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync lpszToken = FindOneOf (lpszToken, szTokens);
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync if (lpszToken)
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync {
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync while (*lpszToken != NULL &&
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync (*lpszToken == ' ' || *lpszToken == '\t'))
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync ++ lpszToken;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync if (*lpszToken != NULL)
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync pipeName = Utf8Str(lpszToken);
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync }
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync if (pipeName.isEmpty())
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync vrc = VERR_INVALID_PARAMETER;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync if (RT_SUCCESS(vrc))
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync {
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync /* do the helper job */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync SVCHlpServer server;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync vrc = server.open(pipeName.c_str());
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (RT_SUCCESS(vrc))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync vrc = server.run();
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (RT_FAILURE(vrc))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Utf8Str err = Utf8StrFmt (
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync "Failed to process Helper request (%Rrc).", vrc);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Log (("SVCMAIN: %s\n", err.raw()));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* don't run the COM server */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync bRun = FALSE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync break;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync lpszToken = FindOneOf(lpszToken, szTokens);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (bRun)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync {
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.StartMonitor();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _ASSERTE(SUCCEEDED(hRes));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync hRes = CoResumeClassObjects();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#else
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _ASSERTE(SUCCEEDED(hRes));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync MSG msg;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync while (GetMessage(&msg, 0, 0, 0))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DispatchMessage(&msg);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.RevokeClassObjects();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Sleep(dwPause); //wait for any threads to finish
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync }
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.Term();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync CoUninitialize();
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Log(("SVCMAIN: Returning, COM server process ends.\n"));
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return nRet;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync