You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
6.4 KiB
214 lines
6.4 KiB
#include <windows.h>
|
|
#include <stdlib.h>
|
|
#include <fusenetincludes.h>
|
|
#include "CUnknown.h"
|
|
#include "CFactory.h"
|
|
#include "Resource.h"
|
|
#include <update.h>
|
|
#include "regdb.h"
|
|
|
|
HWND g_hwndUpdateServer = NULL ;
|
|
CRITICAL_SECTION g_csServer;
|
|
|
|
// Signal that an update is available.
|
|
extern BOOL g_fSignalUpdate;
|
|
|
|
BOOL InitWindow(int nCmdShow) ;
|
|
extern "C" LRESULT APIENTRY MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) ;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// WinMain
|
|
// The main entry point via CoCreate or CreateProcess.
|
|
//-----------------------------------------------------------------------------
|
|
extern "C" int WINAPI WinMain(HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine,
|
|
int nCmdShow)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
MAKE_ERROR_MACROS_STATIC(hr);
|
|
|
|
// Initialize the COM Library.
|
|
IF_FAILED_EXIT(CoInitializeEx(NULL, COINIT_MULTITHREADED));
|
|
|
|
__try
|
|
{
|
|
::InitializeCriticalSection(&g_csServer);
|
|
}
|
|
__except (GetExceptionCode() == STATUS_NO_MEMORY ?
|
|
EXCEPTION_EXECUTE_HANDLER :
|
|
EXCEPTION_CONTINUE_SEARCH )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
IF_FAILED_EXIT(hr);
|
|
|
|
// Get Thread ID.
|
|
CFactory::s_dwThreadID = ::GetCurrentThreadId() ;
|
|
CFactory::s_hModule = hInstance ;
|
|
|
|
IF_WIN32_FALSE_EXIT(InitWindow(SW_HIDE));
|
|
|
|
// Increment artificial server lock.
|
|
::InterlockedIncrement(&CFactory::s_cServerLocks) ;
|
|
|
|
// clean-up the jobs left out from previous login.
|
|
IF_FAILED_EXIT(ProcessOrphanedJobs());
|
|
|
|
// Initialize the subscription list and timers from registry.
|
|
IF_FAILED_EXIT(CAssemblyUpdate::InitializeSubscriptions());
|
|
|
|
// Register all of the class factories.
|
|
IF_FAILED_EXIT(CFactory::StartFactories());
|
|
|
|
// Wait for shutdown.
|
|
MSG msg ;
|
|
while (::GetMessage(&msg, 0, 0, 0))
|
|
{
|
|
::DispatchMessage(&msg) ;
|
|
}
|
|
|
|
// Unregister the class factories.
|
|
// BUGBUG - use the critsect instead
|
|
// for race condition.
|
|
// The check here is because StopFactories
|
|
// will have already been called if an update
|
|
// is signalled.
|
|
if (!g_fSignalUpdate)
|
|
CFactory::StopFactories() ;
|
|
::DeleteCriticalSection(&g_csServer);
|
|
|
|
exit:
|
|
|
|
return SUCCEEDED(hr) ? TRUE : FALSE;
|
|
|
|
// Uninitialize the COM Library.
|
|
CoUninitialize() ;
|
|
return 0 ;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// InitWindow
|
|
// Initializes hidden window used by main service process thread.
|
|
//-----------------------------------------------------------------------------
|
|
BOOL InitWindow(int nCmdShow)
|
|
{
|
|
// Fill in window class structure with parameters
|
|
// that describe the main window.
|
|
WNDCLASS wcUpdateServer ;
|
|
wcUpdateServer.style = 0 ;
|
|
wcUpdateServer.lpfnWndProc = MainWndProc ;
|
|
wcUpdateServer.cbClsExtra = 0 ;
|
|
wcUpdateServer.cbWndExtra = 0 ;
|
|
wcUpdateServer.hInstance = CFactory::s_hModule ;
|
|
wcUpdateServer.hIcon = ::LoadIcon(CFactory::s_hModule,
|
|
MAKEINTRESOURCE(IDC_ICON)) ;
|
|
wcUpdateServer.hCursor = ::LoadCursor(NULL, IDC_ARROW) ;
|
|
wcUpdateServer.hbrBackground = (HBRUSH) ::GetStockObject(GRAY_BRUSH) ;
|
|
wcUpdateServer.lpszMenuName = NULL ;
|
|
wcUpdateServer.lpszClassName = L"UpdateServiceServerInternalWindow" ;
|
|
|
|
// returns GetLastError on fail.
|
|
BOOL bResult = ::RegisterClass(&wcUpdateServer) ;
|
|
if (!bResult)
|
|
{
|
|
return bResult ;
|
|
}
|
|
|
|
HWND hWndMain ;
|
|
|
|
// returns getlasterror
|
|
hWndMain = ::CreateWindow(
|
|
L"UpdateServiceServerInternalWindow",
|
|
L"Application Update Service",
|
|
WS_OVERLAPPEDWINDOW,
|
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
|
NULL,
|
|
NULL,
|
|
CFactory::s_hModule,
|
|
NULL) ;
|
|
|
|
// If window could not be created, return "failure".
|
|
if (!hWndMain)
|
|
{
|
|
return FALSE ;
|
|
}
|
|
|
|
// Make the window visible; update its client area;
|
|
// and return "success".
|
|
::ShowWindow(hWndMain, nCmdShow) ;
|
|
::UpdateWindow(hWndMain) ;
|
|
return TRUE ;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MainWndProc
|
|
// Window procedure for service process thread (hidden).
|
|
//-----------------------------------------------------------------------------
|
|
extern "C" LRESULT APIENTRY MainWndProc(
|
|
HWND hWnd, // window handle
|
|
UINT message, // type of message
|
|
WPARAM wParam, // additional information
|
|
LPARAM lParam) // additional information
|
|
{
|
|
DWORD dwStyle ;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_CREATE:
|
|
{
|
|
// Get size of main window
|
|
CREATESTRUCT* pcs = (CREATESTRUCT*) lParam ;
|
|
|
|
// Create a window. LISTBOX for no particular reason.
|
|
g_hwndUpdateServer = ::CreateWindow(
|
|
L"LISTBOX",
|
|
NULL,
|
|
WS_CHILD | WS_VISIBLE | LBS_USETABSTOPS
|
|
| WS_VSCROLL | LBS_NOINTEGRALHEIGHT,
|
|
0, 0, pcs->cx, pcs->cy,
|
|
hWnd,
|
|
NULL,
|
|
CFactory::s_hModule,
|
|
NULL) ;
|
|
|
|
if (g_hwndUpdateServer == NULL)
|
|
{
|
|
ASSERT(FALSE);
|
|
return -1 ;
|
|
}
|
|
}
|
|
break ;
|
|
|
|
case WM_SIZE:
|
|
::MoveWindow(g_hwndUpdateServer, 0, 0,
|
|
LOWORD(lParam), HIWORD(lParam), TRUE) ;
|
|
break;
|
|
|
|
case WM_DESTROY: // message: window being destroyed
|
|
if (CFactory::CanUnloadNow() == S_OK)
|
|
{
|
|
// Only post the quit message, if there is
|
|
// no one using the program.
|
|
::PostQuitMessage(0) ;
|
|
}
|
|
break ;
|
|
|
|
case WM_CLOSE:
|
|
// Decrement the lock count.
|
|
::InterlockedDecrement(&CFactory::s_cServerLocks) ;
|
|
|
|
// The service is going away.
|
|
g_hwndUpdateServer = NULL ;
|
|
|
|
//Fall through
|
|
default:
|
|
return (DefWindowProc(hWnd, message, wParam, lParam)) ;
|
|
}
|
|
return 0 ;
|
|
}
|
|
|