Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

84 lines
2.2 KiB

#include <pch.h>
#pragma hdrstop
#include "ssdpsrv.h"
#include "status.h"
#include "ncdefine.h"
#include "ncdebug.h"
#include "server_s.c"
static SERVICE_STATUS serviceStatus;
static SERVICE_STATUS_HANDLE serviceStatusHandle;
DWORD WINAPI ServiceCtrlHandler(DWORD dwControl, DWORD dwEventType,
PVOID pEventData, PVOID pContext);
// Delay load support
//
#include <delayimp.h>
EXTERN_C
FARPROC
WINAPI
DelayLoadFailureHook (
UINT unReason,
PDelayLoadInfo pDelayInfo
);
PfnDliHook __pfnDliFailureHook = DelayLoadFailureHook;
void WINAPI ServiceMain(DWORD argc, LPWSTR *argv)
{
serviceStatus.dwServiceType = SERVICE_WIN32;
serviceStatus.dwCurrentState = SERVICE_START_PENDING;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwServiceSpecificExitCode = 0;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
serviceStatusHandle = RegisterServiceCtrlHandlerEx("ssdpsrv",
ServiceCtrlHandler,
NULL);
if (serviceStatusHandle == (SERVICE_STATUS_HANDLE) 0)
{
// To-Do: register an event log
goto cleanup;
}
if (SetServiceStatus(serviceStatusHandle, &serviceStatus) == FALSE)
{
// should register an event log .. tbd
goto cleanup;
}
SsdpMain(serviceStatusHandle, &serviceStatus);
cleanup:
serviceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
}
DWORD WINAPI ServiceCtrlHandler(DWORD dwControl, DWORD dwEventType,
PVOID pEventData, PVOID pContext)
{
TraceTag(ttidSsdpRpcIf, "ServiceCtrlHandler: %d\n", dwControl);
switch (dwControl)
{
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
_Shutdown();
serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(serviceStatusHandle, &serviceStatus);
break;
case SERVICE_CONTROL_INTERROGATE:
SetServiceStatus(serviceStatusHandle, &serviceStatus);
break;
}
return 1;
}