From 90e41cf67312ad9bd8b4f43597c1ada721e62835 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Fri, 22 May 2009 10:47:25 +0000 Subject: [PATCH] - Implement internal function LogfDeleteOffsetInformation. - LogfWriteData: Fix record overwriting when the log file has reached MaxSize. Previous implementation was incorrect. - LogfInitializeExisting: Add support for log files that have had old records overwritten with new records. svn path=/trunk/; revision=41041 --- reactos/base/services/eventlog/eventlog.h | 3 + reactos/base/services/eventlog/file.c | 93 ++++++++++++++++++++--- 2 files changed, 84 insertions(+), 12 deletions(-) diff --git a/reactos/base/services/eventlog/eventlog.h b/reactos/base/services/eventlog/eventlog.h index b5f42a847b1..1c3a7972492 100644 --- a/reactos/base/services/eventlog/eventlog.h +++ b/reactos/base/services/eventlog/eventlog.h @@ -149,6 +149,9 @@ BOOL LogfAddOffsetInformation(PLOGFILE LogFile, ULONG ulNumber, ULONG ulOffset); +BOOL LogfDeleteOffsetInformation(PLOGFILE LogFile, + ULONG ulNumber); + PBYTE LogfAllocAndBuildNewRecord(LPDWORD lpRecSize, DWORD dwRecordNumber, WORD wType, diff --git a/reactos/base/services/eventlog/file.c b/reactos/base/services/eventlog/file.c index 2af89c0974f..f97eb0b71d7 100644 --- a/reactos/base/services/eventlog/file.c +++ b/reactos/base/services/eventlog/file.c @@ -4,6 +4,7 @@ * FILE: services/eventlog/file.c * PURPOSE: Event logging service * COPYRIGHT: Copyright 2005 Saveliy Tretiakov + Michael Martin */ /* INCLUDES *****************************************************************/ @@ -33,7 +34,7 @@ BOOL LogfInitializeNew(PLOGFILE LogFile) LogFile->Header.MajorVersion = MAJORVER; LogFile->Header.MinorVersion = MINORVER; LogFile->Header.CurrentRecordNumber = 1; - /* FIXME: Read MaxSize from registry for this LogFile. + /* FIXME: Read MaxSize from registry for this LogFile. But for now limit EventLog size to just under 5K. */ LogFile->Header.MaxSize = 5000; LogFile->Header.Signature = LOGFILE_SIGNATURE; @@ -84,6 +85,9 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) DWORD dwRecSize, dwRecSign, dwFilePointer; PDWORD pdwRecSize2; PEVENTLOGRECORD RecBuf; + BOOL OvewrWrittenRecords = FALSE; + + DPRINT("Initializing LogFile %S\n",LogFile->LogName); if (SetFilePointer(LogFile->hFile, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) @@ -129,6 +133,14 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) return LogfInitializeNew(LogFile); } + /* Set the read location to the oldest record */ + dwFilePointer = SetFilePointer(LogFile->hFile, LogFile->Header.StartOffset, NULL, FILE_BEGIN); + if (dwFilePointer == INVALID_SET_FILE_POINTER) + { + DPRINT1("SetFilePointer failed! %d\n", GetLastError()); + return FALSE; + } + for (;;) { dwFilePointer = SetFilePointer(LogFile->hFile, 0, NULL, FILE_CURRENT); @@ -139,6 +151,14 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) return FALSE; } + /* If the EVENTLOGEOF info has been reached and the oldest record was not immediately after the Header */ + if ((dwFilePointer == LogFile->Header.EndOffset) && (LogFile->Header.StartOffset != sizeof(EVENTLOGHEADER))) + { + OvewrWrittenRecords = TRUE; + /* The file has records that overwrote old ones so read them */ + dwFilePointer = SetFilePointer(LogFile->hFile, sizeof(EVENTLOGHEADER), NULL, FILE_BEGIN); + } + if (!ReadFile(LogFile->hFile, &dwRecSize, sizeof(dwRecSize), @@ -202,6 +222,13 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) break; } + /* if OvewrWrittenRecords is TRUE and this record has already been read */ + if ((OvewrWrittenRecords == TRUE) && (RecBuf->RecordNumber == LogFile->Header.OldestRecordNumber)) + { + HeapFree(MyHeap, 0, RecBuf); + break; + } + pdwRecSize2 = (PDWORD) (((PBYTE) RecBuf) + dwRecSize - 4); if (*pdwRecSize2 != dwRecSize) @@ -224,16 +251,17 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) } HeapFree(MyHeap, 0, RecBuf); - } // for(;;) + } - LogFile->Header.CurrentRecordNumber = dwRecordsNumber + 1; - LogFile->Header.OldestRecordNumber = dwRecordsNumber ? 1 : 0; // FIXME + LogFile->Header.CurrentRecordNumber = dwRecordsNumber + LogFile->Header.OldestRecordNumber; + if (LogFile->Header.CurrentRecordNumber == 0) + LogFile->Header.CurrentRecordNumber = 1; - /* FIXME: Read MaxSize from registry for this LogFile. + /* FIXME: Read MaxSize from registry for this LogFile. But for now limit EventLog size to just under 5K. */ LogFile->Header.MaxSize = 5000; - if (!SetFilePointer(LogFile->hFile, 0, NULL, FILE_CURRENT) == + if (!SetFilePointer(LogFile->hFile, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer() failed! %d\n", GetLastError()); @@ -664,6 +692,8 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer) PEVENTLOGRECORD RecBuf; LARGE_INTEGER logFileSize; ULONG RecOffSet; + ULONG WriteOffSet; + if (!Buffer) return FALSE; @@ -680,11 +710,13 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer) /* If the size of the file is over MaxSize */ if ((logFileSize.QuadPart + BufSize)> LogFile->Header.MaxSize) { + ULONG OverWriteLength = 0; + WriteOffSet = LogfOffsetByNumber(LogFile, LogFile->Header.OldestRecordNumber); RecBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(EVENTLOGRECORD)); /* Determine how many records need to be overwritten */ while (TRUE) { - DPRINT("EventLogFile has reached maximume size\n"); + DPRINT1("EventLogFile has reached maximume size\n"); if (!RecBuf) { @@ -696,6 +728,7 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer) /* Get the oldest record data */ RecOffSet = LogfOffsetByNumber(LogFile, LogFile->Header.OldestRecordNumber); + if (SetFilePointer(LogFile->hFile, RecOffSet, NULL, @@ -721,12 +754,15 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer) return FALSE; } + LogfDeleteOffsetInformation(LogFile,LogFile->Header.OldestRecordNumber); + LogFile->Header.OldestRecordNumber++; + OverWriteLength += RecBuf->Length; /* Check the size of the record as the record adding may be larger */ - if (RecBuf->Length >= BufSize) + if (OverWriteLength >= BufSize) { - DPRINT1("Record will fit\n"); + DPRINT1("Record will fit. Lenght %d, BufSize %d\n", OverWriteLength, BufSize); LogFile->Header.StartOffset = LogfOffsetByNumber(LogFile, LogFile->Header.OldestRecordNumber); break; } @@ -737,9 +773,11 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer) } HeapFree(GetProcessHeap(), 0, RecBuf); } + else + WriteOffSet = LogFile->Header.EndOffset; if (SetFilePointer(LogFile->hFile, - LogFile->Header.EndOffset, + WriteOffSet, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { @@ -757,18 +795,31 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer) if (!LogfAddOffsetInformation(LogFile, LogFile->Header.CurrentRecordNumber, - LogFile->Header.EndOffset)) + WriteOffSet)) { LeaveCriticalSection(&LogFile->cs); return FALSE; } LogFile->Header.CurrentRecordNumber++; - LogFile->Header.EndOffset += dwWritten; if (LogFile->Header.OldestRecordNumber == 0) LogFile->Header.OldestRecordNumber = 1; + if (WriteOffSet == LogFile->Header.EndOffset) + { + LogFile->Header.EndOffset += dwWritten; + } + if (SetFilePointer(LogFile->hFile, + LogFile->Header.EndOffset, + NULL, + FILE_BEGIN) == INVALID_SET_FILE_POINTER) + { + DPRINT1("SetFilePointer() failed! %d\n", GetLastError()); + LeaveCriticalSection(&LogFile->cs); + return FALSE; + } + EofRec.Ones = 0x11111111; EofRec.Twos = 0x22222222; EofRec.Threes = 0x33333333; @@ -845,6 +896,24 @@ DWORD LogfGetCurrentRecord(PLOGFILE LogFile) return LogFile->Header.CurrentRecordNumber; } +BOOL LogfDeleteOffsetInformation(PLOGFILE LogFile, ULONG ulNumber) +{ + int i; + + if (ulNumber != LogFile->OffsetInfo[0].EventNumber) + { + return FALSE; + } + + for (i=0;iOffsetInfoNext-1; i++) + { + LogFile->OffsetInfo[i].EventNumber = LogFile->OffsetInfo[i+1].EventNumber; + LogFile->OffsetInfo[i].EventOffset = LogFile->OffsetInfo[i+1].EventOffset; + } + LogFile->OffsetInfoNext--; + return TRUE; +} + BOOL LogfAddOffsetInformation(PLOGFILE LogFile, ULONG ulNumber, ULONG ulOffset) { LPVOID NewOffsetInfo;