strsafe.h++;
[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 BOOL Permanent,
160 BOOL Backup);
161
162 VOID
163 LogfClose(PLOGFILE LogFile,
164 BOOL ForceClose);
165
166 VOID LogfCloseAll(VOID);
167
168 DWORD LogfGetOldestRecord(PLOGFILE LogFile);
169
170 DWORD LogfGetCurrentRecord(PLOGFILE LogFile);
171
172 ULONG LogfOffsetByNumber(PLOGFILE LogFile,
173 DWORD RecordNumber);
174
175 BOOL LogfAddOffsetInformation(PLOGFILE LogFile,
176 ULONG ulNumber,
177 ULONG ulOffset);
178
179 BOOL LogfDeleteOffsetInformation(PLOGFILE LogFile,
180 ULONG ulNumber);
181
182 PBYTE LogfAllocAndBuildNewRecord(LPDWORD lpRecSize,
183 DWORD dwRecordNumber,
184 WORD wType,
185 WORD wCategory,
186 DWORD dwEventId,
187 LPCWSTR SourceName,
188 LPCWSTR ComputerName,
189 DWORD dwSidLength,
190 PSID lpUserSid,
191 WORD wNumStrings,
192 WCHAR * lpStrings,
193 DWORD dwDataSize,
194 LPVOID lpRawData);
195
196 VOID
197 LogfReportEvent(WORD wType,
198 WORD wCategory,
199 DWORD dwEventId,
200 WORD wNumStrings,
201 WCHAR *lpStrings,
202 DWORD dwDataSize,
203 LPVOID lpRawData);
204
205 /* eventlog.c */
206 extern HANDLE MyHeap;
207
208 VOID PRINT_HEADER(PEVENTLOGHEADER header);
209
210 VOID PRINT_RECORD(PEVENTLOGRECORD pRec);
211
212 VOID EventTimeToSystemTime(DWORD EventTime,
213 SYSTEMTIME * SystemTime);
214
215 VOID SystemTimeToEventTime(SYSTEMTIME * pSystemTime,
216 DWORD * pEventTime);
217
218 /* eventsource.c */
219 VOID InitEventSourceList(VOID);
220
221 BOOL
222 LoadEventSources(HKEY hKey,
223 PLOGFILE pLogFile);
224
225 PEVENTSOURCE
226 GetEventSourceByName(LPCWSTR Name);
227
228
229 /* logport.c */
230 NTSTATUS WINAPI PortThreadRoutine(PVOID Param);
231
232 NTSTATUS InitLogPort(VOID);
233
234 NTSTATUS ProcessPortMessage(VOID);
235
236 /* rpc.c */
237 DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter);
238
239 static __inline void LogfFreeRecord(LPVOID Rec)
240 {
241 HeapFree(MyHeap, 0, Rec);
242 }
243
244 #endif /* __EVENTLOG_H__ */