Ejemplo n.º 1
0
void windows_service_main( int argc, char **argv ) {

	hServiceStatus = RegisterServiceCtrlHandler( argv[0], (LPHANDLER_FUNCTION) windows_service_control );
	if( hServiceStatus == 0 ) {
		return;
	}

	sStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
	sStatus.dwCurrentState = SERVICE_START_PENDING;
	sStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
	sStatus.dwWin32ExitCode = 0;
	sStatus.dwServiceSpecificExitCode = 0;
	sStatus.dwCheckPoint = 0;
	sStatus.dwWaitHint = 3000; /* Allow us to wait three seconds */
	sStatus.dwCurrentState = SERVICE_RUNNING;

	SetServiceStatus( hServiceStatus, &sStatus );

	/* The main program */
	svc_main_func();

	/* cleanup */
	sStatus.dwCurrentState  = SERVICE_STOPPED;
	SetServiceStatus( hServiceStatus, &sStatus );
}
Ejemplo n.º 2
0
static void WINAPI service_main(DWORD /*argc*/, LPSTR * argv)
{
	char path[MAX_PATH], *p;

	// Register control handler
	svc_handle = RegisterServiceCtrlHandler(argv[0], service_control);

	// Init service status
	svc_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
	service_report_status(SERVICE_START_PENDING, 10);

	// Service started in \windows\system32, change to .exe directory
	if (GetModuleFileNameA(NULL, path, sizeof(path)) && (p = strrchr(path, '\\'))) {
		*p = 0; SetCurrentDirectoryA(path);
	}
	
	// Install exit handler
	atexit(service_exit);

	// Do the real work, service status later updated by daemon_detach()
	daemon_winsvc_exitcode = svc_main_func(svc_main_argc, svc_main_argv);

	exit(daemon_winsvc_exitcode);
	// ... continued in service_exit()
}