[EVENTLOG]
authorEric Kohl <eric.kohl@reactos.org>
Mon, 26 Dec 2011 13:54:05 +0000 (13:54 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Mon, 26 Dec 2011 13:54:05 +0000 (13:54 +0000)
- Replace the log file critical section by a resource and use shared locks for read actions and exclusive locks for write actions.
- Add stubs for clear and backup actions.

svn path=/trunk/; revision=54763

reactos/base/services/eventlog/eventlog.h
reactos/base/services/eventlog/file.c
reactos/base/services/eventlog/rpc.c

index 0de6c87..8ddb361 100644 (file)
@@ -88,7 +88,7 @@ typedef struct _LOGFILE
     EVENTLOGHEADER Header;
     WCHAR *LogName;
     WCHAR *FileName;
-    CRITICAL_SECTION cs;
+    RTL_RESOURCE Lock;
     PEVENT_OFFSET_INFO OffsetInfo;
     ULONG OffsetInfoSize;
     ULONG OffsetInfoNext;
@@ -141,6 +141,14 @@ BOOL LogfWriteData(PLOGFILE LogFile,
                    DWORD BufSize,
                    PBYTE Buffer);
 
+NTSTATUS
+LogfClearFile(PLOGFILE LogFile,
+              PUNICODE_STRING BackupFileName);
+
+NTSTATUS
+LogfBackupFile(PLOGFILE LogFile,
+               PUNICODE_STRING BackupFileName);
+
 PLOGFILE LogfCreate(WCHAR * LogName,
                     WCHAR * FileName);
 
index 245bb6b..8e5c2a1 100644 (file)
@@ -364,7 +364,8 @@ PLOGFILE LogfCreate(WCHAR * LogName, WCHAR * FileName)
     if (!bResult)
         goto fail;
 
-    InitializeCriticalSection(&LogFile->cs);
+    RtlInitializeResource(&LogFile->Lock);
+
     LogfListAddItem(LogFile);
     return LogFile;
 
@@ -391,13 +392,13 @@ VOID LogfClose(PLOGFILE LogFile)
     if (LogFile == NULL)
         return;
 
-    EnterCriticalSection(&LogFile->cs);
+    RtlAcquireResourceExclusive(&LogFile->Lock, TRUE);
 
     FlushFileBuffers(LogFile->hFile);
     CloseHandle(LogFile->hFile);
     LogfListRemoveItem(LogFile);
 
-    DeleteCriticalSection(&LogFile->cs);
+    RtlDeleteResource(&LogFile->Lock);
 
     HeapFree(MyHeap, 0, LogFile->LogName);
     HeapFree(MyHeap, 0, LogFile->FileName);
@@ -727,7 +728,8 @@ DWORD LogfReadEvent(PLOGFILE LogFile,
     }
 
     dwRecNum = *RecordNumber;
-    EnterCriticalSection(&LogFile->cs);
+
+    RtlAcquireResourceShared(&LogFile->Lock, TRUE);
 
     *BytesRead = 0;
     *BytesNeeded = 0;
@@ -736,7 +738,7 @@ DWORD LogfReadEvent(PLOGFILE LogFile,
 
     if (!dwOffset)
     {
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return ERROR_HANDLE_EOF;
     }
 
@@ -756,7 +758,7 @@ DWORD LogfReadEvent(PLOGFILE LogFile,
     if (dwRecSize > BufSize)
     {
         *BytesNeeded = dwRecSize;
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return ERROR_INSUFFICIENT_BUFFER;
     }
 
@@ -857,12 +859,12 @@ DWORD LogfReadEvent(PLOGFILE LogFile,
 
     *BytesRead = dwBufferUsage;
     * RecordNumber = dwRecNum;
-    LeaveCriticalSection(&LogFile->cs);
+    RtlReleaseResource(&LogFile->Lock);
     return ERROR_SUCCESS;
 
 Done:
     DPRINT1("LogfReadEvent failed with %x\n",GetLastError());
-    LeaveCriticalSection(&LogFile->cs);
+    RtlReleaseResource(&LogFile->Lock);
     return GetLastError();
 }
 
@@ -883,11 +885,11 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
     GetSystemTime(&st);
     SystemTimeToEventTime(&st, &((PEVENTLOGRECORD) Buffer)->TimeWritten);
 
-    EnterCriticalSection(&LogFile->cs);
+    RtlAcquireResourceExclusive(&LogFile->Lock, TRUE);
 
     if (!GetFileSizeEx(LogFile->hFile, &logFileSize))
     {
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return FALSE;
     }
 
@@ -906,7 +908,7 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
             {
                 DPRINT1("Failed to allocate buffer for OldestRecord!\n");
                 HeapFree(GetProcessHeap(), 0, RecBuf);
-                LeaveCriticalSection(&LogFile->cs);
+                RtlReleaseResource(&LogFile->Lock);
                 return FALSE;
             }
 
@@ -920,7 +922,7 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
             {
                 DPRINT1("SetFilePointer() failed! %d\n", GetLastError());
                 HeapFree(GetProcessHeap(), 0, RecBuf);
-                LeaveCriticalSection(&LogFile->cs);
+                RtlReleaseResource(&LogFile->Lock);
                 return FALSE;
             }
 
@@ -928,14 +930,14 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
             {
                 DPRINT1("ReadFile() failed!\n");
                 HeapFree(GetProcessHeap(), 0, RecBuf);
-                LeaveCriticalSection(&LogFile->cs);
+                RtlReleaseResource(&LogFile->Lock);
                 return FALSE;
             }
 
             if (RecBuf->Reserved != LOGFILE_SIGNATURE)
             {
                 DPRINT1("LogFile corrupt!\n");
-                LeaveCriticalSection(&LogFile->cs);
+                RtlReleaseResource(&LogFile->Lock);
                 return FALSE;
             }
 
@@ -963,14 +965,14 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
                        FILE_BEGIN) == INVALID_SET_FILE_POINTER)
     {
         DPRINT1("SetFilePointer() failed! %d\n", GetLastError());
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return FALSE;
     }
 
     if (!WriteFile(LogFile->hFile, Buffer, BufSize, &dwWritten, NULL))
     {
         DPRINT1("WriteFile() failed! %d\n", GetLastError());
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return FALSE;
     }
 
@@ -978,7 +980,7 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
                                   LogFile->Header.CurrentRecordNumber,
                                   WriteOffSet))
     {
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return FALSE;
     }
 
