windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/samples/service/nmmgr.cpp
2020-09-26 16:20:57 +08:00

185 lines
3.4 KiB
C++

//
// Copyright (C) 1993-1997 Microsoft Corporation. All Rights Reserved.
//
// MODULE: nmmgr.cpp
//
// PURPOSE: Implements the body of the service.
//
// FUNCTIONS:
// MNMServiceStart(DWORD dwArgc, LPTSTR *lpszArgv);
// MNMServiceStop( );
//
// COMMENTS: The functions implemented in nmmgr.c are
// prototyped in nmmgr.h
//
//
// AUTHOR: Claus Giloi
//
#include <precomp.h>
#define NMSRVC_TEXT "SalemSrvc"
// DEBUG only -- Define debug zone
#ifdef DEBUG
HDBGZONE ghZone = NULL;
static PTCHAR rgZones[] = {
NMSRVC_TEXT,
"Warning",
"Trace",
"Function"
};
#endif // DEBUG
extern DWORD g_dwMainThreadID;
//
// FUNCTION: MNMServiceStart
//
// PURPOSE: Actual code of the service
// that does the work.
//
// PARAMETERS:
// dwArgc - number of command line arguments
// lpszArgv - array of command line arguments
//
// RETURN VALUE:
// none
//
// COMMENTS:
//
VOID MNMServiceStart (DWORD dwArgc, LPTSTR *lpszArgv)
{
HRESULT hRet;
DWORD dwResult;
MSG msg;
DWORD dwError = NO_ERROR;
int i;
// Initialization
DBGINIT(&ghZone, rgZones);
InitDebugModule(NMSRVC_TEXT);
g_dwMainThreadID = GetCurrentThreadId();
DebugEntry(MNMServiceStart);
//
// report the status to the service control manager.
//
if (!ReportStatusToSCMgr( SERVICE_START_PENDING, NO_ERROR, 30000))
{
ERROR_OUT(("ReportStatusToSCMgr failed"));
dwError = GetLastError();
goto cleanup;
}
CoInitialize(NULL);
SetConsoleCtrlHandler(ServiceCtrlHandler, TRUE);
////////////////////////////////////////////////////////
//
// Service is now running, perform work until shutdown
//
if (!MNMServiceActivate())
{
ERROR_OUT(("Unable to activate service"));
goto cleanup;
}
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
cleanup:
MNMServiceDeActivate();
DebugExitVOID(MNMServiceStart);
CoUninitialize();
g_dwMainThreadID = 0;
DBGDEINIT(&ghZone);
ExitDebugModule();
}
BOOL MNMServiceActivate ( VOID )
{
DebugEntry(MNMServiceActivate);
HRESULT hRet = InitConfMgr();
if (FAILED(hRet))
{
ERROR_OUT(("ERROR %x initializing nmmanger", hRet));
return FALSE;
}
AddTaskbarIcon();
ReportStatusToSCMgr( SERVICE_RUNNING, NO_ERROR, 0);
DebugExitBOOL(MNMServiceActivate,TRUE);
return TRUE;
}
BOOL MNMServiceDeActivate ( VOID )
{
DebugEntry(MNMServiceDeActivate);
RemoveTaskbarIcon();
ReportStatusToSCMgr(SERVICE_PAUSED, NO_ERROR, 0);
//
// Leave Conference
//
if (NULL != g_pConference)
{
if ( FAILED(g_pConference->Leave()))
{
ERROR_OUT(("Conference Leave failed"));;
}
}
//
// Free the conference
//
FreeConference();
//
// Free the AS interface
//
ASSERT(g_pAS);
UINT ret = g_pAS->Release();
g_pAS = NULL;
TRACE_OUT(("AS interface freed, ref %d after Release", ret));
// not to call FreeConfMfr imediately after FreeConference to avoid
// a bug in t120 will remove this sleep call after fix the bug in t120
FreeConfMgr();
ReportStatusToSCMgr( SERVICE_STOPPED, 0, 0);
DebugExitBOOL(MNMServiceDeActivate,TRUE);
return TRUE;
}