void* invokeNtop(LPTSTR szAppParameters) { DWORD dwNewArgc, i; LPTSTR *lpszNewArgv=NULL; LPTSTR *lpszTmpArgv; // SetConsoleCtrlHandler(logoffHandler, TRUE); // J. R. Duarte: convert the string argument back to argc & argv lpszNewArgv = convertArgStringToArgList(lpszNewArgv, &dwNewArgc, szAppParameters); // J. R. Duarte: to handle removing the Windows-specific command // line option when running from the command line or as a service if (!stricmp(lpszNewArgv[1],"/c") || !stricmp(lpszNewArgv[1],"/i")) { lpszTmpArgv = lpszNewArgv; // make a copy of argv for(i=0; i < dwNewArgc ;i++) { if (i == 0) lpszNewArgv[0] = lpszTmpArgv[0]; else if (i > 1) lpszNewArgv[i - 1] = lpszTmpArgv[i]; } dwNewArgc--; } ntop_main(dwNewArgc, lpszNewArgv); SetEvent(hServerStopEvent); // Signal main thread that we're leaving return(NULL); }
// The ServiceMain function is the entry point for the service. void WINAPI serviceMain(DWORD dwArgc, LPTSTR *lpszArgv) { TCHAR szAppParameters[8192]; LONG lLen = 8192; LPTSTR *lpszNewArgv = NULL; DWORD dwNewArgc; UINT i; char szParamKey[1025]; sprintf(szParamKey,"SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters", lpszArgv[0]); // Call RegisterServiceCtrlHandler immediately to register a service control // handler function. The returned SERVICE_STATUS_HANDLE is saved with global // scope, and used as a service id in calls to SetServiceStatus. sshStatusHandle = RegisterServiceCtrlHandler( TEXT(SZSERVICENAME), controlHandler); if (!sshStatusHandle) goto finally; // The global ssStatus SERVICE_STATUS structure contains information about the // service, and is used throughout the program in calls made to SetStatus through // the ReportStatus function. ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; ssStatus.dwServiceSpecificExitCode = 0; // If we could guarantee that all initialization would occur in less than one // second, we would not have to report our status to the service control manager. // For good measure, we will assign SERVICE_START_PENDING to the current service // state and inform the service control manager through our ReportStatus function. if (!ReportStatus(SERVICE_START_PENDING, NO_ERROR, 3000)) goto finally; // When we installed this service, we probably saved a list of runtime args // in the registry as a subkey of the key for this service. We'll try to get // it here... if(0 != getStringValue(szAppParameters,(LPDWORD)&lLen, HKEY_LOCAL_MACHINE, szParamKey, SZAPPPARAMS)){ dwNewArgc = 0; lpszNewArgv = NULL; } else { //If we have an argument string, convert it to a list of argc/argv type... lpszNewArgv = convertArgStringToArgList(lpszNewArgv, &dwNewArgc, szAppParameters); } // Do it! In ServiceStart, we'll send additional status reports to the // service control manager, especially the SERVICE_RUNNING report once // our JVM is initiallized and ready to be invoked. ServiceStart(dwNewArgc, lpszNewArgv); // Release the allocated storage used by our arg list. Java programmers // might remember this kind of stuff. for(i=0; i<dwNewArgc; i++){ GlobalFree((HGLOBAL)lpszNewArgv[i]); } if(dwNewArgc > 0) GlobalFree((HGLOBAL)lpszNewArgv); finally: // Report the stopped status to the service control manager, if we have // a valid server status handle. if (sshStatusHandle) (VOID)ReportStatus( SERVICE_STOPPED, dwErr, 0); }
void* invokelprobe(void* _szAppParameters) { DWORD dwNewArgc, i; LPTSTR szAppParameters = (LPTSTR)_szAppParameters; LPTSTR *lpszNewArgv = NULL; LPTSTR *lpszTmpArgv; // SetConsoleCtrlHandler(logoffHandler, TRUE); // J. R. Duarte: convert the string argument back to argc & argv lpszNewArgv = convertArgStringToArgList(lpszNewArgv, &dwNewArgc, szAppParameters); // J. R. Duarte: to handle removing the Windows-specific command // line option when running from the command line or as a service if (!stricmp(lpszNewArgv[1],"/c") || !stricmp(lpszNewArgv[1],"/i") || !stricmp(lpszNewArgv[1],"/r")) { int displ; lpszTmpArgv = lpszNewArgv; // make a copy of argv if(!stricmp(lpszNewArgv[1],"/c")) displ = 1; else displ = 2; for(i=0; i < dwNewArgc ;i++) { if (i == 0) lpszNewArgv[0] = lpszTmpArgv[0]; else if (i > displ) lpszNewArgv[i - displ] = lpszTmpArgv[i]; } dwNewArgc--; } /* Example: C:\ltop\lprobe\Release\lprobe.exe */ GetModuleFileName(GetModuleHandle(NULL), readOnlyGlobals.base_installation_path, MAX_PATH); for(i = strlen(readOnlyGlobals.base_installation_path)-1; i>0; i--) if(readOnlyGlobals.base_installation_path[i] == '\\') { readOnlyGlobals.base_installation_path[i+1] = '\0'; break; } lprobe_main(dwNewArgc, lpszNewArgv); SetEvent(hServerStopEvent); // Signal main thread that we're leaving return(NULL); }