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 #include <ndk/lpcfuncs.h>
19 /* GLOBALS ******************************************************************/
21 HANDLE ConnectPortHandle
= NULL
;
22 HANDLE MessagePortHandle
= NULL
;
25 /* FUNCTIONS ****************************************************************/
27 NTSTATUS WINAPI
PortThreadRoutine(PVOID Param
)
29 NTSTATUS Status
= STATUS_SUCCESS
;
31 Status
= InitLogPort();
32 if (!NT_SUCCESS(Status
))
35 while (NT_SUCCESS(Status
))
36 Status
= ProcessPortMessage();
38 if (ConnectPortHandle
!= NULL
)
39 NtClose(ConnectPortHandle
);
41 if (MessagePortHandle
!= NULL
)
42 NtClose(MessagePortHandle
);
47 NTSTATUS
InitLogPort(VOID
)
49 OBJECT_ATTRIBUTES ObjectAttributes
;
50 UNICODE_STRING PortName
;
54 ConnectPortHandle
= NULL
;
55 MessagePortHandle
= NULL
;
57 RtlInitUnicodeString(&PortName
, L
"\\ErrorLogPort");
58 InitializeObjectAttributes(&ObjectAttributes
, &PortName
, 0, NULL
, NULL
);
60 Status
= NtCreatePort(&ConnectPortHandle
,
66 if (!NT_SUCCESS(Status
))
68 DPRINT1("NtCreatePort() failed (Status %lx)\n", Status
);
72 Status
= NtListenPort(ConnectPortHandle
, &Request
);
74 if (!NT_SUCCESS(Status
))
76 DPRINT1("NtListenPort() failed (Status %lx)\n", Status
);
80 Status
= NtAcceptConnectPort(&MessagePortHandle
, ConnectPortHandle
,
81 NULL
, TRUE
, NULL
, NULL
);
83 if (!NT_SUCCESS(Status
))
85 DPRINT1("NtAcceptConnectPort() failed (Status %lx)\n", Status
);
89 Status
= NtCompleteConnectPort(MessagePortHandle
);
90 if (!NT_SUCCESS(Status
))
92 DPRINT1("NtCompleteConnectPort() failed (Status %lx)\n", Status
);
97 if (!NT_SUCCESS(Status
))
99 if (ConnectPortHandle
!= NULL
)
100 NtClose(ConnectPortHandle
);
102 if (MessagePortHandle
!= NULL
)
103 NtClose(MessagePortHandle
);
108 NTSTATUS
ProcessPortMessage(VOID
)
110 IO_ERROR_LPC Request
;
111 PIO_ERROR_LOG_MESSAGE Message
;
112 PEVENTLOGRECORD pRec
;
116 PLOGFILE SystemLog
= NULL
;
118 DPRINT("ProcessPortMessage() called\n");
120 SystemLog
= LogfListItemByName(L
"System");
124 Status
= NtReplyWaitReceivePort(MessagePortHandle
,
129 if (!NT_SUCCESS(Status
))
131 DPRINT1("NtReplyWaitReceivePort() failed (Status %lx)\n", Status
);
135 DPRINT("Received message\n");
137 if (Request
.Header
.u2
.s2
.Type
== LPC_PORT_CLOSED
)
139 DPRINT("Port closed\n");
140 return STATUS_SUCCESS
;
143 if (Request
.Header
.u2
.s2
.Type
== LPC_REQUEST
)
145 DPRINT("Received request\n");
147 else if (Request
.Header
.u2
.s2
.Type
== LPC_DATAGRAM
)
149 DPRINT("Received datagram\n");
150 Message
= (PIO_ERROR_LOG_MESSAGE
) & Request
.Message
;
151 ulRecNum
= SystemLog
? SystemLog
->Header
.CurrentRecordNumber
: 0;
153 pRec
= (PEVENTLOGRECORD
) LogfAllocAndBuildNewRecord(&dwRecSize
,
154 ulRecNum
, Message
->Type
, Message
->EntryData
.EventCategory
,
155 Message
->EntryData
.ErrorCode
,
156 (WCHAR
*) (((PBYTE
) Message
) + Message
->DriverNameOffset
),
157 L
"MyComputer", /* FIXME */
160 Message
->EntryData
.NumberOfStrings
,
161 (WCHAR
*) (((PBYTE
) Message
) + Message
->EntryData
.StringOffset
),
162 Message
->EntryData
.DumpDataSize
,
163 (LPVOID
) (((PBYTE
) Message
) + sizeof(IO_ERROR_LOG_PACKET
) -
168 DPRINT("LogfAllocAndBuildNewRecord failed!\n");
169 return STATUS_NO_MEMORY
;
172 DPRINT("dwRecSize = %d\n", dwRecSize
);
174 DPRINT("\n --- EVENTLOG RECORD ---\n");
178 if (!onLiveCD
&& SystemLog
)
180 if (!LogfWriteData(SystemLog
, dwRecSize
, (PBYTE
) pRec
))
181 DPRINT("LogfWriteData failed!\n");
183 DPRINT("Data written to Log!\n");
186 LogfFreeRecord(pRec
);