Sync with trunk for console graphics palettes.
[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 /* 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
113 DPRINT("ProcessPortMessage() called\n");
114
115 SystemLog = LogfListItemByName(L"System");
116
117 while (TRUE)
118 {
119 Status = NtReplyWaitReceivePort(MessagePortHandle,
120 0,
121 NULL,
122 &Request.Header);
123
124 if (!NT_SUCCESS(Status))
125 {
126 DPRINT1("NtReplyWaitReceivePort() failed (Status %lx)\n", Status);
127 break;
128 }
129
130 DPRINT("Received message\n");
131
132 if (Request.Header.u2.s2.Type == LPC_PORT_CLOSED)
133 {
134 DPRINT("Port closed\n");
135 return STATUS_SUCCESS;
136 }
137
138 if (Request.Header.u2.s2.Type == LPC_REQUEST)
139 {
140 DPRINT("Received request\n");
141 }
142 else if (Request.Header.u2.s2.Type == LPC_DATAGRAM)
143 {
144 DPRINT("Received datagram\n");
145 Message = (PIO_ERROR_LOG_MESSAGE) & Request.Message;
146 ulRecNum = SystemLog ? SystemLog->Header.CurrentRecordNumber : 0;
147
148 pRec = (PEVENTLOGRECORD) LogfAllocAndBuildNewRecord(&dwRecSize,
149 ulRecNum, Message->Type, Message->EntryData.EventCategory,
150 Message->EntryData.ErrorCode,
151 (WCHAR *) (((PBYTE) Message) + Message->DriverNameOffset),
152 L"MyComputer", /* FIXME */
153 0,
154 NULL,
155 Message->EntryData.NumberOfStrings,
156 (WCHAR *) (((PBYTE) Message) + Message->EntryData.StringOffset),
157 Message->EntryData.DumpDataSize,
158 (LPVOID) (((PBYTE) Message) + sizeof(IO_ERROR_LOG_PACKET) -
159 sizeof(ULONG)));
160
161 if (pRec == NULL)
162 {
163 DPRINT("LogfAllocAndBuildNewRecord failed!\n");
164 return STATUS_NO_MEMORY;
165 }
166
167 DPRINT("dwRecSize = %d\n", dwRecSize);
168
169 DPRINT("\n --- EVENTLOG RECORD ---\n");
170 PRINT_RECORD(pRec);
171 DPRINT("\n");
172
173 if (!onLiveCD && SystemLog)
174 {
175 if (!LogfWriteData(SystemLog, dwRecSize, (PBYTE) pRec))
176 DPRINT("LogfWriteData failed!\n");
177 else
178 DPRINT("Data written to Log!\n");
179 }
180
181 LogfFreeRecord(pRec);
182 }
183 }
184
185 return Status;
186 }