2 * PROJECT: ReactOS EventLog Service
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/services/eventlog/logport.c
5 * PURPOSE: LPC Port Interface support
6 * COPYRIGHT: Copyright 2002 Eric Kohl
7 * Copyright 2005 Saveliy Tretiakov
10 /* INCLUDES *****************************************************************/
13 #include <ndk/lpcfuncs.h>
18 /* GLOBALS ******************************************************************/
20 static HANDLE ConnectPortHandle
= NULL
;
21 static HANDLE MessagePortHandle
= NULL
;
24 /* FUNCTIONS ****************************************************************/
26 NTSTATUS WINAPI
PortThreadRoutine(PVOID Param
)
28 NTSTATUS Status
= STATUS_SUCCESS
;
30 Status
= InitLogPort();
31 if (!NT_SUCCESS(Status
))
34 while (NT_SUCCESS(Status
))
35 Status
= ProcessPortMessage();
37 if (ConnectPortHandle
!= NULL
)
38 NtClose(ConnectPortHandle
);
40 if (MessagePortHandle
!= NULL
)
41 NtClose(MessagePortHandle
);
46 NTSTATUS
InitLogPort(VOID
)
49 UNICODE_STRING PortName
;
50 OBJECT_ATTRIBUTES ObjectAttributes
;
53 ConnectPortHandle
= NULL
;
54 MessagePortHandle
= NULL
;
56 RtlInitUnicodeString(&PortName
, L
"\\ErrorLogPort");
57 InitializeObjectAttributes(&ObjectAttributes
, &PortName
, 0, NULL
, NULL
);
59 Status
= NtCreatePort(&ConnectPortHandle
,
65 if (!NT_SUCCESS(Status
))
67 DPRINT1("NtCreatePort() failed (Status %lx)\n", Status
);
71 Status
= NtListenPort(ConnectPortHandle
, &Request
);
72 if (!NT_SUCCESS(Status
))
74 DPRINT1("NtListenPort() failed (Status %lx)\n", Status
);
78 Status
= NtAcceptConnectPort(&MessagePortHandle
, ConnectPortHandle
,
79 NULL
, TRUE
, NULL
, NULL
);
80 if (!NT_SUCCESS(Status
))
82 DPRINT1("NtAcceptConnectPort() failed (Status %lx)\n", Status
);
86 Status
= NtCompleteConnectPort(MessagePortHandle
);
87 if (!NT_SUCCESS(Status
))
89 DPRINT1("NtCompleteConnectPort() failed (Status %lx)\n", Status
);
94 if (!NT_SUCCESS(Status
))
96 if (ConnectPortHandle
!= NULL
)
97 NtClose(ConnectPortHandle
);
99 if (MessagePortHandle
!= NULL
)
100 NtClose(MessagePortHandle
);
105 NTSTATUS
ProcessPortMessage(VOID
)
108 IO_ERROR_LPC Request
;
109 PIO_ERROR_LOG_MESSAGE Message
;
111 PEVENTLOGRECORD pRec
;
113 PLOGFILE SystemLog
= NULL
;
114 WCHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
115 DWORD dwComputerNameLength
= MAX_COMPUTERNAME_LENGTH
+ 1;
117 DPRINT("ProcessPortMessage() called\n");
119 SystemLog
= LogfListItemByName(L
"System");
123 Status
= NtReplyWaitReceivePort(MessagePortHandle
,
128 if (!NT_SUCCESS(Status
))
130 DPRINT1("NtReplyWaitReceivePort() failed (Status %lx)\n", Status
);
134 DPRINT("Received message\n");
136 if (Request
.Header
.u2
.s2
.Type
== LPC_PORT_CLOSED
)
138 DPRINT("Port closed\n");
139 return STATUS_SUCCESS
;
142 if (Request
.Header
.u2
.s2
.Type
== LPC_REQUEST
)
144 DPRINT("Received request\n");
146 else if (Request
.Header
.u2
.s2
.Type
== LPC_DATAGRAM
)
148 DPRINT("Received datagram\n");
149 // Message = (PIO_ERROR_LOG_MESSAGE)&Request.Message;
150 Message
= &Request
.Message
;
152 if (!GetComputerNameW(szComputerName
, &dwComputerNameLength
))
154 szComputerName
[0] = L
'\0';
157 RtlTimeToSecondsSince1970(&Message
->TimeStamp
, &Time
);
159 // TODO: Log more information??
161 pRec
= LogfAllocAndBuildNewRecord(
165 Message
->EntryData
.EventCategory
,
166 Message
->EntryData
.ErrorCode
,
167 (PWSTR
)((ULONG_PTR
)Message
+ Message
->DriverNameOffset
), // FIXME: Use DriverNameLength too!
171 Message
->EntryData
.NumberOfStrings
,
172 (PWSTR
)((ULONG_PTR
)Message
+ Message
->EntryData
.StringOffset
),
173 Message
->EntryData
.DumpDataSize
,
174 (PVOID
)((ULONG_PTR
)Message
+ FIELD_OFFSET(IO_ERROR_LOG_PACKET
, DumpData
)));
178 DPRINT("LogfAllocAndBuildNewRecord failed!\n");
179 return STATUS_NO_MEMORY
;
182 DPRINT("RecSize = %d\n", RecSize
);
184 DPRINT("\n --- EVENTLOG RECORD ---\n");
188 if (!onLiveCD
&& SystemLog
)
190 Status
= LogfWriteRecord(SystemLog
, RecSize
, pRec
);
191 if (!NT_SUCCESS(Status
))
193 DPRINT1("ERROR writing to event log `%S' (Status 0x%08lx)\n",
194 SystemLog
->FileName
, Status
);
198 LogfFreeRecord(pRec
);