[EVENTLOG]
[reactos.git] / reactos / base / services / eventlog / eventlog.h
1 /*
2 * PROJECT: ReactOS kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/services/eventlog/eventlog.h
5 * PURPOSE: Event logging service
6 * COPYRIGHT: Copyright 2005 Saveliy Tretiakov
7 */
8
9 #ifndef __EVENTLOG_H__
10 #define __EVENTLOG_H__
11
12 #include <stdarg.h>
13
14 /* PSDK/NDK Headers */
15 #define WIN32_NO_STATUS
16 #include <windef.h>
17 #include <winbase.h>
18
19 #define NTOS_MODE_USER
20 #include <ndk/rtlfuncs.h>
21 #include <ndk/obfuncs.h>
22
23 #define ROUND_DOWN(n, align) (((ULONG)n) & ~((align) - 1l))
24 #define ROUND_UP(n, align) ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
25
26 #include <eventlogrpc_s.h>
27 #include <strsafe.h>
28
29 typedef struct _IO_ERROR_LPC
30 {
31 PORT_MESSAGE Header;
32 IO_ERROR_LOG_MESSAGE Message;
33 } IO_ERROR_LPC, *PIO_ERROR_LPC;
34
35
36 /*
37 * Our file format will be compatible with NT's
38 */
39 #define MAJORVER 1
40 #define MINORVER 1
41 #define LOGFILE_SIGNATURE 0x654c664c
42
43 /*
44 * Flags used in logfile header
45 */
46 #define ELF_LOGFILE_HEADER_DIRTY 1
47 #define ELF_LOGFILE_HEADER_WRAP 2
48 #define ELF_LOGFILE_LOGFULL_WRITTEN 4
49 #define ELF_LOGFILE_ARCHIVE_SET 8
50
51 /* FIXME: MSDN reads that the following two structs are in winnt.h. Are they? */
52 typedef struct _EVENTLOGHEADER
53 {
54 ULONG HeaderSize;
55 ULONG Signature;
56 ULONG MajorVersion;
57 ULONG MinorVersion;
58 ULONG StartOffset;
59 ULONG EndOffset;
60 ULONG CurrentRecordNumber;
61 ULONG OldestRecordNumber;
62 ULONG MaxSize;
63 ULONG Flags;
64 ULONG Retention;
65 ULONG EndHeaderSize;
66 } EVENTLOGHEADER, *PEVENTLOGHEADER;
67
68 typedef struct _EVENTLOGEOF
69 {
70 ULONG RecordSizeBeginning;
71 ULONG Ones;
72 ULONG Twos;
73 ULONG Threes;
74 ULONG Fours;
75 ULONG BeginRecord;
76 ULONG EndRecord;
77 ULONG CurrentRecordNumber;
78 ULONG OldestRecordNumber;
79 ULONG RecordSizeEnd;
80 } EVENTLOGEOF, *PEVENTLOGEOF;
81
82 typedef struct _EVENT_OFFSET_INFO
83 {
84 ULONG EventNumber;
85 ULONG EventOffset;
86 } EVENT_OFFSET_INFO, *PEVENT_OFFSET_INFO;
87
88 typedef struct _LOGFILE
89 {
90 HANDLE hFile;
91 EVENTLOGHEADER Header;
92 WCHAR *LogName;
93 WCHAR *FileName;
94 RTL_RESOURCE Lock;
95 PEVENT_OFFSET_INFO OffsetInfo;
96 ULONG OffsetInfoSize;
97 ULONG OffsetInfoNext;
98 BOOL Permanent;
99 LIST_ENTRY ListEntry;
100 } LOGFILE, *PLOGFILE;
101
102 typedef struct _EVENTSOURCE
103 {
104 LIST_ENTRY EventSourceListEntry;
105 PLOGFILE LogFile;
106 WCHAR szName[1];
107 } EVENTSOURCE, *PEVENTSOURCE;
108
109
110 /* Log Handle Flags */
111 #define LOG_HANDLE_BACKUP_FILE 1
112
113 typedef struct _LOGHANDLE
114 {
115 LIST_ENTRY LogHandleListEntry;
116 PEVENTSOURCE EventSource;
117 PLOGFILE LogFile;
118 ULONG CurrentRecord;
119 ULONG Flags;
120 WCHAR szName[1];
121 } LOGHANDLE, *PLOGHANDLE;
122
123
124 /* eventlog.c */
125 extern HANDLE MyHeap;
126 extern PEVENTSOURCE EventLogSource;
127
128 VOID PRINT_HEADER(PEVENTLOGHEADER header);
129 VOID PRINT_RECORD(PEVENTLOGRECORD pRec);
130
131
132 /* eventsource.c */
133 VOID InitEventSourceList(VOID);
134
135 BOOL
136 LoadEventSources(HKEY hKey,
137 PLOGFILE pLogFile);
138
139 PEVENTSOURCE
140 GetEventSourceByName(LPCWSTR Name);
141
142
143 /* file.c */
144 VOID LogfListInitialize(VOID);
145
146 DWORD LogfListItemCount(VOID);
147
148 PLOGFILE LogfListItemByIndex(DWORD Index);
149
150 PLOGFILE LogfListItemByName(LPCWSTR Name);
151
152 // DWORD LogfListItemIndexByName(WCHAR * Name);
153
154
155
156 DWORD LogfReadEvent(PLOGFILE LogFile,
157 DWORD Flags,
158 DWORD * RecordNumber,
159 DWORD BufSize,
160 PBYTE Buffer,
161 DWORD * BytesRead,
162 DWORD * BytesNeeded,
163 BOOL Ansi);
164
165 BOOL LogfWriteData(PLOGFILE LogFile,
166 DWORD BufSize,
167 PBYTE Buffer);
168
169 NTSTATUS
170 LogfClearFile(PLOGFILE LogFile,
171 PUNICODE_STRING BackupFileName);
172
173 NTSTATUS
174 LogfBackupFile(PLOGFILE LogFile,
175 PUNICODE_STRING BackupFileName);
176
177 NTSTATUS
178 LogfCreate(PLOGFILE *Logfile,
179 WCHAR * LogName,
180 PUNICODE_STRING FileName,
181 ULONG ulMaxSize,
182 ULONG ulRetention,
183 BOOL Permanent,
184 BOOL Backup);
185
186 VOID
187 LogfClose(PLOGFILE LogFile,
188 BOOL ForceClose);
189
190 VOID LogfCloseAll(VOID);
191
192 DWORD LogfGetOldestRecord(PLOGFILE LogFile);
193
194 DWORD LogfGetCurrentRecord(PLOGFILE LogFile);
195
196 PBYTE
197 LogfAllocAndBuildNewRecord(PULONG lpRecSize,
198 ULONG dwRecordNumber, // FIXME!
199 USHORT wType,
200 USHORT wCategory,
201 ULONG dwEventId,
202 PCWSTR SourceName,
203 PCWSTR ComputerName,
204 ULONG dwSidLength,
205 PSID lpUserSid,
206 USHORT wNumStrings,
207 WCHAR* lpStrings,
208 ULONG dwDataSize,
209 PVOID lpRawData);
210
211 static __inline void LogfFreeRecord(LPVOID Rec)
212 {
213 HeapFree(MyHeap, 0, Rec);
214 }
215
216 VOID
217 LogfReportEvent(USHORT wType,
218 USHORT wCategory,
219 ULONG dwEventId,
220 USHORT wNumStrings,
221 WCHAR* lpStrings,
222 ULONG dwDataSize,
223 PVOID lpRawData);
224
225
226 /* logport.c */
227 NTSTATUS WINAPI PortThreadRoutine(PVOID Param);
228
229 NTSTATUS InitLogPort(VOID);
230
231 NTSTATUS ProcessPortMessage(VOID);
232
233 /* rpc.c */
234 DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter);
235
236 #endif /* __EVENTLOG_H__ */