+ /* Try to get startup directory - may fail and we fall back to a default */\r
+ if (expand_parameter(key, NSSM_REG_DIR, dir, dirlen, true) || ! dir[0]) {\r
+ /* Our buffers are defined to be long enough for this to be safe */\r
+ size_t i;\r
+ for (i = strlen(exe); i && exe[i] != '\\' && exe[i] != '/'; i--);\r
+ if (i) {\r
+ memmove(dir, exe, i);\r
+ dir[i] = '\0';\r
+ }\r
+ else {\r
+ /* Help! */\r
+ ret = GetWindowsDirectory(dir, dirlen);\r
+ if (! ret || ret > dirlen) {\r
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_NO_DIR_AND_NO_FALLBACK, NSSM_REG_DIR, service_name, 0);\r
+ RegCloseKey(key);\r
+ return 4;\r
+ }\r
+ }\r
+ log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_NO_DIR, NSSM_REG_DIR, service_name, dir, 0);\r
+ }\r
+\r
+ /* Try to get environment variables - may fail */\r
+ set_environment(service_name, key, env);\r
+\r
+ /* Try to get throttle restart delay */\r
+ unsigned long type = REG_DWORD;\r
+ unsigned long buflen = sizeof(*throttle_delay);\r
+ bool throttle_ok = false;\r
+ ret = RegQueryValueEx(key, NSSM_REG_THROTTLE, 0, &type, (unsigned char *) throttle_delay, &buflen);\r
+ if (ret != ERROR_SUCCESS) {\r
+ if (ret != ERROR_FILE_NOT_FOUND) {\r
+ if (type != REG_DWORD) {\r
+ char milliseconds[16];\r
+ _snprintf(milliseconds, sizeof(milliseconds), "%lu", NSSM_RESET_THROTTLE_RESTART);\r
+ log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_BOGUS_THROTTLE, service_name, NSSM_REG_THROTTLE, milliseconds, 0);\r
+ }\r
+ else log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_QUERYVALUE_FAILED, NSSM_REG_THROTTLE, error_string(GetLastError()), 0);\r
+ }\r