* - write debugging function and print all dbg info via that.
* - change 'temp' to something meaningfull
*/
-
+
#include "tcpsvcs.h"
static SERVICE_STATUS_HANDLE hSStat;
FILE *hLogFile;
-BOOL bShutDownFlag = FALSE;
-BOOL bPauseFlag = FALSE;
+BOOL bShutDown = FALSE;
+BOOL bPause = FALSE;
LPCTSTR LogFileName = "\\tcpsvcs_log.log";
LPTSTR ServiceName = _T("Simp Tcp");
{ServiceName, ServiceMain},
{NULL, NULL}
};
-
+
//DPRINT("Starting tcpsvcs service. See \system32%s for logs\n", LogFileName);
if (! StartServiceCtrlDispatcher(ServiceTable))
VOID WINAPI
ServiceMain(DWORD argc, LPTSTR argv[])
{
- TCHAR LogFilePath[MAX_PATH];
+ TCHAR LogFilePath[MAX_PATH];
if(! GetSystemDirectory(LogFilePath, MAX_PATH))
return;
-
+
_tcscat(LogFilePath, LogFileName);
- hLogFile = fopen(LogFilePath, _T("w"));
+ hLogFile = fopen(LogFilePath, _T("a+"));
if (hLogFile == NULL)
{
- TCHAR *temp = NULL;
-
- _stprintf(temp, _T("Could not open log file: %s"), LogFilePath);
- MessageBox(NULL, temp, NULL, MB_OK);
+ TCHAR buf[50];
+
+ _stprintf(buf, _T("Could not open log file: %s\n"), LogFilePath);
+ MessageBox(NULL, buf, NULL, MB_OK);
return;
}
-
- LogEvent(_T("Entering ServiceMain"), 0, FALSE);
+
+
+ LogEvent(_T("Entering ServiceMain\n"), 0, FALSE);
hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
hServStatus.dwCurrentState = SERVICE_START_PENDING;
hServStatus.dwServiceSpecificExitCode = NO_ERROR;
hServStatus.dwCheckPoint = 0;
hServStatus.dwWaitHint = 2*CS_TIMEOUT;
-
+
hSStat = RegisterServiceCtrlHandler(ServiceName, ServerCtrlHandler);
if (hSStat == 0)
LogEvent(_T("Failed to register service\n"), -1, TRUE);
- LogEvent(_T("Control handler registered successfully"), 0, FALSE);
+ LogEvent(_T("Control handler registered successfully\n"), 0, FALSE);
SetServiceStatus (hSStat, &hServStatus);
- LogEvent(_T("Service status set to SERVICE_START_PENDING"), 0, FALSE);
+ LogEvent(_T("Service status set to SERVICE_START_PENDING\n"), 0, FALSE);
if (CreateServers() != 0)
{
SetServiceStatus(hSStat, &hServStatus);
return;
}
-
- LogEvent(_T("Service threads shut down. Set SERVICE_STOPPED status"), 0, FALSE);
+
+ LogEvent(_T("Service threads shut down. Set SERVICE_STOPPED status\n"), 0, FALSE);
/* We will only return here when the ServiceSpecific function
completes, indicating system shutdown. */
UpdateStatus (SERVICE_STOPPED, 0);
- LogEvent(_T("Service status set to SERVICE_STOPPED"), 0, FALSE);
- LogEvent(_T("Leaving ServiceMain"), 0, FALSE);
- fclose(hLogFile); /* Clean up everything, in general */
+ LogEvent(_T("Service status set to SERVICE_STOPPED\n"), 0, FALSE);
+ LogEvent(_T("Leaving ServiceMain\n"), 0, FALSE);
+
+ fclose(hLogFile);
+
return;
}
VOID WINAPI
ServerCtrlHandler(DWORD Control)
{
+ TCHAR buf[256];
+
switch (Control)
{
case SERVICE_CONTROL_SHUTDOWN: /* fall through */
case SERVICE_CONTROL_STOP:
- bShutDownFlag = TRUE;
+ LogEvent(_T("stopping service\n"), 0, FALSE);
+ InterlockedExchange((LONG *)&bShutDown, TRUE);
UpdateStatus(SERVICE_STOP_PENDING, -1);
break;
- case SERVICE_CONTROL_PAUSE:
- bPauseFlag = TRUE;
+ case SERVICE_CONTROL_PAUSE: /* not yet implemented */
+ LogEvent(_T("pausing service\n"), 0, FALSE);
+ InterlockedExchange((LONG *)&bPause, TRUE);
break;
case SERVICE_CONTROL_CONTINUE:
- bPauseFlag = FALSE;
+ LogEvent(_T("continuing service\n"), 0, FALSE);
+ InterlockedExchange((LONG *)&bPause, FALSE);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
hServStatus.dwCheckPoint++;
else
hServStatus.dwCheckPoint = Check;
-
+
if (NewStatus >= 0)
hServStatus.dwCurrentState = NewStatus;
-
+
if (! SetServiceStatus (hSStat, &hServStatus))
- LogEvent(_T("Cannot set service status"), -1, TRUE);
-
+ LogEvent(_T("Cannot set service status\n"), -1, TRUE);
+
return;
}
DWORD dwThreadId[NUM_SERVICES];
HANDLE hThread[NUM_SERVICES];
WSADATA wsaData;
- TCHAR temp[512]; // temp for holding LogEvent text
+ TCHAR buf[256];
INT i;
DWORD RetVal;
-
+
if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
- _stprintf(temp, _T("WSAStartup() failed : %lu\n"), RetVal);
- LogEvent(temp, RetVal, TRUE);
+ _stprintf(buf, _T("WSAStartup() failed : %lu\n"), RetVal);
+ LogEvent(buf, RetVal, TRUE);
return -1;
}
-
+
UpdateStatus(-1, -1); /* increment checkpoint */
LogEvent(_T("Creating server Threads\n"), 0, FALSE);
/* Create MAX_THREADS worker threads. */
for( i=0; i<NUM_SERVICES; i++ )
{
- _stprintf(temp, _T("Starting %s server....\n"), Services[i].Name);
- LogEvent(temp, 0, FALSE);
+ _stprintf(buf, _T("Starting %s server....\n"), Services[i].Name);
+ LogEvent(buf, 0, FALSE);
hThread[i] = CreateThread(
NULL, // default security attributes
/* Check the return value for success. */
if (hThread[i] == NULL)
{
- _stprintf(temp, _T("Failed to start %s server....\n"), Services[i].Name);
+ _stprintf(buf, _T("Failed to start %s server....\n"), Services[i].Name);
/* don't exit process via LogEvent. We want to exit via the server
* which failed to start, which could mean i=0 */
- LogEvent(temp, 0, TRUE);
+ LogEvent(buf, 0, TRUE);
ExitProcess(i);
}
}
-
+
LogEvent(_T("setting service status to running\n"), 0, FALSE);
UpdateStatus(SERVICE_RUNNING, 0);
{
CloseHandle(hThread[i]);
}
+
+ LogEvent(_T("Detaching Winsock2...\n"), 0, FALSE);
+ WSACleanup();
+
return 0;
}
LPTSTR lpvSysMsg;
TCHAR MessageBuffer[512];
+
+
if (PrintErrorMsg)
{
eMsgLen = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
ErrNum, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpvSysMsg, 0, NULL);
- _stprintf(MessageBuffer, _T("\n%s %s ErrNum = %lu. ExitCode = %lu."),
+ _stprintf(MessageBuffer, _T("%s %s ErrNum = %lu. ExitCode = %lu."),
UserMessage, lpvSysMsg, ErrNum, ExitCode);
HeapFree(GetProcessHeap (), 0, lpvSysMsg);
}
else
{
- _stprintf(MessageBuffer, _T("\n%s"), UserMessage);
+ _stprintf(MessageBuffer, _T("%s"), UserMessage);
}
fputs (MessageBuffer, hLogFile);