2 * PROJECT: ReactOS EventLog File Library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: sdk/lib/evtlib/evtlib.h
5 * PURPOSE: Provides functionality for reading and writing
6 * EventLog files in the NT <= 5.2 (.evt) format.
7 * PROGRAMMERS: Copyright 2005 Saveliy Tretiakov
21 /* PSDK/NDK Headers */
22 // #define WIN32_NO_STATUS
23 // #include <windef.h>
24 // #include <winbase.h>
27 #define NTOS_MODE_USER
28 #include <ndk/rtlfuncs.h>
31 #define ROUND_DOWN(n, align) (((ULONG)n) & ~((align) - 1l))
35 #define ROUND_UP(n, align) ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
39 * Our file format will be compatible with NT's
43 #define LOGFILE_SIGNATURE 0x654c664c // "LfLe"
46 * Flags used in the logfile header
48 #define ELF_LOGFILE_HEADER_DIRTY 1
49 #define ELF_LOGFILE_HEADER_WRAP 2
50 #define ELF_LOGFILE_LOGFULL_WRITTEN 4
51 #define ELF_LOGFILE_ARCHIVE_SET 8
54 * On-disk event log structures (log file header, event record and EOF record).
55 * NOTE: Contrary to what MSDN claims, both the EVENTLOGHEADER and EVENTLOGEOF
56 * structures are absent from winnt.h .
59 #include <pshpack4.h> // pshpack1
62 typedef struct _EVENTLOGHEADER
70 ULONG CurrentRecordNumber
;
71 ULONG OldestRecordNumber
;
76 } EVENTLOGHEADER
, *PEVENTLOGHEADER
;
79 /* Those flags and structure are defined in winnt.h */
83 #define EVENTLOG_SUCCESS 0
84 #define EVENTLOG_ERROR_TYPE 1
85 #define EVENTLOG_WARNING_TYPE 2
86 #define EVENTLOG_INFORMATION_TYPE 4
87 #define EVENTLOG_AUDIT_SUCCESS 8
88 #define EVENTLOG_AUDIT_FAILURE 16
90 typedef struct _EVENTLOGRECORD
92 ULONG Length
; /* Length of full record, including the data portion */
99 USHORT NumStrings
; /* Number of strings in the 'Strings' array */
100 USHORT EventCategory
;
101 USHORT ReservedFlags
;
102 ULONG ClosingRecordNumber
;
106 ULONG DataLength
; /* Length of the data portion */
107 ULONG DataOffset
; /* Offset from beginning of record */
109 * Length-varying data:
111 * WCHAR SourceName[];
112 * WCHAR ComputerName[];
113 * SID UserSid; // Must be aligned on a DWORD boundary
116 * CHAR Pad[]; // Padding for DWORD boundary
117 * ULONG Length; // Same as the first 'Length' member at the beginning
119 } EVENTLOGRECORD
, *PEVENTLOGRECORD
;
125 typedef struct _EVENTLOGEOF
127 ULONG RecordSizeBeginning
;
134 ULONG CurrentRecordNumber
;
135 ULONG OldestRecordNumber
;
137 } EVENTLOGEOF
, *PEVENTLOGEOF
;
139 #define EVENTLOGEOF_SIZE_FIXED (5 * sizeof(ULONG))
140 C_ASSERT(EVENTLOGEOF_SIZE_FIXED
== FIELD_OFFSET(EVENTLOGEOF
, BeginRecord
));
145 typedef struct _EVENT_OFFSET_INFO
149 } EVENT_OFFSET_INFO
, *PEVENT_OFFSET_INFO
;
151 #define TAG_ELF ' flE'
152 #define TAG_ELF_BUF 'BflE'
157 (NTAPI
*PELF_ALLOCATE_ROUTINE
)(
164 (NTAPI
*PELF_FREE_ROUTINE
)(
171 (NTAPI
*PELF_FILE_READ_ROUTINE
)(
172 IN
struct _EVTLOGFILE
* LogFile
,
173 IN PLARGE_INTEGER FileOffset
,
176 OUT PSIZE_T ReadLength OPTIONAL
180 (NTAPI
*PELF_FILE_WRITE_ROUTINE
)(
181 IN
struct _EVTLOGFILE
* LogFile
,
182 IN PLARGE_INTEGER FileOffset
,
185 OUT PSIZE_T WrittenLength OPTIONAL
189 (NTAPI
*PELF_FILE_SET_SIZE_ROUTINE
)(
190 IN
struct _EVTLOGFILE
* LogFile
,
196 (NTAPI
*PELF_FILE_FLUSH_ROUTINE
)(
197 IN
struct _EVTLOGFILE
* LogFile
,
198 IN PLARGE_INTEGER FileOffset
,
202 typedef struct _EVTLOGFILE
204 PELF_ALLOCATE_ROUTINE Allocate
;
205 PELF_FREE_ROUTINE Free
;
206 PELF_FILE_SET_SIZE_ROUTINE FileSetSize
;
207 PELF_FILE_WRITE_ROUTINE FileWrite
;
208 PELF_FILE_READ_ROUTINE FileRead
;
209 PELF_FILE_FLUSH_ROUTINE FileFlush
;
211 EVENTLOGHEADER Header
;
212 ULONG CurrentSize
; /* Equivalent to the file size, is <= MaxSize and can be extended to MaxSize if needed */
213 UNICODE_STRING FileName
;
214 PEVENT_OFFSET_INFO OffsetInfo
;
215 ULONG OffsetInfoSize
;
216 ULONG OffsetInfoNext
;
218 } EVTLOGFILE
, *PEVTLOGFILE
;
224 IN OUT PEVTLOGFILE LogFile
,
225 IN PUNICODE_STRING FileName OPTIONAL
,
229 IN BOOLEAN CreateNew
,
231 IN PELF_ALLOCATE_ROUTINE Allocate
,
232 IN PELF_FREE_ROUTINE Free
,
233 IN PELF_FILE_SET_SIZE_ROUTINE FileSetSize
,
234 IN PELF_FILE_WRITE_ROUTINE FileWrite
,
235 IN PELF_FILE_READ_ROUTINE FileRead
,
236 IN PELF_FILE_FLUSH_ROUTINE FileFlush
); // What about Seek ??
241 IN PEVTLOGFILE LogFile
);
244 // ElfClearFile(PEVTLOGFILE LogFile);
249 IN PEVTLOGFILE LogFile
,
250 IN PEVTLOGFILE BackupLogFile
);
255 IN PEVTLOGFILE LogFile
);
259 ElfCloseFile( // ElfFree
260 IN PEVTLOGFILE LogFile
);
265 IN PEVTLOGFILE LogFile
,
266 IN ULONG RecordNumber
,
267 OUT PEVENTLOGRECORD Record
,
268 IN SIZE_T BufSize
, // Length
269 OUT PSIZE_T BytesRead OPTIONAL
,
270 OUT PSIZE_T BytesNeeded OPTIONAL
);
275 IN PEVTLOGFILE LogFile
,
276 IN PEVENTLOGRECORD Record
,
282 IN PEVTLOGFILE LogFile
);
287 IN PEVTLOGFILE LogFile
);
292 IN PEVTLOGFILE LogFile
);
295 VOID
PRINT_HEADER(PEVENTLOGHEADER Header
);
301 #endif /* __EVTLIB_H__ */