- Log files which are opened when the eventlog service is started are permanent files and will only be closed when the service is stopped. Other log files are closed when their handle is closed.
- Opening a non existing backup log file must fail.
- Opening an existing backup log files opens the file for reading only.
svn path=/trunk/; revision=55279
DPRINT("%S -> %S\n", Buf, Expanded);
DPRINT("%S -> %S\n", Buf, Expanded);
- Status = LogfCreate(&pLogf, LogName, &FileName);
+ Status = LogfCreate(&pLogf, LogName, &FileName, TRUE, FALSE);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to create %S! (Status %08lx)\n", Expanded, Status);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to create %S! (Status %08lx)\n", Expanded, Status);
PEVENT_OFFSET_INFO OffsetInfo;
ULONG OffsetInfoSize;
ULONG OffsetInfoNext;
PEVENT_OFFSET_INFO OffsetInfo;
ULONG OffsetInfoSize;
ULONG OffsetInfoNext;
LIST_ENTRY ListEntry;
} LOGFILE, *PLOGFILE;
LIST_ENTRY ListEntry;
} LOGFILE, *PLOGFILE;
NTSTATUS
LogfCreate(PLOGFILE *Logfile,
WCHAR * LogName,
NTSTATUS
LogfCreate(PLOGFILE *Logfile,
WCHAR * LogName,
- PUNICODE_STRING FileName);
+ PUNICODE_STRING FileName,
+ BOOL Permanent,
+ BOOL Backup);
-VOID LogfClose(PLOGFILE LogFile);
+VOID
+LogfClose(PLOGFILE LogFile,
+ BOOL ForceClose);
NTSTATUS
LogfCreate(PLOGFILE *LogFile,
WCHAR * LogName,
NTSTATUS
LogfCreate(PLOGFILE *LogFile,
WCHAR * LogName,
- PUNICODE_STRING FileName)
+ PUNICODE_STRING FileName,
+ BOOL Permanent,
+ BOOL Backup)
{
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
{
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
NULL);
Status = NtCreateFile(&pLogFile->hFile,
NULL);
Status = NtCreateFile(&pLogFile->hFile,
- GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
+ Backup ? (GENERIC_READ | SYNCHRONIZE) : (GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE),
&ObjectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
&ObjectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
+ Backup ? FILE_OPEN : FILE_OPEN_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
pLogFile->OffsetInfoSize = 64;
pLogFile->OffsetInfoSize = 64;
+ pLogFile->Permanent = Permanent;
+
if (bCreateNew)
bResult = LogfInitializeNew(pLogFile);
else
if (bCreateNew)
bResult = LogfInitializeNew(pLogFile);
else
-VOID LogfClose(PLOGFILE LogFile)
+VOID
+LogfClose(PLOGFILE LogFile,
+ BOOL ForceClose)
{
if (LogFile == NULL)
return;
{
if (LogFile == NULL)
return;
+ if ((ForceClose == FALSE) &&
+ (LogFile->Permanent == TRUE))
+ return;
+
RtlAcquireResourceExclusive(&LogFile->Lock, TRUE);
FlushFileBuffers(LogFile->hFile);
RtlAcquireResourceExclusive(&LogFile->Lock, TRUE);
FlushFileBuffers(LogFile->hFile);
{
while (!IsListEmpty(&LogFileListHead))
{
{
while (!IsListEmpty(&LogFileListHead))
{
- LogfClose(LogfListHead());
+ LogfClose(LogfListHead(), TRUE);
}
DeleteCriticalSection(&LogFileListCs);
}
DeleteCriticalSection(&LogFileListCs);
/* Create the log file */
Status = LogfCreate(&lpLogHandle->LogFile,
NULL,
/* Create the log file */
Status = LogfCreate(&lpLogHandle->LogFile,
NULL,
+ FileName,
+ FALSE,
+ TRUE);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to create the log file! (Status 0x%08lx)\n", Status);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to create the log file! (Status 0x%08lx)\n", Status);
if (!ElfGetLogHandleEntryByHandle(lpLogHandle))
return STATUS_INVALID_HANDLE;
if (!ElfGetLogHandleEntryByHandle(lpLogHandle))
return STATUS_INVALID_HANDLE;
- /* Close the log file if it is a backup file */
- if (lpLogHandle->Flags & LOG_HANDLE_BACKUP_FILE)
- LogfClose(lpLogHandle->LogFile);
+ LogfClose(lpLogHandle->LogFile, FALSE);
RemoveEntryList(&lpLogHandle->LogHandleListEntry);
HeapFree(GetProcessHeap(),0,lpLogHandle);
RemoveEntryList(&lpLogHandle->LogHandleListEntry);
HeapFree(GetProcessHeap(),0,lpLogHandle);