Add parameters check to ReadEventLog.
[reactos.git] / reactos / dll / win32 / advapi32 / service / eventlog.c
index 78c1cc6..23b138b 100644 (file)
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 #include <advapi32.h>
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(advapi);
-WINE_DECLARE_DEBUG_CHANNEL(eventlog);
 
 static RPC_UNICODE_STRING EmptyString = { 0, 0, L"" };
 
@@ -155,17 +154,18 @@ BackupEventLogA(IN HANDLE hEventLog,
     BackupFileName.Buffer = (LPSTR)lpBackupFileName;
     BackupFileName.Length = BackupFileName.MaximumLength =
         lpBackupFileName ? strlen(lpBackupFileName) : 0;
+       BackupFileName.MaximumLength += sizeof(CHAR);
 
-    _SEH_TRY
+    RpcTryExcept
     {
         Status = ElfrBackupELFA(hEventLog,
                                 &BackupFileName);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -195,17 +195,18 @@ BackupEventLogW(IN HANDLE hEventLog,
     BackupFileName.Buffer = (LPWSTR)lpBackupFileName;
     BackupFileName.Length = BackupFileName.MaximumLength =
         lpBackupFileName ? wcslen(lpBackupFileName) * sizeof(WCHAR) : 0;
+    BackupFileName.MaximumLength += sizeof(WCHAR);
 
-    _SEH_TRY
+    RpcTryExcept
     {
         Status = ElfrBackupELFW(hEventLog,
                                 &BackupFileName);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -232,17 +233,18 @@ ClearEventLogA(IN HANDLE hEventLog,
     BackupFileName.Buffer = (LPSTR)lpBackupFileName;
     BackupFileName.Length = BackupFileName.MaximumLength =
         lpBackupFileName ? strlen(lpBackupFileName) : 0;
+    BackupFileName.MaximumLength += sizeof(CHAR);
 
-    _SEH_TRY
+    RpcTryExcept
     {
         Status = ElfrClearELFA(hEventLog,
                                &BackupFileName);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -269,17 +271,18 @@ ClearEventLogW(IN HANDLE hEventLog,
     BackupFileName.Buffer = (LPWSTR)lpBackupFileName;
     BackupFileName.Length = BackupFileName.MaximumLength =
         lpBackupFileName ? wcslen(lpBackupFileName) * sizeof(WCHAR) : 0;
+    BackupFileName.MaximumLength += sizeof(WCHAR);
 
-    _SEH_TRY
+    RpcTryExcept
     {
         Status = ElfrClearELFW(hEventLog,
                                &BackupFileName);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -301,15 +304,15 @@ CloseEventLog(IN HANDLE hEventLog)
 
     TRACE("%p\n", hEventLog);
 
-    _SEH_TRY
+    RpcTryExcept
     {
         Status = ElfrCloseEL(&hEventLog);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -337,15 +340,15 @@ DeregisterEventSource(IN HANDLE hEventLog)
 
     TRACE("%p\n", hEventLog);
 
-    _SEH_TRY
+    RpcTryExcept
     {
         Status = ElfrDeregisterEventSource(&hEventLog);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -357,6 +360,29 @@ DeregisterEventSource(IN HANDLE hEventLog)
 }
 
 
+/******************************************************************************
+ * GetEventLogInformation [ADVAPI32.@]
+ *
+ * PARAMS
+ *   hEventLog      [I] Handle to event log
+ *   dwInfoLevel    [I] Level of event log information to return
+ *   lpBuffer       [O] Buffer that receives the event log information
+ *   cbBufSize      [I] Size of the lpBuffer buffer
+ *   pcbBytesNeeded [O] Required buffer size
+ */
+BOOL WINAPI
+GetEventLogInformation(IN HANDLE hEventLog,
+                       IN DWORD dwInfoLevel,
+                       OUT LPVOID lpBuffer,
+                       IN DWORD cbBufSize,
+                       OUT LPDWORD pcbBytesNeeded)
+{
+    UNIMPLEMENTED;
+    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return FALSE;
+}
+
+
 /******************************************************************************
  * GetNumberOfEventLogRecords [ADVAPI32.@]
  *
@@ -373,16 +399,22 @@ GetNumberOfEventLogRecords(IN HANDLE hEventLog,
 
     TRACE("%p, %p\n", hEventLog, NumberOfRecords);
 
-    _SEH_TRY
+    if(!NumberOfRecords)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    
+    RpcTryExcept
     {
         Status = ElfrNumberOfRecords(hEventLog,
                                      &Records);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -412,16 +444,22 @@ GetOldestEventLogRecord(IN HANDLE hEventLog,
 
     TRACE("%p, %p\n", hEventLog, OldestRecord);
 
-    _SEH_TRY
+    if(!OldestRecord)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    
+    RpcTryExcept
     {
         Status = ElfrOldestRecord(hEventLog,
                                   &Oldest);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -509,20 +547,21 @@ OpenBackupEventLogW(IN LPCWSTR lpUNCServerName,
     FileName.Buffer = (LPWSTR)lpFileName;
     FileName.Length = FileName.MaximumLength =
         lpFileName ? wcslen(lpFileName) * sizeof(WCHAR) : 0;
+    FileName.MaximumLength += sizeof(WCHAR);
 
-    _SEH_TRY
+    RpcTryExcept
     {
         Status = ElfrOpenBELW((LPWSTR)lpUNCServerName,
                               &FileName,
-                              0,
-                              0,
+                              1,
+                              1,
                               &LogHandle);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -588,21 +627,22 @@ OpenEventLogW(IN LPCWSTR lpUNCServerName,
     SourceName.Buffer = (LPWSTR)lpSourceName;
     SourceName.Length = SourceName.MaximumLength =
         lpSourceName ? wcslen(lpSourceName) * sizeof(WCHAR) : 0;
+    SourceName.MaximumLength += sizeof(WCHAR);
 
-    _SEH_TRY
+    RpcTryExcept
     {
         Status = ElfrOpenELW((LPWSTR)lpUNCServerName,
                              &SourceName,
                              &EmptyString,
-                             0,
-                             0,
+                             1,
+                             1,
                              &LogHandle);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -633,7 +673,20 @@ ReadEventLogA(IN HANDLE hEventLog,
         hEventLog, dwReadFlags, dwRecordOffset, lpBuffer,
         nNumberOfBytesToRead, pnBytesRead, pnMinNumberOfBytesNeeded);
 
-    _SEH_TRY
+    if(!pnBytesRead || !pnMinNumberOfBytesNeeded)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    /* If buffer is NULL set nNumberOfBytesToRead to 0 to prevent rpcrt4 from
+       trying to access a null pointer */
+    if (!lpBuffer)
+    {
+        nNumberOfBytesToRead = 0;
+    }
+
+    RpcTryExcept
     {
         Status = ElfrReadELA(hEventLog,
                              dwReadFlags,
@@ -643,11 +696,14 @@ ReadEventLogA(IN HANDLE hEventLog,
                              &bytesRead,
                              &minNumberOfBytesNeeded);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
+
+    *pnBytesRead = (DWORD)bytesRead;
+    *pnMinNumberOfBytesNeeded = (DWORD)minNumberOfBytesNeeded;
 
     if (!NT_SUCCESS(Status))
     {
@@ -655,9 +711,6 @@ ReadEventLogA(IN HANDLE hEventLog,
         return FALSE;
     }
 
-    *pnBytesRead = (DWORD)bytesRead;
-    *pnMinNumberOfBytesNeeded = (DWORD)minNumberOfBytesNeeded;
-
     return TRUE;
 }
 
@@ -690,7 +743,20 @@ ReadEventLogW(IN HANDLE hEventLog,
         hEventLog, dwReadFlags, dwRecordOffset, lpBuffer,
         nNumberOfBytesToRead, pnBytesRead, pnMinNumberOfBytesNeeded);
 
-    _SEH_TRY
+    if(!pnBytesRead || !pnMinNumberOfBytesNeeded)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    /* If buffer is NULL set nNumberOfBytesToRead to 0 to prevent rpcrt4 from
+       trying to access a null pointer */
+    if (!lpBuffer)
+    {
+        nNumberOfBytesToRead = 0;
+    }
+
+    RpcTryExcept
     {
         Status = ElfrReadELW(hEventLog,
                              dwReadFlags,
@@ -700,11 +766,14 @@ ReadEventLogW(IN HANDLE hEventLog,
                              &bytesRead,
                              &minNumberOfBytesNeeded);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
+
+    *pnBytesRead = (DWORD)bytesRead;
+    *pnMinNumberOfBytesNeeded = (DWORD)minNumberOfBytesNeeded;
 
     if (!NT_SUCCESS(Status))
     {
@@ -712,9 +781,6 @@ ReadEventLogW(IN HANDLE hEventLog,
         return FALSE;
     }
 
-    *pnBytesRead = (DWORD)bytesRead;
-    *pnMinNumberOfBytesNeeded = (DWORD)minNumberOfBytesNeeded;
-
     return TRUE;
 }
 
@@ -780,21 +846,22 @@ RegisterEventSourceW(IN LPCWSTR lpUNCServerName,
     SourceName.Buffer = (LPWSTR)lpSourceName;
     SourceName.Length = SourceName.MaximumLength =
         lpSourceName ? wcslen(lpSourceName) * sizeof(WCHAR) : 0;
+    SourceName.MaximumLength += sizeof(WCHAR);
 
-    _SEH_TRY
+    RpcTryExcept
     {
         Status = ElfrRegisterEventSourceW((LPWSTR)lpUNCServerName,
                                           &SourceName,
                                           &EmptyString,
-                                          0,
-                                          0,
+                                          1,
+                                          1,
                                           &LogHandle);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     if (!NT_SUCCESS(Status))
     {
@@ -903,9 +970,9 @@ ReportEventW(IN HANDLE hEventLog,
              IN LPCWSTR *lpStrings,
              IN LPVOID lpRawData)
 {
-#if 0
     NTSTATUS Status;
     UNICODE_STRING *Strings;
+    UNICODE_STRING ComputerName;
     WORD i;
 
     TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n",
@@ -924,7 +991,10 @@ ReportEventW(IN HANDLE hEventLog,
     for (i = 0; i < wNumStrings; i++)
         RtlInitUnicodeString(&Strings[i], lpStrings[i]);
 
-    _SEH_TRY
+    /*FIXME: ComputerName */
+    RtlInitUnicodeString(&ComputerName, L"");
+
+    RpcTryExcept
     {
         Status = ElfrReportEventW(hEventLog,
                                   0, /* FIXME: Time */
@@ -933,19 +1003,19 @@ ReportEventW(IN HANDLE hEventLog,
                                   dwEventID,
                                   wNumStrings,
                                   dwDataSize,
-                                  L"", /* FIXME: ComputerName */
+                                  (PRPC_UNICODE_STRING) &ComputerName,
                                   lpUserSid,
-                                  (LPWSTR *)lpStrings, /* FIXME: should be Strings */
+                                  (PRPC_UNICODE_STRING*) &Strings,
                                   lpRawData,
                                   0,
                                   NULL,
                                   NULL);
     }
-    _SEH_HANDLE
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
         Status = I_RpcMapWin32Status(RpcExceptionCode());
     }
-    _SEH_END;
+    RpcEndExcept;
 
     HeapFree(GetProcessHeap(), 0, Strings);
 
@@ -956,43 +1026,4 @@ ReportEventW(IN HANDLE hEventLog,
     }
 
     return TRUE;
-#else
-  int i;
-
-    /* partial stub */
-
-  if (wNumStrings == 0)
-    return TRUE;
-
-  if (lpStrings == NULL)
-    return TRUE;
-
-  for (i = 0; i < wNumStrings; i++)
-    {
-      switch (wType)
-        {
-        case EVENTLOG_SUCCESS:
-            TRACE_(eventlog)("Success: %S\n", lpStrings[i]);
-            break;
-
-        case EVENTLOG_ERROR_TYPE:
-            ERR_(eventlog)("Error: %S\n", lpStrings[i]);
-            break;
-
-        case EVENTLOG_WARNING_TYPE:
-            WARN_(eventlog)("Warning: %S\n", lpStrings[i]);
-            break;
-
-        case EVENTLOG_INFORMATION_TYPE:
-            TRACE_(eventlog)("Info: %S\n", lpStrings[i]);
-            break;
-
-        default:
-            TRACE_(eventlog)("Type %hu: %S\n", wType, lpStrings[i]);
-            break;
-        }
-    }
-
-  return TRUE;
-#endif
 }