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