diff --git a/reactos/dll/win32/advapi32/service/eventlog.c b/reactos/dll/win32/advapi32/service/eventlog.c index 2ad45446dfc..7327532b74b 100644 --- a/reactos/dll/win32/advapi32/service/eventlog.c +++ b/reactos/dll/win32/advapi32/service/eventlog.c @@ -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; }