-revert janderwalds change until because it breaks the gcc 4.x build
[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 HANDLE MyHeap;
19 extern BOOL onLiveCD;
20
21 /* FUNCTIONS ****************************************************************/
22
23 NTSTATUS STDCALL PortThreadRoutine(PVOID Param)
24 {
25 NTSTATUS Status = STATUS_SUCCESS;
26
27 Status = InitLogPort();
28 if(!NT_SUCCESS(Status))
29 return Status;
30
31 while(NT_SUCCESS(Status))
32 {
33 Status = ProcessPortMessage();
34 }
35
36 if(ConnectPortHandle != NULL)
37 NtClose(ConnectPortHandle);
38
39 if(MessagePortHandle != NULL)
40 NtClose(MessagePortHandle);
41
42 return Status;
43 }
44
45 NTSTATUS InitLogPort(VOID)
46 {
47 OBJECT_ATTRIBUTES ObjectAttributes;
48 UNICODE_STRING PortName;
49 PORT_MESSAGE Request;
50 NTSTATUS Status;
51
52 ConnectPortHandle = NULL;
53 MessagePortHandle = NULL;
54
55 RtlInitUnicodeString(&PortName, L"\\ErrorLogPort");
56 InitializeObjectAttributes(
57 &ObjectAttributes,
58 &PortName,
59 0,
60 NULL,
61 NULL);
62
63 Status = NtCreatePort(
64 &ConnectPortHandle,
65 &ObjectAttributes,
66 0,
67 0x100,
68 0x2000);
69
70 if(!NT_SUCCESS(Status))
71 {
72 DPRINT1("NtCreatePort() failed (Status %lx)\n", Status);
73 goto ByeBye;
74 }
75
76 Status = NtListenPort(ConnectPortHandle, &Request);
77
78 if(!NT_SUCCESS(Status))
79 {
80 DPRINT1("NtListenPort() failed (Status %lx)\n", Status);
81 goto ByeBye;
82 }
83
84 Status = NtAcceptConnectPort(
85 &MessagePortHandle,
86 ConnectPortHandle,
87 NULL,
88 TRUE,
89 NULL,
90 NULL);
91
92 if (!NT_SUCCESS(Status))
93 {
94 DPRINT1("NtAcceptConnectPort() failed (Status %lx)\n", Status);
95 goto ByeBye;
96 }
97
98 Status = NtCompleteConnectPort(MessagePortHandle);
99 if (!NT_SUCCESS(Status))
100 {
101 DPRINT1("NtCompleteConnectPort() failed (Status %lx)\n", Status);
102 goto ByeBye;
103 }
104
105 ByeBye:
106 if (!NT_SUCCESS(Status))
107 {
108 if(ConnectPortHandle != NULL)
109 NtClose(ConnectPortHandle);
110
111 if(MessagePortHandle != NULL)
112 NtClose(MessagePortHandle);
113 }
114 return Status;
115 }
116
117
118 NTSTATUS ProcessPortMessage(VOID)
119 {
120 IO_ERROR_LPC Request;
121 PIO_ERROR_LOG_MESSAGE Message;
122 PEVENTLOGRECORD pRec;
123 ULONG ulRecNum;
124 DWORD dwRecSize;
125 NTSTATUS Status;
126 PLOGFILE SystemLog = NULL;
127
128 DPRINT("ProcessPortMessage() called\n");
129
130 SystemLog = LogfListItemByName(L"System");
131
132 while(TRUE)
133 {
134 Status = NtReplyWaitReceivePort(
135 MessagePortHandle,
136 0,
137 NULL,
138 &Request.Header);
139
140 if(!NT_SUCCESS(Status))
141 {
142 DPRINT1("NtReplyWaitReceivePort() failed (Status %lx)\n", Status);
143 break;
144 }
145
146 DPRINT("Received message\n");
147
148 if(Request.Header.u2.s2.Type == LPC_PORT_CLOSED)
149 {
150 DPRINT("Port closed\n");
151 return STATUS_SUCCESS;
152 }
153
154 if(Request.Header.u2.s2.Type == LPC_REQUEST)
155 {
156 DPRINT("Received request\n");
157 }
158 else if (Request.Header.u2.s2.Type == LPC_DATAGRAM)
159 {
160 DPRINT("Received datagram\n");
161 Message = (PIO_ERROR_LOG_MESSAGE)&Request.Message;
162 ulRecNum = SystemLog ? SystemLog->Header.NextRecord : 0;
163
164 pRec = (PEVENTLOGRECORD)LogfAllocAndBuildNewRecord(&dwRecSize,
165 ulRecNum,
166 Message->Type,
167 Message->EntryData.EventCategory,
168 Message->EntryData.ErrorCode,
169 (WCHAR*)(((PBYTE)Message)+Message->DriverNameOffset),
170 L"MyComputer", /* FIXME */
171 0,
172 NULL,
173 Message->EntryData.NumberOfStrings,
174 (WCHAR*)(((PBYTE)Message)+Message->EntryData.StringOffset),
175 Message->EntryData.DumpDataSize,
176 (LPVOID)(((PBYTE)Message)
177 +sizeof(IO_ERROR_LOG_PACKET)-sizeof(ULONG)));
178
179 if(pRec == NULL)
180 {
181 DPRINT("LogfAllocAndBuildNewRecord failed!\n");
182 return STATUS_NO_MEMORY;
183 }
184
185 DPRINT("dwRecSize = %d\n", dwRecSize);
186
187 DPRINT("\n --- EVENTLOG RECORD ---\n");
188 PRINT_RECORD(pRec);
189 DPRINT("\n");
190
191 if(!onLiveCD && SystemLog)
192 {
193 if(!LogfWriteData(SystemLog, dwRecSize, (PBYTE)pRec))
194 DPRINT("LogfWriteData failed!\n");
195 else DPRINT("Data written to Log!\n");
196 }
197
198 LogfFreeRecord(pRec);
199 }
200 }
201 return Status;
202 }