mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 02:36:13 +00:00
- Implement GetEventLogInformation.
- OpenBackupEventLogA, OpenEventLogA, RegisterEventSourceA and ReportEventA: Call the ANSI RPC-Server Function directly instead of converting arguments to Unicode and calling the matching Unicode Function. - OpenEventLogW: Fix argument checks. svn path=/trunk/; revision=45401
This commit is contained in:
parent
b4da1d81d9
commit
5e9564ed2d
1 changed files with 178 additions and 120 deletions
|
@ -26,20 +26,9 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(advapi);
|
WINE_DEFAULT_DEBUG_CHANNEL(advapi);
|
||||||
|
|
||||||
static RPC_UNICODE_STRING EmptyString = { 0, 0, L"" };
|
static RPC_UNICODE_STRING EmptyStringU = { 0, 0, L"" };
|
||||||
|
static RPC_STRING EmptyStringA = { 0, 0, "" };
|
||||||
|
|
||||||
static inline LPWSTR SERV_dup( LPCSTR str )
|
|
||||||
{
|
|
||||||
UINT len;
|
|
||||||
LPWSTR wstr;
|
|
||||||
|
|
||||||
if( !str )
|
|
||||||
return NULL;
|
|
||||||
len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
|
|
||||||
wstr = HeapAlloc( GetProcessHeap(), 0, len*sizeof (WCHAR) );
|
|
||||||
MultiByteToWideChar( CP_ACP, 0, str, -1, wstr, len );
|
|
||||||
return wstr;
|
|
||||||
}
|
|
||||||
|
|
||||||
handle_t __RPC_USER
|
handle_t __RPC_USER
|
||||||
EVENTLOG_HANDLE_A_bind(EVENTLOG_HANDLE_A UNCServerName)
|
EVENTLOG_HANDLE_A_bind(EVENTLOG_HANDLE_A UNCServerName)
|
||||||
|
@ -166,7 +155,7 @@ BackupEventLogA(IN HANDLE hEventLog,
|
||||||
BackupFileName.Buffer = (LPSTR)lpBackupFileName;
|
BackupFileName.Buffer = (LPSTR)lpBackupFileName;
|
||||||
BackupFileName.Length = BackupFileName.MaximumLength =
|
BackupFileName.Length = BackupFileName.MaximumLength =
|
||||||
lpBackupFileName ? strlen(lpBackupFileName) : 0;
|
lpBackupFileName ? strlen(lpBackupFileName) : 0;
|
||||||
BackupFileName.MaximumLength += sizeof(CHAR);
|
BackupFileName.MaximumLength += sizeof(CHAR);
|
||||||
|
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
|
@ -389,9 +378,29 @@ GetEventLogInformation(IN HANDLE hEventLog,
|
||||||
IN DWORD cbBufSize,
|
IN DWORD cbBufSize,
|
||||||
OUT LPDWORD pcbBytesNeeded)
|
OUT LPDWORD pcbBytesNeeded)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
NTSTATUS Status;
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return FALSE;
|
RpcTryExcept
|
||||||
|
{
|
||||||
|
Status = ElfrGetLogInformation(hEventLog,
|
||||||
|
dwInfoLevel,
|
||||||
|
(LPBYTE)lpBuffer,
|
||||||
|
cbBufSize,
|
||||||
|
pcbBytesNeeded);
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(Status));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -416,7 +425,7 @@ GetNumberOfEventLogRecords(IN HANDLE hEventLog,
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
Status = ElfrNumberOfRecords(hEventLog,
|
Status = ElfrNumberOfRecords(hEventLog,
|
||||||
|
@ -461,7 +470,7 @@ GetOldestEventLogRecord(IN HANDLE hEventLog,
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
Status = ElfrOldestRecord(hEventLog,
|
Status = ElfrOldestRecord(hEventLog,
|
||||||
|
@ -510,32 +519,35 @@ HANDLE WINAPI
|
||||||
OpenBackupEventLogA(IN LPCSTR lpUNCServerName,
|
OpenBackupEventLogA(IN LPCSTR lpUNCServerName,
|
||||||
IN LPCSTR lpFileName)
|
IN LPCSTR lpFileName)
|
||||||
{
|
{
|
||||||
UNICODE_STRING UNCServerName;
|
ANSI_STRING FileName;
|
||||||
UNICODE_STRING FileName;
|
IELF_HANDLE LogHandle;
|
||||||
HANDLE Handle;
|
NTSTATUS Status;
|
||||||
|
|
||||||
TRACE("%s, %s\n", lpUNCServerName, lpFileName);
|
TRACE("%s, %s\n", lpUNCServerName, lpFileName);
|
||||||
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz(&UNCServerName, lpUNCServerName))
|
RtlInitAnsiString(&FileName, lpFileName);
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
Status = ElfrOpenBELA((LPSTR)lpUNCServerName,
|
||||||
|
(PRPC_STRING)&FileName,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
&LogHandle);
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(Status));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName))
|
return (HANDLE)LogHandle;
|
||||||
{
|
|
||||||
RtlFreeUnicodeString(&UNCServerName);
|
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Handle = OpenBackupEventLogW(UNCServerName.Buffer,
|
|
||||||
FileName.Buffer);
|
|
||||||
|
|
||||||
RtlFreeUnicodeString(&UNCServerName);
|
|
||||||
RtlFreeUnicodeString(&FileName);
|
|
||||||
|
|
||||||
return Handle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -600,19 +612,51 @@ OpenBackupEventLogW(IN LPCWSTR lpUNCServerName,
|
||||||
* Failure: NULL
|
* Failure: NULL
|
||||||
*/
|
*/
|
||||||
HANDLE WINAPI
|
HANDLE WINAPI
|
||||||
OpenEventLogA(IN LPCSTR uncname,
|
OpenEventLogA(IN LPCSTR lpUNCServerName,
|
||||||
IN LPCSTR source)
|
IN LPCSTR lpSourceName)
|
||||||
{
|
{
|
||||||
LPWSTR uncnameW, sourceW;
|
LPSTR UNCServerName;
|
||||||
HANDLE handle;
|
ANSI_STRING SourceName;
|
||||||
|
IELF_HANDLE LogHandle = NULL;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
uncnameW = SERV_dup(uncname);
|
TRACE("%s, %s\n", lpUNCServerName, lpSourceName);
|
||||||
sourceW = SERV_dup(source);
|
|
||||||
handle = OpenEventLogW(uncnameW, sourceW);
|
|
||||||
HeapFree(GetProcessHeap(), 0, uncnameW);
|
|
||||||
HeapFree(GetProcessHeap(), 0, sourceW);
|
|
||||||
|
|
||||||
return handle;
|
if (lpSourceName == NULL)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lpUNCServerName == NULL || *lpUNCServerName == 0)
|
||||||
|
UNCServerName = NULL;
|
||||||
|
else
|
||||||
|
UNCServerName = (LPSTR)lpUNCServerName;
|
||||||
|
|
||||||
|
RtlInitAnsiString(&SourceName, lpSourceName);
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
|
{
|
||||||
|
Status = ElfrOpenELA(UNCServerName,
|
||||||
|
(PRPC_STRING)&SourceName,
|
||||||
|
&EmptyStringA,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
&LogHandle);
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(Status));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (HANDLE)LogHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -627,22 +671,31 @@ HANDLE WINAPI
|
||||||
OpenEventLogW(IN LPCWSTR lpUNCServerName,
|
OpenEventLogW(IN LPCWSTR lpUNCServerName,
|
||||||
IN LPCWSTR lpSourceName)
|
IN LPCWSTR lpSourceName)
|
||||||
{
|
{
|
||||||
RPC_UNICODE_STRING SourceName;
|
LPWSTR UNCServerName;
|
||||||
|
UNICODE_STRING SourceName;
|
||||||
IELF_HANDLE LogHandle;
|
IELF_HANDLE LogHandle;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
TRACE("%s, %s\n", debugstr_w(lpUNCServerName), debugstr_w(lpSourceName));
|
TRACE("%s, %s\n", debugstr_w(lpUNCServerName), debugstr_w(lpSourceName));
|
||||||
|
|
||||||
SourceName.Buffer = (LPWSTR)lpSourceName;
|
if (lpSourceName == NULL)
|
||||||
SourceName.Length = SourceName.MaximumLength =
|
{
|
||||||
lpSourceName ? wcslen(lpSourceName) * sizeof(WCHAR) : 0;
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
SourceName.MaximumLength += sizeof(WCHAR);
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lpUNCServerName == NULL || *lpUNCServerName == 0)
|
||||||
|
UNCServerName = NULL;
|
||||||
|
else
|
||||||
|
UNCServerName = (LPWSTR)lpUNCServerName;
|
||||||
|
|
||||||
|
RtlInitUnicodeString(&SourceName, lpSourceName);
|
||||||
|
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
Status = ElfrOpenELW((LPWSTR)lpUNCServerName,
|
Status = ElfrOpenELW(UNCServerName,
|
||||||
&SourceName,
|
(PRPC_UNICODE_STRING)&SourceName,
|
||||||
&EmptyString,
|
&EmptyStringU,
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
&LogHandle);
|
&LogHandle);
|
||||||
|
@ -801,32 +854,36 @@ HANDLE WINAPI
|
||||||
RegisterEventSourceA(IN LPCSTR lpUNCServerName,
|
RegisterEventSourceA(IN LPCSTR lpUNCServerName,
|
||||||
IN LPCSTR lpSourceName)
|
IN LPCSTR lpSourceName)
|
||||||
{
|
{
|
||||||
UNICODE_STRING UNCServerName;
|
ANSI_STRING SourceName;
|
||||||
UNICODE_STRING SourceName;
|
IELF_HANDLE LogHandle;
|
||||||
HANDLE Handle;
|
NTSTATUS Status;
|
||||||
|
|
||||||
TRACE("%s, %s\n", lpUNCServerName, lpSourceName);
|
TRACE("%s, %s\n", lpUNCServerName, lpSourceName);
|
||||||
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz(&UNCServerName, lpUNCServerName))
|
RtlInitAnsiString(&SourceName, lpSourceName);
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
Status = ElfrRegisterEventSourceA((LPSTR)lpUNCServerName,
|
||||||
|
(PRPC_STRING)&SourceName,
|
||||||
|
&EmptyStringA,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
&LogHandle);
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(Status));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz(&SourceName, lpSourceName))
|
return (HANDLE)LogHandle;
|
||||||
{
|
|
||||||
RtlFreeUnicodeString(&UNCServerName);
|
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Handle = RegisterEventSourceW(UNCServerName.Buffer,
|
|
||||||
SourceName.Buffer);
|
|
||||||
|
|
||||||
RtlFreeUnicodeString(&UNCServerName);
|
|
||||||
RtlFreeUnicodeString(&SourceName);
|
|
||||||
|
|
||||||
return Handle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -861,7 +918,7 @@ RegisterEventSourceW(IN LPCWSTR lpUNCServerName,
|
||||||
{
|
{
|
||||||
Status = ElfrRegisterEventSourceW((LPWSTR)lpUNCServerName,
|
Status = ElfrRegisterEventSourceW((LPWSTR)lpUNCServerName,
|
||||||
&SourceName,
|
&SourceName,
|
||||||
&EmptyString,
|
&EmptyStringU,
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
&LogHandle);
|
&LogHandle);
|
||||||
|
@ -896,61 +953,62 @@ ReportEventA(IN HANDLE hEventLog,
|
||||||
IN LPCSTR *lpStrings,
|
IN LPCSTR *lpStrings,
|
||||||
IN LPVOID lpRawData)
|
IN LPVOID lpRawData)
|
||||||
{
|
{
|
||||||
LPCWSTR *wideStrArray;
|
NTSTATUS Status;
|
||||||
UNICODE_STRING str;
|
ANSI_STRING *Strings;
|
||||||
|
ANSI_STRING ComputerName;
|
||||||
WORD i;
|
WORD i;
|
||||||
BOOL ret;
|
|
||||||
|
|
||||||
if (wNumStrings == 0)
|
TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n",
|
||||||
return TRUE;
|
hEventLog, wType, wCategory, dwEventID, lpUserSid,
|
||||||
|
wNumStrings, dwDataSize, lpStrings, lpRawData);
|
||||||
|
|
||||||
if (lpStrings == NULL)
|
Strings = HeapAlloc(GetProcessHeap(),
|
||||||
return TRUE;
|
0,
|
||||||
|
wNumStrings * sizeof(ANSI_STRING));
|
||||||
wideStrArray = HeapAlloc(GetProcessHeap(),
|
if (!Strings)
|
||||||
HEAP_ZERO_MEMORY,
|
|
||||||
sizeof(LPCWSTR) * wNumStrings);
|
|
||||||
|
|
||||||
for (i = 0; i < wNumStrings; i++)
|
|
||||||
{
|
|
||||||
if (!RtlCreateUnicodeStringFromAsciiz(&str, (PSTR)lpStrings[i]))
|
|
||||||
break;
|
|
||||||
wideStrArray[i] = str.Buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == wNumStrings)
|
|
||||||
{
|
|
||||||
ret = ReportEventW(hEventLog,
|
|
||||||
wType,
|
|
||||||
wCategory,
|
|
||||||
dwEventID,
|
|
||||||
lpUserSid,
|
|
||||||
wNumStrings,
|
|
||||||
dwDataSize,
|
|
||||||
wideStrArray,
|
|
||||||
lpRawData);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
ret = FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < wNumStrings; i++)
|
for (i = 0; i < wNumStrings; i++)
|
||||||
|
RtlInitAnsiString(&Strings[i], lpStrings[i]);
|
||||||
|
|
||||||
|
/*FIXME: ComputerName */
|
||||||
|
RtlInitAnsiString(&ComputerName, "");
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
if (wideStrArray[i])
|
Status = ElfrReportEventA(hEventLog,
|
||||||
{
|
0, /* FIXME: Time */
|
||||||
HeapFree(GetProcessHeap(),
|
wType,
|
||||||
0,
|
wCategory,
|
||||||
(PVOID)wideStrArray[i]);
|
dwEventID,
|
||||||
}
|
wNumStrings,
|
||||||
|
dwDataSize,
|
||||||
|
(PRPC_STRING) &ComputerName,
|
||||||
|
lpUserSid,
|
||||||
|
(PRPC_STRING*) &Strings,
|
||||||
|
lpRawData,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, Strings);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(Status));
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(),
|
return TRUE;
|
||||||
0,
|
|
||||||
(PVOID)wideStrArray);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue