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
,
167 if (!NT_SUCCESS(Status
))
169 DPRINT1("Failed to create the log file! (Status 0x%08lx)\n", Status
);
173 /* Set the backup flag */
174 lpLogHandle
->Flags
|= LOG_HANDLE_BACKUP_FILE
;
176 /* Get the current record */
177 lpLogHandle
->CurrentRecord
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
180 if (NT_SUCCESS(Status
))
182 /* Append log handle */
183 InsertTailList(&LogHandleListHead
, &lpLogHandle
->LogHandleListEntry
);
184 *LogHandle
= lpLogHandle
;
188 HeapFree(GetProcessHeap(), 0, lpLogHandle
);
195 PLOGHANDLE
ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle
)
197 PLOGHANDLE lpLogHandle
;
199 if (IsListEmpty(&LogHandleListHead
))
204 lpLogHandle
= CONTAINING_RECORD((PLOGHANDLE
)EventLogHandle
, LOGHANDLE
, LogHandleListEntry
);
211 ElfDeleteEventLogHandle(IELF_HANDLE EventLogHandle
)
213 PLOGHANDLE lpLogHandle
= (PLOGHANDLE
)EventLogHandle
;
215 if (!ElfGetLogHandleEntryByHandle(lpLogHandle
))
216 return STATUS_INVALID_HANDLE
;
218 LogfClose(lpLogHandle
->LogFile
, FALSE
);
220 RemoveEntryList(&lpLogHandle
->LogHandleListEntry
);
221 HeapFree(GetProcessHeap(),0,lpLogHandle
);
223 return STATUS_SUCCESS
;
227 NTSTATUS
ElfrClearELFW(
228 IELF_HANDLE LogHandle
,
229 PRPC_UNICODE_STRING BackupFileName
)
231 PLOGHANDLE lpLogHandle
;
233 DPRINT("ElfrClearELFW()\n");
235 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
238 return STATUS_INVALID_HANDLE
;
241 /* Fail, if the log file is a backup file */
242 if (lpLogHandle
->Flags
& LOG_HANDLE_BACKUP_FILE
)
243 return STATUS_INVALID_HANDLE
;
245 return LogfClearFile(lpLogHandle
->LogFile
,
246 (PUNICODE_STRING
)BackupFileName
);
251 NTSTATUS
ElfrBackupELFW(
252 IELF_HANDLE LogHandle
,
253 PRPC_UNICODE_STRING BackupFileName
)
255 PLOGHANDLE lpLogHandle
;
257 DPRINT("ElfrBackupELFW()\n");
259 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
262 return STATUS_INVALID_HANDLE
;
265 return LogfBackupFile(lpLogHandle
->LogFile
,
266 (PUNICODE_STRING
)BackupFileName
);
271 NTSTATUS
ElfrCloseEL(
272 IELF_HANDLE
*LogHandle
)
274 return ElfDeleteEventLogHandle(*LogHandle
);
279 NTSTATUS
ElfrDeregisterEventSource(
280 IELF_HANDLE
*LogHandle
)
282 return ElfDeleteEventLogHandle(*LogHandle
);
287 NTSTATUS
ElfrNumberOfRecords(
288 IELF_HANDLE LogHandle
,
289 DWORD
*NumberOfRecords
)
291 PLOGHANDLE lpLogHandle
;
294 DPRINT("ElfrNumberOfRecords()");
296 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
299 return STATUS_INVALID_HANDLE
;
302 lpLogFile
= lpLogHandle
->LogFile
;
304 DPRINT("Oldest: %lu Current: %lu\n",
305 lpLogFile
->Header
.OldestRecordNumber
,
306 lpLogFile
->Header
.CurrentRecordNumber
);
308 *NumberOfRecords
= lpLogFile
->Header
.CurrentRecordNumber
-
309 lpLogFile
->Header
.OldestRecordNumber
;
311 return STATUS_SUCCESS
;
316 NTSTATUS
ElfrOldestRecord(
317 IELF_HANDLE LogHandle
,
318 DWORD
*OldestRecordNumber
)
320 PLOGHANDLE lpLogHandle
;
322 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
325 return STATUS_INVALID_HANDLE
;
328 if (!OldestRecordNumber
)
330 return STATUS_INVALID_PARAMETER
;
333 *OldestRecordNumber
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
335 return STATUS_SUCCESS
;
340 NTSTATUS
ElfrChangeNotify(
341 IELF_HANDLE
*LogHandle
,
342 RPC_CLIENT_ID ClientId
,
345 DPRINT("ElfrChangeNotify()");
348 return STATUS_NOT_IMPLEMENTED
;
353 NTSTATUS
ElfrOpenELW(
354 EVENTLOG_HANDLE_W UNCServerName
,
355 PRPC_UNICODE_STRING ModuleName
,
356 PRPC_UNICODE_STRING RegModuleName
,
359 IELF_HANDLE
*LogHandle
)
361 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
362 return STATUS_INVALID_PARAMETER
;
364 /* RegModuleName must be an empty string */
365 if (RegModuleName
->Length
> 0)
366 return STATUS_INVALID_PARAMETER
;
368 /*FIXME: UNCServerName must specify the server */
370 /*FIXME: Must verify that caller has read access */
372 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
379 NTSTATUS
ElfrRegisterEventSourceW(
380 EVENTLOG_HANDLE_W UNCServerName
,
381 PRPC_UNICODE_STRING ModuleName
,
382 PRPC_UNICODE_STRING RegModuleName
,
385 IELF_HANDLE
*LogHandle
)
387 DPRINT("ElfrRegisterEventSourceW()\n");
389 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
390 return STATUS_INVALID_PARAMETER
;
392 /* RegModuleName must be an empty string */
393 if (RegModuleName
->Length
> 0)
394 return STATUS_INVALID_PARAMETER
;
396 DPRINT("ModuleName: %S\n", ModuleName
->Buffer
);
398 /*FIXME: UNCServerName must specify the server or empty for local */
400 /*FIXME: Must verify that caller has write access */
402 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
409 NTSTATUS
ElfrOpenBELW(
410 EVENTLOG_HANDLE_W UNCServerName
,
411 PRPC_UNICODE_STRING BackupFileName
,
414 IELF_HANDLE
*LogHandle
)
416 DPRINT("ElfrOpenBELW(%wZ)\n", BackupFileName
);
418 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
419 return STATUS_INVALID_PARAMETER
;
421 /*FIXME: UNCServerName must specify the server */
423 /*FIXME: Must verify that caller has read access */
425 return ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
426 (PUNICODE_STRING
)BackupFileName
);
431 NTSTATUS
ElfrReadELW(
432 IELF_HANDLE LogHandle
,
435 RULONG NumberOfBytesToRead
,
437 DWORD
*NumberOfBytesRead
,
438 DWORD
*MinNumberOfBytesNeeded
)
440 PLOGHANDLE lpLogHandle
;
444 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
447 return STATUS_INVALID_HANDLE
;
451 return STATUS_INVALID_PARAMETER
;
453 /* If sequential read, retrieve the CurrentRecord from this log handle */
454 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
456 RecordNumber
= lpLogHandle
->CurrentRecord
;
460 RecordNumber
= RecordOffset
;
463 dwError
= LogfReadEvent(lpLogHandle
->LogFile
, ReadFlags
, &RecordNumber
,
464 NumberOfBytesToRead
, Buffer
, NumberOfBytesRead
, MinNumberOfBytesNeeded
,
467 /* Update the handles CurrentRecord if success*/
468 if (dwError
== ERROR_SUCCESS
)
470 lpLogHandle
->CurrentRecord
= RecordNumber
;
474 if (dwError
== ERROR_HANDLE_EOF
)
475 return STATUS_END_OF_FILE
;
477 return I_RpcMapWin32Status(dwError
);
482 NTSTATUS
ElfrReportEventW(
483 IELF_HANDLE LogHandle
,
486 USHORT EventCategory
,
490 PRPC_UNICODE_STRING ComputerName
,
492 PRPC_UNICODE_STRING Strings
[],
500 PLOGHANDLE lpLogHandle
;
503 DWORD dwStringsSize
= 0;
504 DWORD dwUserSidLength
= 0;
505 DWORD dwError
= ERROR_SUCCESS
;
509 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
512 return STATUS_INVALID_HANDLE
;
515 /* Flags must be 0 */
518 return STATUS_INVALID_PARAMETER
;
521 lastRec
= LogfGetCurrentRecord(lpLogHandle
->LogFile
);
523 for (i
= 0; i
< NumStrings
; i
++)
527 case EVENTLOG_SUCCESS
:
528 DPRINT("Success: %wZ\n", Strings
[i
]);
531 case EVENTLOG_ERROR_TYPE
:
532 DPRINT("Error: %wZ\n", Strings
[i
]);
535 case EVENTLOG_WARNING_TYPE
:
536 DPRINT("Warning: %wZ\n", Strings
[i
]);
539 case EVENTLOG_INFORMATION_TYPE
:
540 DPRINT("Info: %wZ\n", Strings
[i
]);
543 case EVENTLOG_AUDIT_SUCCESS
:
544 DPRINT("Audit Success: %wZ\n", Strings
[i
]);
547 case EVENTLOG_AUDIT_FAILURE
:
548 DPRINT("Audit Failure: %wZ\n", Strings
[i
]);
552 DPRINT1("Type %hu: %wZ\n", EventType
, Strings
[i
]);
555 dwStringsSize
+= Strings
[i
]->Length
+ sizeof UNICODE_NULL
;
558 lpStrings
= HeapAlloc(GetProcessHeap(), 0, dwStringsSize
);
561 DPRINT1("Failed to allocate heap\n");
562 return STATUS_NO_MEMORY
;
565 for (i
= 0; i
< NumStrings
; i
++)
567 CopyMemory(lpStrings
+ pos
, Strings
[i
]->Buffer
, Strings
[i
]->Length
);
568 pos
+= Strings
[i
]->Length
/ sizeof(WCHAR
);
569 lpStrings
[pos
] = UNICODE_NULL
;
570 pos
+= sizeof UNICODE_NULL
/ sizeof(WCHAR
);
574 dwUserSidLength
= FIELD_OFFSET(SID
, SubAuthority
[UserSID
->SubAuthorityCount
]);
575 LogBuffer
= LogfAllocAndBuildNewRecord(&recSize
,
581 ComputerName
->Buffer
,
589 dwError
= LogfWriteData(lpLogHandle
->LogFile
, recSize
, LogBuffer
);
592 DPRINT1("ERROR WRITING TO EventLog %S\n", lpLogHandle
->LogFile
->FileName
);
595 LogfFreeRecord(LogBuffer
);
597 HeapFree(GetProcessHeap(), 0, lpStrings
);
599 return I_RpcMapWin32Status(dwError
);
604 NTSTATUS
ElfrClearELFA(
605 IELF_HANDLE LogHandle
,
606 PRPC_STRING BackupFileName
)
608 UNICODE_STRING BackupFileNameW
;
611 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
612 (PANSI_STRING
)BackupFileName
,
614 if (!NT_SUCCESS(Status
))
617 Status
= ElfrClearELFW(LogHandle
,
618 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
620 RtlFreeUnicodeString(&BackupFileNameW
);
627 NTSTATUS
ElfrBackupELFA(
628 IELF_HANDLE LogHandle
,
629 PRPC_STRING BackupFileName
)
631 UNICODE_STRING BackupFileNameW
;
634 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
635 (PANSI_STRING
)BackupFileName
,
637 if (!NT_SUCCESS(Status
))
640 Status
= ElfrBackupELFW(LogHandle
,
641 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
643 RtlFreeUnicodeString(&BackupFileNameW
);
650 NTSTATUS
ElfrOpenELA(
651 EVENTLOG_HANDLE_A UNCServerName
,
652 PRPC_STRING ModuleName
,
653 PRPC_STRING RegModuleName
,
656 IELF_HANDLE
*LogHandle
)
658 UNICODE_STRING ModuleNameW
;
661 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
662 return STATUS_INVALID_PARAMETER
;
664 /* RegModuleName must be an empty string */
665 if (RegModuleName
->Length
> 0)
666 return STATUS_INVALID_PARAMETER
;
668 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
, (PANSI_STRING
)ModuleName
, TRUE
);
669 if (!NT_SUCCESS(Status
))
672 /* FIXME: Must verify that caller has read access */
674 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
678 RtlFreeUnicodeString(&ModuleNameW
);
685 NTSTATUS
ElfrRegisterEventSourceA(
686 EVENTLOG_HANDLE_A UNCServerName
,
687 PRPC_STRING ModuleName
,
688 PRPC_STRING RegModuleName
,
691 IELF_HANDLE
*LogHandle
)
693 UNICODE_STRING ModuleNameW
;
696 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
,
697 (PANSI_STRING
)ModuleName
,
699 if (!NT_SUCCESS(Status
))
701 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
705 /* RegModuleName must be an empty string */
706 if (RegModuleName
->Length
> 0)
708 RtlFreeUnicodeString(&ModuleNameW
);
709 return STATUS_INVALID_PARAMETER
;
712 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
714 RtlFreeUnicodeString(&ModuleNameW
);
715 return STATUS_INVALID_PARAMETER
;
718 /* FIXME: Must verify that caller has write access */
720 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
724 RtlFreeUnicodeString(&ModuleNameW
);
731 NTSTATUS
ElfrOpenBELA(
732 EVENTLOG_HANDLE_A UNCServerName
,
733 PRPC_STRING BackupFileName
,
736 IELF_HANDLE
*LogHandle
)
738 UNICODE_STRING BackupFileNameW
;
741 DPRINT("ElfrOpenBELA(%Z)\n", BackupFileName
);
743 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
744 (PANSI_STRING
)BackupFileName
,
746 if (!NT_SUCCESS(Status
))
748 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
752 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
754 RtlFreeUnicodeString(&BackupFileNameW
);
755 return STATUS_INVALID_PARAMETER
;
758 /*FIXME: UNCServerName must specify the server */
760 /*FIXME: Must verify that caller has read access */
762 Status
= ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
765 RtlFreeUnicodeString(&BackupFileNameW
);
772 NTSTATUS
ElfrReadELA(
773 IELF_HANDLE LogHandle
,
776 RULONG NumberOfBytesToRead
,
778 DWORD
*NumberOfBytesRead
,
779 DWORD
*MinNumberOfBytesNeeded
)
781 PLOGHANDLE lpLogHandle
;
785 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
788 return STATUS_INVALID_HANDLE
;
792 return STATUS_INVALID_PARAMETER
;
794 /* If sequential read, retrieve the CurrentRecord from this log handle */
795 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
797 RecordNumber
= lpLogHandle
->CurrentRecord
;
801 RecordNumber
= RecordOffset
;
804 dwError
= LogfReadEvent(lpLogHandle
->LogFile
,
810 MinNumberOfBytesNeeded
,
813 /* Update the handles CurrentRecord if success*/
814 if (dwError
== ERROR_SUCCESS
)
816 lpLogHandle
->CurrentRecord
= RecordNumber
;
820 if (dwError
== ERROR_HANDLE_EOF
)
821 return STATUS_END_OF_FILE
;
823 return I_RpcMapWin32Status(dwError
);
828 NTSTATUS
ElfrReportEventA(
829 IELF_HANDLE LogHandle
,
832 USHORT EventCategory
,
836 PRPC_STRING ComputerName
,
838 PRPC_STRING Strings
[],
844 UNICODE_STRING ComputerNameW
;
845 PUNICODE_STRING
*StringsArrayW
= NULL
;
846 NTSTATUS Status
= STATUS_SUCCESS
;
849 DPRINT("ElfrReportEventA(%hu)\n", NumStrings
);
852 for (i
= 0; i
< NumStrings
; i
++)
854 if (Strings
[i
] == NULL
)
856 DPRINT1("String %hu is null\n", i
);
860 DPRINT1("String %hu: %Z\n", i
, Strings
[i
]);
865 Status
= RtlAnsiStringToUnicodeString((PUNICODE_STRING
)&ComputerNameW
,
866 (PANSI_STRING
)ComputerName
,
868 if (!NT_SUCCESS(Status
))
873 StringsArrayW
= HeapAlloc(MyHeap
,
875 NumStrings
* sizeof (PUNICODE_STRING
));
876 if (StringsArrayW
== NULL
)
878 Status
= STATUS_NO_MEMORY
;
882 for (i
= 0; i
< NumStrings
; i
++)
884 if (Strings
[i
] != NULL
)
886 StringsArrayW
[i
] = HeapAlloc(MyHeap
,
888 sizeof(UNICODE_STRING
));
889 if (StringsArrayW
[i
] == NULL
)
891 Status
= STATUS_NO_MEMORY
;
895 Status
= RtlAnsiStringToUnicodeString(StringsArrayW
[i
],
896 (PANSI_STRING
)Strings
[i
],
900 if (!NT_SUCCESS(Status
))
905 if (NT_SUCCESS(Status
))
907 Status
= ElfrReportEventW(LogHandle
,
914 (PRPC_UNICODE_STRING
)&ComputerNameW
,
916 (PRPC_UNICODE_STRING
*)StringsArrayW
,
924 for (i
= 0; i
< NumStrings
; i
++)
926 if (StringsArrayW
[i
] != NULL
)
928 if (StringsArrayW
[i
]->Buffer
)
930 RtlFreeUnicodeString(StringsArrayW
[i
]);
931 HeapFree(MyHeap
, 0, StringsArrayW
[i
]);
936 if (StringsArrayW
!= NULL
)
937 HeapFree(MyHeap
, 0, StringsArrayW
);
939 RtlFreeUnicodeString(&ComputerNameW
);
946 NTSTATUS
ElfrRegisterClusterSvc(
947 handle_t BindingHandle
)
950 return STATUS_NOT_IMPLEMENTED
;
955 NTSTATUS
ElfrDeregisterClusterSvc(
956 handle_t BindingHandle
)
959 return STATUS_NOT_IMPLEMENTED
;
964 NTSTATUS
ElfrWriteClusterEvents(
965 handle_t BindingHandle
)
968 return STATUS_NOT_IMPLEMENTED
;
973 NTSTATUS
ElfrGetLogInformation(
974 IELF_HANDLE LogHandle
,
978 DWORD
*pcbBytesNeeded
)
980 NTSTATUS Status
= STATUS_SUCCESS
;
982 /* FIXME: check handle first */
986 case EVENTLOG_FULL_INFO
:
988 LPEVENTLOG_FULL_INFORMATION efi
= (LPEVENTLOG_FULL_INFORMATION
)Buffer
;
990 *pcbBytesNeeded
= sizeof(EVENTLOG_FULL_INFORMATION
);
991 if (cbBufSize
< sizeof(EVENTLOG_FULL_INFORMATION
))
993 return STATUS_BUFFER_TOO_SMALL
;
996 efi
->dwFull
= 0; /* FIXME */
1001 Status
= STATUS_INVALID_LEVEL
;
1010 NTSTATUS
ElfrFlushEL(
1011 IELF_HANDLE LogHandle
)
1014 return STATUS_NOT_IMPLEMENTED
;
1019 NTSTATUS
ElfrReportEventAndSourceW(
1020 IELF_HANDLE LogHandle
,
1023 USHORT EventCategory
,
1025 PRPC_UNICODE_STRING SourceName
,
1028 PRPC_UNICODE_STRING ComputerName
,
1030 PRPC_UNICODE_STRING Strings
[],
1033 DWORD
*RecordNumber
,
1037 return STATUS_NOT_IMPLEMENTED
;
1041 void __RPC_FAR
*__RPC_USER
midl_user_allocate(SIZE_T len
)
1043 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
1047 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
1049 HeapFree(GetProcessHeap(), 0, ptr
);
1053 void __RPC_USER
IELF_HANDLE_rundown(IELF_HANDLE LogHandle
)