[EVTLIB]: Allow specifying a memory allocation tag when freeing the allocated buffers (functionality similar to the Ex**WithTag kernel functions).

[EVENTLOG]: Use the previous functionality; use also the internal LogfpAlloc() / LogfpFree() functions when dealing with buffers related to event log files.

svn path=/trunk/; revision=75527
This commit is contained in:
Hermès Bélusca-Maïto 2017-08-11 12:37:15 +00:00
parent bfac984256
commit e7fb5e7c33
4 changed files with 36 additions and 34 deletions

View file

@ -142,7 +142,7 @@ LogfAllocAndBuildNewRecord(PSIZE_T pRecSize,
static __inline void LogfFreeRecord(PEVENTLOGRECORD Record) static __inline void LogfFreeRecord(PEVENTLOGRECORD Record)
{ {
HeapFree(GetProcessHeap(), 0, Record); RtlFreeHeap(GetProcessHeap(), 0, Record);
} }
VOID VOID

View file

@ -167,8 +167,10 @@ LogfpAlloc(IN SIZE_T Size,
static static
VOID NTAPI VOID NTAPI
LogfpFree(IN PVOID Ptr, LogfpFree(IN PVOID Ptr,
IN ULONG Flags) IN ULONG Flags,
IN ULONG Tag)
{ {
UNREFERENCED_PARAMETER(Tag);
RtlFreeHeap(GetProcessHeap(), Flags, Ptr); RtlFreeHeap(GetProcessHeap(), Flags, Ptr);
} }
@ -305,7 +307,7 @@ LogfCreate(PLOGFILE* LogFile,
SIZE_T LogNameLen; SIZE_T LogNameLen;
BOOLEAN CreateNew; BOOLEAN CreateNew;
pLogFile = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*pLogFile)); pLogFile = LogfpAlloc(sizeof(*pLogFile), HEAP_ZERO_MEMORY, TAG_ELF);
if (!pLogFile) if (!pLogFile)
{ {
DPRINT1("Cannot allocate heap!\n"); DPRINT1("Cannot allocate heap!\n");
@ -313,9 +315,7 @@ LogfCreate(PLOGFILE* LogFile,
} }
LogNameLen = (LogName ? wcslen(LogName) : 0) + 1; LogNameLen = (LogName ? wcslen(LogName) : 0) + 1;
pLogFile->LogName = RtlAllocateHeap(GetProcessHeap(), pLogFile->LogName = LogfpAlloc(LogNameLen * sizeof(WCHAR), HEAP_ZERO_MEMORY, 0);
HEAP_ZERO_MEMORY,
LogNameLen * sizeof(WCHAR));
if (pLogFile->LogName == NULL) if (pLogFile->LogName == NULL)
{ {
DPRINT1("Cannot allocate heap\n"); DPRINT1("Cannot allocate heap\n");
@ -412,9 +412,9 @@ Quit:
NtClose(pLogFile->FileHandle); NtClose(pLogFile->FileHandle);
if (pLogFile->LogName) if (pLogFile->LogName)
RtlFreeHeap(GetProcessHeap(), 0, pLogFile->LogName); LogfpFree(pLogFile->LogName, 0, 0);
RtlFreeHeap(GetProcessHeap(), 0, pLogFile); LogfpFree(pLogFile, 0, TAG_ELF);
} }
else else
{ {
@ -440,11 +440,11 @@ LogfClose(PLOGFILE LogFile,
ElfCloseFile(&LogFile->LogFile); ElfCloseFile(&LogFile->LogFile);
NtClose(LogFile->FileHandle); NtClose(LogFile->FileHandle);
RtlFreeHeap(GetProcessHeap(), 0, LogFile->LogName); LogfpFree(LogFile->LogName, 0, 0);
RtlDeleteResource(&LogFile->Lock); RtlDeleteResource(&LogFile->Lock);
RtlFreeHeap(GetProcessHeap(), 0, LogFile); LogfpFree(LogFile, 0, TAG_ELF);
return; return;
} }
@ -583,7 +583,7 @@ ReadRecord(IN PEVTLOGFILE LogFile,
if (BytesNeeded) if (BytesNeeded)
*BytesNeeded = 0; *BytesNeeded = 0;
UnicodeBuffer = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, BufSize); UnicodeBuffer = LogfpAlloc(BufSize, HEAP_ZERO_MEMORY, TAG_ELF_BUF);
if (UnicodeBuffer == NULL) if (UnicodeBuffer == NULL)
{ {
DPRINT1("Alloc failed!\n"); DPRINT1("Alloc failed!\n");
@ -705,7 +705,7 @@ ReadRecord(IN PEVTLOGFILE LogFile,
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
Quit: Quit:
RtlFreeHeap(GetProcessHeap(), 0, UnicodeBuffer); LogfpFree(UnicodeBuffer, 0, TAG_ELF_BUF);
return Status; return Status;
} }

View file

@ -2,8 +2,8 @@
* PROJECT: ReactOS EventLog File Library * PROJECT: ReactOS EventLog File Library
* LICENSE: GPL - See COPYING in the top level directory * LICENSE: GPL - See COPYING in the top level directory
* FILE: sdk/lib/evtlib/evtlib.c * FILE: sdk/lib/evtlib/evtlib.c
* PURPOSE: Provides a library for reading and writing EventLog files * PURPOSE: Provides functionality for reading and writing
* in the NT <= 5.2 (.evt) format. * EventLog files in the NT <= 5.2 (.evt) format.
* PROGRAMMERS: Copyright 2005 Saveliy Tretiakov * PROGRAMMERS: Copyright 2005 Saveliy Tretiakov
* Michael Martin * Michael Martin
* Hermes Belusca-Maito * Hermes Belusca-Maito
@ -238,7 +238,7 @@ ElfpAddOffsetInformation(
RtlCopyMemory(NewOffsetInfo, RtlCopyMemory(NewOffsetInfo,
LogFile->OffsetInfo, LogFile->OffsetInfo,
LogFile->OffsetInfoSize * sizeof(EVENT_OFFSET_INFO)); LogFile->OffsetInfoSize * sizeof(EVENT_OFFSET_INFO));
LogFile->Free(LogFile->OffsetInfo, 0); LogFile->Free(LogFile->OffsetInfo, 0, TAG_ELF);
} }
LogFile->OffsetInfo = (PEVENT_OFFSET_INFO)NewOffsetInfo; LogFile->OffsetInfo = (PEVENT_OFFSET_INFO)NewOffsetInfo;
LogFile->OffsetInfoSize += OFFSET_INFO_INCREMENT; LogFile->OffsetInfoSize += OFFSET_INFO_INCREMENT;
@ -771,20 +771,20 @@ Continue:
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
EVTLTRACE1("ReadLogBuffer failed (Status 0x%08lx)\n", Status); EVTLTRACE1("ReadLogBuffer failed (Status 0x%08lx)\n", Status);
LogFile->Free(pRecBuf, 0); LogFile->Free(pRecBuf, 0, TAG_ELF_BUF);
return STATUS_EVENTLOG_FILE_CORRUPT; return STATUS_EVENTLOG_FILE_CORRUPT;
} }
if (ReadLength != RecBuf.Length) if (ReadLength != RecBuf.Length)
{ {
DPRINT1("Oh oh!!\n"); DPRINT1("Oh oh!!\n");
LogFile->Free(pRecBuf, 0); LogFile->Free(pRecBuf, 0, TAG_ELF_BUF);
break; break;
} }
// /* If OverWrittenRecords is TRUE and this record has already been read */ // /* If OverWrittenRecords is TRUE and this record has already been read */
// if (OverWrittenRecords && (pRecBuf->RecordNumber == LogFile->Header.OldestRecordNumber)) // if (OverWrittenRecords && (pRecBuf->RecordNumber == LogFile->Header.OldestRecordNumber))
// { // {
// LogFile->Free(pRecBuf, 0); // LogFile->Free(pRecBuf, 0, TAG_ELF_BUF);
// break; // break;
// } // }
@ -794,7 +794,7 @@ Continue:
{ {
EVTLTRACE1("Invalid RecordSizeEnd of record %d (0x%x) in `%wZ'\n", EVTLTRACE1("Invalid RecordSizeEnd of record %d (0x%x) in `%wZ'\n",
RecordNumber, *pRecSize2, &LogFile->FileName); RecordNumber, *pRecSize2, &LogFile->FileName);
LogFile->Free(pRecBuf, 0); LogFile->Free(pRecBuf, 0, TAG_ELF_BUF);
break; break;
} }
@ -807,11 +807,11 @@ Continue:
FileOffset.QuadPart)) FileOffset.QuadPart))
{ {
EVTLTRACE1("ElfpAddOffsetInformation() failed!\n"); EVTLTRACE1("ElfpAddOffsetInformation() failed!\n");
LogFile->Free(pRecBuf, 0); LogFile->Free(pRecBuf, 0, TAG_ELF_BUF);
return STATUS_EVENTLOG_FILE_CORRUPT; return STATUS_EVENTLOG_FILE_CORRUPT;
} }
LogFile->Free(pRecBuf, 0); LogFile->Free(pRecBuf, 0, TAG_ELF_BUF);
if (NextOffset.QuadPart == LogFile->Header.EndOffset) if (NextOffset.QuadPart == LogFile->Header.EndOffset)
{ {
@ -874,7 +874,7 @@ Continue:
NTSTATUS NTSTATUS
NTAPI NTAPI
ElfCreateFile( ElfCreateFile(
IN PEVTLOGFILE LogFile, IN OUT PEVTLOGFILE LogFile,
IN PUNICODE_STRING FileName OPTIONAL, IN PUNICODE_STRING FileName OPTIONAL,
IN ULONG FileSize, IN ULONG FileSize,
IN ULONG MaxSize, IN ULONG MaxSize,
@ -952,14 +952,13 @@ Quit:
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
if (LogFile->OffsetInfo) if (LogFile->OffsetInfo)
LogFile->Free(LogFile->OffsetInfo, 0); LogFile->Free(LogFile->OffsetInfo, 0, TAG_ELF);
if (LogFile->FileName.Buffer) if (LogFile->FileName.Buffer)
LogFile->Free(LogFile->FileName.Buffer, 0); LogFile->Free(LogFile->FileName.Buffer, 0, TAG_ELF);
} }
return Status; return Status;
} }
NTSTATUS NTSTATUS
@ -1071,7 +1070,7 @@ ElfBackupFile(
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
EVTLTRACE1("ReadLogBuffer failed (Status 0x%08lx)\n", Status); EVTLTRACE1("ReadLogBuffer failed (Status 0x%08lx)\n", Status);
LogFile->Free(Buffer, 0); LogFile->Free(Buffer, 0, TAG_ELF_BUF);
// Status = STATUS_EVENTLOG_FILE_CORRUPT; // Status = STATUS_EVENTLOG_FILE_CORRUPT;
goto Quit; goto Quit;
} }
@ -1085,7 +1084,7 @@ ElfBackupFile(
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
EVTLTRACE1("FileWrite() failed (Status 0x%08lx)\n", Status); EVTLTRACE1("FileWrite() failed (Status 0x%08lx)\n", Status);
LogFile->Free(Buffer, 0); LogFile->Free(Buffer, 0, TAG_ELF_BUF);
goto Quit; goto Quit;
} }
@ -1093,7 +1092,7 @@ ElfBackupFile(
Header->EndOffset += RecBuf.Length; Header->EndOffset += RecBuf.Length;
/* Free the buffer */ /* Free the buffer */
LogFile->Free(Buffer, 0); LogFile->Free(Buffer, 0, TAG_ELF_BUF);
Buffer = NULL; Buffer = NULL;
} }
@ -1186,10 +1185,10 @@ ElfCloseFile( // ElfFree
ElfFlushFile(LogFile); ElfFlushFile(LogFile);
/* Free the data */ /* Free the data */
LogFile->Free(LogFile->OffsetInfo, 0); LogFile->Free(LogFile->OffsetInfo, 0, TAG_ELF);
if (LogFile->FileName.Buffer) if (LogFile->FileName.Buffer)
LogFile->Free(LogFile->FileName.Buffer, 0); LogFile->Free(LogFile->FileName.Buffer, 0, TAG_ELF);
RtlInitEmptyUnicodeString(&LogFile->FileName, NULL, 0); RtlInitEmptyUnicodeString(&LogFile->FileName, NULL, 0);
} }

