2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: services/eventlog/logport.c
5 * PURPOSE: Event logging service
6 * PROGRAMMER: Eric Kohl
7 * Saveliy Tretiakov (saveliyt@mail.ru)
10 /* INCLUDES *****************************************************************/
14 /* GLOBALS ******************************************************************/
16 HANDLE ConnectPortHandle
= NULL
;
17 HANDLE MessagePortHandle
= NULL
;
18 extern PLOGFILE SystemLog
;
22 /* FUNCTIONS ****************************************************************/
24 NTSTATUS STDCALL
PortThreadRoutine(PVOID Param
)
26 NTSTATUS Status
= STATUS_SUCCESS
;
28 Status
= InitLogPort();
29 if(!NT_SUCCESS(Status
))
32 while(NT_SUCCESS(Status
))
34 Status
= ProcessPortMessage();
37 if(ConnectPortHandle
!= NULL
)
38 NtClose(ConnectPortHandle
);
40 if(MessagePortHandle
!= NULL
)
41 NtClose(MessagePortHandle
);
46 NTSTATUS
InitLogPort(VOID
)
48 OBJECT_ATTRIBUTES ObjectAttributes
;
49 UNICODE_STRING PortName
;
53 ConnectPortHandle
= NULL
;
54 MessagePortHandle
= NULL
;
56 RtlInitUnicodeString(&PortName
, L
"\\ErrorLogPort");
57 InitializeObjectAttributes(
64 Status
= NtCreatePort(
71 if(!NT_SUCCESS(Status
))
73 DPRINT1("NtCreatePort() failed (Status %lx)\n", Status
);
77 Status
= NtListenPort(ConnectPortHandle
, &Request
);
79 if(!NT_SUCCESS(Status
))
81 DPRINT1("NtListenPort() failed (Status %lx)\n", Status
);
85 Status
= NtAcceptConnectPort(
93 if (!NT_SUCCESS(Status
))
95 DPRINT1("NtAcceptConnectPort() failed (Status %lx)\n", Status
);
99 Status
= NtCompleteConnectPort(MessagePortHandle
);
100 if (!NT_SUCCESS(Status
))
102 DPRINT1("NtCompleteConnectPort() failed (Status %lx)\n", Status
);
107 if (!NT_SUCCESS(Status
))
109 if(ConnectPortHandle
!= NULL
)
110 NtClose(ConnectPortHandle
);
112 if(MessagePortHandle
!= NULL
)
113 NtClose(MessagePortHandle
);
119 NTSTATUS
ProcessPortMessage(VOID
)
121 IO_ERROR_LPC Request
;
122 PIO_ERROR_LOG_MESSAGE Message
;
123 PEVENTLOGRECORD pRec
;
124 ULONG ulRecNum
, ulRecSize
;
126 PLOGFILE SystemLog
= NULL
;
128 DPRINT1("ProcessPortMessage() called\n");
130 Status
= STATUS_SUCCESS
;
134 Status
= NtReplyWaitReceivePort(
140 if(!NT_SUCCESS(Status
))
142 DPRINT1("NtReplyWaitReceivePort() failed (Status %lx)\n", Status
);
146 DPRINT("Received message\n");
148 if(Request
.Header
.u2
.s2
.Type
== LPC_PORT_CLOSED
)
150 DPRINT("Port closed\n");
151 return STATUS_SUCCESS
;
154 if(Request
.Header
.u2
.s2
.Type
== LPC_REQUEST
)
156 DPRINT("Received request\n");
158 else if (Request
.Header
.u2
.s2
.Type
== LPC_DATAGRAM
)
160 DPRINT("Received datagram\n");
161 Message
= (PIO_ERROR_LOG_MESSAGE
)&Request
.Message
;
162 ulRecNum
= SystemLog
? SystemLog
->Header
.NextRecord
: 0;
164 ulRecSize
= LogfBuildNewRecord(NULL
,
167 Message
->EntryData
.EventCategory
,
168 Message
->EntryData
.ErrorCode
,
169 (WCHAR
*)(((PBYTE
)Message
)+Message
->DriverNameOffset
),
170 L
"MyComputer", /* FIXME */
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
)));
179 DPRINT("ulRecSize = %d\n", ulRecSize
);
181 pRec
= HeapAlloc(MyHeap
, 0, ulRecSize
);
185 DPRINT("Can't allocate heap!\n");
186 return STATUS_NO_MEMORY
;
189 LogfBuildNewRecord((PBYTE
)pRec
,
192 Message
->EntryData
.EventCategory
,
193 Message
->EntryData
.ErrorCode
,
194 (WCHAR
*)(((PBYTE
)Message
)+Message
->DriverNameOffset
),
195 L
"MyComputer", /* FIXME */
198 Message
->EntryData
.NumberOfStrings
,
199 (WCHAR
*)(((PBYTE
)Message
)+Message
->EntryData
.StringOffset
),
200 Message
->EntryData
.DumpDataSize
,
201 (LPVOID
)(((PBYTE
)Message
)
202 +sizeof(IO_ERROR_LOG_PACKET
)-sizeof(ULONG
)));
204 DPRINT("\n --- EVENTLOG RECORD ---\n");
210 if(!LogfWriteData(SystemLog
, ulRecSize
, (PBYTE
)pRec
))
211 DPRINT("LogfWriteData failed!\n");
212 else DPRINT("Data written to Log!\n");
215 HeapFree(MyHeap
, 0, pRec
);