ReactOS 0.4.16-dev-303-g11d5cb8
logfile.c
Go to the documentation of this file.
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
35
36#define FORMAT_BUFFER_SIZE 512
37#define LINE_BUFFER_SIZE 1024
38
39/* FUNCTIONS ****************************************************************/
40
42InitializeSetupActionLog (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 {
61 DeleteFileW(szFileName);
62 }
63
64 hLogFile = CreateFileW(szFileName,
67 NULL,
70 NULL);
72 {
73 hLogFile = NULL;
74 return FALSE;
75 }
76
77 return TRUE;
78}
79
80
83{
84 if (hLogFile != NULL)
85 {
87 hLogFile = NULL;
88 }
89}
90
91
92VOID
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;
108
109 if (hLogFile == NULL)
110 return;
111
112 GetLocalTime(&stTime);
113
114 if (pszMessage)
115 {
116 pszFormatBuffer = HeapAlloc(GetProcessHeap(),
118 FORMAT_BUFFER_SIZE * sizeof(WCHAR));
119 if (pszFormatBuffer == NULL)
120 goto done;
121
122 va_start(args, pszMessage);
123 vsnwprintf(pszFormatBuffer,
125 pszMessage,
126 args);
127 va_end(args);
128 }
129
130 pszLineBuffer = HeapAlloc(GetProcessHeap(),
132 LINE_BUFFER_SIZE * sizeof(WCHAR));
133 if (pszLineBuffer == NULL)
134 goto done;
135
136 _snwprintf(pszLineBuffer,
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,
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(),
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 */
173 0,
174 NULL,
175 FILE_END);
176
178 pszOutputBuffer,
179 ulOutputSize,
180 &dwWritten,
181 NULL);
182
183done:
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 */
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CDECL
Definition: compat.h:29
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define SetFilePointer
Definition: compat.h:743
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define FILE_SHARE_READ
Definition: compat.h:136
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes)
Definition: fileinfo.c:794
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2352
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:286
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
__CRT_INLINE int __cdecl vsnwprintf(wchar_t *s, size_t n, const wchar_t *format, va_list arg)
Definition: stdio.h:931
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
BOOL WINAPI InitializeSetupActionLog(BOOL bDeleteOldLogFile)
Definition: logfile.c:42
HANDLE hLogFile
Definition: logfile.c:34
VOID CDECL pSetupDebugPrint(IN PCWSTR pszFileName, IN INT nLineNumber, IN PCWSTR pszTag, IN PCWSTR pszMessage,...)
Definition: logfile.c:94
#define FORMAT_BUFFER_SIZE
Definition: logfile.c:36
VOID WINAPI TerminateSetupActionLog(VOID)
Definition: logfile.c:82
#define LINE_BUFFER_SIZE
Definition: logfile.c:37
#define OPEN_ALWAYS
Definition: disk.h:70
int _snwprintf(wchar_t *buffer, size_t count, const wchar_t *format,...)
_Use_decl_annotations_ NTSTATUS NTAPI RtlUnicodeToMultiByteN(_Out_ PCHAR MbString, _In_ ULONG MbSize, _Out_opt_ PULONG ResultSize, _In_ PCWCH UnicodeString, _In_ ULONG UnicodeSize)
Definition: nlsboot.c:107
_Use_decl_annotations_ NTSTATUS NTAPI RtlUnicodeToMultiByteSize(_Out_ PULONG MbSize, _In_ PCWCH UnicodeString, _In_ ULONG UnicodeSize)
Definition: nlsboot.c:145
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define GENERIC_WRITE
Definition: nt_native.h:90
#define L(x)
Definition: ntvdm.h:50
_CRTIMP wchar_t *__cdecl wcsncat(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
#define args
Definition: format.c:66
WORD wYear
Definition: winbase.h:930
WORD wMilliseconds
Definition: winbase.h:937
WORD wMonth
Definition: winbase.h:931
WORD wHour
Definition: winbase.h:934
WORD wSecond
Definition: winbase.h:936
WORD wMinute
Definition: winbase.h:935
WORD wDay
Definition: winbase.h:933
Definition: match.c:390
uint16_t * PWSTR
Definition: typedefs.h:56
char * PSTR
Definition: typedefs.h:51
const uint16_t * PCWSTR
Definition: typedefs.h:57
int32_t INT
Definition: typedefs.h:58
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
#define FILE_END
Definition: winbase.h:115
#define WINAPI
Definition: msvc.h:6
__wchar_t WCHAR
Definition: xmlstorage.h:180