+static HANDLE create_logging_thread(TCHAR *service_name, TCHAR *path, unsigned long sharing, unsigned long disposition, unsigned long flags, HANDLE *read_handle_ptr, HANDLE *pipe_handle_ptr, HANDLE *write_handle_ptr, unsigned long rotate_bytes_low, unsigned long rotate_bytes_high, unsigned long *tid_ptr, unsigned long *rotate_online) {\r
+ *tid_ptr = 0;\r
+\r
+ /* Pipe between application's stdout/stderr and our logging handle. */\r
+ if (read_handle_ptr && ! *read_handle_ptr) {\r
+ if (pipe_handle_ptr && ! *pipe_handle_ptr) {\r
+ if (CreatePipe(read_handle_ptr, pipe_handle_ptr, 0, 0)) {\r
+ SetHandleInformation(*pipe_handle_ptr, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);\r
+ }\r
+ else {\r
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CREATEPIPE_FAILED, service_name, path, error_string(GetLastError()));\r
+ return (HANDLE) 0;\r
+ }\r
+ }\r
+ }\r
+\r
+ logger_t *logger = (logger_t *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(logger_t));\r
+ if (! logger) {\r
+ log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("logger"), _T("create_logging_thread()"), 0);\r
+ return (HANDLE) 0;\r
+ }\r
+\r
+ ULARGE_INTEGER size;\r
+ size.LowPart = rotate_bytes_low;\r
+ size.HighPart = rotate_bytes_high;\r
+\r
+ logger->service_name = service_name;\r
+ logger->path = path;\r
+ logger->sharing = sharing;\r
+ logger->disposition = disposition;\r
+ logger->flags = flags;\r
+ logger->read_handle = *read_handle_ptr;\r
+ logger->write_handle = *write_handle_ptr;\r
+ logger->size = (__int64) size.QuadPart;\r
+ logger->tid_ptr = tid_ptr;\r
+ logger->rotate_online = rotate_online;\r
+\r