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