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
InitializeSetupActionLog(BOOL bDeleteOldLogFile)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
TerminateSetupActionLog(VOID)82 TerminateSetupActionLog(VOID)
83 {
84 if (hLogFile != NULL)
85 {
86 CloseHandle (hLogFile);
87 hLogFile = NULL;
88 }
89 }
90
91
92 VOID
93 CDECL
pSetupDebugPrint(IN PCWSTR pszFileName,IN INT nLineNumber,IN PCWSTR pszTag,IN PCWSTR pszMessage,...)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 */
195