mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 22:05:49 +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);
|
||||
|
||||
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
|
||||
EVENTLOG_HANDLE_A_bind(EVENTLOG_HANDLE_A UNCServerName)
|
||||
|
@ -166,7 +155,7 @@ BackupEventLogA(IN HANDLE hEventLog,
|
|||
BackupFileName.Buffer = (LPSTR)lpBackupFileName;
|
||||
BackupFileName.Length = BackupFileName.MaximumLength =
|
||||
lpBackupFileName ? strlen(lpBackupFileName) : 0;
|
||||
BackupFileName.MaximumLength += sizeof(CHAR);
|
||||
BackupFileName.MaximumLength += sizeof(CHAR);
|
||||
|
||||
RpcTryExcept
|
||||
{
|
||||
|
@ -389,9 +378,29 @@ GetEventLogInformation(IN HANDLE hEventLog,
|
|||
IN DWORD cbBufSize,
|
||||
OUT LPDWORD pcbBytesNeeded)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return FALSE;
|
||||
NTSTATUS Status;
|
||||
|
||||
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);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
RpcTryExcept
|
||||
{
|
||||
Status = ElfrNumberOfRecords(hEventLog,
|
||||
|
@ -461,7 +470,7 @@ GetOldestEventLogRecord(IN HANDLE hEventLog,
|
|||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
RpcTryExcept
|
||||
{
|
||||
Status = ElfrOldestRecord(hEventLog,
|
||||
|
@ -510,32 +519,35 @@ HANDLE WINAPI
|
|||
OpenBackupEventLogA(IN LPCSTR lpUNCServerName,
|
||||
IN LPCSTR lpFileName)
|
||||
{
|
||||
UNICODE_STRING UNCServerName;
|
||||
UNICODE_STRING FileName;
|
||||
HANDLE Handle;
|
||||
ANSI_STRING FileName;
|
||||
IELF_HANDLE LogHandle;
|
||||
NTSTATUS Status;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (!RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName))
|
||||
{
|
||||
RtlFreeUnicodeString(&UNCServerName);
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Handle = OpenBackupEventLogW(UNCServerName.Buffer,
|
||||
FileName.Buffer);
|
||||
|
||||
RtlFreeUnicodeString(&UNCServerName);
|
||||
RtlFreeUnicodeString(&FileName);
|
||||
|
||||
return Handle;
|
||||
return (HANDLE)LogHandle;
|
||||
}
|
||||
|
||||
|
||||
|
@ -600,19 +612,51 @@ OpenBackupEventLogW(IN LPCWSTR lpUNCServerName,
|
|||
* Failure: NULL
|
||||
*/
|
||||
HANDLE WINAPI
|
||||
OpenEventLogA(IN LPCSTR uncname,
|
||||
IN LPCSTR source)
|
||||
OpenEventLogA(IN LPCSTR lpUNCServerName,
|
||||
IN LPCSTR lpSourceName)
|
||||
{
|
||||
LPWSTR uncnameW, sourceW;
|
||||
HANDLE handle;
|
||||
LPSTR UNCServerName;
|
||||
ANSI_STRING SourceName;
|
||||
IELF_HANDLE LogHandle = NULL;
|
||||
NTSTATUS Status;
|
||||
|
||||
uncnameW = SERV_dup(uncname);
|
||||
sourceW = SERV_dup(source);
|
||||
handle = OpenEventLogW(uncnameW, sourceW);
|
||||
HeapFree(GetProcessHeap(), 0, uncnameW);
|
||||
HeapFree(GetProcessHeap(), 0, sourceW);
|
||||
TRACE("%s, %s\n", lpUNCServerName, lpSourceName);
|
||||
|
||||
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,
|
||||
IN LPCWSTR lpSourceName)
|
||||
{
|
||||
RPC_UNICODE_STRING SourceName;
|
||||
LPWSTR UNCServerName;
|
||||
UNICODE_STRING SourceName;
|
||||
IELF_HANDLE LogHandle;
|
||||
NTSTATUS Status;
|
||||
|
||||
TRACE("%s, %s\n", debugstr_w(lpUNCServerName), debugstr_w(lpSourceName));
|
||||
|
||||
SourceName.Buffer = (LPWSTR)lpSourceName;
|
||||
SourceName.Length = SourceName.MaximumLength =
|
||||
lpSourceName ? wcslen(lpSourceName) * sizeof(WCHAR) : 0;
|
||||
SourceName.MaximumLength += sizeof(WCHAR);
|
||||
if (lpSourceName == NULL)
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (lpUNCServerName == NULL || *lpUNCServerName == 0)
|
||||
UNCServerName = NULL;
|
||||
else
|
||||
UNCServerName = (LPWSTR)lpUNCServerName;
|
||||
|
||||
RtlInitUnicodeString(&SourceName, lpSourceName);
|
||||
|
||||
RpcTryExcept
|
||||
{
|
||||
Status = ElfrOpenELW((LPWSTR)lpUNCServerName,
|
||||
&SourceName,
|
||||
&EmptyString,
|
||||
Status = ElfrOpenELW(UNCServerName,
|
||||
(PRPC_UNICODE_STRING)&SourceName,
|
||||
&EmptyStringU,
|
||||
1,
|
||||
1,
|
||||
&LogHandle);
|
||||
|
@ -801,32 +854,36 @@ HANDLE WINAPI
|
|||
RegisterEventSourceA(IN LPCSTR lpUNCServerName,
|
||||
IN LPCSTR lpSourceName)
|
||||
{
|
||||
UNICODE_STRING UNCServerName;
|
||||
UNICODE_STRING SourceName;
|
||||
HANDLE Handle;
|
||||
ANSI_STRING SourceName;
|
||||
IELF_HANDLE LogHandle;
|
||||
NTSTATUS Status;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (!RtlCreateUnicodeStringFromAsciiz(&SourceName, lpSourceName))
|
||||
{
|
||||
RtlFreeUnicodeString(&UNCServerName);
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Handle = RegisterEventSourceW(UNCServerName.Buffer,
|
||||
SourceName.Buffer);
|
||||
|
||||
RtlFreeUnicodeString(&UNCServerName);
|
||||
RtlFreeUnicodeString(&SourceName);
|
||||
|
||||
return Handle;
|
||||
return (HANDLE)LogHandle;
|
||||
}
|
||||
|
||||
|
||||
|
@ -861,7 +918,7 @@ RegisterEventSourceW(IN LPCWSTR lpUNCServerName,
|
|||
{
|
||||
Status = ElfrRegisterEventSourceW((LPWSTR)lpUNCServerName,
|
||||
&SourceName,
|
||||
&EmptyString,
|
||||
&EmptyStringU,
|
||||
1,
|
||||
1,
|
||||
&LogHandle);
|
||||
|
@ -896,61 +953,62 @@ ReportEventA(IN HANDLE hEventLog,
|
|||
IN LPCSTR *lpStrings,
|
||||
IN LPVOID lpRawData)
|
||||
{
|
||||
LPCWSTR *wideStrArray;
|
||||
UNICODE_STRING str;
|
||||
NTSTATUS Status;
|
||||
ANSI_STRING *Strings;
|
||||
ANSI_STRING ComputerName;
|
||||
WORD i;
|
||||
BOOL ret;
|
||||
|
||||
if (wNumStrings == 0)
|
||||
return TRUE;
|
||||
TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n",
|
||||
hEventLog, wType, wCategory, dwEventID, lpUserSid,
|
||||
wNumStrings, dwDataSize, lpStrings, lpRawData);
|
||||
|
||||
if (lpStrings == NULL)
|
||||
return TRUE;
|
||||
|
||||
wideStrArray = HeapAlloc(GetProcessHeap(),
|
||||
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
|
||||
Strings = HeapAlloc(GetProcessHeap(),
|
||||
0,
|
||||
wNumStrings * sizeof(ANSI_STRING));
|
||||
if (!Strings)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
ret = FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i < wNumStrings; i++)
|
||||
RtlInitAnsiString(&Strings[i], lpStrings[i]);
|
||||
|
||||
/*FIXME: ComputerName */
|
||||
RtlInitAnsiString(&ComputerName, "");
|
||||
|
||||
RpcTryExcept
|
||||
{
|
||||
if (wideStrArray[i])
|
||||
{
|
||||
HeapFree(GetProcessHeap(),
|
||||
0,
|
||||
(PVOID)wideStrArray[i]);
|
||||
}
|
||||
Status = ElfrReportEventA(hEventLog,
|
||||
0, /* FIXME: Time */
|
||||
wType,
|
||||
wCategory,
|
||||
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(),
|
||||
0,
|
||||
(PVOID)wideStrArray);
|
||||
|
||||
return ret;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue