xref: /reactos/dll/win32/syssetup/logfile.c (revision 40462c92)
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 */
195