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 *****************************************************************/
14 LIST_ENTRY LogHandleListHead
;
16 /* FUNCTIONS ****************************************************************/
18 DWORD WINAPI
RpcThreadRoutine(LPVOID lpParameter
)
22 InitializeListHead(&LogHandleListHead
);
24 Status
= RpcServerUseProtseqEpW(L
"ncacn_np", 20, L
"\\pipe\\EventLog", NULL
);
25 if (Status
!= RPC_S_OK
)
27 DPRINT("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
31 Status
= RpcServerRegisterIf(eventlog_v0_0_s_ifspec
, NULL
, NULL
);
32 if (Status
!= RPC_S_OK
)
34 DPRINT("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
38 Status
= RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT
, FALSE
);
39 if (Status
!= RPC_S_OK
)
41 DPRINT("RpcServerListen() failed (Status %lx)\n", Status
);
49 ElfCreateEventLogHandle(PLOGHANDLE
*LogHandle
,
53 PLOGHANDLE lpLogHandle
;
54 PLOGFILE currentLogFile
= NULL
;
56 PEVENTSOURCE pEventSource
;
57 NTSTATUS Status
= STATUS_SUCCESS
;
59 DPRINT("ElfCreateEventLogHandle(Name: %S)\n", Name
);
61 lpLogHandle
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOGHANDLE
)
62 + ((wcslen(Name
) + 1) * sizeof(WCHAR
)));
65 DPRINT1("Failed to allocate Heap!\n");
66 return STATUS_NO_MEMORY
;
69 wcscpy(lpLogHandle
->szName
, Name
);
71 /* Get the number of Log Files the EventLog service found */
72 LogsActive
= LogfListItemCount();
75 DPRINT1("EventLog service reports no log files!\n");
76 Status
= STATUS_UNSUCCESSFUL
;
80 /* If Creating, default to the Application Log in case we fail, as documented on MSDN */
83 pEventSource
= GetEventSourceByName(Name
);
84 DPRINT("EventSource: %p\n", pEventSource
);
87 DPRINT("EventSource LogFile: %p\n", pEventSource
->LogFile
);
88 lpLogHandle
->LogFile
= pEventSource
->LogFile
;
92 DPRINT("EventSource LogFile: Application log file\n");
93 lpLogHandle
->LogFile
= LogfListItemByName(L
"Application");
96 DPRINT("LogHandle LogFile: %p\n", lpLogHandle
->LogFile
);
100 lpLogHandle
->LogFile
= NULL
;
102 for (i
= 1; i
<= LogsActive
; i
++)
104 currentLogFile
= LogfListItemByIndex(i
);
106 if (_wcsicmp(Name
, currentLogFile
->LogName
) == 0)
108 lpLogHandle
->LogFile
= LogfListItemByIndex(i
);
109 lpLogHandle
->CurrentRecord
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
114 /* Use the application log if the desired log does not exist */
115 if (lpLogHandle
->LogFile
== NULL
)
117 lpLogHandle
->LogFile
= LogfListItemByName(L
"Application");
118 lpLogHandle
->CurrentRecord
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
122 if (!lpLogHandle
->LogFile
)
123 Status
= STATUS_UNSUCCESSFUL
;
126 if (NT_SUCCESS(Status
))
128 /* Append log handle */
129 InsertTailList(&LogHandleListHead
, &lpLogHandle
->LogHandleListEntry
);
130 *LogHandle
= lpLogHandle
;
134 HeapFree(GetProcessHeap(), 0, lpLogHandle
);
142 ElfCreateBackupLogHandle(PLOGHANDLE
*LogHandle
,
143 PUNICODE_STRING FileName
)
145 PLOGHANDLE lpLogHandle
;
147 NTSTATUS Status
= STATUS_SUCCESS
;
149 DPRINT("ElfCreateBackupLogHandle(FileName: %wZ)\n", FileName
);
151 lpLogHandle
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(LOGHANDLE
));
152 if (lpLogHandle
== NULL
)
154 DPRINT1("Failed to allocate Heap!\n");
155 return STATUS_NO_MEMORY
;
158 /* Create the log file */
159 Status
= LogfCreate(&lpLogHandle
->LogFile
,
164 if (!NT_SUCCESS(Status
))
166 DPRINT1("Failed to create the log file! (Status 0x%08lx)\n", Status
);
170 /* Set the backup flag */
171 lpLogHandle
->Flags
|= LOG_HANDLE_BACKUP_FILE
;
173 /* Get the current record */
174 lpLogHandle
->CurrentRecord
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
177 if (NT_SUCCESS(Status
))
179 /* Append log handle */
180 InsertTailList(&LogHandleListHead
, &lpLogHandle
->LogHandleListEntry
);
181 *LogHandle
= lpLogHandle
;
185 HeapFree(GetProcessHeap(), 0, lpLogHandle
);
192 PLOGHANDLE
ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle
)
194 PLOGHANDLE lpLogHandle
;
196 if (IsListEmpty(&LogHandleListHead
))
201 lpLogHandle
= CONTAINING_RECORD((PLOGHANDLE
)EventLogHandle
, LOGHANDLE
, LogHandleListEntry
);
208 ElfDeleteEventLogHandle(IELF_HANDLE EventLogHandle
)
210 PLOGHANDLE lpLogHandle
= (PLOGHANDLE
)EventLogHandle
;
212 if (!ElfGetLogHandleEntryByHandle(lpLogHandle
))
213 return STATUS_INVALID_HANDLE
;
215 LogfClose(lpLogHandle
->LogFile
, FALSE
);
217 RemoveEntryList(&lpLogHandle
->LogHandleListEntry
);
218 HeapFree(GetProcessHeap(),0,lpLogHandle
);
220 return STATUS_SUCCESS
;
224 NTSTATUS
ElfrClearELFW(
225 IELF_HANDLE LogHandle
,
226 PRPC_UNICODE_STRING BackupFileName
)
228 PLOGHANDLE lpLogHandle
;
230 DPRINT("ElfrClearELFW()\n");
232 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
235 return STATUS_INVALID_HANDLE
;
238 return LogfClearFile(lpLogHandle
->LogFile
,
239 (PUNICODE_STRING
)BackupFileName
);
244 NTSTATUS
ElfrBackupELFW(
245 IELF_HANDLE LogHandle
,
246 PRPC_UNICODE_STRING BackupFileName
)
248 PLOGHANDLE lpLogHandle
;
250 DPRINT("ElfrBackupELFW()\n");
252 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
255 return STATUS_INVALID_HANDLE
;
258 return LogfBackupFile(lpLogHandle
->LogFile
,
259 (PUNICODE_STRING
)BackupFileName
);
264 NTSTATUS
ElfrCloseEL(
265 IELF_HANDLE
*LogHandle
)
267 return ElfDeleteEventLogHandle(*LogHandle
);
272 NTSTATUS
ElfrDeregisterEventSource(
273 IELF_HANDLE
*LogHandle
)
275 return ElfDeleteEventLogHandle(*LogHandle
);
280 NTSTATUS
ElfrNumberOfRecords(
281 IELF_HANDLE LogHandle
,
282 DWORD
*NumberOfRecords
)
284 PLOGHANDLE lpLogHandle
;
287 DPRINT("ElfrNumberOfRecords()");
289 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
292 return STATUS_INVALID_HANDLE
;
295 lpLogFile
= lpLogHandle
->LogFile
;
297 DPRINT("Oldest: %lu Current: %lu\n",
298 lpLogFile
->Header
.OldestRecordNumber
,
299 lpLogFile
->Header
.CurrentRecordNumber
);
301 *NumberOfRecords
= lpLogFile
->Header
.CurrentRecordNumber
-
302 lpLogFile
->Header
.OldestRecordNumber
;
304 return STATUS_SUCCESS
;
309 NTSTATUS
ElfrOldestRecord(
310 IELF_HANDLE LogHandle
,
311 DWORD
*OldestRecordNumber
)
313 PLOGHANDLE lpLogHandle
;
315 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
318 return STATUS_INVALID_HANDLE
;
321 if (!OldestRecordNumber
)
323 return STATUS_INVALID_PARAMETER
;
326 *OldestRecordNumber
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
328 return STATUS_SUCCESS
;
333 NTSTATUS
ElfrChangeNotify(
334 IELF_HANDLE
*LogHandle
,
335 RPC_CLIENT_ID ClientId
,
338 DPRINT("ElfrChangeNotify()");
341 return STATUS_NOT_IMPLEMENTED
;
346 NTSTATUS
ElfrOpenELW(
347 EVENTLOG_HANDLE_W UNCServerName
,
348 PRPC_UNICODE_STRING ModuleName
,
349 PRPC_UNICODE_STRING RegModuleName
,
352 IELF_HANDLE
*LogHandle
)
354 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
355 return STATUS_INVALID_PARAMETER
;
357 /* RegModuleName must be an empty string */
358 if (RegModuleName
->Length
> 0)
359 return STATUS_INVALID_PARAMETER
;
361 /*FIXME: UNCServerName must specify the server */
363 /*FIXME: Must verify that caller has read access */
365 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
372 NTSTATUS
ElfrRegisterEventSourceW(
373 EVENTLOG_HANDLE_W UNCServerName
,
374 PRPC_UNICODE_STRING ModuleName
,
375 PRPC_UNICODE_STRING RegModuleName
,
378 IELF_HANDLE
*LogHandle
)
380 DPRINT("ElfrRegisterEventSourceW()\n");
382 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
383 return STATUS_INVALID_PARAMETER
;
385 /* RegModuleName must be an empty string */
386 if (RegModuleName
->Length
> 0)
387 return STATUS_INVALID_PARAMETER
;
389 DPRINT("ModuleName: %S\n", ModuleName
->Buffer
);
391 /*FIXME: UNCServerName must specify the server or empty for local */
393 /*FIXME: Must verify that caller has write access */
395 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
402 NTSTATUS
ElfrOpenBELW(
403 EVENTLOG_HANDLE_W UNCServerName
,
404 PRPC_UNICODE_STRING BackupFileName
,
407 IELF_HANDLE
*LogHandle
)
409 DPRINT("ElfrOpenBELW(%wZ)\n", BackupFileName
);
411 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
412 return STATUS_INVALID_PARAMETER
;
414 /*FIXME: UNCServerName must specify the server */
416 /*FIXME: Must verify that caller has read access */
418 return ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
419 (PUNICODE_STRING
)BackupFileName
);
424 NTSTATUS
ElfrReadELW(
425 IELF_HANDLE LogHandle
,
428 RULONG NumberOfBytesToRead
,
430 DWORD
*NumberOfBytesRead
,
431 DWORD
*MinNumberOfBytesNeeded
)
433 PLOGHANDLE lpLogHandle
;
437 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
440 return STATUS_INVALID_HANDLE
;
444 return STATUS_INVALID_PARAMETER
;
446 /* If sequential read, retrieve the CurrentRecord from this log handle */
447 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
449 RecordNumber
= lpLogHandle
->CurrentRecord
;
453 RecordNumber
= RecordOffset
;
456 dwError
= LogfReadEvent(lpLogHandle
->LogFile
, ReadFlags
, &RecordNumber
,
457 NumberOfBytesToRead
, Buffer
, NumberOfBytesRead
, MinNumberOfBytesNeeded
,
460 /* Update the handles CurrentRecord if success*/
461 if (dwError
== ERROR_SUCCESS
)
463 lpLogHandle
->CurrentRecord
= RecordNumber
;
467 if (dwError
== ERROR_HANDLE_EOF
)
468 return STATUS_END_OF_FILE
;
470 return I_RpcMapWin32Status(dwError
);
475 NTSTATUS
ElfrReportEventW(
476 IELF_HANDLE LogHandle
,
479 USHORT EventCategory
,
483 PRPC_UNICODE_STRING ComputerName
,
485 PRPC_UNICODE_STRING Strings
[],
493 PLOGHANDLE lpLogHandle
;
496 DWORD dwStringsSize
= 0;
497 DWORD dwUserSidLength
= 0;
498 DWORD dwError
= ERROR_SUCCESS
;
502 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
505 return STATUS_INVALID_HANDLE
;
508 /* Flags must be 0 */
511 return STATUS_INVALID_PARAMETER
;
514 lastRec
= LogfGetCurrentRecord(lpLogHandle
->LogFile
);
516 for (i
= 0; i
< NumStrings
; i
++)
520 case EVENTLOG_SUCCESS
:
521 DPRINT("Success: %wZ\n", Strings
[i
]);
524 case EVENTLOG_ERROR_TYPE
:
525 DPRINT("Error: %wZ\n", Strings
[i
]);
528 case EVENTLOG_WARNING_TYPE
:
529 DPRINT("Warning: %wZ\n", Strings
[i
]);
532 case EVENTLOG_INFORMATION_TYPE
:
533 DPRINT("Info: %wZ\n", Strings
[i
]);
536 case EVENTLOG_AUDIT_SUCCESS
:
537 DPRINT("Audit Success: %wZ\n", Strings
[i
]);
540 case EVENTLOG_AUDIT_FAILURE
:
541 DPRINT("Audit Failure: %wZ\n", Strings
[i
]);
545 DPRINT1("Type %hu: %wZ\n", EventType
, Strings
[i
]);
548 dwStringsSize
+= Strings
[i
]->Length
+ sizeof UNICODE_NULL
;
551 lpStrings
= HeapAlloc(GetProcessHeap(), 0, dwStringsSize
);
554 DPRINT1("Failed to allocate heap\n");
555 return STATUS_NO_MEMORY
;
558 for (i
= 0; i
< NumStrings
; i
++)
560 CopyMemory(lpStrings
+ pos
, Strings
[i
]->Buffer
, Strings
[i
]->Length
);
561 pos
+= Strings
[i
]->Length
/ sizeof(WCHAR
);
562 lpStrings
[pos
] = UNICODE_NULL
;
563 pos
+= sizeof UNICODE_NULL
/ sizeof(WCHAR
);
567 dwUserSidLength
= FIELD_OFFSET(SID
, SubAuthority
[UserSID
->SubAuthorityCount
]);
568 LogBuffer
= LogfAllocAndBuildNewRecord(&recSize
,
574 ComputerName
->Buffer
,
582 dwError
= LogfWriteData(lpLogHandle
->LogFile
, recSize
, LogBuffer
);
585 DPRINT1("ERROR WRITING TO EventLog %S\n", lpLogHandle
->LogFile
->FileName
);
588 LogfFreeRecord(LogBuffer
);
590 HeapFree(GetProcessHeap(), 0, lpStrings
);
592 return I_RpcMapWin32Status(dwError
);
597 NTSTATUS
ElfrClearELFA(
598 IELF_HANDLE LogHandle
,
599 PRPC_STRING BackupFileName
)
601 UNICODE_STRING BackupFileNameW
;
604 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
605 (PANSI_STRING
)BackupFileName
,
607 if (!NT_SUCCESS(Status
))
610 Status
= ElfrClearELFW(LogHandle
,
611 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
613 RtlFreeUnicodeString(&BackupFileNameW
);
620 NTSTATUS
ElfrBackupELFA(
621 IELF_HANDLE LogHandle
,
622 PRPC_STRING BackupFileName
)
624 UNICODE_STRING BackupFileNameW
;
627 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
628 (PANSI_STRING
)BackupFileName
,
630 if (!NT_SUCCESS(Status
))
633 Status
= ElfrBackupELFW(LogHandle
,
634 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
636 RtlFreeUnicodeString(&BackupFileNameW
);
643 NTSTATUS
ElfrOpenELA(
644 EVENTLOG_HANDLE_A UNCServerName
,
645 PRPC_STRING ModuleName
,
646 PRPC_STRING RegModuleName
,
649 IELF_HANDLE
*LogHandle
)
651 UNICODE_STRING ModuleNameW
;
654 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
655 return STATUS_INVALID_PARAMETER
;
657 /* RegModuleName must be an empty string */
658 if (RegModuleName
->Length
> 0)
659 return STATUS_INVALID_PARAMETER
;
661 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
, (PANSI_STRING
)ModuleName
, TRUE
);
662 if (!NT_SUCCESS(Status
))
665 /* FIXME: Must verify that caller has read access */
667 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
671 RtlFreeUnicodeString(&ModuleNameW
);
678 NTSTATUS
ElfrRegisterEventSourceA(
679 EVENTLOG_HANDLE_A UNCServerName
,
680 PRPC_STRING ModuleName
,
681 PRPC_STRING RegModuleName
,
684 IELF_HANDLE
*LogHandle
)
686 UNICODE_STRING ModuleNameW
;
689 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
,
690 (PANSI_STRING
)ModuleName
,
692 if (!NT_SUCCESS(Status
))
694 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
698 /* RegModuleName must be an empty string */
699 if (RegModuleName
->Length
> 0)
701 RtlFreeUnicodeString(&ModuleNameW
);
702 return STATUS_INVALID_PARAMETER
;
705 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
707 RtlFreeUnicodeString(&ModuleNameW
);
708 return STATUS_INVALID_PARAMETER
;
711 /* FIXME: Must verify that caller has write access */
713 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
717 RtlFreeUnicodeString(&ModuleNameW
);
724 NTSTATUS
ElfrOpenBELA(
725 EVENTLOG_HANDLE_A UNCServerName
,
726 PRPC_STRING BackupFileName
,
729 IELF_HANDLE
*LogHandle
)
731 UNICODE_STRING BackupFileNameW
;
734 DPRINT("ElfrOpenBELA(%Z)\n", BackupFileName
);
736 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
737 (PANSI_STRING
)BackupFileName
,
739 if (!NT_SUCCESS(Status
))
741 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
745 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
747 RtlFreeUnicodeString(&BackupFileNameW
);
748 return STATUS_INVALID_PARAMETER
;
751 /*FIXME: UNCServerName must specify the server */
753 /*FIXME: Must verify that caller has read access */
755 Status
= ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
758 RtlFreeUnicodeString(&BackupFileNameW
);
765 NTSTATUS
ElfrReadELA(
766 IELF_HANDLE LogHandle
,
769 RULONG NumberOfBytesToRead
,
771 DWORD
*NumberOfBytesRead
,
772 DWORD
*MinNumberOfBytesNeeded
)
774 PLOGHANDLE lpLogHandle
;
778 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
781 return STATUS_INVALID_HANDLE
;
785 return STATUS_INVALID_PARAMETER
;
787 /* If sequential read, retrieve the CurrentRecord from this log handle */
788 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
790 RecordNumber
= lpLogHandle
->CurrentRecord
;
794 RecordNumber
= RecordOffset
;
797 dwError
= LogfReadEvent(lpLogHandle
->LogFile
,
803 MinNumberOfBytesNeeded
,
806 /* Update the handles CurrentRecord if success*/
807 if (dwError
== ERROR_SUCCESS
)
809 lpLogHandle
->CurrentRecord
= RecordNumber
;
813 if (dwError
== ERROR_HANDLE_EOF
)
814 return STATUS_END_OF_FILE
;
816 return I_RpcMapWin32Status(dwError
);
821 NTSTATUS
ElfrReportEventA(
822 IELF_HANDLE LogHandle
,
825 USHORT EventCategory
,
829 PRPC_STRING ComputerName
,
831 PRPC_STRING Strings
[],
837 UNICODE_STRING ComputerNameW
;
838 PUNICODE_STRING
*StringsArrayW
= NULL
;
839 NTSTATUS Status
= STATUS_SUCCESS
;
842 DPRINT("ElfrReportEventA(%hu)\n", NumStrings
);
845 for (i
= 0; i
< NumStrings
; i
++)
847 if (Strings
[i
] == NULL
)
849 DPRINT1("String %hu is null\n", i
);
853 DPRINT1("String %hu: %Z\n", i
, Strings
[i
]);
858 Status
= RtlAnsiStringToUnicodeString((PUNICODE_STRING
)&ComputerNameW
,
859 (PANSI_STRING
)ComputerName
,
861 if (!NT_SUCCESS(Status
))
866 StringsArrayW
= HeapAlloc(MyHeap
,
868 NumStrings
* sizeof (PUNICODE_STRING
));
869 if (StringsArrayW
== NULL
)
871 Status
= STATUS_NO_MEMORY
;
875 for (i
= 0; i
< NumStrings
; i
++)
877 if (Strings
[i
] != NULL
)
879 StringsArrayW
[i
] = HeapAlloc(MyHeap
,
881 sizeof(UNICODE_STRING
));
882 if (StringsArrayW
[i
] == NULL
)
884 Status
= STATUS_NO_MEMORY
;
888 Status
= RtlAnsiStringToUnicodeString(StringsArrayW
[i
],
889 (PANSI_STRING
)Strings
[i
],
893 if (!NT_SUCCESS(Status
))
898 if (NT_SUCCESS(Status
))
900 Status
= ElfrReportEventW(LogHandle
,
907 (PRPC_UNICODE_STRING
)&ComputerNameW
,
909 (PRPC_UNICODE_STRING
*)StringsArrayW
,
917 for (i
= 0; i
< NumStrings
; i
++)
919 if (StringsArrayW
[i
] != NULL
)
921 if (StringsArrayW
[i
]->Buffer
)
923 RtlFreeUnicodeString(StringsArrayW
[i
]);
924 HeapFree(MyHeap
, 0, StringsArrayW
[i
]);
929 if (StringsArrayW
!= NULL
)
930 HeapFree(MyHeap
, 0, StringsArrayW
);
932 RtlFreeUnicodeString(&ComputerNameW
);
939 NTSTATUS
ElfrRegisterClusterSvc(
940 handle_t BindingHandle
)
943 return STATUS_NOT_IMPLEMENTED
;
948 NTSTATUS
ElfrDeregisterClusterSvc(
949 handle_t BindingHandle
)
952 return STATUS_NOT_IMPLEMENTED
;
957 NTSTATUS
ElfrWriteClusterEvents(
958 handle_t BindingHandle
)
961 return STATUS_NOT_IMPLEMENTED
;
966 NTSTATUS
ElfrGetLogInformation(
967 IELF_HANDLE LogHandle
,
971 DWORD
*pcbBytesNeeded
)
973 NTSTATUS Status
= STATUS_SUCCESS
;
975 /* FIXME: check handle first */
979 case EVENTLOG_FULL_INFO
:
981 LPEVENTLOG_FULL_INFORMATION efi
= (LPEVENTLOG_FULL_INFORMATION
)Buffer
;
983 *pcbBytesNeeded
= sizeof(EVENTLOG_FULL_INFORMATION
);
984 if (cbBufSize
< sizeof(EVENTLOG_FULL_INFORMATION
))
986 return STATUS_BUFFER_TOO_SMALL
;
989 efi
->dwFull
= 0; /* FIXME */
994 Status
= STATUS_INVALID_LEVEL
;
1003 NTSTATUS
ElfrFlushEL(
1004 IELF_HANDLE LogHandle
)
1007 return STATUS_NOT_IMPLEMENTED
;
1012 NTSTATUS
ElfrReportEventAndSourceW(
1013 IELF_HANDLE LogHandle
,
1016 USHORT EventCategory
,
1018 PRPC_UNICODE_STRING SourceName
,
1021 PRPC_UNICODE_STRING ComputerName
,
1023 PRPC_UNICODE_STRING Strings
[],
1026 DWORD
*RecordNumber
,
1030 return STATUS_NOT_IMPLEMENTED
;
1034 void __RPC_FAR
*__RPC_USER
midl_user_allocate(SIZE_T len
)
1036 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
1040 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
1042 HeapFree(GetProcessHeap(), 0, ptr
);
1046 void __RPC_USER
IELF_HANDLE_rundown(IELF_HANDLE LogHandle
)