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