@@ -997,7 +999,7 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
                        FILE_BEGIN) == INVALID_SET_FILE_POINTER)
     {
         DPRINT1("SetFilePointer() failed! %d\n", GetLastError());
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return FALSE;
     }
 
@@ -1019,7 +1021,7 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
                    NULL))
     {
         DPRINT1("WriteFile() failed! %d\n", GetLastError());
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return FALSE;
     }
 
@@ -1027,7 +1029,7 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
         INVALID_SET_FILE_POINTER)
     {
         DPRINT1("SetFilePointer() failed! %d\n", GetLastError());
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return FALSE;
     }
 
@@ -1038,21 +1040,55 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
                    NULL))
     {
         DPRINT1("WriteFile failed! LastError = %d\n", GetLastError());
-        LeaveCriticalSection(&LogFile->cs);
+        RtlReleaseResource(&LogFile->Lock);
         return FALSE;
     }
 
     if (!FlushFileBuffers(LogFile->hFile))
     {
-        LeaveCriticalSection(&LogFile->cs);
         DPRINT1("FlushFileBuffers() failed! %d\n", GetLastError());
+        RtlReleaseResource(&LogFile->Lock);
         return FALSE;
     }
 
-    LeaveCriticalSection(&LogFile->cs);
+    RtlReleaseResource(&LogFile->Lock);
     return TRUE;
 }
 
+
+NTSTATUS
+LogfClearFile(PLOGFILE LogFile,
+              PUNICODE_STRING BackupFileName)
+{
+    RtlAcquireResourceExclusive(&LogFile->Lock, TRUE);
+
+    if (BackupFileName->Length > 0)
+    {
+        /* FIXME: Write a backup file */
+    }
+
+    LogfInitializeNew(LogFile);
+
+    RtlReleaseResource(&LogFile->Lock);
+
+    return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+LogfBackupFile(PLOGFILE LogFile,
+               PUNICODE_STRING BackupFileName)
+{
+//    RtlAcquireResourceShared(&LogFile->Lock, TRUE);
+
+    /* FIXME: Write a backup file */
+
+//    RtlReleaseResource(&LogFile->Lock);
+
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+
 /* Returns 0 if nothing found. */
 ULONG LogfOffsetByNumber(PLOGFILE LogFile, DWORD RecordNumber)
 {
index 91a0f77..8c7ec4e 100644 (file)
@@ -161,7 +161,8 @@ NTSTATUS ElfrClearELFW(
     PRPC_UNICODE_STRING BackupFileName)
 {
     PLOGHANDLE lpLogHandle;
-    PLOGFILE lpLogFile;
+
+    DPRINT("ElfrClearELFW()\n");
 
     lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle);
     if (!lpLogHandle)
@@ -169,16 +170,8 @@ NTSTATUS ElfrClearELFW(
         return STATUS_INVALID_HANDLE;
     }
 
-    lpLogFile = lpLogHandle->LogFile;
-
-    if (BackupFileName->Length > 0)
-    {
-        /* FIXME: Write a backup file */
-    }
-
-    LogfInitializeNew(lpLogFile);
-
-    return STATUS_SUCCESS;
+    return LogfClearFile(lpLogHandle->LogFile,
+                         (PUNICODE_STRING)BackupFileName);
 }
 
 
@@ -187,10 +180,21 @@ NTSTATUS ElfrBackupELFW(
     IELF_HANDLE LogHandle,
     PRPC_UNICODE_STRING BackupFileName)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    PLOGHANDLE lpLogHandle;
+
+    DPRINT("ElfrBackupELFW()\n");
+
+    lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle);
+    if (!lpLogHandle)
+    {
+        return STATUS_INVALID_HANDLE;
+    }
+
+    return LogfBackupFile(lpLogHandle->LogFile,
+                          (PUNICODE_STRING)BackupFileName);
 }
 
+
 /* Function 2 */
 NTSTATUS ElfrCloseEL(
     IELF_HANDLE *LogHandle)
@@ -279,6 +283,8 @@ NTSTATUS ElfrChangeNotify(
     RPC_CLIENT_ID ClientId,
     DWORD Event)
 {
+    DPRINT("ElfrChangeNotify()");
+
     UNIMPLEMENTED;
     return STATUS_NOT_IMPLEMENTED;
 }