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
10 /* INCLUDES *****************************************************************/
14 /* GLOBALS ******************************************************************/
16 HANDLE ConnectPortHandle
= NULL
;
17 HANDLE MessagePortHandle
= NULL
;
21 /* FUNCTIONS ****************************************************************/
23 NTSTATUS STDCALL
PortThreadRoutine(PVOID Param
)
25 NTSTATUS Status
= STATUS_SUCCESS
;
27 Status
= InitLogPort();
28 if (!NT_SUCCESS(Status
))
31 while (NT_SUCCESS(Status
))
32 Status
= ProcessPortMessage();
34 if (ConnectPortHandle
!= NULL
)
35 NtClose(ConnectPortHandle
);
37 if (MessagePortHandle
!= NULL
)
38 NtClose(MessagePortHandle
);
43 NTSTATUS
InitLogPort(VOID
)
45 OBJECT_ATTRIBUTES ObjectAttributes
;
46 UNICODE_STRING PortName
;
50 ConnectPortHandle
= NULL
;
51 MessagePortHandle
= NULL
;
53 RtlInitUnicodeString(&PortName
, L
"\\ErrorLogPort");
54 InitializeObjectAttributes(&ObjectAttributes
, &PortName
, 0, NULL
, NULL
);
56 Status
= NtCreatePort(&ConnectPortHandle
,
62 if (!NT_SUCCESS(Status
))
64 DPRINT1("NtCreatePort() failed (Status %lx)\n", Status
);
68 Status
= NtListenPort(ConnectPortHandle
, &Request
);
70 if (!NT_SUCCESS(Status
))
72 DPRINT1("NtListenPort() failed (Status %lx)\n", Status
);
76 Status
= NtAcceptConnectPort(&MessagePortHandle
, ConnectPortHandle
,
77 NULL
, TRUE
, NULL
, NULL
);
79 if (!NT_SUCCESS(Status
))
81 DPRINT1("NtAcceptConnectPort() failed (Status %lx)\n", Status
);
85 Status
= NtCompleteConnectPort(MessagePortHandle
);
86 if (!NT_SUCCESS(Status
))
88 DPRINT1("NtCompleteConnectPort() failed (Status %lx)\n", Status
);
93 if (!NT_SUCCESS(Status
))
95 if (ConnectPortHandle
!= NULL
)
96 NtClose(ConnectPortHandle
);
98 if (MessagePortHandle
!= NULL
)
99 NtClose(MessagePortHandle
);
104 NTSTATUS
ProcessPortMessage(VOID
)
106 IO_ERROR_LPC Request
;
107 PIO_ERROR_LOG_MESSAGE Message
;
108 PEVENTLOGRECORD pRec
;
112 PLOGFILE SystemLog
= NULL
;
114 DPRINT("ProcessPortMessage() called\n");
116 SystemLog
= LogfListItemByName(L
"System");
120 Status
= NtReplyWaitReceivePort(MessagePortHandle
,
125 if (!NT_SUCCESS(Status
))
127 DPRINT1("NtReplyWaitReceivePort() failed (Status %lx)\n", Status
);
131 DPRINT("Received message\n");
133 if (Request
.Header
.u2
.s2
.Type
== LPC_PORT_CLOSED
)
135 DPRINT("Port closed\n");
136 return STATUS_SUCCESS
;
139 if (Request
.Header
.u2
.s2
.Type
== LPC_REQUEST
)
141 DPRINT("Received request\n");
143 else if (Request
.Header
.u2
.s2
.Type
== LPC_DATAGRAM
)
145 DPRINT("Received datagram\n");
146 Message
= (PIO_ERROR_LOG_MESSAGE
) & Request
.Message
;
147 ulRecNum
= SystemLog
? SystemLog
->Header
.NextRecord
: 0;
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 */
156 Message
->EntryData
.NumberOfStrings
,
157 (WCHAR
*) (((PBYTE
) Message
) + Message
->EntryData
.StringOffset
),
158 Message
->EntryData
.DumpDataSize
,
159 (LPVOID
) (((PBYTE
) Message
) + sizeof(IO_ERROR_LOG_PACKET
) -
164 DPRINT("LogfAllocAndBuildNewRecord failed!\n");
165 return STATUS_NO_MEMORY
;
168 DPRINT("dwRecSize = %d\n", dwRecSize
);
170 DPRINT("\n --- EVENTLOG RECORD ---\n");
174 if (!onLiveCD
&& SystemLog
)
176 if (!LogfWriteData(SystemLog
, dwRecSize
, (PBYTE
) pRec
))
177 DPRINT("LogfWriteData failed!\n");
179 DPRINT("Data written to Log!\n");
182 LogfFreeRecord(pRec
);