View file

@ -2,8 +2,8 @@
* PROJECT: ReactOS EventLog File Library * PROJECT: ReactOS EventLog File Library
* LICENSE: GPL - See COPYING in the top level directory * LICENSE: GPL - See COPYING in the top level directory
* FILE: sdk/lib/evtlib/evtlib.h * FILE: sdk/lib/evtlib/evtlib.h
* PURPOSE: Provides a library for reading and writing EventLog files * PURPOSE: Provides functionality for reading and writing
* in the NT <= 5.2 (.evt) format. * EventLog files in the NT <= 5.2 (.evt) format.
* PROGRAMMERS: Copyright 2005 Saveliy Tretiakov * PROGRAMMERS: Copyright 2005 Saveliy Tretiakov
* Michael Martin * Michael Martin
* Hermes Belusca-Maito * Hermes Belusca-Maito
@ -12,6 +12,8 @@
#ifndef __EVTLIB_H__ #ifndef __EVTLIB_H__
#define __EVTLIB_H__ #define __EVTLIB_H__
#pragma once
/* PSDK/NDK Headers */ /* PSDK/NDK Headers */
// #define WIN32_NO_STATUS // #define WIN32_NO_STATUS
// #include <windef.h> // #include <windef.h>
@ -157,7 +159,8 @@ typedef PVOID
typedef VOID typedef VOID
(NTAPI *PELF_FREE_ROUTINE)( (NTAPI *PELF_FREE_ROUTINE)(
IN PVOID Ptr, IN PVOID Ptr,
IN ULONG Flags IN ULONG Flags,
IN ULONG Tag
); );
typedef NTSTATUS typedef NTSTATUS
@ -214,7 +217,7 @@ typedef struct _EVTLOGFILE
NTSTATUS NTSTATUS
NTAPI NTAPI
ElfCreateFile( ElfCreateFile(
IN PEVTLOGFILE LogFile, IN OUT PEVTLOGFILE LogFile,
IN PUNICODE_STRING FileName OPTIONAL, IN PUNICODE_STRING FileName OPTIONAL,
IN ULONG FileSize, IN ULONG FileSize,
IN ULONG MaxSize, IN ULONG MaxSize,