svcmain.cpp revision a97f26ece82a85f69a131fb74b057774c85db9c8
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * SVCMAIN - COM out-of-proc server main entry
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * 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.
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/* Passed to CreateThread to monitor the shutdown event */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (l == 0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync SetEvent(hEventShutdown); /* tell monitor that we transitioned to zero */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/* Monitors the shutdown event */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync dwWait = WaitForSingleObject(hEventShutdown, dwTimeOut);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* timed out */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (!bActivity && m_nLockCnt == 0) /* if no activity let's really bail */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync hEventShutdown = CreateEvent(NULL, false, false, NULL);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return false;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync HANDLE h = CreateThread(NULL, 0, MonitorProc, this, 0, &dwThreadID);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync return (h != NULL);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if (*p1 == *p)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncstatic int WordCmpI(LPCTSTR psz1, LPCTSTR psz2) throw()
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync while (c1 != NULL && c1 == c2 && c1 != ' ' && c1 != '\t')
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync if ((c1 == NULL || c1 == ' ' || c1 == '\t') && (c2 == NULL || c2 == ' ' || c2 == '\t'))
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/////////////////////////////////////////////////////////////////////////////
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncextern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Initialize the VBox runtime without loading
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * the support driver.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync lpCmdLine = GetCommandLine(); /* this line necessary for _ATL_MIN_CRT */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.Init(ObjectMap, hInstance, &LIBID_VirtualBox);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, FALSE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync else if (WordCmpI(lpszToken, _T("RegServer")) == 0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, TRUE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync else if (WordCmpI(lpszToken, _T("ReregServer")) == 0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, FALSE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync _Module.UpdateRegistryFromResource(IDR_VIRTUALBOX, TRUE);
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 Log (("SVCMAIN: Processing Helper request (cmdline=\"%ls\")...\n",
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync /* do the helper job */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /* don't run the COM server */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync Log(("SVCMAIN: Returning, COM server process ends.\n"));