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
25 WINE_DEFAULT_DEBUG_CHANNEL(advapi
);
27 static RPC_UNICODE_STRING EmptyStringU
= { 0, 0, L
"" };
28 static RPC_STRING EmptyStringA
= { 0, 0, "" };
32 EVENTLOG_HANDLE_A_bind(EVENTLOG_HANDLE_A UNCServerName
)
34 handle_t hBinding
= NULL
;
35 UCHAR
*pszStringBinding
;
38 TRACE("EVENTLOG_HANDLE_A_bind() called\n");
40 status
= RpcStringBindingComposeA(NULL
,
42 (UCHAR
*)UNCServerName
,
43 (UCHAR
*)"\\pipe\\EventLog",
45 (UCHAR
**)&pszStringBinding
);
48 ERR("RpcStringBindingCompose returned 0x%x\n", status
);
52 /* Set the binding handle that will be used to bind to the server. */
53 status
= RpcBindingFromStringBindingA(pszStringBinding
,
57 ERR("RpcBindingFromStringBinding returned 0x%x\n", status
);
60 status
= RpcStringFreeA(&pszStringBinding
);
63 ERR("RpcStringFree returned 0x%x\n", status
);
71 EVENTLOG_HANDLE_A_unbind(EVENTLOG_HANDLE_A UNCServerName
,
76 TRACE("EVENTLOG_HANDLE_A_unbind() called\n");
78 status
= RpcBindingFree(&hBinding
);
81 ERR("RpcBindingFree returned 0x%x\n", status
);
87 EVENTLOG_HANDLE_W_bind(EVENTLOG_HANDLE_W UNCServerName
)
89 handle_t hBinding
= NULL
;
90 LPWSTR pszStringBinding
;
93 TRACE("EVENTLOG_HANDLE_W_bind() called\n");
95 status
= RpcStringBindingComposeW(NULL
,
97 (LPWSTR
)UNCServerName
,
103 ERR("RpcStringBindingCompose returned 0x%x\n", status
);
107 /* Set the binding handle that will be used to bind to the server. */
108 status
= RpcBindingFromStringBindingW(pszStringBinding
,
112 ERR("RpcBindingFromStringBinding returned 0x%x\n", status
);
115 status
= RpcStringFreeW(&pszStringBinding
);
118 ERR("RpcStringFree returned 0x%x\n", status
);
126 EVENTLOG_HANDLE_W_unbind(EVENTLOG_HANDLE_W UNCServerName
,
131 TRACE("EVENTLOG_HANDLE_W_unbind() called\n");
133 status
= RpcBindingFree(&hBinding
);
136 ERR("RpcBindingFree returned 0x%x\n", status
);
141 /******************************************************************************
142 * BackupEventLogA [ADVAPI32.@]
145 BackupEventLogA(IN HANDLE hEventLog
,
146 IN LPCSTR lpBackupFileName
)
148 ANSI_STRING BackupFileNameA
;
149 UNICODE_STRING BackupFileNameW
;
153 TRACE("%p, %s\n", hEventLog
, lpBackupFileName
);
155 if (lpBackupFileName
== NULL
)
157 SetLastError(ERROR_INVALID_PARAMETER
);
161 RtlInitAnsiString(&BackupFileNameA
, lpBackupFileName
);
163 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
166 if (!NT_SUCCESS(Status
))
168 SetLastError(RtlNtStatusToDosError(Status
));
172 Result
= BackupEventLogW(hEventLog
,
173 BackupFileNameW
.Buffer
);
175 RtlFreeUnicodeString(&BackupFileNameW
);
181 /******************************************************************************
182 * BackupEventLogW [ADVAPI32.@]
186 * lpBackupFileName []
189 BackupEventLogW(IN HANDLE hEventLog
,
190 IN LPCWSTR lpBackupFileName
)
192 UNICODE_STRING BackupFileNameW
;
195 TRACE("%p, %s\n", hEventLog
, debugstr_w(lpBackupFileName
));
197 if (lpBackupFileName
== NULL
)
199 SetLastError(ERROR_INVALID_PARAMETER
);
203 if (!RtlDosPathNameToNtPathName_U(lpBackupFileName
, &BackupFileNameW
,
206 SetLastError(ERROR_INVALID_PARAMETER
);
212 Status
= ElfrBackupELFW(hEventLog
,
213 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
215 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
217 Status
= I_RpcMapWin32Status(RpcExceptionCode());
221 RtlFreeHeap(RtlGetProcessHeap(), 0, BackupFileNameW
.Buffer
);
223 if (!NT_SUCCESS(Status
))
225 SetLastError(RtlNtStatusToDosError(Status
));
233 /******************************************************************************
234 * ClearEventLogA [ADVAPI32.@]
237 ClearEventLogA(IN HANDLE hEventLog
,
238 IN LPCSTR lpBackupFileName
)
240 ANSI_STRING BackupFileNameA
;
241 UNICODE_STRING BackupFileNameW
;
245 TRACE("%p, %s\n", hEventLog
, lpBackupFileName
);
247 if (lpBackupFileName
== NULL
)
249 RtlInitUnicodeString(&BackupFileNameW
, NULL
);
253 RtlInitAnsiString(&BackupFileNameA
, lpBackupFileName
);
255 Status
= RtlAnsiStringToUnicodeString(&BackupFileNameW
,
258 if (!NT_SUCCESS(Status
))
260 SetLastError(RtlNtStatusToDosError(Status
));
265 Result
= ClearEventLogW(hEventLog
,
266 BackupFileNameW
.Buffer
);
268 RtlFreeUnicodeString(&BackupFileNameW
);
274 /******************************************************************************
275 * ClearEventLogW [ADVAPI32.@]
278 ClearEventLogW(IN HANDLE hEventLog
,
279 IN LPCWSTR lpBackupFileName
)
281 UNICODE_STRING BackupFileNameW
;
284 TRACE("%p, %s\n", hEventLog
, debugstr_w(lpBackupFileName
));
286 if (lpBackupFileName
== NULL
)
288 RtlInitUnicodeString(&BackupFileNameW
, NULL
);
292 if (!RtlDosPathNameToNtPathName_U(lpBackupFileName
, &BackupFileNameW
,
295 SetLastError(ERROR_INVALID_PARAMETER
);
302 Status
= ElfrClearELFW(hEventLog
,
303 (PRPC_UNICODE_STRING
)&BackupFileNameW
);
305 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
307 Status
= I_RpcMapWin32Status(RpcExceptionCode());
311 if (lpBackupFileName
!= NULL
)
312 RtlFreeHeap(RtlGetProcessHeap(), 0, BackupFileNameW
.Buffer
);
314 if (!NT_SUCCESS(Status
))
316 SetLastError(RtlNtStatusToDosError(Status
));
324 /******************************************************************************
325 * CloseEventLog [ADVAPI32.@]
328 CloseEventLog(IN HANDLE hEventLog
)
332 TRACE("%p\n", hEventLog
);
336 Status
= ElfrCloseEL(&hEventLog
);
338 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
340 Status
= I_RpcMapWin32Status(RpcExceptionCode());
344 if (!NT_SUCCESS(Status
))
346 SetLastError(RtlNtStatusToDosError(Status
));
354 /******************************************************************************
355 * DeregisterEventSource [ADVAPI32.@]
356 * Closes a handle to the specified event log
359 * hEventLog [I] Handle to event log
364 DeregisterEventSource(IN HANDLE hEventLog
)
368 TRACE("%p\n", hEventLog
);
372 Status
= ElfrDeregisterEventSource(&hEventLog
);
374 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
376 Status
= I_RpcMapWin32Status(RpcExceptionCode());
380 if (!NT_SUCCESS(Status
))
382 SetLastError(RtlNtStatusToDosError(Status
));
390 /******************************************************************************
391 * GetEventLogInformation [ADVAPI32.@]
394 * hEventLog [I] Handle to event log
395 * dwInfoLevel [I] Level of event log information to return
396 * lpBuffer [O] Buffer that receives the event log information
397 * cbBufSize [I] Size of the lpBuffer buffer
398 * pcbBytesNeeded [O] Required buffer size
401 GetEventLogInformation(IN HANDLE hEventLog
,
402 IN DWORD dwInfoLevel
,
405 OUT LPDWORD pcbBytesNeeded
)
409 if (dwInfoLevel
!= EVENTLOG_FULL_INFO
)
411 SetLastError(ERROR_INVALID_LEVEL
);
417 Status
= ElfrGetLogInformation(hEventLog
,
423 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
425 Status
= I_RpcMapWin32Status(RpcExceptionCode());
429 if (!NT_SUCCESS(Status
))
431 SetLastError(RtlNtStatusToDosError(Status
));
439 /******************************************************************************
440 * GetNumberOfEventLogRecords [ADVAPI32.@]
447 GetNumberOfEventLogRecords(IN HANDLE hEventLog
,
448 OUT PDWORD NumberOfRecords
)
453 TRACE("%p, %p\n", hEventLog
, NumberOfRecords
);
455 if (NumberOfRecords
== NULL
)
457 SetLastError(ERROR_INVALID_PARAMETER
);
463 Status
= ElfrNumberOfRecords(hEventLog
,
466 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
468 Status
= I_RpcMapWin32Status(RpcExceptionCode());
472 if (!NT_SUCCESS(Status
))
474 SetLastError(RtlNtStatusToDosError(Status
));
478 *NumberOfRecords
= Records
;
484 /******************************************************************************
485 * GetOldestEventLogRecord [ADVAPI32.@]
492 GetOldestEventLogRecord(IN HANDLE hEventLog
,
493 OUT PDWORD OldestRecord
)
498 TRACE("%p, %p\n", hEventLog
, OldestRecord
);
500 if (OldestRecord
== NULL
)
502 SetLastError(ERROR_INVALID_PARAMETER
);
508 Status
= ElfrOldestRecord(hEventLog
,
511 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
513 Status
= I_RpcMapWin32Status(RpcExceptionCode());
517 if (!NT_SUCCESS(Status
))
519 SetLastError(RtlNtStatusToDosError(Status
));
523 *OldestRecord
= Oldest
;
529 /******************************************************************************
530 * NotifyChangeEventLog [ADVAPI32.@]
537 NotifyChangeEventLog(IN HANDLE hEventLog
,
540 /* Use ElfrChangeNotify */
542 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
547 /******************************************************************************
548 * OpenBackupEventLogA [ADVAPI32.@]
551 OpenBackupEventLogA(IN LPCSTR lpUNCServerName
,
552 IN LPCSTR lpFileName
)
554 ANSI_STRING UNCServerNameA
;
555 UNICODE_STRING UNCServerNameW
;
556 ANSI_STRING FileNameA
;
557 UNICODE_STRING FileNameW
;
561 TRACE("%s, %s\n", lpUNCServerName
, lpFileName
);
563 /* Convert the server name to unicode */
564 if (lpUNCServerName
== NULL
)
566 RtlInitUnicodeString(&UNCServerNameW
, NULL
);
570 RtlInitAnsiString(&UNCServerNameA
, lpUNCServerName
);
572 Status
= RtlAnsiStringToUnicodeString(&UNCServerNameW
,
575 if (!NT_SUCCESS(Status
))
577 SetLastError(RtlNtStatusToDosError(Status
));
582 /* Convert the file name to unicode */
583 if (lpFileName
== NULL
)
585 RtlInitUnicodeString(&FileNameW
, NULL
);
589 RtlInitAnsiString(&FileNameA
, lpFileName
);
591 Status
= RtlAnsiStringToUnicodeString(&FileNameW
,
594 if (!NT_SUCCESS(Status
))
596 RtlFreeUnicodeString(&UNCServerNameW
);
597 SetLastError(RtlNtStatusToDosError(Status
));
602 /* Call the unicode function */
603 LogHandle
= OpenBackupEventLogW(UNCServerNameW
.Buffer
,
606 /* Free the unicode strings */
607 RtlFreeUnicodeString(&UNCServerNameW
);
608 RtlFreeUnicodeString(&FileNameW
);
614 /******************************************************************************
615 * OpenBackupEventLogW [ADVAPI32.@]
622 OpenBackupEventLogW(IN LPCWSTR lpUNCServerName
,
623 IN LPCWSTR lpFileName
)
625 UNICODE_STRING FileNameW
;
626 IELF_HANDLE LogHandle
;
629 TRACE("%s, %s\n", debugstr_w(lpUNCServerName
), debugstr_w(lpFileName
));
631 if (lpFileName
== NULL
)
633 SetLastError(ERROR_INVALID_PARAMETER
);
637 if (!RtlDosPathNameToNtPathName_U(lpFileName
, &FileNameW
,
640 SetLastError(ERROR_INVALID_PARAMETER
);
646 Status
= ElfrOpenBELW((LPWSTR
)lpUNCServerName
,
647 (PRPC_UNICODE_STRING
)&FileNameW
,
652 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
654 Status
= I_RpcMapWin32Status(RpcExceptionCode());
658 if (FileNameW
.Buffer
!= NULL
)
659 RtlFreeHeap(RtlGetProcessHeap(), 0, FileNameW
.Buffer
);
661 if (!NT_SUCCESS(Status
))
663 SetLastError(RtlNtStatusToDosError(Status
));
667 return (HANDLE
)LogHandle
;
671 /******************************************************************************
672 * OpenEventLogA [ADVAPI32.@]
674 * Opens a handle to the specified event log.
677 * lpUNCServerName [I] UNC name of the server on which the event log is
679 * lpSourceName [I] Name of the log.
682 * Success: Handle to an event log.
686 OpenEventLogA(IN LPCSTR lpUNCServerName
,
687 IN LPCSTR lpSourceName
)
690 ANSI_STRING SourceName
;
691 IELF_HANDLE LogHandle
= NULL
;
694 TRACE("%s, %s\n", lpUNCServerName
, lpSourceName
);
696 if (lpSourceName
== NULL
)
698 SetLastError(ERROR_INVALID_PARAMETER
);
702 if (lpUNCServerName
== NULL
|| *lpUNCServerName
== 0)
703 UNCServerName
= NULL
;
705 UNCServerName
= (LPSTR
)lpUNCServerName
;
707 RtlInitAnsiString(&SourceName
, lpSourceName
);
711 Status
= ElfrOpenELA(UNCServerName
,
712 (PRPC_STRING
)&SourceName
,
718 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
720 Status
= I_RpcMapWin32Status(RpcExceptionCode());
724 if (!NT_SUCCESS(Status
))
726 SetLastError(RtlNtStatusToDosError(Status
));
730 return (HANDLE
)LogHandle
;
734 /******************************************************************************
735 * OpenEventLogW [ADVAPI32.@]
742 OpenEventLogW(IN LPCWSTR lpUNCServerName
,
743 IN LPCWSTR lpSourceName
)
745 LPWSTR UNCServerName
;
746 UNICODE_STRING SourceName
;
747 IELF_HANDLE LogHandle
;
750 TRACE("%s, %s\n", debugstr_w(lpUNCServerName
), debugstr_w(lpSourceName
));
752 if (lpSourceName
== NULL
)
754 SetLastError(ERROR_INVALID_PARAMETER
);
758 if (lpUNCServerName
== NULL
|| *lpUNCServerName
== 0)
759 UNCServerName
= NULL
;
761 UNCServerName
= (LPWSTR
)lpUNCServerName
;
763 RtlInitUnicodeString(&SourceName
, lpSourceName
);
767 Status
= ElfrOpenELW(UNCServerName
,
768 (PRPC_UNICODE_STRING
)&SourceName
,
774 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
776 Status
= I_RpcMapWin32Status(RpcExceptionCode());
780 if (!NT_SUCCESS(Status
))
782 SetLastError(RtlNtStatusToDosError(Status
));
786 return (HANDLE
)LogHandle
;
790 /******************************************************************************
791 * ReadEventLogA [ADVAPI32.@]
794 ReadEventLogA(IN HANDLE hEventLog
,
795 IN DWORD dwReadFlags
,
796 IN DWORD dwRecordOffset
,
798 IN DWORD nNumberOfBytesToRead
,
799 OUT DWORD
*pnBytesRead
,
800 OUT DWORD
*pnMinNumberOfBytesNeeded
)
803 DWORD bytesRead
, minNumberOfBytesNeeded
;
806 TRACE("%p, %lu, %lu, %p, %lu, %p, %p\n",
807 hEventLog
, dwReadFlags
, dwRecordOffset
, lpBuffer
,
808 nNumberOfBytesToRead
, pnBytesRead
, pnMinNumberOfBytesNeeded
);
810 if (lpBuffer
== NULL
||
811 pnBytesRead
== NULL
||
812 pnMinNumberOfBytesNeeded
== NULL
)
814 SetLastError(ERROR_INVALID_PARAMETER
);
818 dwFlags
= dwReadFlags
& (EVENTLOG_SEQUENTIAL_READ
| EVENTLOG_SEEK_READ
);
819 if (dwFlags
== (EVENTLOG_SEQUENTIAL_READ
| EVENTLOG_SEEK_READ
))
821 SetLastError(ERROR_INVALID_PARAMETER
);
825 dwFlags
= dwReadFlags
& (EVENTLOG_FORWARDS_READ
| EVENTLOG_BACKWARDS_READ
);
826 if (dwFlags
== (EVENTLOG_FORWARDS_READ
| EVENTLOG_BACKWARDS_READ
))
828 SetLastError(ERROR_INVALID_PARAMETER
);
834 Status
= ElfrReadELA(hEventLog
,
837 nNumberOfBytesToRead
,
840 &minNumberOfBytesNeeded
);
842 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
844 Status
= I_RpcMapWin32Status(RpcExceptionCode());
848 *pnBytesRead
= (DWORD
)bytesRead
;
849 *pnMinNumberOfBytesNeeded
= (DWORD
)minNumberOfBytesNeeded
;
851 if (!NT_SUCCESS(Status
))
853 SetLastError(RtlNtStatusToDosError(Status
));
861 /******************************************************************************
862 * ReadEventLogW [ADVAPI32.@]
869 * nNumberOfBytesToRead []
871 * pnMinNumberOfBytesNeeded []
874 ReadEventLogW(IN HANDLE hEventLog
,
875 IN DWORD dwReadFlags
,
876 IN DWORD dwRecordOffset
,
878 IN DWORD nNumberOfBytesToRead
,
879 OUT DWORD
*pnBytesRead
,
880 OUT DWORD
*pnMinNumberOfBytesNeeded
)
883 DWORD bytesRead
, minNumberOfBytesNeeded
;
886 TRACE("%p, %lu, %lu, %p, %lu, %p, %p\n",
887 hEventLog
, dwReadFlags
, dwRecordOffset
, lpBuffer
,
888 nNumberOfBytesToRead
, pnBytesRead
, pnMinNumberOfBytesNeeded
);
890 if (lpBuffer
== NULL
||
891 pnBytesRead
== NULL
||
892 pnMinNumberOfBytesNeeded
== NULL
)
894 SetLastError(ERROR_INVALID_PARAMETER
);
898 dwFlags
= dwReadFlags
& (EVENTLOG_SEQUENTIAL_READ
| EVENTLOG_SEEK_READ
);
899 if (dwFlags
== (EVENTLOG_SEQUENTIAL_READ
| EVENTLOG_SEEK_READ
))
901 SetLastError(ERROR_INVALID_PARAMETER
);
905 dwFlags
= dwReadFlags
& (EVENTLOG_FORWARDS_READ
| EVENTLOG_BACKWARDS_READ
);
906 if (dwFlags
== (EVENTLOG_FORWARDS_READ
| EVENTLOG_BACKWARDS_READ
))
908 SetLastError(ERROR_INVALID_PARAMETER
);
914 Status
= ElfrReadELW(hEventLog
,
917 nNumberOfBytesToRead
,
920 &minNumberOfBytesNeeded
);
922 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
924 Status
= I_RpcMapWin32Status(RpcExceptionCode());
928 *pnBytesRead
= (DWORD
)bytesRead
;
929 *pnMinNumberOfBytesNeeded
= (DWORD
)minNumberOfBytesNeeded
;
931 if (!NT_SUCCESS(Status
))
933 SetLastError(RtlNtStatusToDosError(Status
));
941 /******************************************************************************
942 * RegisterEventSourceA [ADVAPI32.@]
945 RegisterEventSourceA(IN LPCSTR lpUNCServerName
,
946 IN LPCSTR lpSourceName
)
948 ANSI_STRING SourceName
;
949 IELF_HANDLE LogHandle
;
952 TRACE("%s, %s\n", lpUNCServerName
, lpSourceName
);
954 RtlInitAnsiString(&SourceName
, lpSourceName
);
958 Status
= ElfrRegisterEventSourceA((LPSTR
)lpUNCServerName
,
959 (PRPC_STRING
)&SourceName
,
965 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
967 Status
= I_RpcMapWin32Status(RpcExceptionCode());
971 if (!NT_SUCCESS(Status
))
973 SetLastError(RtlNtStatusToDosError(Status
));
977 return (HANDLE
)LogHandle
;
981 /******************************************************************************
982 * RegisterEventSourceW [ADVAPI32.@]
983 * Returns a registered handle to an event log
986 * lpUNCServerName [I] Server name for source
987 * lpSourceName [I] Source name for registered handle
994 RegisterEventSourceW(IN LPCWSTR lpUNCServerName
,
995 IN LPCWSTR lpSourceName
)
997 UNICODE_STRING SourceName
;
998 IELF_HANDLE LogHandle
;
1001 TRACE("%s, %s\n", debugstr_w(lpUNCServerName
), debugstr_w(lpSourceName
));
1003 RtlInitUnicodeString(&SourceName
, lpSourceName
);
1007 Status
= ElfrRegisterEventSourceW((LPWSTR
)lpUNCServerName
,
1008 (PRPC_UNICODE_STRING
)&SourceName
,
1014 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1016 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1020 if (!NT_SUCCESS(Status
))
1022 SetLastError(RtlNtStatusToDosError(Status
));
1026 return (HANDLE
)LogHandle
;
1030 /******************************************************************************
1031 * ReportEventA [ADVAPI32.@]
1034 ReportEventA(IN HANDLE hEventLog
,
1039 IN WORD wNumStrings
,
1040 IN DWORD dwDataSize
,
1041 IN LPCSTR
*lpStrings
,
1042 IN LPVOID lpRawData
)
1045 PANSI_STRING
*Strings
;
1046 ANSI_STRING ComputerName
;
1048 CHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
1050 LARGE_INTEGER SystemTime
;
1053 TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n",
1054 hEventLog
, wType
, wCategory
, dwEventID
, lpUserSid
,
1055 wNumStrings
, dwDataSize
, lpStrings
, lpRawData
);
1057 Strings
= HeapAlloc(GetProcessHeap(),
1059 wNumStrings
* sizeof(PANSI_STRING
));
1062 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1066 for (i
= 0; i
< wNumStrings
; i
++)
1068 Strings
[i
] = HeapAlloc(GetProcessHeap(),
1070 sizeof(ANSI_STRING
));
1073 RtlInitAnsiString(Strings
[i
], lpStrings
[i
]);
1077 dwSize
= MAX_COMPUTERNAME_LENGTH
+ 1;
1078 GetComputerNameA(szComputerName
, &dwSize
);
1079 RtlInitAnsiString(&ComputerName
, szComputerName
);
1081 NtQuerySystemTime(&SystemTime
);
1082 RtlTimeToSecondsSince1970(&SystemTime
, &Seconds
);
1086 Status
= ElfrReportEventA(hEventLog
,
1093 (PRPC_STRING
)&ComputerName
,
1095 (PRPC_STRING
*)Strings
,
1101 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1103 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1107 for (i
= 0; i
< wNumStrings
; i
++)
1109 if (Strings
[i
] != NULL
)
1110 HeapFree(GetProcessHeap(), 0, Strings
[i
]);
1113 HeapFree(GetProcessHeap(), 0, Strings
);
1115 if (!NT_SUCCESS(Status
))
1117 SetLastError(RtlNtStatusToDosError(Status
));
1125 /******************************************************************************
1126 * ReportEventW [ADVAPI32.@]
1140 ReportEventW(IN HANDLE hEventLog
,
1145 IN WORD wNumStrings
,
1146 IN DWORD dwDataSize
,
1147 IN LPCWSTR
*lpStrings
,
1148 IN LPVOID lpRawData
)
1151 PUNICODE_STRING
*Strings
;
1152 UNICODE_STRING ComputerName
;
1154 WCHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
1156 LARGE_INTEGER SystemTime
;
1159 TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n",
1160 hEventLog
, wType
, wCategory
, dwEventID
, lpUserSid
,
1161 wNumStrings
, dwDataSize
, lpStrings
, lpRawData
);
1163 Strings
= HeapAlloc(GetProcessHeap(),
1165 wNumStrings
* sizeof(PUNICODE_STRING
));
1168 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
1172 for (i
= 0; i
< wNumStrings
; i
++)
1174 Strings
[i
] = HeapAlloc(GetProcessHeap(),
1176 sizeof(ANSI_STRING
));
1179 RtlInitUnicodeString(Strings
[i
], lpStrings
[i
]);
1183 dwSize
= MAX_COMPUTERNAME_LENGTH
+ 1;
1184 GetComputerNameW(szComputerName
, &dwSize
);
1185 RtlInitUnicodeString(&ComputerName
, szComputerName
);
1187 NtQuerySystemTime(&SystemTime
);
1188 RtlTimeToSecondsSince1970(&SystemTime
, &Seconds
);
1192 Status
= ElfrReportEventW(hEventLog
,
1199 (PRPC_UNICODE_STRING
)&ComputerName
,
1201 (PRPC_UNICODE_STRING
*)Strings
,
1207 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1209 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1213 for (i
= 0; i
< wNumStrings
; i
++)
1215 if (Strings
[i
] != NULL
)
1216 HeapFree(GetProcessHeap(), 0, Strings
[i
]);
1219 HeapFree(GetProcessHeap(), 0, Strings
);
1221 if (!NT_SUCCESS(Status
))
1223 SetLastError(RtlNtStatusToDosError(Status
));