[NTOSKRNL] Drop the useless Timestamp field
[reactos.git] / dll / win32 / syssetup / logfile.c
1 /*
2 * ReactOS kernel
3 * Copyright (C) 2003 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 /*
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS system libraries
22 * PURPOSE: Log file functions
23 * FILE: lib/syssetup/logfile.c
24 * PROGRAMER: Eric Kohl
25 */
26
27 /* INCLUDES *****************************************************************/
28
29 #include "precomp.h"
30 #include <stdarg.h>
31
32 /* GLOBALS ******************************************************************/
33
34 HANDLE hLogFile = NULL;
35
36 #define FORMAT_BUFFER_SIZE 512
37 #define LINE_BUFFER_SIZE 1024
38
39 /* FUNCTIONS ****************************************************************/
40
41 BOOL WINAPI
42 InitializeSetupActionLog (BOOL bDeleteOldLogFile)
43 {
44 WCHAR szFileName[MAX_PATH];
45
46 GetWindowsDirectoryW(szFileName, MAX_PATH);
47
48 if (szFileName[wcslen(szFileName)] != L'\\')
49 {
50 wcsncat(szFileName,
51 L"\\",
52 (sizeof(szFileName) / sizeof(szFileName[0])) - wcslen(szFileName));
53 }
54 wcsncat(szFileName,
55 L"setuplog.txt",
56 (sizeof(szFileName) / sizeof(szFileName[0])) - wcslen(szFileName));
57
58 if (bDeleteOldLogFile)
59 {
60 SetFileAttributesW(szFileName, FILE_ATTRIBUTE_NORMAL);
61 DeleteFileW(szFileName);
62 }
63
64 hLogFile = CreateFileW(szFileName,
65 GENERIC_READ | GENERIC_WRITE,
66 FILE_SHARE_READ | FILE_SHARE_WRITE,
67 NULL,
68 OPEN_ALWAYS,
69 FILE_ATTRIBUTE_NORMAL,
70 NULL);
71 if (hLogFile == INVALID_HANDLE_VALUE)
72 {
73 hLogFile = NULL;
74 return FALSE;
75 }
76
77 return TRUE;
78 }
79
80
81 VOID WINAPI
82 TerminateSetupActionLog(VOID)
83 {
84 if (hLogFile != NULL)
85 {
86 CloseHandle (hLogFile);
87 hLogFile = NULL;
88 }
89 }
90
91
92 VOID
93 CDECL
94 pSetupDebugPrint(
95 IN PCWSTR pszFileName,
96 IN INT nLineNumber,
97 IN PCWSTR pszTag,
98 IN PCWSTR pszMessage,
99 ...)
100 {
101 PWSTR pszFormatBuffer = NULL;
102 PWSTR pszLineBuffer = NULL;
103 PSTR pszOutputBuffer = NULL;
104 ULONG ulLineSize, ulOutputSize;
105 DWORD dwWritten;
106 SYSTEMTIME stTime;
107 va_list args;
108
109 if (hLogFile == NULL)
110 return;
111
112 GetLocalTime(&stTime);
113
114 if (pszMessage)
115 {
116 pszFormatBuffer = HeapAlloc(GetProcessHeap(),
117 HEAP_ZERO_MEMORY,
118 FORMAT_BUFFER_SIZE * sizeof(WCHAR));
119 if (pszFormatBuffer == NULL)
120 goto done;
121
122 va_start(args, pszMessage);
123 vsnwprintf(pszFormatBuffer,
124 FORMAT_BUFFER_SIZE,
125 pszMessage,
126 args);
127 va_end(args);
128 }
129
130 pszLineBuffer = HeapAlloc(GetProcessHeap(),
131 HEAP_ZERO_MEMORY,
132 LINE_BUFFER_SIZE * sizeof(WCHAR));
133 if (pszLineBuffer == NULL)
134 goto done;
135
136 _snwprintf(pszLineBuffer,
137 LINE_BUFFER_SIZE,
138 L"%02d/%02d/%04d %02d:%02d:%02d.%03d, %s, %d, %s, %s\r\n",
139 stTime.wMonth,
140 stTime.wDay,
141 stTime.wYear,
142 stTime.wHour,
143 stTime.wMinute,
144 stTime.wSecond,
145 stTime.wMilliseconds,
146 pszFileName ? pszFileName : L"",
147 nLineNumber,
148 pszTag ? pszTag : L"",
149 pszFormatBuffer ? pszFormatBuffer : L"");
150
151 /* Get length of the converted ansi string */
152 ulLineSize = wcslen(pszLineBuffer) * sizeof(WCHAR);
153 RtlUnicodeToMultiByteSize(&ulOutputSize,
154 pszLineBuffer,
155 ulLineSize);
156
157 /* Allocate message string buffer */
158 pszOutputBuffer = HeapAlloc(GetProcessHeap(),
159 HEAP_ZERO_MEMORY,
160 ulOutputSize);
161 if (pszOutputBuffer == NULL)
162 goto done;
163
164 /* Convert unicode to ansi */
165 RtlUnicodeToMultiByteN(pszOutputBuffer,
166 ulOutputSize,
167 NULL,
168 pszLineBuffer,
169 ulLineSize);
170
171 /* Set file pointer to the end of the file */
172 SetFilePointer(hLogFile,
173 0,
174 NULL,
175 FILE_END);
176
177 WriteFile(hLogFile,
178 pszOutputBuffer,
179 ulOutputSize,
180 &dwWritten,
181 NULL);
182
183 done:
184 if (pszOutputBuffer)
185 HeapFree(GetProcessHeap(), 0, pszOutputBuffer);
186
187 if (pszLineBuffer)
188 HeapFree(GetProcessHeap(), 0, pszLineBuffer);
189
190 if (pszFormatBuffer)
191 HeapFree(GetProcessHeap(), 0, pszFormatBuffer);
192 }
193
194 /* EOF */