Sync to trunk r65566.
[reactos.git] / 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 #include <ndk/lpcfuncs.h>
15
16 #define NDEBUG
17 #include <debug.h>
18
19 /* GLOBALS ******************************************************************/
20
21 HANDLE ConnectPortHandle = NULL;
22 HANDLE MessagePortHandle = NULL;
23 extern BOOL onLiveCD;
24
25 /* FUNCTIONS ****************************************************************/
26
27 NTSTATUS WINAPI PortThreadRoutine(PVOID Param)
28 {
29 NTSTATUS Status = STATUS_SUCCESS;
30
31 Status = InitLogPort();
32 if (!NT_SUCCESS(Status))
33 return Status;
34
35 while (NT_SUCCESS(Status))
36 Status = ProcessPortMessage();
37
38 if (ConnectPortHandle != NULL)
39 NtClose(ConnectPortHandle);
40
41 if (MessagePortHandle != NULL)
42 NtClose(MessagePortHandle);
43
44 return Status;
45 }
46
47 NTSTATUS InitLogPort(VOID)
48 {
49 OBJECT_ATTRIBUTES ObjectAttributes;
50 UNICODE_STRING PortName;
51 PORT_MESSAGE Request;
52 NTSTATUS Status;
53
54 ConnectPortHandle = NULL;
55 MessagePortHandle = NULL;
56
57 RtlInitUnicodeString(&PortName, L"\\ErrorLogPort");
58 InitializeObjectAttributes(&ObjectAttributes, &PortName, 0, NULL, NULL);
59
60 Status = NtCreatePort(&ConnectPortHandle,
61 &ObjectAttributes,
62 0,
63 0x100,
64 0x2000);
65
66 if (!NT_SUCCESS(Status))
67 {
68 DPRINT1("NtCreatePort() failed (Status %lx)\n", Status);
69 goto ByeBye;
70 }
71
72 Status = NtListenPort(ConnectPortHandle, &Request);
73
74 if (!NT_SUCCESS(Status))
75 {
76 DPRINT1("NtListenPort() failed (Status %lx)\n", Status);
77 goto ByeBye;
78 }
79
80 Status = NtAcceptConnectPort(&MessagePortHandle, ConnectPortHandle,
81 NULL, TRUE, NULL, NULL);
82
83 if (!NT_SUCCESS(Status))
84 {
85 DPRINT1("NtAcceptConnectPort() failed (Status %lx)\n", Status);
86 goto ByeBye;
87 }
88
89 Status = NtCompleteConnectPort(MessagePortHandle);
90 if (!NT_SUCCESS(Status))
91 {
92 DPRINT1("NtCompleteConnectPort() failed (Status %lx)\n", Status);
93 goto ByeBye;
94 }
95
96 ByeBye:
97 if (!NT_SUCCESS(Status))
98 {
99 if (ConnectPortHandle != NULL)
100 NtClose(ConnectPortHandle);
101
102 if (MessagePortHandle != NULL)
103 NtClose(MessagePortHandle);
104 }
105 return Status;
106 }
107
108 NTSTATUS ProcessPortMessage(VOID)
109 {
110 IO_ERROR_LPC Request;
111 PIO_ERROR_LOG_MESSAGE Message;
112 PEVENTLOGRECORD pRec;
113 ULONG ulRecNum;
114 DWORD dwRecSize;
115 NTSTATUS Status;
116 PLOGFILE SystemLog = NULL;
117
118 DPRINT("ProcessPortMessage() called\n");
119
120 SystemLog = LogfListItemByName(L"System");
121
122 while (TRUE)
123 {
124 Status = NtReplyWaitReceivePort(MessagePortHandle,
125 0,
126 NULL,
127 &Request.Header);
128
129 if (!NT_SUCCESS(Status))
130 {
131 DPRINT1("NtReplyWaitReceivePort() failed (Status %lx)\n", Status);
132 break;
133 }
134
135 DPRINT("Received message\n");
136
137 if (Request.Header.u2.s2.Type == LPC_PORT_CLOSED)
138 {
139 DPRINT("Port closed\n");
140 return STATUS_SUCCESS;
141 }
142
143 if (Request.Header.u2.s2.Type == LPC_REQUEST)
144 {
145 DPRINT("Received request\n");
146 }
147 else if (Request.Header.u2.s2.Type == LPC_DATAGRAM)
148 {
149 DPRINT("Received datagram\n");
150 Message = (PIO_ERROR_LOG_MESSAGE) & Request.Message;
151 ulRecNum = SystemLog ? SystemLog->Header.CurrentRecordNumber : 0;
152
153 pRec = (PEVENTLOGRECORD) LogfAllocAndBuildNewRecord(&dwRecSize,
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 }