|
|
|
#include <stdio.h>
|
|
|
|
#include <tchar.h>
|
|
|
|
|
|
|
|
#include "server.h"
|
|
|
|
#include "service.h"
|
|
|
|
#include "client.h"
|
|
|
|
|
|
|
|
SERVICE_STATUS gSvcStatus;
|
|
|
|
SERVICE_STATUS_HANDLE gSvcStatusHandle;
|
|
|
|
HANDLE ghSvcStopEvent = NULL;
|
|
|
|
HANDLE ghExecuteService = NULL;
|
|
|
|
|
|
|
|
int _tmain(int argc, TCHAR *argv[]) {
|
|
|
|
SERVICE_TABLE_ENTRY DispatchTable[] = {
|
|
|
|
{SVCNAME, (LPSERVICE_MAIN_FUNCTION)SvcMain},
|
|
|
|
{NULL, NULL} };
|
|
|
|
|
|
|
|
if (argc == 2) {
|
|
|
|
if (lstrcmpi(argv[1], TEXT("-s")) == 0) {
|
|
|
|
StartShellServer();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
else if (lstrcmpi(argv[1], TEXT("-sc")) == 0) {
|
|
|
|
if (!StartServiceCtrlDispatcher(DispatchTable)) {
|
|
|
|
printf("Error while starting Dispatcher Table : %d\n", GetLastError());
|
|
|
|
ERROR_FAILED_SERVICE_CONTROLLER_CONNECT;
|
|
|
|
SvcReportEvent(TEXT("StartServiceCtrlDispatcher"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
goto help_message;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else if (argc == 3) {
|
|
|
|
if (lstrcmpi(argv[1], TEXT("-c")) == 0) {
|
|
|
|
StartShellClient(argv[2]);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
else if (lstrcmpi(argv[1], TEXT("-s")) == 0 && lstrcmpi(argv[2], TEXT("-service")) == 0) {
|
|
|
|
SvcInstall();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
goto help_message;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
goto help_message;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
help_message:
|
|
|
|
printf("Wrong usage\nUsage: %s [-c {remote ip} | -s [-service]]\n", argv[0]);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
VOID WINAPI SvcMain(DWORD dwArgc, LPTSTR* lpszArgv) {
|
|
|
|
// Register the handler function for the service
|
|
|
|
gSvcStatusHandle = RegisterServiceCtrlHandler(SVCNAME, SvcCtrlHandler);
|
|
|
|
|
|
|
|
if (!gSvcStatusHandle) {
|
|
|
|
SvcReportEvent(TEXT("RegisterServiceCtrlHandler"));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// These SERVICE_STATUS members remain as set here
|
|
|
|
gSvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
|
|
|
|
gSvcStatus.dwServiceSpecificExitCode = 0;
|
|
|
|
|
|
|
|
// Report initial status to the SCM
|
|
|
|
ReportSvcStatus(SERVICE_START_PENDING, NO_ERROR, 3000);
|
|
|
|
// Perform service-specific initialization and work.
|
|
|
|
SvcInit(dwArgc, lpszArgv);
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD WINAPI ServerThreadStart(LPDWORD dummy) {
|
|
|
|
UNREFERENCED_PARAMETER(dummy);
|
|
|
|
|
|
|
|
StartShellServer();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
VOID SvcInit(DWORD dwArgc, LPTSTR* lpszArgv) {
|
|
|
|
ghSvcStopEvent = CreateEvent(NULL, // default security attributes
|
|
|
|
TRUE, // manual reset event
|
|
|
|
FALSE, // not signaled
|
|
|
|
NULL); // no name
|
|
|
|
|
|
|
|
if (ghSvcStopEvent == NULL) {
|
|
|
|
ReportSvcStatus(SERVICE_STOPPED, GetLastError(), 0);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Report running status when initialization is complete.
|
|
|
|
ReportSvcStatus(SERVICE_RUNNING, NO_ERROR, 0);
|
|
|
|
|
|
|
|
ghExecuteService = CreateThread(NULL, 0, ServerThreadStart, NULL, 0, NULL);
|
|
|
|
if (ghExecuteService == NULL) {
|
|
|
|
ReportSvcStatus(SERVICE_STOPPED, GetLastError(), 0);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (1) {
|
|
|
|
// Check whether to stop the service.
|
|
|
|
WaitForSingleObject(ghSvcStopEvent, INFINITE);
|
|
|
|
TerminateThread(ghExecuteService, 0);
|
|
|
|
ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|