2 * Win32 advapi functions
4 * Copyright 1995 Sven Verdoolaege
5 * Copyright 1998 Juergen Schmied
6 * Copyright 2003 Mike Hearn
7 * Copyright 2007 Hervé Poussineau
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include <ndk/kefuncs.h>
27 #include <eventlogrpc_c.h>
29 WINE_DEFAULT_DEBUG_CHANNEL(advapi
);
31 static RPC_UNICODE_STRING EmptyStringU
= { 0, 0, L
"" };
32 static RPC_STRING EmptyStringA
= { 0, 0, "" };
36 EVENTLOG_HANDLE_A_bind(EVENTLOG_HANDLE_A UNCServerName
)
38 handle_t hBinding
= NULL
;
39 UCHAR
*pszStringBinding
;
42 TRACE("EVENTLOG_HANDLE_A_bind() called\n");
44 status
= RpcStringBindingComposeA(NULL
,
46 (UCHAR
*)UNCServerName
,
47 (UCHAR
*)"\\pipe\\EventLog",
49 (UCHAR
**)&pszStringBinding
);
52 ERR("RpcStringBindingCompose returned 0x%x\n", status
);
56 /* Set the binding handle that will be used to bind to the server. */
57 status
= RpcBindingFromStringBindingA(pszStringBinding
,
61 ERR("RpcBindingFromStringBinding returned 0x%x\n", status
);
64 status
= RpcStringFreeA(&pszStringBinding
);
67 ERR("RpcStringFree returned 0x%x\n", status
);
75 EVENTLOG_HANDLE_A_unbind(EVENTLOG_HANDLE_A UNCServerName
,
80 TRACE("EVENTLOG_HANDLE_A_unbind() called\n");
82 status
= RpcBindingFree(&hBinding
);
85 ERR("RpcBindingFree returned 0x%x\n", status
);
91 EVENTLOG_HANDLE_W_bind(EVENTLOG_HANDLE_W UNCServerName
)
93 handle_t hBinding
= NULL
;
94 LPWSTR pszStringBinding
;
97 TRACE("EVENTLOG_HANDLE_W_bind() called\n");
99 status
= RpcStringBindingComposeW(NULL
,
101 (LPWSTR
)UNCServerName
,
107 ERR("RpcStringBindingCompose returned 0x%x\n", status
);
111 /* Set the binding handle that will be used to bind to the server. */
112 status
= RpcBindingFromStringBindingW(pszStringBinding
,
116 ERR("RpcBindingFromStringBinding returned 0x%x\n", status
);
119 status
= RpcStringFreeW(&pszStringBinding
);
122 ERR("RpcStringFree returned 0x%x\n", status
);
130 EVENTLOG_HANDLE_W_unbind(EVENTLOG_HANDLE_W UNCServerName
,
135 TRACE("EVENTLOG_HANDLE_W_unbind() called\n");
137 status
= RpcBindingFree(&hBinding
);
140 ERR("RpcBindingFree returned 0x%x\n", status
);
145 /******************************************************************************
146 * BackupEventLogA [ADVAPI32.@]
149 BackupEventLogA(IN HANDLE hEventLog
,
150 IN LPCSTR lpBackupFileName
)
152 ANSI_STRING BackupFileNameA
;
153 UNICODE_STRING BackupFileNameW
;
157 TRACE("%p, %s\n", hEventLog
, lpBackupFileName
);
159 if (lpBackupFileName
== NULL
)
161 SetLastError(ERROR_INVALID_PARAMETER
);
165 RtlInitAnsiString(&BackupFileNameA
, lpBackupFileName
);
167 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
170 if (!NT_SUCCESS(Status
))
172 SetLastError(RtlNtStatusToDosError(Status
));
176 Result
= BackupEventLogW(hEventLog
,
177 BackupFileNameW
.Buffer
);
179 RtlFreeUnicodeString(&BackupFileNameW
);
185 /******************************************************************************
186 * BackupEventLogW [ADVAPI32.@]
190 * lpBackupFileName []
193 BackupEventLogW(IN HANDLE hEventLog
,
194 IN LPCWSTR lpBackupFileName
)
196 UNICODE_STRING BackupFileNameW
;
199 TRACE("%p, %s\n", hEventLog
, debugstr_w(lpBackupFileName
));
201 if (lpBackupFileName
== NULL
)
203 SetLastError(ERROR_INVALID_PARAMETER
);
207 if (!RtlDosPathNameToNtPathName_U(lpBackupFileName
, &BackupFileNameW
,
210 SetLastError(ERROR_INVALID_PARAMETER
);
216 Status
= ElfrBackupELFW(hEventLog
,
217 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
219 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
221 Status
= I_RpcMapWin32Status(RpcExceptionCode());
225 RtlFreeHeap(RtlGetProcessHeap(), 0, BackupFileNameW
.Buffer
);
227 if (!NT_SUCCESS(Status
))
229 SetLastError(RtlNtStatusToDosError(Status
));
237 /******************************************************************************
238 * ClearEventLogA [ADVAPI32.@]
241 ClearEventLogA(IN HANDLE hEventLog
,
242 IN LPCSTR lpBackupFileName
)
244 ANSI_STRING BackupFileNameA
;
245 UNICODE_STRING BackupFileNameW
;
249 TRACE("%p, %s\n", hEventLog
, lpBackupFileName
);
251 if (lpBackupFileName
== NULL
)
253 RtlInitUnicodeString(&BackupFileNameW
, NULL
);
257 RtlInitAnsiString(&BackupFileNameA
, lpBackupFileName
);
259 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
262 if (!NT_SUCCESS(Status
))
264 SetLastError(RtlNtStatusToDosError(Status
));
269 Result
= ClearEventLogW(hEventLog
,
270 BackupFileNameW
.Buffer
);
272 RtlFreeUnicodeString(&BackupFileNameW
);
278 /******************************************************************************
279 * ClearEventLogW [ADVAPI32.@]
282 ClearEventLogW(IN HANDLE hEventLog
,
283 IN LPCWSTR lpBackupFileName
)
285 UNICODE_STRING BackupFileNameW
;
288 TRACE("%p, %s\n", hEventLog
, debugstr_w(lpBackupFileName
));
290 if (lpBackupFileName
== NULL
)
292 RtlInitUnicodeString(&BackupFileNameW
, NULL
);
296 if (!RtlDosPathNameToNtPathName_U(lpBackupFileName
, &BackupFileNameW
,
299 SetLastError(ERROR_INVALID_PARAMETER
);
306 Status
= ElfrClearELFW(hEventLog
,
307 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
309 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
311 Status
= I_RpcMapWin32Status(RpcExceptionCode());
315 if (lpBackupFileName
!= NULL
)
316 RtlFreeHeap(RtlGetProcessHeap(), 0, BackupFileNameW
.Buffer
);
318 if (!NT_SUCCESS(Status
))
320 SetLastError(RtlNtStatusToDosError(Status
));
328 /******************************************************************************
329 * CloseEventLog [ADVAPI32.@]
332 CloseEventLog(IN HANDLE hEventLog
)
336 TRACE("%p\n", hEventLog
);
340 Status
= ElfrCloseEL(&hEventLog
);
342 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
344 Status
= I_RpcMapWin32Status(RpcExceptionCode());
348 if (!NT_SUCCESS(Status
))
350 SetLastError(RtlNtStatusToDosError(Status
));
358 /******************************************************************************
359 * DeregisterEventSource [ADVAPI32.@]
360 * Closes a handle to the specified event log
363 * hEventLog [I] Handle to event log
368 DeregisterEventSource(IN HANDLE hEventLog
)
372 TRACE("%p\n", hEventLog
);
376 Status
= ElfrDeregisterEventSource(&hEventLog
);
378 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
380 Status
= I_RpcMapWin32Status(RpcExceptionCode());
384 if (!NT_SUCCESS(Status
))
386 SetLastError(RtlNtStatusToDosError(Status
));
394 /******************************************************************************
395 * GetEventLogInformation [ADVAPI32.@]
398 * hEventLog [I] Handle to event log
399 * dwInfoLevel [I] Level of event log information to return
400 * lpBuffer [O] Buffer that receives the event log information
401 * cbBufSize [I] Size of the lpBuffer buffer
402 * pcbBytesNeeded [O] Required buffer size
405 GetEventLogInformation(IN HANDLE hEventLog
,
406 IN DWORD dwInfoLevel
,
409 OUT LPDWORD pcbBytesNeeded
)
413 if (dwInfoLevel
!= EVENTLOG_FULL_INFO
)
415 SetLastError(ERROR_INVALID_LEVEL
);
421 Status
= ElfrGetLogInformation(hEventLog
,
427 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
429 Status
= I_RpcMapWin32Status(RpcExceptionCode());
433 if (!NT_SUCCESS(Status
))
435 SetLastError(RtlNtStatusToDosError(Status
));
443 /******************************************************************************
444 * GetNumberOfEventLogRecords [ADVAPI32.@]
451 GetNumberOfEventLogRecords(IN HANDLE hEventLog
,
452 OUT PDWORD NumberOfRecords
)
457 TRACE("%p, %p\n", hEventLog
, NumberOfRecords
);
459 if (NumberOfRecords
== NULL
)
461 SetLastError(ERROR_INVALID_PARAMETER
);
467 Status
= ElfrNumberOfRecords(hEventLog
,
470 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
472 Status
= I_RpcMapWin32Status(RpcExceptionCode());
476 if (!NT_SUCCESS(Status
))
478 SetLastError(RtlNtStatusToDosError(Status
));
482 *NumberOfRecords
= Records
;
488 /******************************************************************************
489 * GetOldestEventLogRecord [ADVAPI32.@]
496 GetOldestEventLogRecord(IN HANDLE hEventLog
,
497 OUT PDWORD OldestRecord
)
502 TRACE("%p, %p\n", hEventLog
, OldestRecord
);
504 if (OldestRecord
== NULL
)
506 SetLastError(ERROR_INVALID_PARAMETER
);
512 Status
= ElfrOldestRecord(hEventLog
,
515 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
517 Status
= I_RpcMapWin32Status(RpcExceptionCode());
521 if (!NT_SUCCESS(Status
))
523 SetLastError(RtlNtStatusToDosError(Status
));
527 *OldestRecord
= Oldest
;
533 /******************************************************************************
534 * NotifyChangeEventLog [ADVAPI32.@]
541 NotifyChangeEventLog(IN HANDLE hEventLog
,
544 /* Use ElfrChangeNotify */
546 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
551 /******************************************************************************
552 * OpenBackupEventLogA [ADVAPI32.@]
555 OpenBackupEventLogA(IN LPCSTR lpUNCServerName
,
556 IN LPCSTR lpFileName
)
558 ANSI_STRING UNCServerNameA
;
559 UNICODE_STRING UNCServerNameW
;
560 ANSI_STRING FileNameA
;
561 UNICODE_STRING FileNameW
;
565 TRACE("%s, %s\n", lpUNCServerName
, lpFileName
);
567 /* Convert the server name to unicode */
568 if (lpUNCServerName
== NULL
)
570 RtlInitUnicodeString(&UNCServerNameW
, NULL
);
574 RtlInitAnsiString(&UNCServerNameA
, lpUNCServerName
);
576 Status
= RtlAnsiStringToUnicodeString(&UNCServerNameW
,
579 if (!NT_SUCCESS(Status
))
581 SetLastError(RtlNtStatusToDosError(Status
));
586 /* Convert the file name to unicode */
587 if (lpFileName
== NULL
)
589 RtlInitUnicodeString(&FileNameW
, NULL
);
593 RtlInitAnsiString(&FileNameA
, lpFileName
);
595 Status
= RtlAnsiStringToUnicodeString(&FileNameW
,
598 if (!NT_SUCCESS(Status
))
600 RtlFreeUnicodeString(&UNCServerNameW
);
601 SetLastError(RtlNtStatusToDosError(Status
));
606 /* Call the unicode function */
607 LogHandle
= OpenBackupEventLogW(UNCServerNameW
.Buffer
,
610 /* Free the unicode strings */
611 RtlFreeUnicodeString(&UNCServerNameW
);
612 RtlFreeUnicodeString(&FileNameW
);
618 /******************************************************************************
619 * OpenBackupEventLogW [ADVAPI32.@]
626 OpenBackupEventLogW(IN LPCWSTR lpUNCServerName
,
627 IN LPCWSTR lpFileName
)
629 UNICODE_STRING FileNameW
;
630 IELF_HANDLE LogHandle
;
633 TRACE("%s, %s\n", debugstr_w(lpUNCServerName
), debugstr_w(lpFileName
));
635 if (lpFileName
== NULL
)
637 SetLastError(ERROR_INVALID_PARAMETER
);
641 if (!RtlDosPathNameToNtPathName_U(lpFileName
, &FileNameW
,
644 SetLastError(ERROR_INVALID_PARAMETER
);
650 Status
= ElfrOpenBELW((LPWSTR
)lpUNCServerName
,
651 (PRPC_UNICODE_STRING
)&FileNameW
,
656 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
658 Status
= I_RpcMapWin32Status(RpcExceptionCode());
662 if (FileNameW
.Buffer
!= NULL
)
663 RtlFreeHeap(RtlGetProcessHeap(), 0, FileNameW
.Buffer
);
665 if (!NT_SUCCESS(Status
))
667 SetLastError(RtlNtStatusToDosError(Status
));
671 return (HANDLE
)LogHandle
;
675 /******************************************************************************
676 * OpenEventLogA [ADVAPI32.@]
678 * Opens a handle to the specified event log.
681 * lpUNCServerName [I] UNC name of the server on which the event log is
683 * lpSourceName [I] Name of the log.
686 * Success: Handle to an event log.
690 OpenEventLogA(IN LPCSTR lpUNCServerName
,
691 IN LPCSTR lpSourceName
)
694 ANSI_STRING SourceName
;
695 IELF_HANDLE LogHandle
= NULL
;
698 TRACE("%s, %s\n", lpUNCServerName
, lpSourceName
);
700 if (lpSourceName
== NULL
)
702 SetLastError(ERROR_INVALID_PARAMETER
);
706 if (lpUNCServerName
== NULL
|| *lpUNCServerName
== 0)
707 UNCServerName
= NULL
;
709 UNCServerName
= (LPSTR
)lpUNCServerName
;
711 RtlInitAnsiString(&SourceName
, lpSourceName
);
715 Status
= ElfrOpenELA(UNCServerName
,
716 (PRPC_STRING
)&SourceName
,
722 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
724 Status
= I_RpcMapWin32Status(RpcExceptionCode());
728 if (!NT_SUCCESS(Status
))
730 SetLastError(RtlNtStatusToDosError(Status
));
734 return (HANDLE
)LogHandle
;
738 /******************************************************************************
739 * OpenEventLogW [ADVAPI32.@]
746 OpenEventLogW(IN LPCWSTR lpUNCServerName
,
747 IN LPCWSTR lpSourceName
)
749 LPWSTR UNCServerName
;
750 UNICODE_STRING SourceName
;
751 IELF_HANDLE LogHandle
;
754 TRACE("%s, %s\n", debugstr_w(lpUNCServerName
), debugstr_w(lpSourceName
));
756 if (lpSourceName
== NULL
)
758 SetLastError(ERROR_INVALID_PARAMETER
);
762 if (lpUNCServerName
== NULL
|| *lpUNCServerName
== 0)
763 UNCServerName
= NULL
;
765 UNCServerName
= (LPWSTR
)lpUNCServerName
;
767 RtlInitUnicodeString(&SourceName
, lpSourceName
);
771 Status
= ElfrOpenELW(UNCServerName
,
772 (PRPC_UNICODE_STRING
)&SourceName
,
778 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
780 Status
= I_RpcMapWin32Status(RpcExceptionCode());
784 if (!NT_SUCCESS(Status
))
786 SetLastError(RtlNtStatusToDosError(Status
));
790 return (HANDLE
)LogHandle
;
794 /******************************************************************************
795 * ReadEventLogA [ADVAPI32.@]
798 ReadEventLogA(IN HANDLE hEventLog
,
799 IN DWORD dwReadFlags
,
800 IN DWORD dwRecordOffset
,
802 IN DWORD nNumberOfBytesToRead
,
803 OUT DWORD
*pnBytesRead
,
804 OUT DWORD
*pnMinNumberOfBytesNeeded
)
807 DWORD bytesRead
, minNumberOfBytesNeeded
;
810 TRACE("%p, %lu, %lu, %p, %lu, %p, %p\n",
811 hEventLog
, dwReadFlags
, dwRecordOffset
, lpBuffer
,
812 nNumberOfBytesToRead
, pnBytesRead
, pnMinNumberOfBytesNeeded
);
814 if (lpBuffer
== NULL
||
815 pnBytesRead
== NULL
||
816 pnMinNumberOfBytesNeeded
== NULL
)
818 SetLastError(ERROR_INVALID_PARAMETER
);
822 dwFlags
= dwReadFlags
& (EVENTLOG_SEQUENTIAL_READ
| EVENTLOG_SEEK_READ
);
823 if (dwFlags
== (EVENTLOG_SEQUENTIAL_READ
| EVENTLOG_SEEK_READ
))
825 SetLastError(ERROR_INVALID_PARAMETER
);
829 dwFlags
= dwReadFlags
& (EVENTLOG_FORWARDS_READ
| EVENTLOG_BACKWARDS_READ
);
830 if (dwFlags
== (EVENTLOG_FORWARDS_READ
| EVENTLOG_BACKWARDS_READ
))
832 SetLastError(ERROR_INVALID_PARAMETER
);
838 Status
= ElfrReadELA(hEventLog
,
841 nNumberOfBytesToRead
,
844 &minNumberOfBytesNeeded
);
846 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
848 Status
= I_RpcMapWin32Status(RpcExceptionCode());
852 *pnBytesRead
= (DWORD
)bytesRead
;
853 *pnMinNumberOfBytesNeeded
= (DWORD
)minNumberOfBytesNeeded
;
855 if (!NT_SUCCESS(Status
))
857 SetLastError(RtlNtStatusToDosError(Status
));
865 /******************************************************************************
866 * ReadEventLogW [ADVAPI32.@]
873 * nNumberOfBytesToRead []
875 * pnMinNumberOfBytesNeeded []
878 ReadEventLogW(IN HANDLE hEventLog
,
879 IN DWORD dwReadFlags
,
880 IN DWORD dwRecordOffset
,
882 IN DWORD nNumberOfBytesToRead
,
883 OUT DWORD
*pnBytesRead
,
884 OUT DWORD
*pnMinNumberOfBytesNeeded
)
887 DWORD bytesRead
, minNumberOfBytesNeeded
;
890 TRACE("%p, %lu, %lu, %p, %lu, %p, %p\n",
891 hEventLog
, dwReadFlags
, dwRecordOffset
, lpBuffer
,
892 nNumberOfBytesToRead
, pnBytesRead
, pnMinNumberOfBytesNeeded
);
894 if (lpBuffer
== NULL
||
895 pnBytesRead
== NULL
||
896 pnMinNumberOfBytesNeeded
== NULL
)
898 SetLastError(ERROR_INVALID_PARAMETER
);
902 dwFlags
= dwReadFlags
& (EVENTLOG_SEQUENTIAL_READ
| EVENTLOG_SEEK_READ
);
903 if (dwFlags
== (EVENTLOG_SEQUENTIAL_READ
| EVENTLOG_SEEK_READ
))
905 SetLastError(ERROR_INVALID_PARAMETER
);
909 dwFlags
= dwReadFlags
& (EVENTLOG_FORWARDS_READ
| EVENTLOG_BACKWARDS_READ
);
910 if (dwFlags
== (EVENTLOG_FORWARDS_READ
| EVENTLOG_BACKWARDS_READ
))
912 SetLastError(ERROR_INVALID_PARAMETER
);
918 Status
= ElfrReadELW(hEventLog
,
921 nNumberOfBytesToRead
,
924 &minNumberOfBytesNeeded
);
926 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
928 Status
= I_RpcMapWin32Status(RpcExceptionCode());
932 *pnBytesRead
= (DWORD
)bytesRead
;
933 *pnMinNumberOfBytesNeeded
= (DWORD
)minNumberOfBytesNeeded
;
935 if (!NT_SUCCESS(Status
))
937 SetLastError(RtlNtStatusToDosError(Status
));
945 /******************************************************************************
946 * RegisterEventSourceA [ADVAPI32.@]
949 RegisterEventSourceA(IN LPCSTR lpUNCServerName
,
950 IN LPCSTR lpSourceName
)
952 ANSI_STRING SourceName
;
953 IELF_HANDLE LogHandle
;
956 TRACE("%s, %s\n", lpUNCServerName
, lpSourceName
);
958 RtlInitAnsiString(&SourceName
, lpSourceName
);
962 Status
= ElfrRegisterEventSourceA((LPSTR
)lpUNCServerName
,
963 (PRPC_STRING
)&SourceName
,
969 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
971 Status
= I_RpcMapWin32Status(RpcExceptionCode());
975 if (!NT_SUCCESS(Status
))
977 SetLastError(RtlNtStatusToDosError(Status
));
981 return (HANDLE
)LogHandle
;
985 /******************************************************************************
986 * RegisterEventSourceW [ADVAPI32.@]
987 * Returns a registered handle to an event log
990 * lpUNCServerName [I] Server name for source
991 * lpSourceName [I] Source name for registered handle
998 RegisterEventSourceW(IN LPCWSTR lpUNCServerName
,
999 IN LPCWSTR lpSourceName
)
1001 UNICODE_STRING SourceName
;
1002 IELF_HANDLE LogHandle
;
1005 TRACE("%s, %s\n", debugstr_w(lpUNCServerName
), debugstr_w(lpSourceName
));
1007 RtlInitUnicodeString(&SourceName
, lpSourceName
);
1011 Status
= ElfrRegisterEventSourceW((LPWSTR
)lpUNCServerName
,
1012 (PRPC_UNICODE_STRING
)&SourceName
,
1018 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1020 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1024 if (!NT_SUCCESS(Status
))
1026 SetLastError(RtlNtStatusToDosError(Status
));
1030 return (HANDLE
)LogHandle
;
1034 /******************************************************************************
1035 * ReportEventA [ADVAPI32.@]
1038 ReportEventA(IN HANDLE hEventLog
,
1043 IN WORD wNumStrings
,
1044 IN DWORD dwDataSize
,
1045 IN LPCSTR
*lpStrings
,
1046 IN LPVOID lpRawData
)
1049 PANSI_STRING
*Strings
;
1050 ANSI_STRING ComputerName
;
1052 CHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
1054 LARGE_INTEGER SystemTime
;
1057 TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n",
1058 hEventLog
, wType
, wCategory
, dwEventID
, lpUserSid
,
1059 wNumStrings
, dwDataSize
, lpStrings
, lpRawData
);
1061 Strings
= HeapAlloc(GetProcessHeap(),
1063 wNumStrings
* sizeof(PANSI_STRING
));
1066 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1070 for (i
= 0; i
< wNumStrings
; i
++)
1072 Strings
[i
] = HeapAlloc(GetProcessHeap(),
1074 sizeof(ANSI_STRING
));
1077 RtlInitAnsiString(Strings
[i
], lpStrings
[i
]);
1081 dwSize
= MAX_COMPUTERNAME_LENGTH
+ 1;
1082 GetComputerNameA(szComputerName
, &dwSize
);
1083 RtlInitAnsiString(&ComputerName
, szComputerName
);
1085 NtQuerySystemTime(&SystemTime
);
1086 RtlTimeToSecondsSince1970(&SystemTime
, &Seconds
);
1090 Status
= ElfrReportEventA(hEventLog
,
1097 (PRPC_STRING
)&ComputerName
,
1099 (PRPC_STRING
*)Strings
,
1105 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1107 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1111 for (i
= 0; i
< wNumStrings
; i
++)
1113 if (Strings
[i
] != NULL
)
1114 HeapFree(GetProcessHeap(), 0, Strings
[i
]);
1117 HeapFree(GetProcessHeap(), 0, Strings
);
1119 if (!NT_SUCCESS(Status
))
1121 SetLastError(RtlNtStatusToDosError(Status
));
1129 /******************************************************************************
1130 * ReportEventW [ADVAPI32.@]
1144 ReportEventW(IN HANDLE hEventLog
,
1149 IN WORD wNumStrings
,
1150 IN DWORD dwDataSize
,
1151 IN LPCWSTR
*lpStrings
,
1152 IN LPVOID lpRawData
)
1155 PUNICODE_STRING
*Strings
;
1156 UNICODE_STRING ComputerName
;
1158 WCHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
1160 LARGE_INTEGER SystemTime
;
1163 TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n",
1164 hEventLog
, wType
, wCategory
, dwEventID
, lpUserSid
,
1165 wNumStrings
, dwDataSize
, lpStrings
, lpRawData
);
1167 Strings
= HeapAlloc(GetProcessHeap(),
1169 wNumStrings
* sizeof(PUNICODE_STRING
));
1172 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1176 for (i
= 0; i
< wNumStrings
; i
++)
1178 Strings
[i
] = HeapAlloc(GetProcessHeap(),
1180 sizeof(ANSI_STRING
));
1183 RtlInitUnicodeString(Strings
[i
], lpStrings
[i
]);
1187 dwSize
= MAX_COMPUTERNAME_LENGTH
+ 1;
1188 GetComputerNameW(szComputerName
, &dwSize
);
1189 RtlInitUnicodeString(&ComputerName
, szComputerName
);
1191 NtQuerySystemTime(&SystemTime
);
1192 RtlTimeToSecondsSince1970(&SystemTime
, &Seconds
);
1196 Status
= ElfrReportEventW(hEventLog
,
1203 (PRPC_UNICODE_STRING
)&ComputerName
,
1205 (PRPC_UNICODE_STRING
*)Strings
,
1211 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1213 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1217 for (i
= 0; i
< wNumStrings
; i
++)
1219 if (Strings
[i
] != NULL
)
1220 HeapFree(GetProcessHeap(), 0, Strings
[i
]);
1223 HeapFree(GetProcessHeap(), 0, Strings
);
1225 if (!NT_SUCCESS(Status
))
1227 SetLastError(RtlNtStatusToDosError(Status
));