683513e3395c384b27a2527818cf645b846c7a89
[reactos.git] / reactos / base / services / eventlog / logport.c
1 /*
2 * PROJECT: ReactOS kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: services/eventlog/logport.c
5 * PURPOSE: Event logging service
6 * COPYRIGHT: Copyright 2002 Eric Kohl
7 * Copyright 2005 Saveliy Tretiakov
8 */
9
10 /* INCLUDES *****************************************************************/
11
12 #include "eventlog.h"
13
14 /* GLOBALS ******************************************************************/
15
16 HANDLE ConnectPortHandle = NULL;
17 HANDLE MessagePortHandle = NULL;
18 extern BOOL onLiveCD;
19
20 /* FUNCTIONS ****************************************************************/
21
22 NTSTATUS WINAPI PortThreadRoutine(PVOID Param)
23 {
24 NTSTATUS Status = STATUS_SUCCESS;
25
26 Status = InitLogPort();
27 if (!NT_SUCCESS(Status))
28 return Status;
29
30 while (NT_SUCCESS(Status))
31 Status = ProcessPortMessage();
32
33 if (ConnectPortHandle != NULL)
34 NtClose(ConnectPortHandle);
35
36 if (MessagePortHandle != NULL)
37 NtClose(MessagePortHandle);
38
39 return Status;
40 }
41
42 NTSTATUS InitLogPort(VOID)
43 {
44 OBJECT_ATTRIBUTES ObjectAttributes;
45 UNICODE_STRING PortName;
46 PORT_MESSAGE Request;
47 NTSTATUS Status;
48
49 ConnectPortHandle = NULL;
50 MessagePortHandle = NULL;
51
52 RtlInitUnicodeString(&PortName, L"\\ErrorLogPort");
53 InitializeObjectAttributes(&ObjectAttributes, &PortName, 0, NULL, NULL);
54
55 Status = NtCreatePort(&ConnectPortHandle,
56 &ObjectAttributes,
57 0,
58 0x100,
59 0x2000);
60
61 if (!NT_SUCCESS(Status))
62 {
63 DPRINT1("NtCreatePort() failed (Status %lx)\n", Status);
64 goto ByeBye;
65 }
66
67 Status = NtListenPort(ConnectPortHandle, &Request);
68
69 if (!NT_SUCCESS(Status))
70 {
71 DPRINT1("NtListenPort() failed (Status %lx)\n", Status);
72 goto ByeBye;
73 }
74
75 Status = NtAcceptConnectPort(&MessagePortHandle, ConnectPortHandle,
76 NULL, TRUE, NULL, NULL);
77
78 if (!NT_SUCCESS(Status))
79 {
80 DPRINT1("NtAcceptConnectPort() failed (Status %lx)\n", Status);
81 goto ByeBye;
82 }
83
84 Status = NtCompleteConnectPort(MessagePortHandle);
85 if (!NT_SUCCESS(Status))
86 {
87 DPRINT1("NtCompleteConnectPort() failed (Status %lx)\n", Status);
88 goto ByeBye;
89 }
90
91 ByeBye:
92 if (!NT_SUCCESS(Status))
93 {
94 if (ConnectPortHandle != NULL)
95 NtClose(ConnectPortHandle);
96
97 if (MessagePortHandle != NULL)
98 NtClose(MessagePortHandle);
99 }
100 return Status;
101 }
102
103 NTSTATUS ProcessPortMessage(VOID)
104 {
105 IO_ERROR_LPC Request;
106 PIO_ERROR_LOG_MESSAGE Message;
107 PEVENTLOGRECORD pRec;
108 ULONG ulRecNum;
109 DWORD dwRecSize;
110 NTSTATUS Status;
111 PLOGFILE SystemLog = NULL;
112 LARGE_INTEGER SystemTime;
113 ULONG Seconds;
114
115 DPRINT("ProcessPortMessage() called\n");
116
117 SystemLog = LogfListItemByName(L"System");
118
119 while (TRUE)
120 {
121 Status = NtReplyWaitReceivePort(MessagePortHandle,
122 0,
123 NULL,
124 &Request.Header);
125
126 if (!NT_SUCCESS(Status))
127 {
128 DPRINT1("NtReplyWaitReceivePort() failed (Status %lx)\n", Status);
129 break;
130 }
131
132 DPRINT("Received message\n");
133
134 if (Request.Header.u2.s2.Type == LPC_PORT_CLOSED)
135 {
136 DPRINT("Port closed\n");
137 return STATUS_SUCCESS;
138 }
139
140 if (Request.Header.u2.s2.Type == LPC_REQUEST)
141 {
142 DPRINT("Received request\n");
143 }
144 else if (Request.Header.u2.s2.Type == LPC_DATAGRAM)
145 {
146 DPRINT("Received datagram\n");
147 Message = (PIO_ERROR_LOG_MESSAGE) & Request.Message;
148 ulRecNum = SystemLog ? SystemLog->Header.CurrentRecordNumber : 0;
149
150 NtQuerySystemTime(&SystemTime);
151 RtlTimeToSecondsSince1970(&SystemTime, &Seconds);
152
153 pRec = (PEVENTLOGRECORD) LogfAllocAndBuildNewRecord(&dwRecSize, Seconds,
154 ulRecNum, Message->Type, Message->EntryData.EventCategory,
155 Message->EntryData.ErrorCode,
156 (WCHAR *) (((PBYTE) Message) + Message->DriverNameOffset),
157 L"MyComputer", /* FIXME */
158 0,
159 NULL,
160 Message->EntryData.NumberOfStrings,
161 (WCHAR *) (((PBYTE) Message) + Message->EntryData.StringOffset),
162 Message->EntryData.DumpDataSize,
163 (LPVOID) (((PBYTE) Message) + sizeof(IO_ERROR_LOG_PACKET) -
164 sizeof(ULONG)));
165
166 if (pRec == NULL)
167 {
168 DPRINT("LogfAllocAndBuildNewRecord failed!\n");
169 return STATUS_NO_MEMORY;
170 }
171
172 DPRINT("dwRecSize = %d\n", dwRecSize);
173
174 DPRINT("\n --- EVENTLOG RECORD ---\n");
175 PRINT_RECORD(pRec);
176 DPRINT("\n");
177
178 if (!onLiveCD && SystemLog)
179 {
180 if (!LogfWriteData(SystemLog, dwRecSize, (PBYTE) pRec))
181 DPRINT("LogfWriteData failed!\n");
182 else
183 DPRINT("Data written to Log!\n");
184 }
185
186 LogfFreeRecord(pRec);
187 }
188 }
189
190 return Status;
191 }