#include "eventlog.h"
+#define NDEBUG
+#include <debug.h>
+
LIST_ENTRY LogHandleListHead;
/* FUNCTIONS ****************************************************************/
ElfCreateBackupLogHandle(PLOGHANDLE *LogHandle,
PUNICODE_STRING FileName)
{
+ PLOGHANDLE lpLogHandle;
+
+ NTSTATUS Status = STATUS_SUCCESS;
+
DPRINT("ElfCreateBackupLogHandle(FileName: %wZ)\n", FileName);
- return STATUS_NOT_IMPLEMENTED;
+
+ lpLogHandle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LOGHANDLE));
+ if (lpLogHandle == NULL)
+ {
+ DPRINT1("Failed to allocate Heap!\n");
+ return STATUS_NO_MEMORY;
+ }
+
+ /* Create the log file */
+ Status = LogfCreate(&lpLogHandle->LogFile,
+ NULL,
+ FileName,
+ 0,
+ 0,
+ FALSE,
+ TRUE);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to create the log file! (Status 0x%08lx)\n", Status);
+ goto Done;
+ }
+
+ /* Set the backup flag */
+ lpLogHandle->Flags |= LOG_HANDLE_BACKUP_FILE;
+
+ /* Get the current record */
+ lpLogHandle->CurrentRecord = LogfGetOldestRecord(lpLogHandle->LogFile);
+
+Done:
+ if (NT_SUCCESS(Status))
+ {
+ /* Append log handle */
+ InsertTailList(&LogHandleListHead, &lpLogHandle->LogHandleListEntry);
+ *LogHandle = lpLogHandle;
+ }
+ else
+ {
+ HeapFree(GetProcessHeap(), 0, lpLogHandle);
+ }
+
+ return Status;
}
PLOGHANDLE ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle)
{
+ PLIST_ENTRY CurrentEntry;
PLOGHANDLE lpLogHandle;
- if (IsListEmpty(&LogHandleListHead))
+ CurrentEntry = LogHandleListHead.Flink;
+ while (CurrentEntry != &LogHandleListHead)
{
- return NULL;
- }
+ lpLogHandle = CONTAINING_RECORD(CurrentEntry,
+ LOGHANDLE,
+ LogHandleListEntry);
+ CurrentEntry = CurrentEntry->Flink;
- lpLogHandle = CONTAINING_RECORD((PLOGHANDLE)EventLogHandle, LOGHANDLE, LogHandleListEntry);
+ if (lpLogHandle == EventLogHandle)
+ return lpLogHandle;
+ }
- return lpLogHandle;
+ return NULL;
}
static NTSTATUS
-ElfDeleteEventLogHandle(IELF_HANDLE EventLogHandle)
+ElfDeleteEventLogHandle(IELF_HANDLE LogHandle)
{
- PLOGHANDLE lpLogHandle = (PLOGHANDLE)EventLogHandle;
+ PLOGHANDLE lpLogHandle;
- if (!ElfGetLogHandleEntryByHandle(lpLogHandle))
+ lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle);
+ if (!lpLogHandle)
+ {
return STATUS_INVALID_HANDLE;
+ }
RemoveEntryList(&lpLogHandle->LogHandleListEntry);
- HeapFree(GetProcessHeap(),0,lpLogHandle);
+ LogfClose(lpLogHandle->LogFile, FALSE);
+
+ HeapFree(GetProcessHeap(), 0, lpLogHandle);
return STATUS_SUCCESS;
}
return STATUS_INVALID_HANDLE;
}
+ /* Fail, if the log file is a backup file */
+ if (lpLogHandle->Flags & LOG_HANDLE_BACKUP_FILE)
+ return STATUS_INVALID_HANDLE;
+
return LogfClearFile(lpLogHandle->LogFile,
(PUNICODE_STRING)BackupFileName);
}
PLOGHANDLE lpLogHandle;
PLOGFILE lpLogFile;
- DPRINT("ElfrNumberOfRecords()");
+ DPRINT("ElfrNumberOfRecords()\n");
lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle);
if (!lpLogHandle)
}
Done:
- for (i = 0; i < NumStrings; i++)
+ if (StringsArrayW != NULL)
{
- if (StringsArrayW[i] != NULL)
+ for (i = 0; i < NumStrings; i++)
{
- if (StringsArrayW[i]->Buffer)
+ if (StringsArrayW[i] != NULL)
{
- RtlFreeUnicodeString(StringsArrayW[i]);
- HeapFree(MyHeap, 0, StringsArrayW[i]);
+ if (StringsArrayW[i]->Buffer)
+ {
+ RtlFreeUnicodeString(StringsArrayW[i]);
+ HeapFree(MyHeap, 0, StringsArrayW[i]);
+ }
}
}
- }
- if (StringsArrayW != NULL)
HeapFree(MyHeap, 0, StringsArrayW);
+ }
RtlFreeUnicodeString(&ComputerNameW);