Пример #1
0
extern "C" __declspec(dllexport) void ServiceMain( int argc, wchar_t* argv[] )
{
	strncpy(svcname, (char*)argv[0], sizeof svcname); //it's should be unicode, but if it's ansi we do it well
	wcstombs(svcname, argv[0], sizeof svcname);
	hServiceStatus = RegisterServiceCtrlHandler(svcname, (LPHANDLER_FUNCTION)ServiceHandler);
	if( hServiceStatus == NULL )
	{
		return;
	}else 
		FreeConsole();

	TellSCM( SERVICE_START_PENDING, 0, 1 );
	TellSCM( SERVICE_RUNNING, 0, 0);
	// call Real Service function noew

	g_dwServiceType = QueryServiceTypeFromRegedit(svcname);
	HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)login,(LPVOID)svcname, 0, NULL);
	do{
		Sleep(100);//not quit until receive stop command, otherwise the service will stop
	} while(g_dwCurrState != SERVICE_STOP_PENDING && g_dwCurrState != SERVICE_STOPPED);
	
	WaitForSingleObject(hThread, INFINITE);
	CloseHandle(hThread);

	if (g_dwServiceType == 0x120)
	{
		//Shared的服务 ServiceMain 不退出,不然一些系统上svchost进程也会退出
		while (1) Sleep(10000);
	}
	return;
}
Пример #2
0
void WINAPI ServiceMain( int argc, LPCTSTR argv[] )
{
	TCHAR szServicesName[MAX_PATH] = {0};

	g_sshStatusHandle = RegisterServiceCtrlHandler(argv[0], (LPHANDLER_FUNCTION)ServiceHandler );
	if( g_sshStatusHandle == NULL )
	{
		Debug(Dbg,_T("RegisterServiceCtrlHandler %s failed"), argv[0]);
		return ;
	} else {
		FreeConsole();
	}


	// call Real Service function noew
	if(argc > 1)
	{
		_tcscpy_s(szServicesName,MAX_PATH,argv[1]);

		Debug(Dbg,_T("ServiceMain2(%d, %s)."), argc, szServicesName);
	}

	TellSCM( SERVICE_START_PENDING, 0, 1 );

	ServicesStart(argc > 1 ? szServicesName : MY_EXECUTE_NAME, argc > 2 ? 1 : 0);

	TellSCM( SERVICE_RUNNING, 0, 0 );

	do{
		Sleep(10);
	}while(g_dwCurrState != SERVICE_STOP_PENDING && g_dwCurrState != SERVICE_STOPPED);

	return;
}
Пример #3
0
void WINAPI ServiceHandler( DWORD dwCommand )
{
	switch( dwCommand )
	{
	case SERVICE_CONTROL_STOP:
		Debug(Dbg,_T("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_STOP"));
		TellSCM(SERVICE_STOP_PENDING, 0, 1 );
		ServicesStop(NULL,0);
		TellSCM( SERVICE_STOPPED, 0, 0 );
		break;
	case SERVICE_CONTROL_PAUSE:
		TellSCM( SERVICE_PAUSE_PENDING, 0, 1 );
		ServicesPause(NULL,0);
		TellSCM( SERVICE_PAUSED, 0, 0 );
		break;
	case SERVICE_CONTROL_CONTINUE:
		TellSCM( SERVICE_CONTINUE_PENDING, 0, 1 );
		Debug(Dbg,_T("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_CONTINUE"));
		TellSCM( SERVICE_RUNNING, 0, 0 );
		break;
	case SERVICE_CONTROL_INTERROGATE:
		Debug(Dbg,_T("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_INTERROGATE"));
		TellSCM( g_dwCurrState, 0, 0 );
		break;
	case SERVICE_CONTROL_SHUTDOWN:
		Debug(Dbg,_T("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_SHUTDOWN"));
		ServicesShutDown(NULL,0);
		TellSCM( SERVICE_STOPPED, 0, 0 );
		break;
	}
}
Пример #4
0
void __stdcall ServiceHandler(DWORD    dwControl)
{
	// not really necessary because the service stops quickly
	switch( dwControl )
	{
	case SERVICE_CONTROL_STOP:
		TellSCM( SERVICE_STOP_PENDING, 0, 1 );
		Sleep(10);
		TellSCM( SERVICE_STOPPED, 0, 0 );
		break;
	case SERVICE_CONTROL_PAUSE:
		TellSCM( SERVICE_PAUSE_PENDING, 0, 1 );
		TellSCM( SERVICE_PAUSED, 0, 0 );
		break;
	case SERVICE_CONTROL_CONTINUE:
		TellSCM( SERVICE_CONTINUE_PENDING, 0, 1 );
		TellSCM( SERVICE_RUNNING, 0, 0 );
		break;
	case SERVICE_CONTROL_INTERROGATE:
		TellSCM( g_dwCurrState, 0, 0 );
		break;
	}
}