+ if (mode != MODE_GETTING) print_message(stderr, NSSM_MESSAGE_INVALID_SERVICE, service->name, NSSM, service->image);\r
+ }\r
+\r
+ /* Editing with the GUI. */\r
+ if (mode == MODE_EDITING) {\r
+ nssm_gui(IDD_EDIT, service);\r
+ return 0;\r
+ }\r
+\r
+ /* Trying to manage App* parameters for a non-NSSM service. */\r
+ if (! setting->native && service->native) {\r
+ CloseHandle(service->handle);\r
+ print_message(stderr, NSSM_MESSAGE_NATIVE_PARAMETER, setting->name, NSSM);\r
+ return 1;\r
+ }\r
+\r
+ HKEY key;\r
+ value_t value;\r
+ int ret;\r
+\r
+ if (mode == MODE_GETTING) {\r
+ if (! service->native) {\r
+ key = open_registry(service->name, KEY_READ);\r
+ if (! key) return 4;\r
+ }\r
+\r
+ if (setting->native) ret = get_setting(service->name, service->handle, setting, &value, additional);\r
+ else ret = get_setting(service->name, key, setting, &value, additional);\r
+ if (ret < 0) {\r
+ CloseHandle(service->handle);\r
+ return 5;\r
+ }\r
+\r
+ switch (setting->type) {\r
+ case REG_EXPAND_SZ:\r
+ case REG_MULTI_SZ:\r
+ case REG_SZ:\r
+ _tprintf(_T("%s\n"), value.string ? value.string : _T(""));\r
+ HeapFree(GetProcessHeap(), 0, value.string);\r
+ break;\r
+\r
+ case REG_DWORD:\r
+ _tprintf(_T("%u\n"), value.numeric);\r
+ break;\r
+ }\r
+\r
+ if (! service->native) RegCloseKey(key);\r
+ CloseHandle(service->handle);\r
+ return 0;\r
+ }\r
+\r
+ /* Build the value. */\r
+ if (mode == MODE_RESETTING) {\r
+ /* Unset the parameter. */\r
+ value.string = 0;\r
+ }\r
+ else {\r
+ /* Set the parameter. */\r
+ size_t len = 0;\r
+ size_t delimiterlen = (setting->additional & ADDITIONAL_CRLF) ? 2 : 1;\r
+ for (i = remainder; i < argc; i++) len += _tcslen(argv[i]) + delimiterlen;\r
+ len++;\r
+\r
+ value.string = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, len * sizeof(TCHAR));\r
+ if (! value.string) {\r
+ print_message(stderr, NSSM_MESSAGE_OUT_OF_MEMORY, _T("value"), _T("edit_service()"));\r
+ CloseHandle(service->handle);\r
+ return 2;\r
+ }\r
+\r
+ size_t s = 0;\r
+ for (i = remainder; i < argc; i++) {\r
+ size_t len = _tcslen(argv[i]);\r
+ memmove(value.string + s, argv[i], len * sizeof(TCHAR));\r
+ s += len;\r
+ if (i < argc - 1) {\r
+ if (setting->additional & ADDITIONAL_CRLF) {\r
+ value.string[s++] = _T('\r');\r
+ value.string[s++] = _T('\n');\r
+ }\r
+ else value.string[s++] = _T(' ');\r
+ }\r
+ }\r
+ value.string[s] = _T('\0');\r
+ }\r
+\r
+ if (! service->native) {\r
+ key = open_registry(service->name, KEY_WRITE);\r
+ if (! key) {\r
+ if (value.string) HeapFree(GetProcessHeap(), 0, value.string);\r
+ return 4;\r
+ }\r
+ }\r
+\r
+ if (setting->native) ret = set_setting(service->name, service->handle, setting, &value, additional);\r
+ else ret = set_setting(service->name, key, setting, &value, additional);\r
+ if (value.string) HeapFree(GetProcessHeap(), 0, value.string);\r
+ if (ret < 0) {\r
+ if (! service->native) RegCloseKey(key);\r
+ CloseHandle(service->handle);\r
+ return 6;\r