[EVENTLOG]
[reactos.git] / reactos / base / services / eventlog / file.c
index 351291c..3dd38af 100644 (file)
 /*
- * COPYRIGHT:        See COPYING in the top level directory
- * PROJECT:          ReactOS
+ * PROJECT:          ReactOS kernel
+ * LICENSE:          GPL - See COPYING in the top level directory
  * FILE:             services/eventlog/file.c
  * PURPOSE:          Event logging service
- * PROGRAMMER:       Saveliy Tretiakov (saveliyt@mail.ru)
+ * COPYRIGHT:        Copyright 2005 Saveliy Tretiakov
+                     Michael Martin
  */
+
+/* INCLUDES *****************************************************************/
+
 #include "eventlog.h"
 
-PLOGFILE _LogListHead = NULL;
-extern HANDLE MyHeap;
+/* GLOBALS ******************************************************************/
+
+static LIST_ENTRY LogFileListHead;
+static CRITICAL_SECTION LogFileListCs;
+
+/* FUNCTIONS ****************************************************************/
 
 BOOL LogfInitializeNew(PLOGFILE LogFile)
 {
     DWORD dwWritten;
-       EOF_RECORD EofRec;
-    
-    ZeroMemory(&LogFile->Header, sizeof(FILE_HEADER));
-       SetFilePointer(LogFile->hFile, 0, NULL, FILE_BEGIN);
-       SetEndOfFile(LogFile->hFile);
-       
-       LogFile->Header.SizeOfHeader = sizeof(FILE_HEADER);
-       LogFile->Header.SizeOfHeader2 = sizeof(FILE_HEADER);
-       LogFile->Header.FirstRecordOffset = sizeof(FILE_HEADER);
-       LogFile->Header.EofOffset = sizeof(FILE_HEADER);
-       LogFile->Header.MajorVersion = MAJORVER;
-       LogFile->Header.MinorVersion = MINORVER;
-       LogFile->Header.NextRecord = 1;
-
-       LogFile->Header.Signature = LOGFILE_SIGNATURE;
-       WriteFile(LogFile->hFile,
-                         &LogFile->Header,
-                         sizeof(FILE_HEADER),
-                         &dwWritten,
-                         NULL);
-
-       EofRec.Ones = 0x11111111;
-       EofRec.Twos = 0x22222222;
-       EofRec.Threes = 0x33333333;
-       EofRec.Fours = 0x44444444;
-       EofRec.Size1 = sizeof(EOF_RECORD);
-       EofRec.Size2 = sizeof(EOF_RECORD);
-       EofRec.NextRecordNumber = LogFile->Header.NextRecord;
-       EofRec.OldestRecordNumber = LogFile->Header.OldestRecord;
-       EofRec.StartOffset = LogFile->Header.FirstRecordOffset;
-       EofRec.EndOffset = LogFile->Header.EofOffset;
-
-       WriteFile(LogFile->hFile, &EofRec, sizeof(EOF_RECORD), &dwWritten, NULL);
-
-       FlushFileBuffers(LogFile->hFile);
-      
+    EVENTLOGEOF EofRec;
+
+    ZeroMemory(&LogFile->Header, sizeof(EVENTLOGHEADER));
+    SetFilePointer(LogFile->hFile, 0, NULL, FILE_BEGIN);
+    SetEndOfFile(LogFile->hFile);
+
+    LogFile->Header.HeaderSize = sizeof(EVENTLOGHEADER);
+    LogFile->Header.EndHeaderSize = sizeof(EVENTLOGHEADER);
+    LogFile->Header.StartOffset = sizeof(EVENTLOGHEADER);
+    LogFile->Header.EndOffset = sizeof(EVENTLOGHEADER);
+    LogFile->Header.MajorVersion = MAJORVER;
+    LogFile->Header.MinorVersion = MINORVER;
+    LogFile->Header.CurrentRecordNumber = 1;
+    /* 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;
+    if (!WriteFile(LogFile->hFile,
+                   &LogFile->Header,
+                   sizeof(EVENTLOGHEADER),
+                   &dwWritten,
+                   NULL))
+    {
+        DPRINT1("WriteFile failed:%d!\n", GetLastError());
+        return FALSE;
+    }
+
+    EofRec.Ones = 0x11111111;
+    EofRec.Twos = 0x22222222;
+    EofRec.Threes = 0x33333333;
+    EofRec.Fours = 0x44444444;
+    EofRec.RecordSizeBeginning = sizeof(EVENTLOGEOF);
+    EofRec.RecordSizeEnd = sizeof(EVENTLOGEOF);
+    EofRec.CurrentRecordNumber = LogFile->Header.CurrentRecordNumber;
+    EofRec.OldestRecordNumber = LogFile->Header.OldestRecordNumber;
+    EofRec.BeginRecord = LogFile->Header.StartOffset;
+    EofRec.EndRecord = LogFile->Header.EndOffset;
+
+    if (!WriteFile(LogFile->hFile,
+                   &EofRec,
+                   sizeof(EVENTLOGEOF),
+                   &dwWritten,
+                   NULL))
+    {
+        DPRINT1("WriteFile failed:%d!\n", GetLastError());
+        return FALSE;
+    }
+
+    if (!FlushFileBuffers(LogFile->hFile))
+    {
+        DPRINT1("FlushFileBuffers failed:%d!\n", GetLastError());
+        return FALSE;
+    }
+
     return TRUE;
 }
 
 BOOL LogfInitializeExisting(PLOGFILE LogFile)
 {
-       DWORD dwRead;
-       DWORD dwRecordsNumber = 0;
-       DWORD dwRecSize, dwRecSign, dwFilePointer;
-       PDWORD pdwRecSize2;
-       PEVENTLOGRECORD RecBuf;
-
-       SetFilePointer(LogFile->hFile, 0, NULL, FILE_BEGIN);
-       ReadFile(LogFile->hFile, 
-             &LogFile->Header, 
-             sizeof(FILE_HEADER), 
-             &dwRead, NULL);
-             
-       if(dwRead != sizeof(FILE_HEADER))
-       {
-               DPRINT("EventLog: Invalid file %S.\n", LogFile->FileName);
-               return LogfInitializeNew(LogFile);
-    }
-    
-       if(LogFile->Header.SizeOfHeader != sizeof(FILE_HEADER) ||
-               LogFile->Header.SizeOfHeader2 != sizeof(FILE_HEADER))
-       {
-               DPRINT("EventLog: Invalid header size in %S.\n", LogFile->FileName);
-               return LogfInitializeNew(LogFile);
-    }
-    
-    if(LogFile->Header.Signature != LOGFILE_SIGNATURE)
-    {
-        DPRINT("EventLog: Invalid signature %x in %S.\n", 
-               LogFile->Header.Signature,
-               LogFile->FileName);
+    DWORD dwRead;
+    DWORD dwRecordsNumber = 0;
+    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)
+    {
+        DPRINT1("SetFilePointer failed! %d\n", GetLastError());
+        return FALSE;
+    }
+
+    if (!ReadFile(LogFile->hFile,
+                  &LogFile->Header,
+                  sizeof(EVENTLOGHEADER),
+                  &dwRead,
+                  NULL))
+    {
+        DPRINT1("ReadFile failed! %d\n", GetLastError());
+        return FALSE;
+    }
+
+    if (dwRead != sizeof(EVENTLOGHEADER))
+    {
+        DPRINT("EventLog: Invalid file %S.\n", LogFile->FileName);
         return LogfInitializeNew(LogFile);
     }
 
-       if(LogFile->Header.EofOffset > GetFileSize(LogFile->hFile, NULL)+1)
-       {
-        DPRINT("EventLog: Invalid eof offset %x in %S.\n", 
-               LogFile->Header.EofOffset,
-               LogFile->FileName);
+    if (LogFile->Header.HeaderSize != sizeof(EVENTLOGHEADER) ||
+        LogFile->Header.EndHeaderSize != sizeof(EVENTLOGHEADER))
+    {
+        DPRINT("EventLog: Invalid header size in %S.\n", LogFile->FileName);
+        return LogfInitializeNew(LogFile);
+    }
+
+    if (LogFile->Header.Signature != LOGFILE_SIGNATURE)
+    {
+        DPRINT("EventLog: Invalid signature %x in %S.\n",
+               LogFile->Header.Signature, LogFile->FileName);
         return LogfInitializeNew(LogFile);
-       }
-
-       for(;;)
-       {
-               dwFilePointer = SetFilePointer(LogFile->hFile, 
-                                                                          0, 
-                                                                          NULL, 
-                                                                          FILE_CURRENT);
-
-               ReadFile(LogFile->hFile, 
-                                &dwRecSize, 
-                                sizeof(dwRecSize), 
-                                &dwRead, 
-                                NULL);
-
-               if(dwRead != sizeof(dwRecSize))
-                       break;
-
-               ReadFile(LogFile->hFile,
-                                &dwRecSign,
-                                sizeof(dwRecSign),
-                                &dwRead,
-                                NULL);
-               
-               if(dwRead != sizeof(dwRecSize))
-                       break;
-               
-               if(dwRecSign != LOGFILE_SIGNATURE ||
-                  dwRecSize + dwFilePointer > GetFileSize(LogFile->hFile, NULL)+1 ||
-                  dwRecSize < sizeof(EVENTLOGRECORD))
-               {
-                       break;
-               }
-               
-               SetFilePointer(LogFile->hFile, -((LONG)sizeof(DWORD)*2), NULL, FILE_CURRENT);
-               RecBuf = (PEVENTLOGRECORD) HeapAlloc(MyHeap, 0, dwRecSize);
-               ReadFile(LogFile->hFile,
-                                RecBuf,
-                                dwRecSize,
-                                &dwRead,
-                                NULL);         
-               
-               if(dwRead !=  dwRecSize)
-               {
-                       HeapFree(MyHeap, 0, RecBuf);
-                       break;
-               }
-
-               pdwRecSize2 = (PDWORD)(((PBYTE)RecBuf)+dwRecSize-4);
-               if(*pdwRecSize2 != dwRecSize)
-               {
-                       DPRINT("EventLog: Invalid size2 of record %d (%x) in %s\n", 
-                               dwRecordsNumber,
-                               *pdwRecSize2,
-                               LogFile->LogName);
-                       HeapFree(MyHeap, 0, RecBuf);
-                       break;
-               }
-
-               dwRecordsNumber++;
-               
-               if(!LogfAddOffsetInformation(LogFile, RecBuf->RecordNumber, dwFilePointer))
-               {
-                       HeapFree(MyHeap, 0, RecBuf);
-                       return FALSE;
-               }
-
-               HeapFree(MyHeap, 0, RecBuf);
-       }//for(;;)
-
-       LogFile->Header.NextRecord = dwRecordsNumber+1;
-       LogFile->Header.OldestRecord = dwRecordsNumber ? 1 : 0; //FIXME
-
-       SetFilePointer(LogFile->hFile, 0, 0, FILE_CURRENT);
-       WriteFile(LogFile->hFile,
-                         &LogFile->Header,
-                         sizeof(FILE_HEADER),
-                         &dwRead, 
-                         NULL);
-       FlushFileBuffers(LogFile->hFile);
-       
-       return TRUE;
+    }
+
+    if (LogFile->Header.EndOffset > GetFileSize(LogFile->hFile, NULL) + 1)
+    {
+        DPRINT("EventLog: Invalid eof offset %x in %S.\n",
+               LogFile->Header.EndOffset, LogFile->FileName);
+        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);
+
+        if (dwFilePointer == INVALID_SET_FILE_POINTER)
+        {
+            DPRINT1("SetFilePointer failed! %d\n", GetLastError());
+            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),
+                      &dwRead,
+                      NULL))
+        {
+            DPRINT1("ReadFile failed! %d\n", GetLastError());
+            return FALSE;
+        }
+
+        if (dwRead != sizeof(dwRecSize))
+            break;
+
+        if (!ReadFile(LogFile->hFile,
+                      &dwRecSign,
+                      sizeof(dwRecSign),
+                      &dwRead,
+                      NULL))
+        {
+            DPRINT1("ReadFile() failed! %d\n", GetLastError());
+            return FALSE;
+        }
+
+        if (dwRead != sizeof(dwRecSize))
+            break;
+
+        if (dwRecSign != LOGFILE_SIGNATURE ||
+            dwRecSize + dwFilePointer > GetFileSize(LogFile->hFile, NULL) + 1 ||
+            dwRecSize < sizeof(EVENTLOGRECORD))
+        {
+            break;
+        }
+
+        if (SetFilePointer(LogFile->hFile,
+                           -((LONG) sizeof(DWORD) * 2),
+                           NULL,
+                           FILE_CURRENT) == INVALID_SET_FILE_POINTER)
+        {
+            DPRINT1("SetFilePointer() failed! %d", GetLastError());
+            return FALSE;
+        }
+
+        RecBuf = (PEVENTLOGRECORD) HeapAlloc(MyHeap, 0, dwRecSize);
+
+        if (!RecBuf)
+        {
+            DPRINT1("Can't allocate heap!\n");
+            return FALSE;
+        }
+
+        if (!ReadFile(LogFile->hFile, RecBuf, dwRecSize, &dwRead, NULL))
+        {
+            DPRINT1("ReadFile() failed! %d\n", GetLastError());
+            HeapFree(MyHeap, 0, RecBuf);
+            return FALSE;
+        }
+
+        if (dwRead != dwRecSize)
+        {
+            HeapFree(MyHeap, 0, RecBuf);
+            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)
+        {
+            DPRINT1("Invalid RecordSizeEnd of record %d (%x) in %S\n",
+                    dwRecordsNumber, *pdwRecSize2, LogFile->LogName);
+            HeapFree(MyHeap, 0, RecBuf);
+            break;
+        }
+
+        dwRecordsNumber++;
+
+        if (!LogfAddOffsetInformation(LogFile,
+                                      RecBuf->RecordNumber,
+                                      dwFilePointer))
+        {
+            DPRINT1("LogfAddOffsetInformation() failed!\n");
+            HeapFree(MyHeap, 0, RecBuf);
+            return FALSE;
+        }
+
+        HeapFree(MyHeap, 0, RecBuf);
+    }
+
+    LogFile->Header.CurrentRecordNumber = dwRecordsNumber + LogFile->Header.OldestRecordNumber;
+    if (LogFile->Header.CurrentRecordNumber == 0)
+        LogFile->Header.CurrentRecordNumber = 1;
+
+    /* 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_BEGIN) ==
+        INVALID_SET_FILE_POINTER)
+    {
+        DPRINT1("SetFilePointer() failed! %d\n", GetLastError());
+        return FALSE;
+    }
+
+    if (!WriteFile(LogFile->hFile,
+                   &LogFile->Header,
+                   sizeof(EVENTLOGHEADER),
+                   &dwRead,
+                   NULL))
+    {
+        DPRINT1("WriteFile failed! %d\n", GetLastError());
+        return FALSE;
+    }
+
+    if (!FlushFileBuffers(LogFile->hFile))
+    {
+        DPRINT1("FlushFileBuffers failed! %d\n", GetLastError());
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
-PLOGFILE LogfCreate(WCHAR *LogName, 
-                    WCHAR *FileName)
+PLOGFILE LogfCreate(WCHAR * LogName, WCHAR * FileName)
 {
     PLOGFILE LogFile;
-       BOOL bResult, bCreateNew = FALSE;
-    
-    LogFile = HeapAlloc(MyHeap, 
-                        HEAP_ZERO_MEMORY, 
-                        sizeof(LOGFILE));
-    if(!LogFile)
-    {
-        DbgPrint("EventLog: Can't allocate heap\n");
+    BOOL bResult, bCreateNew = FALSE;
+
+    LogFile = (LOGFILE *) HeapAlloc(MyHeap, HEAP_ZERO_MEMORY, sizeof(LOGFILE));
+    if (!LogFile)
+    {
+        DPRINT1("Can't allocate heap!\n");
         return NULL;
     }
-    
-    LogFile->hFile = CreateFile(FileName, 
-                                GENERIC_READ | GENERIC_WRITE, 
-                                FILE_SHARE_READ, 
-                                NULL, 
+
+    LogFile->hFile = CreateFile(FileName,
+                                GENERIC_READ | GENERIC_WRITE,
+                                FILE_SHARE_READ,
+                                NULL,
                                 OPEN_ALWAYS,
-                                FILE_ATTRIBUTE_NORMAL | 
-                                FILE_FLAG_RANDOM_ACCESS,
+                                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
                                 NULL);
-       
-    if(LogFile->hFile == INVALID_HANDLE_VALUE)
-    {
-               DbgPrint("EventLog: Can't open file %S.\n", FileName);
-        HeapFree(MyHeap, 0, LogFile); 
-               return NULL;
-       }
-       
-       bCreateNew = GetLastError() == ERROR_ALREADY_EXISTS ? FALSE : TRUE;
-       
-       LogFile->LogName = HeapAlloc(MyHeap,
-                                    HEAP_ZERO_MEMORY,
-                                    (lstrlenW(LogName)+1)*sizeof(WCHAR));
-    if(LogFile->LogName)
-               lstrcpyW(LogFile->LogName, LogName);
-       else 
-       {
-               DPRINT("EventLog: Can't allocate heap\n");
-               HeapFree(MyHeap, 0, LogFile);
-               return NULL;
-       }
-    
-       LogFile->FileName = HeapAlloc(MyHeap,
-                                    HEAP_ZERO_MEMORY,
-                                    (lstrlenW(FileName)+1)*sizeof(WCHAR));
-    if(LogFile->FileName)
-               lstrcpyW(LogFile->FileName, FileName);
-       else
-       {
-               DPRINT("EventLog: Can't allocate heap\n");
-               HeapFree(MyHeap, 0, LogFile->LogName);
-               HeapFree(MyHeap, 0, LogFile);
-               return NULL;
-       }
-
-
-       LogFile->OffsetInfo = (PEVENT_OFFSET_INFO) 
-               HeapAlloc(MyHeap, 
-                                 HEAP_ZERO_MEMORY,
-                                 sizeof(EVENT_OFFSET_INFO)*64);
-
-       if(!LogFile->OffsetInfo)
-       {
-               DPRINT("EventLog: Can't allocate heap\n");
-               HeapFree(MyHeap, 0, LogFile->FileName);
-               HeapFree(MyHeap, 0, LogFile->LogName);
-               HeapFree(MyHeap, 0, LogFile);
-               return NULL;
-       }
-
-       LogFile->OffsetInfoSize = 64;
-
-       if(bCreateNew)
-               bResult = LogfInitializeNew(LogFile);
-       else bResult = LogfInitializeExisting(LogFile);
-
-       if(!bResult)
-       {
-               HeapFree(MyHeap, 0, LogFile->OffsetInfo);
-               HeapFree(MyHeap, 0, LogFile->FileName);
-               HeapFree(MyHeap, 0, LogFile->LogName);
-               HeapFree(MyHeap, 0, LogFile);
-               return NULL;
-       }
-    
+
+    if (LogFile->hFile == INVALID_HANDLE_VALUE)
+    {
+        DPRINT1("Can't create file %S.\n", FileName);
+        HeapFree(MyHeap, 0, LogFile);
+        return NULL;
+    }
+
+    bCreateNew = (GetLastError() == ERROR_ALREADY_EXISTS) ? FALSE : TRUE;
+
+    LogFile->LogName =
+        (WCHAR *) HeapAlloc(MyHeap,
+                            HEAP_ZERO_MEMORY,
+                            (lstrlenW(LogName) + 1) * sizeof(WCHAR));
+
+    if (LogFile->LogName)
+        lstrcpyW(LogFile->LogName, LogName);
+    else
+    {
+        DPRINT1("Can't allocate heap\n");
+        HeapFree(MyHeap, 0, LogFile);
+        return NULL;
+    }
+
+    LogFile->FileName =
+        (WCHAR *) HeapAlloc(MyHeap,
+                            HEAP_ZERO_MEMORY,
+                            (lstrlenW(FileName) + 1) * sizeof(WCHAR));
+
+    if (LogFile->FileName)
+        lstrcpyW(LogFile->FileName, FileName);
+    else
+    {
+        DPRINT1("Can't allocate heap\n");
+        goto fail;
+    }
+
+    LogFile->OffsetInfo =
+        (PEVENT_OFFSET_INFO) HeapAlloc(MyHeap,
+                                       HEAP_ZERO_MEMORY,
+                                       sizeof(EVENT_OFFSET_INFO) * 64);
+
+    if (!LogFile->OffsetInfo)
+    {
+        DPRINT1("Can't allocate heap\n");
+        goto fail;
+    }
+
+    LogFile->OffsetInfoSize = 64;
+
+    if (bCreateNew)
+        bResult = LogfInitializeNew(LogFile);
+    else
+        bResult = LogfInitializeExisting(LogFile);
+
+    if (!bResult)
+        goto fail;
+
     InitializeCriticalSection(&LogFile->cs);
     LogfListAddItem(LogFile);
     return LogFile;
+
+  fail:
+    if (LogFile)
+    {
+        if (LogFile->OffsetInfo)
+            HeapFree(MyHeap, 0, LogFile->OffsetInfo);
+
+        if (LogFile->FileName)
+            HeapFree(MyHeap, 0, LogFile->FileName);
+
+        if (LogFile->LogName)
+            HeapFree(MyHeap, 0, LogFile->LogName);
+
+        HeapFree(MyHeap, 0, LogFile);
+    }
+
+    return NULL;
 }
 
 VOID LogfClose(PLOGFILE LogFile)
 {
-       if(LogFile == NULL)
-               return;
+    if (LogFile == NULL)
+        return;
 
     EnterCriticalSection(&LogFile->cs);
-    
+
     FlushFileBuffers(LogFile->hFile);
     CloseHandle(LogFile->hFile);
-    
     LogfListRemoveItem(LogFile);
+
     DeleteCriticalSection(&LogFile->cs);
-    
+
     HeapFree(MyHeap, 0, LogFile->LogName);
     HeapFree(MyHeap, 0, LogFile->FileName);
-       HeapFree(MyHeap, 0, LogFile->OffsetInfo);
+    HeapFree(MyHeap, 0, LogFile->OffsetInfo);
     HeapFree(MyHeap, 0, LogFile);
-    
+
     return;
 }
 
-PLOGFILE LogfListHead()
+VOID LogfCloseAll(VOID)
 {
-    return _LogListHead;
+    while (!IsListEmpty(&LogFileListHead))
+    {
+        LogfClose(LogfListHead());
+    }
+
+    DeleteCriticalSection(&LogFileListCs);
 }
 
-PLOGFILE LogfListItemByName(WCHAR *Name)
+VOID LogfListInitialize(VOID)
 {
-    PLOGFILE Item;
-    Item = LogfListHead();
-    while(Item)
+    InitializeCriticalSection(&LogFileListCs);
+    InitializeListHead(&LogFileListHead);
+}
+
+PLOGFILE LogfListHead(VOID)
+{
+    return CONTAINING_RECORD(LogFileListHead.Flink, LOGFILE, ListEntry);
+}
+
+PLOGFILE LogfListItemByName(WCHAR * Name)
+{
+    PLIST_ENTRY CurrentEntry;
+    PLOGFILE Result = NULL;
+
+    EnterCriticalSection(&LogFileListCs);
+
+    CurrentEntry = LogFileListHead.Flink;
+    while (CurrentEntry != &LogFileListHead)
     {
-        if(Item->LogName && lstrcmpW(Item->LogName, Name)==0)
-            return Item;
-        Item = (PLOGFILE)Item->Next;
+        PLOGFILE Item = CONTAINING_RECORD(CurrentEntry,
+                                          LOGFILE,
+                                          ListEntry);
+
+        if (Item->LogName && !lstrcmpi(Item->LogName, Name))
+        {
+            Result = Item;
+            break;
+        }
+
+        CurrentEntry = CurrentEntry->Flink;
     }
-    return NULL;
+
+    LeaveCriticalSection(&LogFileListCs);
+    return Result;
 }
 
-PLOGFILE LogfListItemByIndex(INT Index)
+/* Index starting from 1 */
+INT LogfListItemIndexByName(WCHAR * Name)
 {
-    INT i = 0;
-    PLOGFILE Item;
-    Item = LogfListHead();
-    while(Item)
+    PLIST_ENTRY CurrentEntry;
+    INT Result = 0;
+    INT i = 1;
+
+    EnterCriticalSection(&LogFileListCs);
+
+    CurrentEntry = LogFileListHead.Flink;
+    while (CurrentEntry != &LogFileListHead)
     {
-        if(i == Index) 
-            return Item;
+        PLOGFILE Item = CONTAINING_RECORD(CurrentEntry,
+                                          LOGFILE,
+                                          ListEntry);
+
+        if (Item->LogName && !lstrcmpi(Item->LogName, Name))
+        {
+            Result = i;
+            break;
+        }
+
+        CurrentEntry = CurrentEntry->Flink;
         i++;
-        Item = (PLOGFILE)Item->Next;
     }
-    return NULL;
+
+    LeaveCriticalSection(&LogFileListCs);
+    return Result;
 }
 
-INT LogfListItemCount()
+/* Index starting from 1 */
+PLOGFILE LogfListItemByIndex(INT Index)
 {
-    PLOGFILE Item = NULL;
+    PLIST_ENTRY CurrentEntry;
+    PLOGFILE Result = NULL;
     INT i = 1;
-    Item = LogfListHead();
-    if(Item)
-    { 
-        while(Item->Next)
+
+    EnterCriticalSection(&LogFileListCs);
+
+    CurrentEntry = LogFileListHead.Flink;
+    while (CurrentEntry != &LogFileListHead)
+    {
+        if (i == Index)
         {
-            i++;
-            Item = (PLOGFILE) Item->Next;
+            Result = CONTAINING_RECORD(CurrentEntry, LOGFILE, ListEntry);
+            break;
         }
-        return i;
+
+        CurrentEntry = CurrentEntry->Flink;
+        i++;
     }
-    else return 0;
+
+    LeaveCriticalSection(&LogFileListCs);
+    return Result;
 }
 
-VOID LogfListAddItem(PLOGFILE Item)
+INT LogfListItemCount()
 {
-    PLOGFILE List;
-       
-       List = LogfListHead();
-    
-       if(List)
-    {
-        while(List->Next) 
-            List = (PLOGFILE)List->Next;
-        Item->Prev = (PVOID)List;
-        Item->Next = NULL;
-        InterlockedExchange((PLONG)&List->Next, (LONG)Item);
-    }
-    else {
-        Item->Next = NULL;
-        Item->Prev = NULL;
-        InterlockedExchange((PLONG)&_LogListHead, (LONG)Item);
+    PLIST_ENTRY CurrentEntry;
+    INT i = 0;
+
+    EnterCriticalSection(&LogFileListCs);
+
+    CurrentEntry = LogFileListHead.Flink;
+    while (CurrentEntry != &LogFileListHead)
+    {
+        CurrentEntry = CurrentEntry->Flink;
+        i++;
     }
+
+    LeaveCriticalSection(&LogFileListCs);
+    return i;
+}
+
+VOID LogfListAddItem(PLOGFILE Item)
+{
+    EnterCriticalSection(&LogFileListCs);
+    InsertTailList(&LogFileListHead, &Item->ListEntry);
+    LeaveCriticalSection(&LogFileListCs);
 }
 
 VOID LogfListRemoveItem(PLOGFILE Item)
 {
-    if(Item->Prev)
-    {
-        InterlockedExchange((PLONG)&((PLOGFILE)Item->Prev)->Next,
-                            (LONG)Item->Next);
-    }
-    else {
-        InterlockedExchange((PLONG)&_LogListHead, (LONG)Item->Next);
-    }
+    EnterCriticalSection(&LogFileListCs);
+    RemoveEntryList(&Item->ListEntry);
+    LeaveCriticalSection(&LogFileListCs);
 }
 
-BOOL LogfReadEvent(PLOGFILE LogFile,
+DWORD LogfReadEvent(PLOGFILE LogFile,
                    DWORD Flags,
-                   DWORD RecordNumber,
+                   DWORD RecordNumber,
                    DWORD BufSize,
                    PBYTE Buffer,
-                   DWORD *BytesRead,
-                   DWORD *BytesNeeded)
+                   DWORD * BytesRead,
+                   DWORD * BytesNeeded)
 {
-       DWORD dwOffset, dwRead, dwRecSize;
-       DWORD dwBufferUsage = 0, dwRecNum;
-
-       if(Flags & EVENTLOG_FORWARDS_READ &&
-          Flags & EVENTLOG_BACKWARDS_READ)
-       {
-               return FALSE;
-       }
-
-       if(!(Flags & EVENTLOG_FORWARDS_READ) &&
-               !(Flags & EVENTLOG_BACKWARDS_READ))
-       {
-               return FALSE;
-       }
-
-       if(!Buffer || !BytesRead || !BytesNeeded)
-       {
-               return FALSE;
-       }
-       
-       dwRecNum = RecordNumber;
-       EnterCriticalSection(&LogFile->cs);
-       dwOffset = LogfOffsetByNumber(LogFile, dwRecNum);
-       
-       if(!dwOffset)
-       {
-               LeaveCriticalSection(&LogFile->cs);
-               return FALSE;
-       }
-
-       SetFilePointer(LogFile->hFile, dwOffset, NULL, FILE_BEGIN);
-       ReadFile(LogFile->hFile, &dwRecSize, sizeof(DWORD), &dwRead, NULL);
-       if(dwRecSize > BufSize)
-       {
-               *BytesRead = 0;
-               *BytesNeeded = dwRecSize;
-               SetLastError(ERROR_INSUFFICIENT_BUFFER);
-               LeaveCriticalSection(&LogFile->cs);
-               return FALSE;
-       }
-
-       SetFilePointer(LogFile->hFile, 
-                                  -((LONG)sizeof(DWORD)), 
-                                  NULL, 
-                                  FILE_CURRENT);
-
-       ReadFile(LogFile->hFile, Buffer, dwRecSize, &dwRead, NULL);
-       dwBufferUsage+=dwRead;
-
-       while(dwBufferUsage<BufSize)
-       {
-               if(Flags & EVENTLOG_FORWARDS_READ)
-                       dwRecNum++;
-               else dwRecNum--;
-
-               dwOffset = LogfOffsetByNumber(LogFile, dwRecNum);
-               if(!dwOffset) break;
-
-               SetFilePointer(LogFile->hFile, dwOffset, NULL, FILE_BEGIN);
-               ReadFile(LogFile->hFile, &dwRecSize, sizeof(DWORD), &dwRead, NULL);
-               if(dwBufferUsage+dwRecSize>BufSize)break;
-
-               SetFilePointer(LogFile->hFile, 
-                                          -((LONG)sizeof(DWORD)),
-                                          NULL,
-                                          FILE_CURRENT);
-               
-               ReadFile(LogFile->hFile, 
-                                Buffer+dwBufferUsage,
-                                dwRecSize,
-                                &dwRead,
-                                NULL);
-
-               dwBufferUsage+=dwRead;
-       }
-
-       *BytesRead = dwBufferUsage;
-       LeaveCriticalSection(&LogFile->cs);
-       return TRUE;
+    DWORD dwOffset, dwRead, dwRecSize;
+    DWORD dwBufferUsage = 0, dwRecNum;
+
+    if (Flags & EVENTLOG_FORWARDS_READ && Flags & EVENTLOG_BACKWARDS_READ)
+        return ERROR_INVALID_PARAMETER;
+
+    if (!(Flags & EVENTLOG_FORWARDS_READ) && !(Flags & EVENTLOG_BACKWARDS_READ))
+        return ERROR_INVALID_PARAMETER;
+
+    if (!Buffer || !BytesRead || !BytesNeeded)
+        return ERROR_INVALID_PARAMETER;
+
+    if ((*RecordNumber==0) && !(EVENTLOG_SEQUENTIAL_READ))
+    {
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    dwRecNum = *RecordNumber;
+    EnterCriticalSection(&LogFile->cs);
+
+    *BytesRead = 0;
+    *BytesNeeded = 0;
+
+    dwOffset = LogfOffsetByNumber(LogFile, dwRecNum);
+
+    if (!dwOffset)
+    {
+        LeaveCriticalSection(&LogFile->cs);
+        return ERROR_HANDLE_EOF;
+    }
+
+    if (SetFilePointer(LogFile->hFile, dwOffset, NULL, FILE_BEGIN) ==
+        INVALID_SET_FILE_POINTER)
+    {
+        DPRINT1("SetFilePointer() failed!\n");
+        goto Done;
+    }
+
+    if (!ReadFile(LogFile->hFile, &dwRecSize, sizeof(DWORD), &dwRead, NULL))
+    {
+        DPRINT1("ReadFile() failed!\n");
+        goto Done;
+    }
+
+    if (dwRecSize > BufSize)
+    {
+        *BytesNeeded = dwRecSize;
+        LeaveCriticalSection(&LogFile->cs);
+        return ERROR_INSUFFICIENT_BUFFER;
+    }
+
+    if (SetFilePointer(LogFile->hFile,
+                       -((LONG) sizeof(DWORD)),
+                       NULL,
+                       FILE_CURRENT) == INVALID_SET_FILE_POINTER)
+    {
+        DPRINT1("SetFilePointer() failed!\n");
+        goto Done;
+    }
+
+    if (!ReadFile(LogFile->hFile, Buffer, dwRecSize, &dwRead, NULL))
+    {
+        DPRINT1("ReadFile() failed!\n");
+        goto Done;
+    }
+
+    dwBufferUsage += dwRead;
+
+    while (dwBufferUsage <= BufSize)
+    {
+        if (Flags & EVENTLOG_FORWARDS_READ)
+            dwRecNum++;
+        else
+            dwRecNum--;
+
+        dwOffset = LogfOffsetByNumber(LogFile, dwRecNum);
+        if (!dwOffset)
+            break;
+
+        if (SetFilePointer(LogFile->hFile, dwOffset, NULL, FILE_BEGIN) ==
+            INVALID_SET_FILE_POINTER)
+        {
+            DPRINT1("SetFilePointer() failed!\n");
+            goto Done;
+        }
+
+        if (!ReadFile(LogFile->hFile,
+                      &dwRecSize,
+                      sizeof(DWORD),
+                      &dwRead,
+                      NULL))
+        {
+            DPRINT1("ReadFile() failed!\n");
+            goto Done;
+        }
+
+        if (dwBufferUsage + dwRecSize > BufSize)
+            break;
+
+        if (SetFilePointer(LogFile->hFile,
+                           -((LONG) sizeof(DWORD)),
+                           NULL,
+                           FILE_CURRENT) == INVALID_SET_FILE_POINTER)
+        {
+            DPRINT1("SetFilePointer() failed!\n");
+            goto Done;
+        }
+
+        if (!ReadFile(LogFile->hFile,
+                      Buffer + dwBufferUsage,
+                      dwRecSize,
+                      &dwRead,
+                      NULL))
+        {
+            DPRINT1("ReadFile() failed!\n");
+            goto Done;
+        }
+
+        dwBufferUsage += dwRead;
+    }
+
+    *BytesRead = dwBufferUsage;
+    * RecordNumber = dwRecNum;
+    LeaveCriticalSection(&LogFile->cs);
+    return ERROR_SUCCESS;
+
+Done:
+    DPRINT1("LogfReadEvent failed with %x\n",GetLastError());
+    LeaveCriticalSection(&LogFile->cs);
+    return GetLastError();
 }
 
-BOOL LogfWriteData(PLOGFILE LogFile,
-                    DWORD BufSize,
-                    PBYTE Buffer)
+BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
 {
-       DWORD dwWritten;
-       SYSTEMTIME st;
-       EOF_RECORD EofRec;
-       BOOL bResult;
-
-       if(!Buffer)
-       {
-               return FALSE;
-       }
-
-       GetSystemTime(&st);
-       SystemTimeToEventTime(&st, &((PEVENTLOGRECORD)Buffer)->TimeWritten);
-       
-       EnterCriticalSection(&LogFile->cs);
-
-       SetFilePointer(LogFile->hFile, LogFile->Header.EofOffset, NULL, FILE_BEGIN);
-       WriteFile(LogFile->hFile, Buffer, BufSize, &dwWritten, NULL);
-
-       if(BufSize != dwWritten)
-       {
-               LeaveCriticalSection(&LogFile->cs);
-               return FALSE;
-       }
-
-       if(!LogfAddOffsetInformation(LogFile, 
-                       LogFile->Header.NextRecord, 
-                       LogFile->Header.EofOffset))
-       {
-               LeaveCriticalSection(&LogFile->cs);
-               return FALSE;
-       }
-
-       LogFile->Header.NextRecord++;
-       LogFile->Header.EofOffset += dwWritten;
-       
-       if(LogFile->Header.OldestRecord == 0)
-               LogFile->Header.OldestRecord = 1;
-
-       EofRec.Ones = 0x11111111;
-       EofRec.Twos = 0x22222222;
-       EofRec.Threes = 0x33333333;
-       EofRec.Fours = 0x44444444;
-       EofRec.Size1 = sizeof(EOF_RECORD);
-       EofRec.Size2 = sizeof(EOF_RECORD);
-       EofRec.NextRecordNumber = LogFile->Header.NextRecord;
-       EofRec.OldestRecordNumber = LogFile->Header.OldestRecord;
-       EofRec.StartOffset = LogFile->Header.FirstRecordOffset;
-       EofRec.EndOffset = LogFile->Header.EofOffset;
-
-       WriteFile(LogFile->hFile, &EofRec, sizeof(EOF_RECORD), &dwWritten, NULL);
-
-       SetFilePointer(LogFile->hFile, 0, NULL, FILE_BEGIN);
-       bResult = WriteFile(LogFile->hFile, 
-               &LogFile->Header, 
-               sizeof(FILE_HEADER), 
-               &dwWritten, 
-               NULL);
-
-       if(!bResult)
-       {
-               DPRINT("WriteFile failed! LastError = %d\n", GetLastError());
-               LeaveCriticalSection(&LogFile->cs);
-               return FALSE;
-       }
-       
-       if(!FlushFileBuffers(LogFile->hFile))
-               DPRINT("FlushFileBuffers() failed!\n");
-
-       LeaveCriticalSection(&LogFile->cs);
-       return TRUE;
-}    
-
-ULONG LogfOffsetByNumber(PLOGFILE LogFile,
-                                                DWORD RecordNumber)
-/* Returns NULL if nothing found. */
+    DWORD dwWritten;
+    DWORD dwRead;
+    SYSTEMTIME st;
+    EVENTLOGEOF EofRec;
+    PEVENTLOGRECORD RecBuf;
+    LARGE_INTEGER logFileSize;
+    ULONG RecOffSet;
+    ULONG WriteOffSet;
+
+    if (!Buffer)
+        return FALSE;
+
+    GetSystemTime(&st);
+    SystemTimeToEventTime(&st, &((PEVENTLOGRECORD) Buffer)->TimeWritten);
+
+    EnterCriticalSection(&LogFile->cs);
+
+    if (!GetFileSizeEx(LogFile->hFile, &logFileSize))
+    {
+        LeaveCriticalSection(&LogFile->cs);
+        return FALSE;
+    }
+
+    /* 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");
+
+            if (!RecBuf)
+            {
+                DPRINT1("Failed to allocate buffer for OldestRecord!\n");
+                HeapFree(GetProcessHeap(), 0, RecBuf);
+                LeaveCriticalSection(&LogFile->cs);
+                return FALSE;
+            }
+
+            /* Get the oldest record data */
+            RecOffSet = LogfOffsetByNumber(LogFile, LogFile->Header.OldestRecordNumber);
+
+            if (SetFilePointer(LogFile->hFile,
+                               RecOffSet,
+                               NULL,
+                               FILE_BEGIN) == INVALID_SET_FILE_POINTER)
+            {
+                DPRINT1("SetFilePointer() failed! %d\n", GetLastError());
+                HeapFree(GetProcessHeap(), 0, RecBuf);
+                LeaveCriticalSection(&LogFile->cs);
+                return FALSE;
+            }
+
+            if (!ReadFile(LogFile->hFile, RecBuf, sizeof(EVENTLOGRECORD), &dwRead, NULL))
+            {
+                DPRINT1("ReadFile() failed!\n");
+                HeapFree(GetProcessHeap(), 0, RecBuf);
+                LeaveCriticalSection(&LogFile->cs);
+                return FALSE;
+            }
+
+            if (RecBuf->Reserved != LOGFILE_SIGNATURE)
+            {
+                DPRINT1("LogFile corrupt!\n");
+                LeaveCriticalSection(&LogFile->cs);
+                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 (OverWriteLength >= BufSize)
+            {
+                DPRINT("Record will fit. Lenght %d, BufSize %d\n", OverWriteLength, BufSize);
+                LogFile->Header.StartOffset = LogfOffsetByNumber(LogFile, LogFile->Header.OldestRecordNumber);
+                break;
+            }
+        }
+        HeapFree(GetProcessHeap(), 0, RecBuf);
+    }
+    else
+        WriteOffSet = LogFile->Header.EndOffset;
+
+    if (SetFilePointer(LogFile->hFile,
+                       WriteOffSet,
+                       NULL,
+                       FILE_BEGIN) == INVALID_SET_FILE_POINTER)
+    {
+        DPRINT1("SetFilePointer() failed! %d\n", GetLastError());
+        LeaveCriticalSection(&LogFile->cs);
+        return FALSE;
+    }
+
+    if (!WriteFile(LogFile->hFile, Buffer, BufSize, &dwWritten, NULL))
+    {
+        DPRINT1("WriteFile() failed! %d\n", GetLastError());
+        LeaveCriticalSection(&LogFile->cs);
+        return FALSE;
+    }
+
+    if (!LogfAddOffsetInformation(LogFile,
+                                  LogFile->Header.CurrentRecordNumber,
+                                  WriteOffSet))
+    {
+        LeaveCriticalSection(&LogFile->cs);
+        return FALSE;
+    }
+
+    LogFile->Header.CurrentRecordNumber++;
+
+    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;
+    EofRec.Fours = 0x44444444;
+    EofRec.RecordSizeBeginning = sizeof(EVENTLOGEOF);
+    EofRec.RecordSizeEnd = sizeof(EVENTLOGEOF);
+    EofRec.CurrentRecordNumber = LogFile->Header.CurrentRecordNumber;
+    EofRec.OldestRecordNumber = LogFile->Header.OldestRecordNumber;
+    EofRec.BeginRecord = LogFile->Header.StartOffset;
+    EofRec.EndRecord = LogFile->Header.EndOffset;
+
+    if (!WriteFile(LogFile->hFile,
+                   &EofRec,
+                   sizeof(EVENTLOGEOF),
+                   &dwWritten,
+                   NULL))
+    {
+        DPRINT1("WriteFile() failed! %d\n", GetLastError());
+        LeaveCriticalSection(&LogFile->cs);
+        return FALSE;
+    }
+
+    if (SetFilePointer(LogFile->hFile, 0, NULL, FILE_BEGIN) ==
+        INVALID_SET_FILE_POINTER)
+    {
+        DPRINT1("SetFilePointer() failed! %d\n", GetLastError());
+        LeaveCriticalSection(&LogFile->cs);
+        return FALSE;
+    }
+
+    if (!WriteFile(LogFile->hFile,
+                   &LogFile->Header,
+                   sizeof(EVENTLOGHEADER),
+                   &dwWritten,
+                   NULL))
+    {
+        DPRINT1("WriteFile failed! LastError = %d\n", GetLastError());
+        LeaveCriticalSection(&LogFile->cs);
+        return FALSE;
+    }
+
+    if (!FlushFileBuffers(LogFile->hFile))
+    {
+        LeaveCriticalSection(&LogFile->cs);
+        DPRINT1("FlushFileBuffers() failed! %d\n", GetLastError());
+        return FALSE;
+    }
+
+    LeaveCriticalSection(&LogFile->cs);
+    return TRUE;
+}
+
+ULONG LogfOffsetByNumber(PLOGFILE LogFile, DWORD RecordNumber)
+
+/* Returns 0 if nothing found. */
 {
-       DWORD i;
-       for(i = 0; i < LogFile->OffsetInfoNext; i++)
-               if(LogFile->OffsetInfo[i].EventNumber == RecordNumber)
-                       return LogFile->OffsetInfo[i].EventOffset;
-       return 0;
+    DWORD i;
+
+    for (i = 0; i < LogFile->OffsetInfoNext; i++)
+    {
+        if (LogFile->OffsetInfo[i].EventNumber == RecordNumber)
+            return LogFile->OffsetInfo[i].EventOffset;
+    }
+    return 0;
 }
 
 DWORD LogfGetOldestRecord(PLOGFILE LogFile)
 {
-       return LogFile->Header.OldestRecord;
+    return LogFile->Header.OldestRecordNumber;
 }
 
-BOOL LogfAddOffsetInformation(PLOGFILE LogFile, 
-                                                         ULONG ulNumber,
-                                                         ULONG ulOffset)
+DWORD LogfGetCurrentRecord(PLOGFILE LogFile)
 {
-       LPVOID NewOffsetInfo;
-       
-       if(LogFile->OffsetInfoNext == LogFile->OffsetInfoSize)
-       {
-               NewOffsetInfo = HeapReAlloc(MyHeap, 
-                                                                       HEAP_ZERO_MEMORY,
-                                                                       LogFile->OffsetInfo,
-                                                                       (LogFile->OffsetInfoSize+64)*
-                                                                       sizeof(EVENT_OFFSET_INFO));
-               if(!NewOffsetInfo)
-               {
-                       DbgPrint("EventLog: Can't reallocate heap.\n");
-                       return FALSE;
-               }
-
-               LogFile->OffsetInfo = (PEVENT_OFFSET_INFO)NewOffsetInfo;
-               LogFile->OffsetInfoSize+=64;
-       }
-
-       LogFile->OffsetInfo[LogFile->OffsetInfoNext].EventNumber = ulNumber;
-       LogFile->OffsetInfo[LogFile->OffsetInfoNext].EventOffset = ulOffset;
-       LogFile->OffsetInfoNext++;
-
-       return TRUE;
+    return LogFile->Header.CurrentRecordNumber;
+}
+
+BOOL LogfDeleteOffsetInformation(PLOGFILE LogFile, ULONG ulNumber)
+{
+    int i;
+
+    if (ulNumber != LogFile->OffsetInfo[0].EventNumber)
+    {
+        return FALSE;
+    }
+
+    for (i=0;i<LogFile->OffsetInfoNext-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;
+
+    if (LogFile->OffsetInfoNext == LogFile->OffsetInfoSize)
+    {
+        NewOffsetInfo = HeapReAlloc(MyHeap,
+                                    HEAP_ZERO_MEMORY,
+                                    LogFile->OffsetInfo,
+                                    (LogFile->OffsetInfoSize + 64) *
+                                        sizeof(EVENT_OFFSET_INFO));
+
+        if (!NewOffsetInfo)
+        {
+            DPRINT1("Can't reallocate heap.\n");
+            return FALSE;
+        }
+
+        LogFile->OffsetInfo = (PEVENT_OFFSET_INFO) NewOffsetInfo;
+        LogFile->OffsetInfoSize += 64;
+    }
+
+    LogFile->OffsetInfo[LogFile->OffsetInfoNext].EventNumber = ulNumber;
+    LogFile->OffsetInfo[LogFile->OffsetInfoNext].EventOffset = ulOffset;
+    LogFile->OffsetInfoNext++;
+
+    return TRUE;
 }
 
-DWORD LogfBuildNewRecord(PBYTE Buffer, 
-                                                DWORD dwRecordNumber,
-                                                WORD wType,
-                                                WORD wCategory,
-                                                DWORD dwEventId,
-                                                LPCWSTR SourceName,
-                                                LPCWSTR ComputerName,
-                                                DWORD dwSidLength,
-                                                PSID lpUserSid,
-                                                WORD wNumStrings,
-                                                WCHAR *lpStrings,
-                                                DWORD dwDataSize,
-                                                LPVOID lpRawData)
+PBYTE LogfAllocAndBuildNewRecord(LPDWORD lpRecSize,
+                                 DWORD   dwRecordNumber,
+                                 WORD    wType,
+                                 WORD    wCategory,
+                                 DWORD   dwEventId,
+                                 LPCWSTR SourceName,
+                                 LPCWSTR ComputerName,
+                                 DWORD   dwSidLength,
+                                 PSID    lpUserSid,
+                                 WORD    wNumStrings,
+                                 WCHAR   * lpStrings,
+                                 DWORD   dwDataSize,
+                                 LPVOID  lpRawData)
 {
-       DWORD dwRecSize;
-       PEVENTLOGRECORD pRec;
-       SYSTEMTIME SysTime;
-       WCHAR *str;
-       UINT i, pos, nStrings;
-
-       dwRecSize = sizeof(EVENTLOGRECORD) + (lstrlenW(ComputerName) + 
-       lstrlenW(SourceName) + 2)*sizeof(WCHAR);
-
-       if(dwRecSize % 4 != 0) dwRecSize += 4 - (dwRecSize % 4);
-       dwRecSize += dwSidLength;
-
-       for(i = 0, str = lpStrings; i < wNumStrings; i++)
-       {
-               dwRecSize += (lstrlenW(str)+1)*sizeof(WCHAR);
-               str += lstrlenW(str)+1;
-       }
-
-       dwRecSize += dwDataSize;
-       if(dwRecSize % 4 != 0) dwRecSize += 4 - (dwRecSize % 4);
-       dwRecSize+=4;
-
-       if(!Buffer)
-       {
-               return dwRecSize;
-       }
-
-       ZeroMemory(Buffer, dwRecSize);
-       pRec = (PEVENTLOGRECORD)Buffer;
-       pRec->Length = dwRecSize;
-       pRec->Reserved = LOGFILE_SIGNATURE;
-       pRec->RecordNumber = dwRecordNumber;
-
-       GetSystemTime(&SysTime);
-       SystemTimeToEventTime(&SysTime, &pRec->TimeGenerated);
-       SystemTimeToEventTime(&SysTime, &pRec->TimeWritten);
-
-       pRec->EventID = dwEventId;
-       pRec->EventType = wType;
-       pRec->NumStrings = wNumStrings;
-       pRec->EventCategory = wCategory;
-
-       pos = sizeof(EVENTLOGRECORD);
-
-       lstrcpyW((WCHAR*)(Buffer+pos), SourceName);
-       pos+=(lstrlenW(SourceName)+1)*sizeof(WCHAR);
-       lstrcpyW((WCHAR*)(Buffer+pos), ComputerName);
-       pos+=(lstrlenW(ComputerName)+1)*sizeof(WCHAR);
-
-       pRec->UserSidOffset = pos;
-       if(dwSidLength)
-       {
-               if(pos % 4 != 0) pos += 4 - (pos % 4);
-               CopyMemory(Buffer+pos, lpUserSid, dwSidLength);
-               pRec->UserSidLength = dwSidLength;
-               pRec->UserSidOffset = pos;
-               pos+=dwSidLength;
-       }
-
-       pRec->StringOffset = pos;
-       for(i = 0, str = lpStrings, nStrings = 0; i < wNumStrings; i++)
-       {
-               lstrcpyW((WCHAR*)(Buffer+pos), str);
-               pos += (lstrlenW(str)+1)*sizeof(WCHAR);
-               str += lstrlenW(str)+1;
-               nStrings++;
-       }
-       pRec->NumStrings = nStrings;
-
-       pRec->DataOffset = pos;
-       if(dwDataSize)
-       {
-               pRec->DataLength = dwDataSize;
-               CopyMemory(Buffer+pos, lpRawData, dwDataSize);
-               pos += dwDataSize;
-       }
-
-       if(pos % 4 != 0) pos += 4 - (pos % 4);
-       *((PDWORD)(Buffer+pos)) = dwRecSize;
-
-       return TRUE;
+    DWORD dwRecSize;
+    PEVENTLOGRECORD pRec;
+    SYSTEMTIME SysTime;
+    WCHAR *str;
+    UINT i, pos, nStrings;
+    PBYTE Buffer;
+
+    dwRecSize =
+        sizeof(EVENTLOGRECORD) + (lstrlenW(ComputerName) +
+                                  lstrlenW(SourceName) + 2) * sizeof(WCHAR);
+
+    if (dwRecSize % 4 != 0)
+        dwRecSize += 4 - (dwRecSize % 4);
+
+    dwRecSize += dwSidLength;
+
+    for (i = 0, str = lpStrings; i < wNumStrings; i++)
+    {
+        dwRecSize += (lstrlenW(str) + 1) * sizeof(WCHAR);
+        str += lstrlenW(str) + 1;
+    }
+
+    dwRecSize += dwDataSize;
+    if (dwRecSize % 4 != 0)
+        dwRecSize += 4 - (dwRecSize % 4);
+
+    dwRecSize += 4;
+
+    Buffer = (BYTE *) HeapAlloc(MyHeap, HEAP_ZERO_MEMORY, dwRecSize);
+
+    if (!Buffer)
+    {
+        DPRINT1("Can't allocate heap!\n");
+        return NULL;
+    }
+
+    pRec = (PEVENTLOGRECORD) Buffer;
+    pRec->Length = dwRecSize;
+    pRec->Reserved = LOGFILE_SIGNATURE;
+    pRec->RecordNumber = dwRecordNumber;
+
+    GetSystemTime(&SysTime);
+    SystemTimeToEventTime(&SysTime, &pRec->TimeGenerated);
+    SystemTimeToEventTime(&SysTime, &pRec->TimeWritten);
+
+    pRec->EventID = dwEventId;
+    pRec->EventType = wType;
+    pRec->NumStrings = wNumStrings;
+    pRec->EventCategory = wCategory;
+
+    pos = sizeof(EVENTLOGRECORD);
+
+    lstrcpyW((WCHAR *) (Buffer + pos), SourceName);
+    pos += (lstrlenW(SourceName) + 1) * sizeof(WCHAR);
+    lstrcpyW((WCHAR *) (Buffer + pos), ComputerName);
+    pos += (lstrlenW(ComputerName) + 1) * sizeof(WCHAR);
+
+    pRec->UserSidOffset = pos;
+    if (dwSidLength)
+    {
+        if (pos % 4 != 0)
+            pos += 4 - (pos % 4);
+        CopyMemory(Buffer + pos, lpUserSid, dwSidLength);
+        pRec->UserSidLength = dwSidLength;
+        pRec->UserSidOffset = pos;
+        pos += dwSidLength;
+    }
+
+    pRec->StringOffset = pos;
+    for (i = 0, str = lpStrings, nStrings = 0; i < wNumStrings; i++)
+    {
+        lstrcpyW((WCHAR *) (Buffer + pos), str);
+        pos += (lstrlenW(str) + 1) * sizeof(WCHAR);
+        str += lstrlenW(str) + 1;
+        nStrings++;
+    }
+    pRec->NumStrings = nStrings;
+
+    pRec->DataOffset = pos;
+    if (dwDataSize)
+    {
+        pRec->DataLength = dwDataSize;
+        CopyMemory(Buffer + pos, lpRawData, dwDataSize);
+        pos += dwDataSize;
+    }
+
+    if (pos % 4 != 0)
+        pos += 4 - (pos % 4);
+
+    *((PDWORD) (Buffer + pos)) = dwRecSize;
+
+    *lpRecSize = dwRecSize;
+    return Buffer;
 }
+
+
+VOID
+LogfReportEvent(WORD wType,
+                WORD wCategory,
+                DWORD dwEventId)
+{
+    WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
+    DWORD dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1;
+    PEVENTSOURCE pEventSource = NULL;
+    PBYTE logBuffer;
+    DWORD lastRec;
+    DWORD recSize;
+    DWORD dwError;
+
+    if (!GetComputerNameW(szComputerName, &dwComputerNameLength))
+    {
+        szComputerName[0] = 0;
+    }
+
+    pEventSource = GetEventSourceByName(L"EventLog");
+    if (pEventSource == NULL)
+    {
+        return;
+    }
+
+    lastRec = LogfGetCurrentRecord(pEventSource->LogFile);
+
+    logBuffer = LogfAllocAndBuildNewRecord(&recSize,
+                                           lastRec,
+                                           wType,
+                                           wCategory,
+                                           dwEventId,
+                                           pEventSource->szName,
+                                           (LPCWSTR)szComputerName,
+                                           0,
+                                           NULL,
+                                           0, //wNumStrings,
+                                           NULL, //lpStrings,
+                                           0, //dwDataSize,
+                                           NULL); //lpRawData);
+
+    dwError = LogfWriteData(pEventSource->LogFile, recSize, logBuffer);
+    if (!dwError)
+    {
+        DPRINT1("ERROR WRITING TO EventLog %S\n", pEventSource->LogFile->FileName);
+    }
+
+    LogfFreeRecord(logBuffer);
+}
\ No newline at end of file