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