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");
122 if (lpLogHandle
->LogFile
== NULL
)
124 DPRINT1("Application log is missing!\n");
125 Status
= STATUS_UNSUCCESSFUL
;
129 lpLogHandle
->CurrentRecord
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
133 if (!lpLogHandle
->LogFile
)
134 Status
= STATUS_UNSUCCESSFUL
;
137 if (NT_SUCCESS(Status
))
139 /* Append log handle */
140 InsertTailList(&LogHandleListHead
, &lpLogHandle
->LogHandleListEntry
);
141 *LogHandle
= lpLogHandle
;
145 HeapFree(GetProcessHeap(), 0, lpLogHandle
);
153 ElfCreateBackupLogHandle(PLOGHANDLE
*LogHandle
,
154 PUNICODE_STRING FileName
)
156 PLOGHANDLE lpLogHandle
;
158 NTSTATUS Status
= STATUS_SUCCESS
;
160 DPRINT("ElfCreateBackupLogHandle(FileName: %wZ)\n", FileName
);
162 lpLogHandle
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(LOGHANDLE
));
163 if (lpLogHandle
== NULL
)
165 DPRINT1("Failed to allocate Heap!\n");
166 return STATUS_NO_MEMORY
;
169 /* Create the log file */
170 Status
= LogfCreate(&lpLogHandle
->LogFile
,
177 if (!NT_SUCCESS(Status
))
179 DPRINT1("Failed to create the log file! (Status 0x%08lx)\n", Status
);
183 /* Set the backup flag */
184 lpLogHandle
->Flags
|= LOG_HANDLE_BACKUP_FILE
;
186 /* Get the current record */
187 lpLogHandle
->CurrentRecord
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
190 if (NT_SUCCESS(Status
))
192 /* Append log handle */
193 InsertTailList(&LogHandleListHead
, &lpLogHandle
->LogHandleListEntry
);
194 *LogHandle
= lpLogHandle
;
198 HeapFree(GetProcessHeap(), 0, lpLogHandle
);
205 PLOGHANDLE
ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle
)
207 PLIST_ENTRY CurrentEntry
;
208 PLOGHANDLE lpLogHandle
;
210 CurrentEntry
= LogHandleListHead
.Flink
;
211 while (CurrentEntry
!= &LogHandleListHead
)
213 lpLogHandle
= CONTAINING_RECORD(CurrentEntry
,
216 CurrentEntry
= CurrentEntry
->Flink
;
218 if (lpLogHandle
== EventLogHandle
)
227 ElfDeleteEventLogHandle(IELF_HANDLE LogHandle
)
229 PLOGHANDLE lpLogHandle
;
231 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
234 return STATUS_INVALID_HANDLE
;
237 RemoveEntryList(&lpLogHandle
->LogHandleListEntry
);
238 LogfClose(lpLogHandle
->LogFile
, FALSE
);
240 HeapFree(GetProcessHeap(), 0, lpLogHandle
);
242 return STATUS_SUCCESS
;
246 NTSTATUS
ElfrClearELFW(
247 IELF_HANDLE LogHandle
,
248 PRPC_UNICODE_STRING BackupFileName
)
250 PLOGHANDLE lpLogHandle
;
252 DPRINT("ElfrClearELFW()\n");
254 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
257 return STATUS_INVALID_HANDLE
;
260 /* Fail, if the log file is a backup file */
261 if (lpLogHandle
->Flags
& LOG_HANDLE_BACKUP_FILE
)
262 return STATUS_INVALID_HANDLE
;
264 return LogfClearFile(lpLogHandle
->LogFile
,
265 (PUNICODE_STRING
)BackupFileName
);
270 NTSTATUS
ElfrBackupELFW(
271 IELF_HANDLE LogHandle
,
272 PRPC_UNICODE_STRING BackupFileName
)
274 PLOGHANDLE lpLogHandle
;
276 DPRINT("ElfrBackupELFW()\n");
278 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
281 return STATUS_INVALID_HANDLE
;
284 return LogfBackupFile(lpLogHandle
->LogFile
,
285 (PUNICODE_STRING
)BackupFileName
);
290 NTSTATUS
ElfrCloseEL(
291 IELF_HANDLE
*LogHandle
)
293 return ElfDeleteEventLogHandle(*LogHandle
);
298 NTSTATUS
ElfrDeregisterEventSource(
299 IELF_HANDLE
*LogHandle
)
301 return ElfDeleteEventLogHandle(*LogHandle
);
306 NTSTATUS
ElfrNumberOfRecords(
307 IELF_HANDLE LogHandle
,
308 DWORD
*NumberOfRecords
)
310 PLOGHANDLE lpLogHandle
;
313 DPRINT("ElfrNumberOfRecords()\n");
315 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
318 return STATUS_INVALID_HANDLE
;
321 lpLogFile
= lpLogHandle
->LogFile
;
323 DPRINT("Oldest: %lu Current: %lu\n",
324 lpLogFile
->Header
.OldestRecordNumber
,
325 lpLogFile
->Header
.CurrentRecordNumber
);
327 *NumberOfRecords
= lpLogFile
->Header
.CurrentRecordNumber
-
328 lpLogFile
->Header
.OldestRecordNumber
;
330 return STATUS_SUCCESS
;
335 NTSTATUS
ElfrOldestRecord(
336 IELF_HANDLE LogHandle
,
337 DWORD
*OldestRecordNumber
)
339 PLOGHANDLE lpLogHandle
;
341 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
344 return STATUS_INVALID_HANDLE
;
347 if (!OldestRecordNumber
)
349 return STATUS_INVALID_PARAMETER
;
352 *OldestRecordNumber
= LogfGetOldestRecord(lpLogHandle
->LogFile
);
354 return STATUS_SUCCESS
;
359 NTSTATUS
ElfrChangeNotify(
360 IELF_HANDLE
*LogHandle
,
361 RPC_CLIENT_ID ClientId
,
364 DPRINT("ElfrChangeNotify()");
367 return STATUS_NOT_IMPLEMENTED
;
372 NTSTATUS
ElfrOpenELW(
373 EVENTLOG_HANDLE_W UNCServerName
,
374 PRPC_UNICODE_STRING ModuleName
,
375 PRPC_UNICODE_STRING RegModuleName
,
378 IELF_HANDLE
*LogHandle
)
380 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
381 return STATUS_INVALID_PARAMETER
;
383 /* RegModuleName must be an empty string */
384 if (RegModuleName
->Length
> 0)
385 return STATUS_INVALID_PARAMETER
;
387 /*FIXME: UNCServerName must specify the server */
389 /*FIXME: Must verify that caller has read access */
391 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
398 NTSTATUS
ElfrRegisterEventSourceW(
399 EVENTLOG_HANDLE_W UNCServerName
,
400 PRPC_UNICODE_STRING ModuleName
,
401 PRPC_UNICODE_STRING RegModuleName
,
404 IELF_HANDLE
*LogHandle
)
406 DPRINT("ElfrRegisterEventSourceW()\n");
408 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
409 return STATUS_INVALID_PARAMETER
;
411 /* RegModuleName must be an empty string */
412 if (RegModuleName
->Length
> 0)
413 return STATUS_INVALID_PARAMETER
;
415 DPRINT("ModuleName: %S\n", ModuleName
->Buffer
);
417 /*FIXME: UNCServerName must specify the server or empty for local */
419 /*FIXME: Must verify that caller has write access */
421 return ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
428 NTSTATUS
ElfrOpenBELW(
429 EVENTLOG_HANDLE_W UNCServerName
,
430 PRPC_UNICODE_STRING BackupFileName
,
433 IELF_HANDLE
*LogHandle
)
435 DPRINT("ElfrOpenBELW(%wZ)\n", BackupFileName
);
437 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
438 return STATUS_INVALID_PARAMETER
;
440 /*FIXME: UNCServerName must specify the server */
442 /*FIXME: Must verify that caller has read access */
444 return ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
445 (PUNICODE_STRING
)BackupFileName
);
450 NTSTATUS
ElfrReadELW(
451 IELF_HANDLE LogHandle
,
454 RULONG NumberOfBytesToRead
,
456 DWORD
*NumberOfBytesRead
,
457 DWORD
*MinNumberOfBytesNeeded
)
459 PLOGHANDLE lpLogHandle
;
463 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
466 return STATUS_INVALID_HANDLE
;
470 return STATUS_INVALID_PARAMETER
;
472 /* If sequential read, retrieve the CurrentRecord from this log handle */
473 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
475 RecordNumber
= lpLogHandle
->CurrentRecord
;
479 RecordNumber
= RecordOffset
;
482 dwError
= LogfReadEvent(lpLogHandle
->LogFile
, ReadFlags
, &RecordNumber
,
483 NumberOfBytesToRead
, Buffer
, NumberOfBytesRead
, MinNumberOfBytesNeeded
,
486 /* Update the handles CurrentRecord if success*/
487 if (dwError
== ERROR_SUCCESS
)
489 lpLogHandle
->CurrentRecord
= RecordNumber
;
493 if (dwError
== ERROR_HANDLE_EOF
)
494 return STATUS_END_OF_FILE
;
496 return I_RpcMapWin32Status(dwError
);
501 NTSTATUS
ElfrReportEventW(
502 IELF_HANDLE LogHandle
,
505 USHORT EventCategory
,
509 PRPC_UNICODE_STRING ComputerName
,
511 PRPC_UNICODE_STRING Strings
[],
519 PLOGHANDLE lpLogHandle
;
522 DWORD dwStringsSize
= 0;
523 DWORD dwUserSidLength
= 0;
524 DWORD dwError
= ERROR_SUCCESS
;
528 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
531 return STATUS_INVALID_HANDLE
;
534 /* Flags must be 0 */
537 return STATUS_INVALID_PARAMETER
;
540 lastRec
= LogfGetCurrentRecord(lpLogHandle
->LogFile
);
542 for (i
= 0; i
< NumStrings
; i
++)
546 case EVENTLOG_SUCCESS
:
547 DPRINT("Success: %wZ\n", Strings
[i
]);
550 case EVENTLOG_ERROR_TYPE
:
551 DPRINT("Error: %wZ\n", Strings
[i
]);
554 case EVENTLOG_WARNING_TYPE
:
555 DPRINT("Warning: %wZ\n", Strings
[i
]);
558 case EVENTLOG_INFORMATION_TYPE
:
559 DPRINT("Info: %wZ\n", Strings
[i
]);
562 case EVENTLOG_AUDIT_SUCCESS
:
563 DPRINT("Audit Success: %wZ\n", Strings
[i
]);
566 case EVENTLOG_AUDIT_FAILURE
:
567 DPRINT("Audit Failure: %wZ\n", Strings
[i
]);
571 DPRINT1("Type %hu: %wZ\n", EventType
, Strings
[i
]);
574 dwStringsSize
+= Strings
[i
]->Length
+ sizeof UNICODE_NULL
;
577 lpStrings
= HeapAlloc(GetProcessHeap(), 0, dwStringsSize
);
580 DPRINT1("Failed to allocate heap\n");
581 return STATUS_NO_MEMORY
;
584 for (i
= 0; i
< NumStrings
; i
++)
586 CopyMemory(lpStrings
+ pos
, Strings
[i
]->Buffer
, Strings
[i
]->Length
);
587 pos
+= Strings
[i
]->Length
/ sizeof(WCHAR
);
588 lpStrings
[pos
] = UNICODE_NULL
;
589 pos
+= sizeof UNICODE_NULL
/ sizeof(WCHAR
);
593 dwUserSidLength
= FIELD_OFFSET(SID
, SubAuthority
[UserSID
->SubAuthorityCount
]);
594 LogBuffer
= LogfAllocAndBuildNewRecord(&recSize
,
600 ComputerName
->Buffer
,
608 dwError
= LogfWriteData(lpLogHandle
->LogFile
, recSize
, LogBuffer
);
611 DPRINT1("ERROR WRITING TO EventLog %S\n", lpLogHandle
->LogFile
->FileName
);
614 LogfFreeRecord(LogBuffer
);
616 HeapFree(GetProcessHeap(), 0, lpStrings
);
618 return I_RpcMapWin32Status(dwError
);
623 NTSTATUS
ElfrClearELFA(
624 IELF_HANDLE LogHandle
,
625 PRPC_STRING BackupFileName
)
627 UNICODE_STRING BackupFileNameW
;
630 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
631 (PANSI_STRING
)BackupFileName
,
633 if (!NT_SUCCESS(Status
))
636 Status
= ElfrClearELFW(LogHandle
,
637 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
639 RtlFreeUnicodeString(&BackupFileNameW
);
646 NTSTATUS
ElfrBackupELFA(
647 IELF_HANDLE LogHandle
,
648 PRPC_STRING BackupFileName
)
650 UNICODE_STRING BackupFileNameW
;
653 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
654 (PANSI_STRING
)BackupFileName
,
656 if (!NT_SUCCESS(Status
))
659 Status
= ElfrBackupELFW(LogHandle
,
660 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
662 RtlFreeUnicodeString(&BackupFileNameW
);
669 NTSTATUS
ElfrOpenELA(
670 EVENTLOG_HANDLE_A UNCServerName
,
671 PRPC_STRING ModuleName
,
672 PRPC_STRING RegModuleName
,
675 IELF_HANDLE
*LogHandle
)
677 UNICODE_STRING ModuleNameW
;
680 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
681 return STATUS_INVALID_PARAMETER
;
683 /* RegModuleName must be an empty string */
684 if (RegModuleName
->Length
> 0)
685 return STATUS_INVALID_PARAMETER
;
687 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
, (PANSI_STRING
)ModuleName
, TRUE
);
688 if (!NT_SUCCESS(Status
))
691 /* FIXME: Must verify that caller has read access */
693 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
697 RtlFreeUnicodeString(&ModuleNameW
);
704 NTSTATUS
ElfrRegisterEventSourceA(
705 EVENTLOG_HANDLE_A UNCServerName
,
706 PRPC_STRING ModuleName
,
707 PRPC_STRING RegModuleName
,
710 IELF_HANDLE
*LogHandle
)
712 UNICODE_STRING ModuleNameW
;
715 Status
= RtlAnsiStringToUnicodeString(&ModuleNameW
,
716 (PANSI_STRING
)ModuleName
,
718 if (!NT_SUCCESS(Status
))
720 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
724 /* RegModuleName must be an empty string */
725 if (RegModuleName
->Length
> 0)
727 RtlFreeUnicodeString(&ModuleNameW
);
728 return STATUS_INVALID_PARAMETER
;
731 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
733 RtlFreeUnicodeString(&ModuleNameW
);
734 return STATUS_INVALID_PARAMETER
;
737 /* FIXME: Must verify that caller has write access */
739 Status
= ElfCreateEventLogHandle((PLOGHANDLE
*)LogHandle
,
743 RtlFreeUnicodeString(&ModuleNameW
);
750 NTSTATUS
ElfrOpenBELA(
751 EVENTLOG_HANDLE_A UNCServerName
,
752 PRPC_STRING BackupFileName
,
755 IELF_HANDLE
*LogHandle
)
757 UNICODE_STRING BackupFileNameW
;
760 DPRINT("ElfrOpenBELA(%Z)\n", BackupFileName
);
762 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
763 (PANSI_STRING
)BackupFileName
,
765 if (!NT_SUCCESS(Status
))
767 DPRINT1("RtlAnsiStringToUnicodeString failed (Status 0x%08lx)\n", Status
);
771 if ((MajorVersion
!= 1) || (MinorVersion
!= 1))
773 RtlFreeUnicodeString(&BackupFileNameW
);
774 return STATUS_INVALID_PARAMETER
;
777 /*FIXME: UNCServerName must specify the server */
779 /*FIXME: Must verify that caller has read access */
781 Status
= ElfCreateBackupLogHandle((PLOGHANDLE
*)LogHandle
,
784 RtlFreeUnicodeString(&BackupFileNameW
);
791 NTSTATUS
ElfrReadELA(
792 IELF_HANDLE LogHandle
,
795 RULONG NumberOfBytesToRead
,
797 DWORD
*NumberOfBytesRead
,
798 DWORD
*MinNumberOfBytesNeeded
)
800 PLOGHANDLE lpLogHandle
;
804 lpLogHandle
= ElfGetLogHandleEntryByHandle(LogHandle
);
807 return STATUS_INVALID_HANDLE
;
811 return STATUS_INVALID_PARAMETER
;
813 /* If sequential read, retrieve the CurrentRecord from this log handle */
814 if (ReadFlags
& EVENTLOG_SEQUENTIAL_READ
)
816 RecordNumber
= lpLogHandle
->CurrentRecord
;
820 RecordNumber
= RecordOffset
;
823 dwError
= LogfReadEvent(lpLogHandle
->LogFile
,
829 MinNumberOfBytesNeeded
,
832 /* Update the handles CurrentRecord if success*/
833 if (dwError
== ERROR_SUCCESS
)
835 lpLogHandle
->CurrentRecord
= RecordNumber
;
839 if (dwError
== ERROR_HANDLE_EOF
)
840 return STATUS_END_OF_FILE
;
842 return I_RpcMapWin32Status(dwError
);
847 NTSTATUS
ElfrReportEventA(
848 IELF_HANDLE LogHandle
,
851 USHORT EventCategory
,
855 PRPC_STRING ComputerName
,
857 PRPC_STRING Strings
[],
863 UNICODE_STRING ComputerNameW
;
864 PUNICODE_STRING
*StringsArrayW
= NULL
;
865 NTSTATUS Status
= STATUS_SUCCESS
;
868 DPRINT("ElfrReportEventA(%hu)\n", NumStrings
);
871 for (i
= 0; i
< NumStrings
; i
++)
873 if (Strings
[i
] == NULL
)
875 DPRINT1("String %hu is null\n", i
);
879 DPRINT1("String %hu: %Z\n", i
, Strings
[i
]);
884 Status
= RtlAnsiStringToUnicodeString((PUNICODE_STRING
)&ComputerNameW
,
885 (PANSI_STRING
)ComputerName
,
887 if (!NT_SUCCESS(Status
))
892 StringsArrayW
= HeapAlloc(MyHeap
,
894 NumStrings
* sizeof (PUNICODE_STRING
));
895 if (StringsArrayW
== NULL
)
897 Status
= STATUS_NO_MEMORY
;
901 for (i
= 0; i
< NumStrings
; i
++)
903 if (Strings
[i
] != NULL
)
905 StringsArrayW
[i
] = HeapAlloc(MyHeap
,
907 sizeof(UNICODE_STRING
));
908 if (StringsArrayW
[i
] == NULL
)
910 Status
= STATUS_NO_MEMORY
;
914 Status
= RtlAnsiStringToUnicodeString(StringsArrayW
[i
],
915 (PANSI_STRING
)Strings
[i
],
919 if (!NT_SUCCESS(Status
))
924 if (NT_SUCCESS(Status
))
926 Status
= ElfrReportEventW(LogHandle
,
933 (PRPC_UNICODE_STRING
)&ComputerNameW
,
935 (PRPC_UNICODE_STRING
*)StringsArrayW
,
943 if (StringsArrayW
!= NULL
)
945 for (i
= 0; i
< NumStrings
; i
++)
947 if (StringsArrayW
[i
] != NULL
)
949 if (StringsArrayW
[i
]->Buffer
)
951 RtlFreeUnicodeString(StringsArrayW
[i
]);
952 HeapFree(MyHeap
, 0, StringsArrayW
[i
]);
957 HeapFree(MyHeap
, 0, StringsArrayW
);
960 RtlFreeUnicodeString(&ComputerNameW
);
967 NTSTATUS
ElfrRegisterClusterSvc(
968 handle_t BindingHandle
)
971 return STATUS_NOT_IMPLEMENTED
;
976 NTSTATUS
ElfrDeregisterClusterSvc(
977 handle_t BindingHandle
)
980 return STATUS_NOT_IMPLEMENTED
;
985 NTSTATUS
ElfrWriteClusterEvents(
986 handle_t BindingHandle
)
989 return STATUS_NOT_IMPLEMENTED
;
994 NTSTATUS
ElfrGetLogInformation(
995 IELF_HANDLE LogHandle
,
999 DWORD
*pcbBytesNeeded
)
1001 NTSTATUS Status
= STATUS_SUCCESS
;
1003 /* FIXME: check handle first */
1007 case EVENTLOG_FULL_INFO
:
1009 LPEVENTLOG_FULL_INFORMATION efi
= (LPEVENTLOG_FULL_INFORMATION
)Buffer
;
1011 *pcbBytesNeeded
= sizeof(EVENTLOG_FULL_INFORMATION
);
1012 if (cbBufSize
< sizeof(EVENTLOG_FULL_INFORMATION
))
1014 return STATUS_BUFFER_TOO_SMALL
;
1017 efi
->dwFull
= 0; /* FIXME */
1022 Status
= STATUS_INVALID_LEVEL
;
1031 NTSTATUS
ElfrFlushEL(
1032 IELF_HANDLE LogHandle
)
1035 return STATUS_NOT_IMPLEMENTED
;
1040 NTSTATUS
ElfrReportEventAndSourceW(
1041 IELF_HANDLE LogHandle
,
1044 USHORT EventCategory
,
1046 PRPC_UNICODE_STRING SourceName
,
1049 PRPC_UNICODE_STRING ComputerName
,
1051 PRPC_UNICODE_STRING Strings
[],
1054 DWORD
*RecordNumber
,
1058 return STATUS_NOT_IMPLEMENTED
;
1062 void __RPC_FAR
*__RPC_USER
midl_user_allocate(SIZE_T len
)
1064 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
1068 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
1070 HeapFree(GetProcessHeap(), 0, ptr
);
1074 void __RPC_USER
IELF_HANDLE_rundown(IELF_HANDLE LogHandle
)