+ si->dwFlags |= STARTF_USESTDHANDLES;\r
+\r
+ if (service->no_console) return 0;\r
+\r
+ /* Redirect other handles. */\r
+ if (! si->hStdInput) {\r
+ if (dup_handle(GetStdHandle(STD_INPUT_HANDLE), &si->hStdInput, _T("STD_INPUT_HANDLE"), _T("stdin"))) return 8;\r
+ }\r
+ if (! si->hStdOutput) {\r
+ if (dup_handle(GetStdHandle(STD_OUTPUT_HANDLE), &si->hStdOutput, _T("STD_OUTPUT_HANDLE"), _T("stdout"))) return 9;\r
+ }\r
+ if (! si->hStdError) {\r
+ if (dup_handle(GetStdHandle(STD_ERROR_HANDLE), &si->hStdError, _T("STD_ERROR_HANDLE"), _T("stderr"))) return 10;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+/* Reuse output handles for a hook. */\r
+int use_output_handles(nssm_service_t *service, STARTUPINFO *si) {\r
+ si->dwFlags &= ~STARTF_USESTDHANDLES;\r
+\r
+ if (service->stdout_si) {\r
+ if (dup_handle(service->stdout_si, &si->hStdOutput, _T("stdout_pipe"), _T("hStdOutput"))) return 1;\r
+ si->dwFlags |= STARTF_USESTDHANDLES;\r
+ }\r
+\r
+ if (service->stderr_si) {\r
+ if (dup_handle(service->stderr_si, &si->hStdError, _T("stderr_pipe"), _T("hStdError"))) {\r
+ if (si->hStdOutput) {\r
+ si->dwFlags &= ~STARTF_USESTDHANDLES;\r
+ CloseHandle(si->hStdOutput);\r
+ }\r
+ return 2;\r
+ }\r
+ si->dwFlags |= STARTF_USESTDHANDLES;\r
+ }\r