+const TCHAR *nssm_imagepath() {\r
+ return imagepath;\r
+}\r
+\r
+int _tmain(int argc, TCHAR **argv) {\r
+ check_console();\r
+\r
+#ifdef UNICODE\r
+ /*\r
+ Ensure we write in UTF-16 mode, so that non-ASCII characters don't get\r
+ mangled. If we were compiled in ANSI mode it won't work.\r
+ */\r
+ _setmode(_fileno(stdout), _O_U16TEXT);\r
+ _setmode(_fileno(stderr), _O_U16TEXT);\r
+#endif\r
+\r
+ /* Remember if we are admin */\r
+ check_admin();\r
+\r
+ /* Set up function pointers. */\r
+ if (get_imports()) exit(111);\r
+\r
+ /* Remember our path for later. */\r
+ GetModuleFileName(0, unquoted_imagepath, _countof(unquoted_imagepath));\r
+ GetModuleFileName(0, imagepath, _countof(imagepath));\r
+ PathQuoteSpaces(imagepath);\r
+\r
+ /* Elevate */\r
+ if (argc > 1) {\r
+ /*\r
+ Valid commands are:\r
+ start, stop, pause, continue, install, edit, get, set, reset, unset, remove\r
+ */\r
+ if (str_equiv(argv[1], _T("start"))) exit(control_service(NSSM_SERVICE_CONTROL_START, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("stop"))) exit(control_service(SERVICE_CONTROL_STOP, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("restart"))) {\r
+ int ret = control_service(SERVICE_CONTROL_STOP, argc - 2, argv + 2);\r
+ if (ret) exit(ret);\r
+ exit(control_service(NSSM_SERVICE_CONTROL_START, argc - 2, argv + 2));\r
+ }\r
+ if (str_equiv(argv[1], _T("pause"))) exit(control_service(SERVICE_CONTROL_PAUSE, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("continue"))) exit(control_service(SERVICE_CONTROL_CONTINUE, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("status"))) exit(control_service(SERVICE_CONTROL_INTERROGATE, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("rotate"))) exit(control_service(NSSM_SERVICE_CONTROL_ROTATE, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("install"))) {\r
+ if (! is_admin) exit(elevate(argc, argv, NSSM_MESSAGE_NOT_ADMINISTRATOR_CANNOT_INSTALL));\r
+ exit(pre_install_service(argc - 2, argv + 2));\r
+ }\r
+ if (str_equiv(argv[1], _T("edit")) || str_equiv(argv[1], _T("get")) || str_equiv(argv[1], _T("set")) || str_equiv(argv[1], _T("reset")) || str_equiv(argv[1], _T("unset"))) {\r
+ int ret = pre_edit_service(argc - 1, argv + 1);\r
+ if (ret == 3 && ! is_admin && argc == 3) exit(elevate(argc, argv, NSSM_MESSAGE_NOT_ADMINISTRATOR_CANNOT_EDIT));\r
+ /* There might be a password here. */\r
+ for (int i = 0; i < argc; i++) SecureZeroMemory(argv[i], _tcslen(argv[i]) * sizeof(TCHAR));\r
+ exit(ret);\r
+ }\r
+ if (str_equiv(argv[1], _T("remove"))) {\r
+ if (! is_admin) exit(elevate(argc, argv, NSSM_MESSAGE_NOT_ADMINISTRATOR_CANNOT_REMOVE));\r
+ exit(pre_remove_service(argc - 2, argv + 2));\r
+ }\r