2 * PROJECT: ReactOS kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: services/eventlog/rpc.c
5 * PURPOSE: Event logging service
6 * COPYRIGHT: Copyright 2005 Saveliy Tretiakov
7 * Copyright 2008 Michael Martin
10 /* INCLUDES *****************************************************************/
17 LIST_ENTRY LogHandleListHead
;
19 /* FUNCTIONS ****************************************************************/
21 DWORD WINAPI
RpcThreadRoutine(LPVOID lpParameter
)
25 InitializeListHead(&LogHandleListHead
);
27 Status
= RpcServerUseProtseqEpW(L
"ncacn_np", 20, L
"\\pipe\\EventLog", NULL
);
28 if (Status
!= RPC_S_OK
)
30 DPRINT("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
34 Status
= RpcServerRegisterIf(eventlog_v0_0_s_ifspec
, NULL
, NULL
);
35 if (Status
!= RPC_S_OK
)
37 DPRINT("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
41 Status
= RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT
, FALSE
);
42 if (Status
!= RPC_S_OK
)
44 DPRINT("RpcServerListen() failed (Status %lx)\n", Status
);
52 ElfCreateEventLogHandle(PLOGHANDLE
*LogHandle
,
56 PLOGHANDLE lpLogHandle
;
57 PLOGFILE currentLogFile
= NULL
;
59 PEVENTSOURCE pEventSource
;
60 NTSTATUS Status
= STATUS_SUCCESS
;
62 DPRINT("ElfCreateEventLogHandle(Name: %S)\n", Name
);
64 lpLogHandle
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOGHANDLE
)
65 + ((wcslen(Name
) + 1) * sizeof(WCHAR
)));
68 DPRINT1("Failed to allocate Heap!\n");
69 return STATUS_NO_MEMORY
;
72 wcscpy(lpLogHandle
->szName
, Name
);
74 /* Get the number of Log Files the EventLog service found */
75 LogsActive
= LogfListItemCount();
78 DPRINT1("EventLog service reports no log files!\n");
79 Status
= STATUS_UNSUCCESSFUL
;
83 /* If Creating, default to the Application Log in case we fail, as documented on MSDN */
86 pEventSource
= GetEventSourceByName(Name
);
87 DPRINT("EventSource: %p\n", pEventSource
);
90 DPRINT("EventSource LogFile: %p\n", pEventSource
->LogFile
);
91 lpLogHandle
->LogFile
= pEventSource
->LogFile
;
95 DPRINT("EventSource LogFile: Application log file\n");
96 lpLogHandle
->LogFile
= LogfListItemByName(L
"Application");
99 DPRINT("LogHandle LogFile: %p\n", lpLogHandle
->LogFile
);
103 lpLogHandle
->LogFile
= NULL
;
105 for (i
= 1; i
<= LogsActive
; i
++)
107 currentLogFile
= LogfListItemByIndex(i
);
109 if (_wcsicmp(Name
, currentLogFile
->LogName
) == 0)
111 lpLogHandle
->LogFile
= LogfListItemByIndex(i
);
112 lpLogHandle
->CurrentRecord
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
117 /* Use the application log if the desired log does not exist */
118 if (lpLogHandle
->LogFile
== NULL
)
120 lpLogHandle
->LogFile
= LogfListItemByName(L
"Application");
121 lpLogHandle
->CurrentRecord
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
125 if (!lpLogHandle
->LogFile
)
126 Status
= STATUS_UNSUCCESSFUL
;
129 if (NT_SUCCESS(Status
))
131 /* Append log handle */
132 InsertTailList(&LogHandleListHead
, &lpLogHandle
->LogHandleListEntry
);
133 *LogHandle
= lpLogHandle
;
137 HeapFree(GetProcessHeap(), 0, lpLogHandle
);
145 ElfCreateBackupLogHandle(PLOGHANDLE
*LogHandle
,
146 PUNICODE_STRING FileName
)
148 PLOGHANDLE lpLogHandle
;
150 NTSTATUS Status
= STATUS_SUCCESS
;
152 DPRINT("ElfCreateBackupLogHandle(FileName: %wZ)\n", FileName
);
154 lpLogHandle
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(LOGHANDLE
));
155 if (lpLogHandle
== NULL
)
157 DPRINT1("Failed to allocate Heap!\n");
158 return STATUS_NO_MEMORY
;
161 /* Create the log file */
162 Status
= LogfCreate(&lpLogHandle
->LogFile
,
169 if (!NT_SUCCESS(Status
))
171 DPRINT1("Failed to create the log file! (Status 0x%08lx)\n", Status
);
175 /* Set the backup flag */
176 lpLogHandle
->Flags
|= LOG_HANDLE_BACKUP_FILE
;
178 /* Get the current record */
179 lpLogHandle
->CurrentRecord
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
182 if (NT_SUCCESS(Status
))
184 /* Append log handle */
185 InsertTailList(&LogHandleListHead
, &lpLogHandle
->LogHandleListEntry
);
186 *LogHandle
= lpLogHandle
;
190 HeapFree(GetProcessHeap(), 0, lpLogHandle
);
197 PLOGHANDLE
ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle
)
199 PLIST_ENTRY CurrentEntry
;
200 PLOGHANDLE lpLogHandle
;
202 CurrentEntry
= LogHandleListHead
.Flink
;
203 while (CurrentEntry
!= &LogHandleListHead
)
205 lpLogHandle
= CONTAINING_RECORD(CurrentEntry
,
208 CurrentEntry
= CurrentEntry
->Flink
;
210 if (lpLogHandle
== EventLogHandle
)
219 ElfDeleteEventLogHandle(IELF_HANDLE LogHandle
)
221 PLOGHANDLE lpLogHandle
;
223 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
226 return STATUS_INVALID_HANDLE
;
229 RemoveEntryList(&lpLogHandle
->LogHandleListEntry
);
230 LogfClose(lpLogHandle
->LogFile
, FALSE
);
232 HeapFree(GetProcessHeap(), 0, lpLogHandle
);
234 return STATUS_SUCCESS
;
238 NTSTATUS
ElfrClearELFW(
239 IELF_HANDLE LogHandle
,
240 PRPC_UNICODE_STRING BackupFileName
)
242 PLOGHANDLE lpLogHandle
;
244 DPRINT("ElfrClearELFW()\n");
246 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
249 return STATUS_INVALID_HANDLE
;
252 /* Fail, if the log file is a backup file */
253 if (lpLogHandle
->Flags
& LOG_HANDLE_BACKUP_FILE
)
254 return STATUS_INVALID_HANDLE
;
256 return LogfClearFile(lpLogHandle
->LogFile
,
257 (PUNICODE_STRING
)BackupFileName
);
262 NTSTATUS
ElfrBackupELFW(
263 IELF_HANDLE LogHandle
,
264 PRPC_UNICODE_STRING BackupFileName
)
266 PLOGHANDLE lpLogHandle
;
268 DPRINT("ElfrBackupELFW()\n");
270 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
273 return STATUS_INVALID_HANDLE
;
276 return LogfBackupFile(lpLogHandle
->LogFile
,
277 (PUNICODE_STRING
)BackupFileName
);
282 NTSTATUS
ElfrCloseEL(
283 IELF_HANDLE
*LogHandle
)
285 return ElfDeleteEventLogHandle(*LogHandle
);
290 NTSTATUS
ElfrDeregisterEventSource(
291 IELF_HANDLE
*LogHandle
)
293 return ElfDeleteEventLogHandle(*LogHandle
);
298 NTSTATUS
ElfrNumberOfRecords(
299 IELF_HANDLE LogHandle
,
300 DWORD
*NumberOfRecords
)
302 PLOGHANDLE lpLogHandle
;
305 DPRINT("ElfrNumberOfRecords()\n");
307 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
310 return STATUS_INVALID_HANDLE
;
313 lpLogFile
= lpLogHandle
->LogFile
;
315 DPRINT("Oldest: %lu Current: %lu\n",
316 lpLogFile
->Header
.OldestRecordNumber
,
317 lpLogFile
->Header
.CurrentRecordNumber
);
319 *NumberOfRecords
= lpLogFile
->Header
.CurrentRecordNumber
-
320 lpLogFile
->Header
.OldestRecordNumber
;
322 return STATUS_SUCCESS
;
327 NTSTATUS
ElfrOldestRecord(
328 IELF_HANDLE LogHandle
,
329 DWORD
*OldestRecordNumber
)
331 PLOGHANDLE lpLogHandle
;
333 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
336 return STATUS_INVALID_HANDLE
;
339 if (!OldestRecordNumber
)
341 return STATUS_INVALID_PARAMETER
;
344 *OldestRecordNumber
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
346 return STATUS_SUCCESS
;
351 NTSTATUS
ElfrChangeNotify(
352 IELF_HANDLE
*LogHandle
,
353 RPC_CLIENT_ID ClientId
,
356 DPRINT("ElfrChangeNotify()");
359 return STATUS_NOT_IMPLEMENTED
;
364 NTSTATUS
ElfrOpenELW(
365 EVENTLOG_HANDLE_W UNCServerName
,
366 PRPC_UNICODE_STRING ModuleName
,
367 PRPC_UNICODE_STRING RegModuleName
,
370 IELF_HANDLE
*LogHandle
)
372 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
373 return STATUS_INVALID_PARAMETER
;
375 /* RegModuleName must be an empty string */
376 if (RegModuleName
->Length
> 0)
377 return STATUS_INVALID_PARAMETER
;
379 /*FIXME: UNCServerName must specify the server */
381 /*FIXME: Must verify that caller has read access */
383 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
390 NTSTATUS
ElfrRegisterEventSourceW(
391 EVENTLOG_HANDLE_W UNCServerName
,
392 PRPC_UNICODE_STRING ModuleName
,
393 PRPC_UNICODE_STRING RegModuleName
,
396 IELF_HANDLE
*LogHandle
)
398 DPRINT("ElfrRegisterEventSourceW()\n");
400 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
401 return STATUS_INVALID_PARAMETER
;
403 /* RegModuleName must be an empty string */
404 if (RegModuleName
->Length
> 0)
405 return STATUS_INVALID_PARAMETER
;
407 DPRINT("ModuleName: %S\n", ModuleName
->Buffer
);
409 /*FIXME: UNCServerName must specify the server or empty for local */
411 /*FIXME: Must verify that caller has write access */
413 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
420 NTSTATUS
ElfrOpenBELW(
421 EVENTLOG_HANDLE_W UNCServerName
,
422 PRPC_UNICODE_STRING BackupFileName
,
425 IELF_HANDLE
*LogHandle
)
427 DPRINT("ElfrOpenBELW(%wZ)\n", BackupFileName
);
429 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
430 return STATUS_INVALID_PARAMETER
;
432 /*FIXME: UNCServerName must specify the server */
434 /*FIXME: Must verify that caller has read access */
436 return ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
437 (PUNICODE_STRING
)BackupFileName
);
442 NTSTATUS
ElfrReadELW(
443 IELF_HANDLE LogHandle
,
446 RULONG NumberOfBytesToRead
,
448 DWORD
*NumberOfBytesRead
,
449 DWORD
*MinNumberOfBytesNeeded
)
451 PLOGHANDLE lpLogHandle
;
455 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
458 return STATUS_INVALID_HANDLE
;
462 return STATUS_INVALID_PARAMETER
;
464 /* If sequential read, retrieve the CurrentRecord from this log handle */
465 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
467 RecordNumber
= lpLogHandle
->CurrentRecord
;
471 RecordNumber
= RecordOffset
;
474 dwError
= LogfReadEvent(lpLogHandle
->LogFile
, ReadFlags
, &RecordNumber
,
475 NumberOfBytesToRead
, Buffer
, NumberOfBytesRead
, MinNumberOfBytesNeeded
,
478 /* Update the handles CurrentRecord if success*/
479 if (dwError
== ERROR_SUCCESS
)
481 lpLogHandle
->CurrentRecord
= RecordNumber
;
485 if (dwError
== ERROR_HANDLE_EOF
)
486 return STATUS_END_OF_FILE
;
488 return I_RpcMapWin32Status(dwError
);
493 NTSTATUS
ElfrReportEventW(
494 IELF_HANDLE LogHandle
,
497 USHORT EventCategory
,
501 PRPC_UNICODE_STRING ComputerName
,
503 PRPC_UNICODE_STRING Strings
[],
511 PLOGHANDLE lpLogHandle
;
514 DWORD dwStringsSize
= 0;
515 DWORD dwUserSidLength
= 0;
516 DWORD dwError
= ERROR_SUCCESS
;
520 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
523 return STATUS_INVALID_HANDLE
;
526 /* Flags must be 0 */
529 return STATUS_INVALID_PARAMETER
;
532 lastRec
= LogfGetCurrentRecord(lpLogHandle
->LogFile
);
534 for (i
= 0; i
< NumStrings
; i
++)
538 case EVENTLOG_SUCCESS
:
539 DPRINT("Success: %wZ\n", Strings
[i
]);
542 case EVENTLOG_ERROR_TYPE
:
543 DPRINT("Error: %wZ\n", Strings
[i
]);
546 case EVENTLOG_WARNING_TYPE
:
547 DPRINT("Warning: %wZ\n", Strings
[i
]);
550 case EVENTLOG_INFORMATION_TYPE
:
551 DPRINT("Info: %wZ\n", Strings
[i
]);
554 case EVENTLOG_AUDIT_SUCCESS
:
555 DPRINT("Audit Success: %wZ\n", Strings
[i
]);
558 case EVENTLOG_AUDIT_FAILURE
:
559 DPRINT("Audit Failure: %wZ\n", Strings
[i
]);
563 DPRINT1("Type %hu: %wZ\n", EventType
, Strings
[i
]);
566 dwStringsSize
+= Strings
[i
]->Length
+ sizeof UNICODE_NULL
;
569 lpStrings
= HeapAlloc(GetProcessHeap(), 0, dwStringsSize
);
572 DPRINT1("Failed to allocate heap\n");
573 return STATUS_NO_MEMORY
;
576 for (i
= 0; i
< NumStrings
; i
++)
578 CopyMemory(lpStrings
+ pos
, Strings
[i
]->Buffer
, Strings
[i
]->Length
);
579 pos
+= Strings
[i
]->Length
/ sizeof(WCHAR
);
580 lpStrings
[pos
] = UNICODE_NULL
;
581 pos
+= sizeof UNICODE_NULL
/ sizeof(WCHAR
);
585 dwUserSidLength
= FIELD_OFFSET(SID
, SubAuthority
[UserSID
->SubAuthorityCount
]);
586 LogBuffer
= LogfAllocAndBuildNewRecord(&recSize
,
592 ComputerName
->Buffer
,
600 dwError
= LogfWriteData(lpLogHandle
->LogFile
, recSize
, LogBuffer
);
603 DPRINT1("ERROR WRITING TO EventLog %S\n", lpLogHandle
->LogFile
->FileName
);
606 LogfFreeRecord(LogBuffer
);
608 HeapFree(GetProcessHeap(), 0, lpStrings
);
610 return I_RpcMapWin32Status(dwError
);
615 NTSTATUS
ElfrClearELFA(
616 IELF_HANDLE LogHandle
,
617 PRPC_STRING BackupFileName
)
619 UNICODE_STRING BackupFileNameW
;
622 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
623 (PANSI_STRING
)BackupFileName
,
625 if (!NT_SUCCESS(Status
))
628 Status
= ElfrClearELFW(LogHandle
,
629 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
631 RtlFreeUnicodeString(&BackupFileNameW
);
638 NTSTATUS
ElfrBackupELFA(
639 IELF_HANDLE LogHandle
,
640 PRPC_STRING BackupFileName
)
642 UNICODE_STRING BackupFileNameW
;
645 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
646 (PANSI_STRING
)BackupFileName
,
648 if (!NT_SUCCESS(Status
))
651 Status
= ElfrBackupELFW(LogHandle
,
652 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
654 RtlFreeUnicodeString(&BackupFileNameW
);
661 NTSTATUS
ElfrOpenELA(
662 EVENTLOG_HANDLE_A UNCServerName
,
663 PRPC_STRING ModuleName
,
664 PRPC_STRING RegModuleName
,
667 IELF_HANDLE
*LogHandle
)
669 UNICODE_STRING ModuleNameW
;
672 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
673 return STATUS_INVALID_PARAMETER
;
675 /* RegModuleName must be an empty string */
676 if (RegModuleName
->Length
> 0)
677 return STATUS_INVALID_PARAMETER
;
679 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
, (PANSI_STRING
)ModuleName
, TRUE
);
680 if (!NT_SUCCESS(Status
))
683 /* FIXME: Must verify that caller has read access */
685 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
689 RtlFreeUnicodeString(&ModuleNameW
);
696 NTSTATUS
ElfrRegisterEventSourceA(
697 EVENTLOG_HANDLE_A UNCServerName
,
698 PRPC_STRING ModuleName
,
699 PRPC_STRING RegModuleName
,
702 IELF_HANDLE
*LogHandle
)
704 UNICODE_STRING ModuleNameW
;
707 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
,
708 (PANSI_STRING
)ModuleName
,
710 if (!NT_SUCCESS(Status
))
712 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
716 /* RegModuleName must be an empty string */
717 if (RegModuleName
->Length
> 0)
719 RtlFreeUnicodeString(&ModuleNameW
);
720 return STATUS_INVALID_PARAMETER
;
723 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
725 RtlFreeUnicodeString(&ModuleNameW
);
726 return STATUS_INVALID_PARAMETER
;
729 /* FIXME: Must verify that caller has write access */
731 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
735 RtlFreeUnicodeString(&ModuleNameW
);
742 NTSTATUS
ElfrOpenBELA(
743 EVENTLOG_HANDLE_A UNCServerName
,
744 PRPC_STRING BackupFileName
,
747 IELF_HANDLE
*LogHandle
)
749 UNICODE_STRING BackupFileNameW
;
752 DPRINT("ElfrOpenBELA(%Z)\n", BackupFileName
);
754 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
755 (PANSI_STRING
)BackupFileName
,
757 if (!NT_SUCCESS(Status
))
759 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
763 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
765 RtlFreeUnicodeString(&BackupFileNameW
);
766 return STATUS_INVALID_PARAMETER
;
769 /*FIXME: UNCServerName must specify the server */
771 /*FIXME: Must verify that caller has read access */
773 Status
= ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
776 RtlFreeUnicodeString(&BackupFileNameW
);
783 NTSTATUS
ElfrReadELA(
784 IELF_HANDLE LogHandle
,
787 RULONG NumberOfBytesToRead
,
789 DWORD
*NumberOfBytesRead
,
790 DWORD
*MinNumberOfBytesNeeded
)
792 PLOGHANDLE lpLogHandle
;
796 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
799 return STATUS_INVALID_HANDLE
;
803 return STATUS_INVALID_PARAMETER
;
805 /* If sequential read, retrieve the CurrentRecord from this log handle */
806 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
808 RecordNumber
= lpLogHandle
->CurrentRecord
;
812 RecordNumber
= RecordOffset
;
815 dwError
= LogfReadEvent(lpLogHandle
->LogFile
,
821 MinNumberOfBytesNeeded
,
824 /* Update the handles CurrentRecord if success*/
825 if (dwError
== ERROR_SUCCESS
)
827 lpLogHandle
->CurrentRecord
= RecordNumber
;
831 if (dwError
== ERROR_HANDLE_EOF
)
832 return STATUS_END_OF_FILE
;
834 return I_RpcMapWin32Status(dwError
);
839 NTSTATUS
ElfrReportEventA(
840 IELF_HANDLE LogHandle
,
843 USHORT EventCategory
,
847 PRPC_STRING ComputerName
,
849 PRPC_STRING Strings
[],
855 UNICODE_STRING ComputerNameW
;
856 PUNICODE_STRING
*StringsArrayW
= NULL
;
857 NTSTATUS Status
= STATUS_SUCCESS
;
860 DPRINT("ElfrReportEventA(%hu)\n", NumStrings
);
863 for (i
= 0; i
< NumStrings
; i
++)
865 if (Strings
[i
] == NULL
)
867 DPRINT1("String %hu is null\n", i
);
871 DPRINT1("String %hu: %Z\n", i
, Strings
[i
]);
876 Status
= RtlAnsiStringToUnicodeString((PUNICODE_STRING
)&ComputerNameW
,
877 (PANSI_STRING
)ComputerName
,
879 if (!NT_SUCCESS(Status
))
884 StringsArrayW
= HeapAlloc(MyHeap
,
886 NumStrings
* sizeof (PUNICODE_STRING
));
887 if (StringsArrayW
== NULL
)
889 Status
= STATUS_NO_MEMORY
;
893 for (i
= 0; i
< NumStrings
; i
++)
895 if (Strings
[i
] != NULL
)
897 StringsArrayW
[i
] = HeapAlloc(MyHeap
,
899 sizeof(UNICODE_STRING
));
900 if (StringsArrayW
[i
] == NULL
)
902 Status
= STATUS_NO_MEMORY
;
906 Status
= RtlAnsiStringToUnicodeString(StringsArrayW
[i
],
907 (PANSI_STRING
)Strings
[i
],
911 if (!NT_SUCCESS(Status
))
916 if (NT_SUCCESS(Status
))
918 Status
= ElfrReportEventW(LogHandle
,
925 (PRPC_UNICODE_STRING
)&ComputerNameW
,
927 (PRPC_UNICODE_STRING
*)StringsArrayW
,
935 if (StringsArrayW
!= NULL
)
937 for (i
= 0; i
< NumStrings
; i
++)
939 if (StringsArrayW
[i
] != NULL
)
941 if (StringsArrayW
[i
]->Buffer
)
943 RtlFreeUnicodeString(StringsArrayW
[i
]);
944 HeapFree(MyHeap
, 0, StringsArrayW
[i
]);
949 HeapFree(MyHeap
, 0, StringsArrayW
);
952 RtlFreeUnicodeString(&ComputerNameW
);
959 NTSTATUS
ElfrRegisterClusterSvc(
960 handle_t BindingHandle
)
963 return STATUS_NOT_IMPLEMENTED
;
968 NTSTATUS
ElfrDeregisterClusterSvc(
969 handle_t BindingHandle
)
972 return STATUS_NOT_IMPLEMENTED
;
977 NTSTATUS
ElfrWriteClusterEvents(
978 handle_t BindingHandle
)
981 return STATUS_NOT_IMPLEMENTED
;
986 NTSTATUS
ElfrGetLogInformation(
987 IELF_HANDLE LogHandle
,
991 DWORD
*pcbBytesNeeded
)
993 NTSTATUS Status
= STATUS_SUCCESS
;
995 /* FIXME: check handle first */
999 case EVENTLOG_FULL_INFO
:
1001 LPEVENTLOG_FULL_INFORMATION efi
= (LPEVENTLOG_FULL_INFORMATION
)Buffer
;
1003 *pcbBytesNeeded
= sizeof(EVENTLOG_FULL_INFORMATION
);
1004 if (cbBufSize
< sizeof(EVENTLOG_FULL_INFORMATION
))
1006 return STATUS_BUFFER_TOO_SMALL
;
1009 efi
->dwFull
= 0; /* FIXME */
1014 Status
= STATUS_INVALID_LEVEL
;
1023 NTSTATUS
ElfrFlushEL(
1024 IELF_HANDLE LogHandle
)
1027 return STATUS_NOT_IMPLEMENTED
;
1032 NTSTATUS
ElfrReportEventAndSourceW(
1033 IELF_HANDLE LogHandle
,
1036 USHORT EventCategory
,
1038 PRPC_UNICODE_STRING SourceName
,
1041 PRPC_UNICODE_STRING ComputerName
,
1043 PRPC_UNICODE_STRING Strings
[],
1046 DWORD
*RecordNumber
,
1050 return STATUS_NOT_IMPLEMENTED
;
1054 void __RPC_FAR
*__RPC_USER
midl_user_allocate(SIZE_T len
)
1056 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
1060 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
1062 HeapFree(GetProcessHeap(), 0, ptr
);
1066 void __RPC_USER
IELF_HANDLE_rundown(IELF_HANDLE LogHandle
)