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 PLOGHANDLE lpLogHandle
;
201 if (IsListEmpty(&LogHandleListHead
))
206 lpLogHandle
= CONTAINING_RECORD((PLOGHANDLE
)EventLogHandle
, LOGHANDLE
, LogHandleListEntry
);
213 ElfDeleteEventLogHandle(IELF_HANDLE EventLogHandle
)
215 PLOGHANDLE lpLogHandle
= (PLOGHANDLE
)EventLogHandle
;
217 if (!ElfGetLogHandleEntryByHandle(lpLogHandle
))
218 return STATUS_INVALID_HANDLE
;
220 RemoveEntryList(&lpLogHandle
->LogHandleListEntry
);
221 LogfClose(lpLogHandle
->LogFile
, FALSE
);
223 HeapFree(GetProcessHeap(),0,lpLogHandle
);
225 return STATUS_SUCCESS
;
229 NTSTATUS
ElfrClearELFW(
230 IELF_HANDLE LogHandle
,
231 PRPC_UNICODE_STRING BackupFileName
)
233 PLOGHANDLE lpLogHandle
;
235 DPRINT("ElfrClearELFW()\n");
237 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
240 return STATUS_INVALID_HANDLE
;
243 /* Fail, if the log file is a backup file */
244 if (lpLogHandle
->Flags
& LOG_HANDLE_BACKUP_FILE
)
245 return STATUS_INVALID_HANDLE
;
247 return LogfClearFile(lpLogHandle
->LogFile
,
248 (PUNICODE_STRING
)BackupFileName
);
253 NTSTATUS
ElfrBackupELFW(
254 IELF_HANDLE LogHandle
,
255 PRPC_UNICODE_STRING BackupFileName
)
257 PLOGHANDLE lpLogHandle
;
259 DPRINT("ElfrBackupELFW()\n");
261 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
264 return STATUS_INVALID_HANDLE
;
267 return LogfBackupFile(lpLogHandle
->LogFile
,
268 (PUNICODE_STRING
)BackupFileName
);
273 NTSTATUS
ElfrCloseEL(
274 IELF_HANDLE
*LogHandle
)
276 return ElfDeleteEventLogHandle(*LogHandle
);
281 NTSTATUS
ElfrDeregisterEventSource(
282 IELF_HANDLE
*LogHandle
)
284 return ElfDeleteEventLogHandle(*LogHandle
);
289 NTSTATUS
ElfrNumberOfRecords(
290 IELF_HANDLE LogHandle
,
291 DWORD
*NumberOfRecords
)
293 PLOGHANDLE lpLogHandle
;
296 DPRINT("ElfrNumberOfRecords()\n");
298 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
301 return STATUS_INVALID_HANDLE
;
304 lpLogFile
= lpLogHandle
->LogFile
;
306 DPRINT("Oldest: %lu Current: %lu\n",
307 lpLogFile
->Header
.OldestRecordNumber
,
308 lpLogFile
->Header
.CurrentRecordNumber
);
310 *NumberOfRecords
= lpLogFile
->Header
.CurrentRecordNumber
-
311 lpLogFile
->Header
.OldestRecordNumber
;
313 return STATUS_SUCCESS
;
318 NTSTATUS
ElfrOldestRecord(
319 IELF_HANDLE LogHandle
,
320 DWORD
*OldestRecordNumber
)
322 PLOGHANDLE lpLogHandle
;
324 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
327 return STATUS_INVALID_HANDLE
;
330 if (!OldestRecordNumber
)
332 return STATUS_INVALID_PARAMETER
;
335 *OldestRecordNumber
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
337 return STATUS_SUCCESS
;
342 NTSTATUS
ElfrChangeNotify(
343 IELF_HANDLE
*LogHandle
,
344 RPC_CLIENT_ID ClientId
,
347 DPRINT("ElfrChangeNotify()");
350 return STATUS_NOT_IMPLEMENTED
;
355 NTSTATUS
ElfrOpenELW(
356 EVENTLOG_HANDLE_W UNCServerName
,
357 PRPC_UNICODE_STRING ModuleName
,
358 PRPC_UNICODE_STRING RegModuleName
,
361 IELF_HANDLE
*LogHandle
)
363 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
364 return STATUS_INVALID_PARAMETER
;
366 /* RegModuleName must be an empty string */
367 if (RegModuleName
->Length
> 0)
368 return STATUS_INVALID_PARAMETER
;
370 /*FIXME: UNCServerName must specify the server */
372 /*FIXME: Must verify that caller has read access */
374 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
381 NTSTATUS
ElfrRegisterEventSourceW(
382 EVENTLOG_HANDLE_W UNCServerName
,
383 PRPC_UNICODE_STRING ModuleName
,
384 PRPC_UNICODE_STRING RegModuleName
,
387 IELF_HANDLE
*LogHandle
)
389 DPRINT("ElfrRegisterEventSourceW()\n");
391 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
392 return STATUS_INVALID_PARAMETER
;
394 /* RegModuleName must be an empty string */
395 if (RegModuleName
->Length
> 0)
396 return STATUS_INVALID_PARAMETER
;
398 DPRINT("ModuleName: %S\n", ModuleName
->Buffer
);
400 /*FIXME: UNCServerName must specify the server or empty for local */
402 /*FIXME: Must verify that caller has write access */
404 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
411 NTSTATUS
ElfrOpenBELW(
412 EVENTLOG_HANDLE_W UNCServerName
,
413 PRPC_UNICODE_STRING BackupFileName
,
416 IELF_HANDLE
*LogHandle
)
418 DPRINT("ElfrOpenBELW(%wZ)\n", BackupFileName
);
420 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
421 return STATUS_INVALID_PARAMETER
;
423 /*FIXME: UNCServerName must specify the server */
425 /*FIXME: Must verify that caller has read access */
427 return ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
428 (PUNICODE_STRING
)BackupFileName
);
433 NTSTATUS
ElfrReadELW(
434 IELF_HANDLE LogHandle
,
437 RULONG NumberOfBytesToRead
,
439 DWORD
*NumberOfBytesRead
,
440 DWORD
*MinNumberOfBytesNeeded
)
442 PLOGHANDLE lpLogHandle
;
446 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
449 return STATUS_INVALID_HANDLE
;
453 return STATUS_INVALID_PARAMETER
;
455 /* If sequential read, retrieve the CurrentRecord from this log handle */
456 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
458 RecordNumber
= lpLogHandle
->CurrentRecord
;
462 RecordNumber
= RecordOffset
;
465 dwError
= LogfReadEvent(lpLogHandle
->LogFile
, ReadFlags
, &RecordNumber
,
466 NumberOfBytesToRead
, Buffer
, NumberOfBytesRead
, MinNumberOfBytesNeeded
,
469 /* Update the handles CurrentRecord if success*/
470 if (dwError
== ERROR_SUCCESS
)
472 lpLogHandle
->CurrentRecord
= RecordNumber
;
476 if (dwError
== ERROR_HANDLE_EOF
)
477 return STATUS_END_OF_FILE
;
479 return I_RpcMapWin32Status(dwError
);
484 NTSTATUS
ElfrReportEventW(
485 IELF_HANDLE LogHandle
,
488 USHORT EventCategory
,
492 PRPC_UNICODE_STRING ComputerName
,
494 PRPC_UNICODE_STRING Strings
[],
502 PLOGHANDLE lpLogHandle
;
505 DWORD dwStringsSize
= 0;
506 DWORD dwUserSidLength
= 0;
507 DWORD dwError
= ERROR_SUCCESS
;
511 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
514 return STATUS_INVALID_HANDLE
;
517 /* Flags must be 0 */
520 return STATUS_INVALID_PARAMETER
;
523 lastRec
= LogfGetCurrentRecord(lpLogHandle
->LogFile
);
525 for (i
= 0; i
< NumStrings
; i
++)
529 case EVENTLOG_SUCCESS
:
530 DPRINT("Success: %wZ\n", Strings
[i
]);
533 case EVENTLOG_ERROR_TYPE
:
534 DPRINT("Error: %wZ\n", Strings
[i
]);
537 case EVENTLOG_WARNING_TYPE
:
538 DPRINT("Warning: %wZ\n", Strings
[i
]);
541 case EVENTLOG_INFORMATION_TYPE
:
542 DPRINT("Info: %wZ\n", Strings
[i
]);
545 case EVENTLOG_AUDIT_SUCCESS
:
546 DPRINT("Audit Success: %wZ\n", Strings
[i
]);
549 case EVENTLOG_AUDIT_FAILURE
:
550 DPRINT("Audit Failure: %wZ\n", Strings
[i
]);
554 DPRINT1("Type %hu: %wZ\n", EventType
, Strings
[i
]);
557 dwStringsSize
+= Strings
[i
]->Length
+ sizeof UNICODE_NULL
;
560 lpStrings
= HeapAlloc(GetProcessHeap(), 0, dwStringsSize
);
563 DPRINT1("Failed to allocate heap\n");
564 return STATUS_NO_MEMORY
;
567 for (i
= 0; i
< NumStrings
; i
++)
569 CopyMemory(lpStrings
+ pos
, Strings
[i
]->Buffer
, Strings
[i
]->Length
);
570 pos
+= Strings
[i
]->Length
/ sizeof(WCHAR
);
571 lpStrings
[pos
] = UNICODE_NULL
;
572 pos
+= sizeof UNICODE_NULL
/ sizeof(WCHAR
);
576 dwUserSidLength
= FIELD_OFFSET(SID
, SubAuthority
[UserSID
->SubAuthorityCount
]);
577 LogBuffer
= LogfAllocAndBuildNewRecord(&recSize
,
583 ComputerName
->Buffer
,
591 dwError
= LogfWriteData(lpLogHandle
->LogFile
, recSize
, LogBuffer
);
594 DPRINT1("ERROR WRITING TO EventLog %S\n", lpLogHandle
->LogFile
->FileName
);
597 LogfFreeRecord(LogBuffer
);
599 HeapFree(GetProcessHeap(), 0, lpStrings
);
601 return I_RpcMapWin32Status(dwError
);
606 NTSTATUS
ElfrClearELFA(
607 IELF_HANDLE LogHandle
,
608 PRPC_STRING BackupFileName
)
610 UNICODE_STRING BackupFileNameW
;
613 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
614 (PANSI_STRING
)BackupFileName
,
616 if (!NT_SUCCESS(Status
))
619 Status
= ElfrClearELFW(LogHandle
,
620 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
622 RtlFreeUnicodeString(&BackupFileNameW
);
629 NTSTATUS
ElfrBackupELFA(
630 IELF_HANDLE LogHandle
,
631 PRPC_STRING BackupFileName
)
633 UNICODE_STRING BackupFileNameW
;
636 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
637 (PANSI_STRING
)BackupFileName
,
639 if (!NT_SUCCESS(Status
))
642 Status
= ElfrBackupELFW(LogHandle
,
643 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
645 RtlFreeUnicodeString(&BackupFileNameW
);
652 NTSTATUS
ElfrOpenELA(
653 EVENTLOG_HANDLE_A UNCServerName
,
654 PRPC_STRING ModuleName
,
655 PRPC_STRING RegModuleName
,
658 IELF_HANDLE
*LogHandle
)
660 UNICODE_STRING ModuleNameW
;
663 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
664 return STATUS_INVALID_PARAMETER
;
666 /* RegModuleName must be an empty string */
667 if (RegModuleName
->Length
> 0)
668 return STATUS_INVALID_PARAMETER
;
670 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
, (PANSI_STRING
)ModuleName
, TRUE
);
671 if (!NT_SUCCESS(Status
))
674 /* FIXME: Must verify that caller has read access */
676 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
680 RtlFreeUnicodeString(&ModuleNameW
);
687 NTSTATUS
ElfrRegisterEventSourceA(
688 EVENTLOG_HANDLE_A UNCServerName
,
689 PRPC_STRING ModuleName
,
690 PRPC_STRING RegModuleName
,
693 IELF_HANDLE
*LogHandle
)
695 UNICODE_STRING ModuleNameW
;
698 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
,
699 (PANSI_STRING
)ModuleName
,
701 if (!NT_SUCCESS(Status
))
703 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
707 /* RegModuleName must be an empty string */
708 if (RegModuleName
->Length
> 0)
710 RtlFreeUnicodeString(&ModuleNameW
);
711 return STATUS_INVALID_PARAMETER
;
714 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
716 RtlFreeUnicodeString(&ModuleNameW
);
717 return STATUS_INVALID_PARAMETER
;
720 /* FIXME: Must verify that caller has write access */
722 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
726 RtlFreeUnicodeString(&ModuleNameW
);
733 NTSTATUS
ElfrOpenBELA(
734 EVENTLOG_HANDLE_A UNCServerName
,
735 PRPC_STRING BackupFileName
,
738 IELF_HANDLE
*LogHandle
)
740 UNICODE_STRING BackupFileNameW
;
743 DPRINT("ElfrOpenBELA(%Z)\n", BackupFileName
);
745 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
746 (PANSI_STRING
)BackupFileName
,
748 if (!NT_SUCCESS(Status
))
750 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
754 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
756 RtlFreeUnicodeString(&BackupFileNameW
);
757 return STATUS_INVALID_PARAMETER
;
760 /*FIXME: UNCServerName must specify the server */
762 /*FIXME: Must verify that caller has read access */
764 Status
= ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
767 RtlFreeUnicodeString(&BackupFileNameW
);
774 NTSTATUS
ElfrReadELA(
775 IELF_HANDLE LogHandle
,
778 RULONG NumberOfBytesToRead
,
780 DWORD
*NumberOfBytesRead
,
781 DWORD
*MinNumberOfBytesNeeded
)
783 PLOGHANDLE lpLogHandle
;
787 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
790 return STATUS_INVALID_HANDLE
;
794 return STATUS_INVALID_PARAMETER
;
796 /* If sequential read, retrieve the CurrentRecord from this log handle */
797 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
799 RecordNumber
= lpLogHandle
->CurrentRecord
;
803 RecordNumber
= RecordOffset
;
806 dwError
= LogfReadEvent(lpLogHandle
->LogFile
,
812 MinNumberOfBytesNeeded
,
815 /* Update the handles CurrentRecord if success*/
816 if (dwError
== ERROR_SUCCESS
)
818 lpLogHandle
->CurrentRecord
= RecordNumber
;
822 if (dwError
== ERROR_HANDLE_EOF
)
823 return STATUS_END_OF_FILE
;
825 return I_RpcMapWin32Status(dwError
);
830 NTSTATUS
ElfrReportEventA(
831 IELF_HANDLE LogHandle
,
834 USHORT EventCategory
,
838 PRPC_STRING ComputerName
,
840 PRPC_STRING Strings
[],
846 UNICODE_STRING ComputerNameW
;
847 PUNICODE_STRING
*StringsArrayW
= NULL
;
848 NTSTATUS Status
= STATUS_SUCCESS
;
851 DPRINT("ElfrReportEventA(%hu)\n", NumStrings
);
854 for (i
= 0; i
< NumStrings
; i
++)
856 if (Strings
[i
] == NULL
)
858 DPRINT1("String %hu is null\n", i
);
862 DPRINT1("String %hu: %Z\n", i
, Strings
[i
]);
867 Status
= RtlAnsiStringToUnicodeString((PUNICODE_STRING
)&ComputerNameW
,
868 (PANSI_STRING
)ComputerName
,
870 if (!NT_SUCCESS(Status
))
875 StringsArrayW
= HeapAlloc(MyHeap
,
877 NumStrings
* sizeof (PUNICODE_STRING
));
878 if (StringsArrayW
== NULL
)
880 Status
= STATUS_NO_MEMORY
;
884 for (i
= 0; i
< NumStrings
; i
++)
886 if (Strings
[i
] != NULL
)
888 StringsArrayW
[i
] = HeapAlloc(MyHeap
,
890 sizeof(UNICODE_STRING
));
891 if (StringsArrayW
[i
] == NULL
)
893 Status
= STATUS_NO_MEMORY
;
897 Status
= RtlAnsiStringToUnicodeString(StringsArrayW
[i
],
898 (PANSI_STRING
)Strings
[i
],
902 if (!NT_SUCCESS(Status
))
907 if (NT_SUCCESS(Status
))
909 Status
= ElfrReportEventW(LogHandle
,
916 (PRPC_UNICODE_STRING
)&ComputerNameW
,
918 (PRPC_UNICODE_STRING
*)StringsArrayW
,
926 if (StringsArrayW
!= NULL
)
928 for (i
= 0; i
< NumStrings
; i
++)
930 if (StringsArrayW
[i
] != NULL
)
932 if (StringsArrayW
[i
]->Buffer
)
934 RtlFreeUnicodeString(StringsArrayW
[i
]);
935 HeapFree(MyHeap
, 0, StringsArrayW
[i
]);
940 HeapFree(MyHeap
, 0, StringsArrayW
);
943 RtlFreeUnicodeString(&ComputerNameW
);
950 NTSTATUS
ElfrRegisterClusterSvc(
951 handle_t BindingHandle
)
954 return STATUS_NOT_IMPLEMENTED
;
959 NTSTATUS
ElfrDeregisterClusterSvc(
960 handle_t BindingHandle
)
963 return STATUS_NOT_IMPLEMENTED
;
968 NTSTATUS
ElfrWriteClusterEvents(
969 handle_t BindingHandle
)
972 return STATUS_NOT_IMPLEMENTED
;
977 NTSTATUS
ElfrGetLogInformation(
978 IELF_HANDLE LogHandle
,
982 DWORD
*pcbBytesNeeded
)
984 NTSTATUS Status
= STATUS_SUCCESS
;
986 /* FIXME: check handle first */
990 case EVENTLOG_FULL_INFO
:
992 LPEVENTLOG_FULL_INFORMATION efi
= (LPEVENTLOG_FULL_INFORMATION
)Buffer
;
994 *pcbBytesNeeded
= sizeof(EVENTLOG_FULL_INFORMATION
);
995 if (cbBufSize
< sizeof(EVENTLOG_FULL_INFORMATION
))
997 return STATUS_BUFFER_TOO_SMALL
;
1000 efi
->dwFull
= 0; /* FIXME */
1005 Status
= STATUS_INVALID_LEVEL
;
1014 NTSTATUS
ElfrFlushEL(
1015 IELF_HANDLE LogHandle
)
1018 return STATUS_NOT_IMPLEMENTED
;
1023 NTSTATUS
ElfrReportEventAndSourceW(
1024 IELF_HANDLE LogHandle
,
1027 USHORT EventCategory
,
1029 PRPC_UNICODE_STRING SourceName
,
1032 PRPC_UNICODE_STRING ComputerName
,
1034 PRPC_UNICODE_STRING Strings
[],
1037 DWORD
*RecordNumber
,
1041 return STATUS_NOT_IMPLEMENTED
;
1045 void __RPC_FAR
*__RPC_USER
midl_user_allocate(SIZE_T len
)
1047 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
1051 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
1053 HeapFree(GetProcessHeap(), 0, ptr
);
1057 void __RPC_USER
IELF_HANDLE_rundown(IELF_HANDLE LogHandle
)