Author: hbelusca Date: Fri Aug 12 19:14:55 2016 New Revision: 72213 URL: http://svn.reactos.org/svn/reactos?rev=72213&view=rev Log: [EVENTLOG] - Use NT functions to retrieve timestamps for events. - Log kernel events with the current computer name. - Don't hardcode variables types for sizeofs. - Add type-checks for the data to be retrieved from the registry, and use default values in case the values do not exist or are invalid. - Use ULONG_PTR to perform pointer arithmetics. - Use string-safe functions for copy/concatenation. - Cache EventLog source for eventlog service self-logging. - Unlock the LogFile in LogfClearFile. - Fix rounding in LogfAllocAndBuildNewRecord. - Verify ELF handle validity in ElfrGetLogInformation. - Implement IELF_HANDLE_rundown to correctly cleanup ELF handles when client apps shut down. Adapt also the parameter of ElfDeleteEventLogHandle for reusing it there. - Update some code formatting. CORE-11842 #resolve
I don't completely touch file.c as it contains most of my upcoming eventlog fixes... Modified: trunk/reactos/base/services/eventlog/eventlog.c trunk/reactos/base/services/eventlog/eventlog.h trunk/reactos/base/services/eventlog/eventsource.c trunk/reactos/base/services/eventlog/file.c trunk/reactos/base/services/eventlog/logport.c trunk/reactos/base/services/eventlog/rpc.c Modified: trunk/reactos/base/services/eventlog/eventlog.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/eventlog/eventlog.c?rev=72213&r1=72212&r2=72213&view=diff ============================================================================== --- trunk/reactos/base/services/eventlog/eventlog.c [iso-8859-1] (original) +++ trunk/reactos/base/services/eventlog/eventlog.c [iso-8859-1] Fri Aug 12 19:14:55 2016 @@ -33,6 +33,8 @@ BOOL onLiveCD = FALSE; // On livecd events will go to debug output only HANDLE MyHeap = NULL; +PEVENTSOURCE EventLogSource = NULL; + /* FUNCTIONS ****************************************************************/ static VOID @@ -74,7 +76,6 @@ 0, EVENT_EventlogStopped, 0, NULL, 0, NULL); - /* Stop listening to incoming RPC messages */ RpcMgmtStopServerListening(NULL); UpdateServiceStatus(SERVICE_STOPPED); @@ -120,15 +121,13 @@ hThread = CreateThread(NULL, 0, - (LPTHREAD_START_ROUTINE) - PortThreadRoutine, + (LPTHREAD_START_ROUTINE)PortThreadRoutine, NULL, 0, NULL); - if (!hThread) { - DPRINT("Can't create PortThread\n"); + DPRINT("Cannot create PortThread\n"); return GetLastError(); } else @@ -136,15 +135,14 @@ hThread = CreateThread(NULL, 0, - (LPTHREAD_START_ROUTINE) - RpcThreadRoutine, + RpcThreadRoutine, NULL, 0, NULL); if (!hThread) { - DPRINT("Can't create RpcThread\n"); + DPRINT("Cannot create RpcThread\n"); return GetLastError(); } else @@ -165,14 +163,14 @@ DWORD dwType; LONG lResult = ERROR_SUCCESS; - ZeroMemory(&versionInfo, sizeof(OSVERSIONINFO)); - versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + ZeroMemory(&versionInfo, sizeof(versionInfo)); + versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); /* Get version information */ if (!GetVersionExW(&versionInfo)) return; - ZeroMemory(szBuffer, 512 * sizeof(WCHAR)); + ZeroMemory(szBuffer, sizeof(szBuffer)); /* Write version into the buffer */ dwLength = swprintf(szBuffer, @@ -197,7 +195,7 @@ &hKey); if (lResult == ERROR_SUCCESS) { - dwValueLength = 512 - dwLength; + dwValueLength = ARRAYSIZE(szBuffer) - dwLength; lResult = RegQueryValueEx(hKey, L"CurrentType", NULL, @@ -268,7 +266,8 @@ } -PLOGFILE LoadLogFile(HKEY hKey, WCHAR * LogName) +static PLOGFILE +LoadLogFile(HKEY hKey, WCHAR* LogName) { DWORD MaxValueLen, ValueLen, Type, ExpandedLen; WCHAR *Buf = NULL, *Expanded = NULL; @@ -280,58 +279,81 @@ DPRINT("LoadLogFile: %S\n", LogName); - Result = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, &MaxValueLen, NULL, NULL); + Result = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, &MaxValueLen, NULL, NULL); if (Result != ERROR_SUCCESS) { - DPRINT1("RegQueryInfoKey failed: %lu\n", Result); + DPRINT1("RegQueryInfoKeyW failed: %lu\n", Result); return NULL; } + MaxValueLen = ROUND_DOWN(MaxValueLen, sizeof(WCHAR)); Buf = HeapAlloc(MyHeap, 0, MaxValueLen); if (!Buf) { - DPRINT1("Can't allocate heap!\n"); + DPRINT1("Cannot allocate heap!\n"); return NULL; } ValueLen = MaxValueLen; - - Result = RegQueryValueEx(hKey, - L"File", - NULL, - &Type, - (LPBYTE) Buf, - &ValueLen); - if (Result != ERROR_SUCCESS) - { - DPRINT1("RegQueryValueEx failed: %lu\n", Result); + Result = RegQueryValueExW(hKey, + L"File", + NULL, + &Type, + (LPBYTE)Buf, + &ValueLen); + /* + * If we failed, because the registry value was inexistent + * or the value type was incorrect, create a new "File" value + * that holds the default event log path. + */ + if ((Result != ERROR_SUCCESS) || (Type != REG_EXPAND_SZ && Type != REG_SZ)) + { + MaxValueLen = (wcslen(L"%SystemRoot%\\System32\\Config\\") + + wcslen(LogName) + wcslen(L".evt") + 1) * sizeof(WCHAR); + + Expanded = HeapReAlloc(MyHeap, 0, Buf, MaxValueLen); + if (!Expanded) + { + DPRINT1("Cannot reallocate heap!\n"); + HeapFree(MyHeap, 0, Buf); + return NULL; + } + Buf = Expanded; + + StringCbCopyW(Buf, MaxValueLen, L"%SystemRoot%\\System32\\Config\\"); + StringCbCatW(Buf, MaxValueLen, LogName); + StringCbCatW(Buf, MaxValueLen, L".evt"); + + ValueLen = MaxValueLen; + Result = RegSetValueExW(hKey, + L"File", + 0, + REG_EXPAND_SZ, + (LPBYTE)Buf, + ValueLen); + if (Result != ERROR_SUCCESS) + { + DPRINT1("RegSetValueEx failed: %lu\n", Result); + HeapFree(MyHeap, 0, Buf); + return NULL; + } + } + + ExpandedLen = ExpandEnvironmentStringsW(Buf, NULL, 0); + Expanded = HeapAlloc(MyHeap, 0, ExpandedLen * sizeof(WCHAR)); + if (!Expanded) + { + DPRINT1("Cannot allocate heap!\n"); HeapFree(MyHeap, 0, Buf); return NULL; } - if (Type != REG_EXPAND_SZ && Type != REG_SZ) - { - DPRINT1("%S\\File - value of wrong type %x.\n", LogName, Type); - HeapFree(MyHeap, 0, Buf); - return NULL; - } - - ExpandedLen = ExpandEnvironmentStrings(Buf, NULL, 0); - Expanded = HeapAlloc(MyHeap, 0, ExpandedLen * sizeof(WCHAR)); - if (!Expanded) - { - DPRINT1("Can't allocate heap!\n"); - HeapFree(MyHeap, 0, Buf); - return NULL; - } - - ExpandEnvironmentStrings(Buf, Expanded, ExpandedLen); - - if (!RtlDosPathNameToNtPathName_U(Expanded, &FileName, - NULL, NULL)) - { - DPRINT1("Can't convert path!\n"); + ExpandEnvironmentStringsW(Buf, Expanded, ExpandedLen); + + if (!RtlDosPathNameToNtPathName_U(Expanded, &FileName, NULL, NULL)) + { + DPRINT1("Cannot convert path!\n"); HeapFree(MyHeap, 0, Expanded); HeapFree(MyHeap, 0, Buf); return NULL; @@ -339,25 +361,47 @@ DPRINT("%S -> %S\n", Buf, Expanded); - ValueLen = sizeof(ULONG); - Result = RegQueryValueEx(hKey, - L"MaxSize", - NULL, - &Type, - (LPBYTE)&ulMaxSize, - &ValueLen); - if (Result != ERROR_SUCCESS) + ValueLen = sizeof(ulMaxSize); + Result = RegQueryValueExW(hKey, + L"MaxSize", + NULL, + &Type, + (LPBYTE)&ulMaxSize, + &ValueLen); + if ((Result != ERROR_SUCCESS) || (Type != REG_DWORD)) + { ulMaxSize = 512 * 1024; /* 512 kBytes */ - ValueLen = sizeof(ULONG); - Result = RegQueryValueEx(hKey, - L"Retention", - NULL, - &Type, - (LPBYTE)&ulRetention, - &ValueLen); - if (Result != ERROR_SUCCESS) + Result = RegSetValueExW(hKey, + L"MaxSize", + 0, + REG_DWORD, + (LPBYTE)&ulMaxSize, + sizeof(ulMaxSize)); + } + + ValueLen = sizeof(ulRetention); + Result = RegQueryValueExW(hKey, + L"Retention", + NULL, + &Type, + (LPBYTE)&ulRetention, + &ValueLen); + if ((Result != ERROR_SUCCESS) || (Type != REG_DWORD)) + { + /* On Windows 2003 it is 604800 (secs) == 7 days */ ulRetention = 0; + + Result = RegSetValueExW(hKey, + L"Retention", + 0, + REG_DWORD, + (LPBYTE)&ulRetention, + sizeof(ulRetention)); + } + + // TODO: Add, or use, default values for "AutoBackupLogFiles" (REG_DWORD) + // and "CustomSD" (REG_SZ). Status = LogfCreate(&pLogf, LogName, &FileName, ulMaxSize, ulRetention, TRUE, FALSE); if (!NT_SUCCESS(Status)) @@ -365,47 +409,44 @@ DPRINT1("Failed to create %S! (Status %08lx)\n", Expanded, Status); } + HeapFree(MyHeap, 0, Expanded); HeapFree(MyHeap, 0, Buf); - HeapFree(MyHeap, 0, Expanded); return pLogf; } -BOOL LoadLogFiles(HKEY eventlogKey) +static BOOL +LoadLogFiles(HKEY eventlogKey) { LONG Result; DWORD MaxLognameLen, LognameLen; WCHAR *Buf = NULL; - INT i; + DWORD dwIndex; PLOGFILE pLogFile; - Result = RegQueryInfoKey(eventlogKey, - NULL, NULL, NULL, NULL, - &MaxLognameLen, - NULL, NULL, NULL, NULL, NULL, NULL); + Result = RegQueryInfoKeyW(eventlogKey, NULL, NULL, NULL, NULL, &MaxLognameLen, + NULL, NULL, NULL, NULL, NULL, NULL); if (Result != ERROR_SUCCESS) { - DPRINT1("RegQueryInfoKey failed: %lu\n", Result); + DPRINT1("RegQueryInfoKeyW failed: %lu\n", Result); return FALSE; } MaxLognameLen++; Buf = HeapAlloc(MyHeap, 0, MaxLognameLen * sizeof(WCHAR)); - if (!Buf) { - DPRINT1("Error: can't allocate heap!\n"); + DPRINT1("Error: cannot allocate heap!\n"); return FALSE; } - i = 0; LognameLen = MaxLognameLen; - - while (RegEnumKeyEx(eventlogKey, - i, - Buf, - &LognameLen, - NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + dwIndex = 0; + while (RegEnumKeyExW(eventlogKey, + dwIndex, + Buf, + &LognameLen, + NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { HKEY SubKey; @@ -431,15 +472,17 @@ } RegCloseKey(SubKey); + LognameLen = MaxLognameLen; - i++; + dwIndex++; } HeapFree(MyHeap, 0, Buf); return TRUE; } -INT wmain() + +int wmain(int argc, WCHAR* argv[]) { WCHAR LogPath[MAX_PATH]; INT RetCode = 0; @@ -458,9 +501,9 @@ goto bye_bye; } - GetWindowsDirectory(LogPath, MAX_PATH); - - if (GetDriveType(LogPath) == DRIVE_CDROM) + GetWindowsDirectoryW(LogPath, MAX_PATH); + + if (GetDriveTypeW(LogPath) == DRIVE_CDROM) { DPRINT("LiveCD detected\n"); onLiveCD = TRUE; @@ -475,7 +518,7 @@ if (Result != ERROR_SUCCESS) { - DPRINT1("Fatal error: can't open eventlog registry key.\n"); + DPRINT1("Fatal error: cannot open eventlog registry key.\n"); RetCode = 1; goto bye_bye; } @@ -483,9 +526,15 @@ LoadLogFiles(elogKey); } + EventLogSource = GetEventSourceByName(L"EventLog"); + if (!EventLogSource) + { + DPRINT1("No EventLog source available, the EventLog service will not be able to log its own events.\n"); + } + StartServiceCtrlDispatcher(ServiceTable); - bye_bye: +bye_bye: LogfCloseAll(); if (MyHeap) @@ -494,40 +543,10 @@ return RetCode; } -VOID EventTimeToSystemTime(DWORD EventTime, SYSTEMTIME * pSystemTime) -{ - SYSTEMTIME st1970 = { 1970, 1, 0, 1, 0, 0, 0, 0 }; - FILETIME ftLocal; - union - { - FILETIME ft; - ULONGLONG ll; - } u1970, uUCT; - - uUCT.ft.dwHighDateTime = 0; - uUCT.ft.dwLowDateTime = EventTime; - SystemTimeToFileTime(&st1970, &u1970.ft); - uUCT.ll = uUCT.ll * 10000000 + u1970.ll; - FileTimeToLocalFileTime(&uUCT.ft, &ftLocal); - FileTimeToSystemTime(&ftLocal, pSystemTime); -} - -VOID SystemTimeToEventTime(SYSTEMTIME * pSystemTime, DWORD * pEventTime) -{ - SYSTEMTIME st1970 = { 1970, 1, 0, 1, 0, 0, 0, 0 }; - union - { - FILETIME ft; - ULONGLONG ll; - } Time, u1970; - - SystemTimeToFileTime(pSystemTime, &Time.ft); - SystemTimeToFileTime(&st1970, &u1970.ft); - *pEventTime = (DWORD)((Time.ll - u1970.ll) / 10000000ull); -} - VOID PRINT_HEADER(PEVENTLOGHEADER header) { + ULONG Flags = header->Flags; + DPRINT("HeaderSize = %lu\n", header->HeaderSize); DPRINT("Signature = 0x%x\n", header->Signature); DPRINT("MajorVersion = %lu\n", header->MajorVersion); @@ -540,10 +559,30 @@ DPRINT("Retention = 0x%x\n", header->Retention); DPRINT("EndHeaderSize = %lu\n", header->EndHeaderSize); DPRINT("Flags: "); - if (header->Flags & ELF_LOGFILE_HEADER_DIRTY) DPRINT("ELF_LOGFILE_HEADER_DIRTY"); - if (header->Flags & ELF_LOGFILE_HEADER_WRAP) DPRINT("| ELF_LOGFILE_HEADER_WRAP "); - if (header->Flags & ELF_LOGFILE_LOGFULL_WRITTEN) DPRINT("| ELF_LOGFILE_LOGFULL_WRITTEN "); - if (header->Flags & ELF_LOGFILE_ARCHIVE_SET) DPRINT("| ELF_LOGFILE_ARCHIVE_SET "); + if (Flags & ELF_LOGFILE_HEADER_DIRTY) + { + DPRINT("ELF_LOGFILE_HEADER_DIRTY"); + Flags &= ~ELF_LOGFILE_HEADER_DIRTY; + } + if (Flags) DPRINT(" | "); + if (Flags & ELF_LOGFILE_HEADER_WRAP) + { + DPRINT("ELF_LOGFILE_HEADER_WRAP"); + Flags &= ~ELF_LOGFILE_HEADER_WRAP; + } + if (Flags) DPRINT(" | "); + if (Flags & ELF_LOGFILE_LOGFULL_WRITTEN) + { + DPRINT("ELF_LOGFILE_LOGFULL_WRITTEN"); + Flags &= ~ELF_LOGFILE_LOGFULL_WRITTEN; + } + if (Flags) DPRINT(" | "); + if (Flags & ELF_LOGFILE_ARCHIVE_SET) + { + DPRINT("ELF_LOGFILE_ARCHIVE_SET"); + Flags &= ~ELF_LOGFILE_ARCHIVE_SET; + } + if (Flags) DPRINT(" | 0x%x", Flags); DPRINT("\n"); } @@ -551,21 +590,24 @@ { UINT i; WCHAR *str; - SYSTEMTIME time; + LARGE_INTEGER SystemTime; + TIME_FIELDS Time; DPRINT("Length = %lu\n", pRec->Length); DPRINT("Reserved = 0x%x\n", pRec->Reserved); DPRINT("RecordNumber = %lu\n", pRec->RecordNumber); - EventTimeToSystemTime(pRec->TimeGenerated, &time); + RtlSecondsSince1970ToTime(pRec->TimeGenerated, &SystemTime); + RtlTimeToTimeFields(&SystemTime, &Time); DPRINT("TimeGenerated = %hu.%hu.%hu %hu:%hu:%hu\n", - time.wDay, time.wMonth, time.wYear, - time.wHour, time.wMinute, time.wSecond); - - EventTimeToSystemTime(pRec->TimeWritten, &time); + Time.Day, Time.Month, Time.Year, + Time.Hour, Time.Minute, Time.Second); + + RtlSecondsSince1970ToTime(pRec->TimeWritten, &SystemTime); + RtlTimeToTimeFields(&SystemTime, &Time); DPRINT("TimeWritten = %hu.%hu.%hu %hu:%hu:%hu\n", - time.wDay, time.wMonth, time.wYear, - time.wHour, time.wMinute, time.wSecond); + Time.Day, Time.Month, Time.Year, + Time.Hour, Time.Minute, Time.Second); DPRINT("EventID = %lu\n", pRec->EventID); @@ -600,17 +642,17 @@ DPRINT("DataLength = %lu\n", pRec->DataLength); DPRINT("DataOffset = %lu\n", pRec->DataOffset); - DPRINT("SourceName: %S\n", (WCHAR *) (((PBYTE) pRec) + sizeof(EVENTLOGRECORD))); - - i = (lstrlenW((WCHAR *) (((PBYTE) pRec) + sizeof(EVENTLOGRECORD))) + 1) * + DPRINT("SourceName: %S\n", (WCHAR *) ((ULONG_PTR)pRec + sizeof(EVENTLOGRECORD))); + + i = (lstrlenW((WCHAR *) ((ULONG_PTR)pRec + sizeof(EVENTLOGRECORD))) + 1) * sizeof(WCHAR); - DPRINT("ComputerName: %S\n", (WCHAR *) (((PBYTE) pRec) + sizeof(EVENTLOGRECORD) + i)); + DPRINT("ComputerName: %S\n", (WCHAR *) ((ULONG_PTR)pRec + sizeof(EVENTLOGRECORD) + i)); if (pRec->StringOffset < pRec->Length && pRec->NumStrings) { DPRINT("Strings:\n"); - str = (WCHAR *) (((PBYTE) pRec) + pRec->StringOffset); + str = (WCHAR *) ((ULONG_PTR)pRec + pRec->StringOffset); for (i = 0; i < pRec->NumStrings; i++) { DPRINT("[%u] %S\n", i, str); @@ -618,5 +660,5 @@ } } - DPRINT("Length2 = %lu\n", *(PDWORD) (((PBYTE) pRec) + pRec->Length - 4)); -} + DPRINT("Length2 = %lu\n", *(PDWORD) ((ULONG_PTR)pRec + pRec->Length - 4)); +} Modified: trunk/reactos/base/services/eventlog/eventlog.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/eventlog/eventlog.h?rev=72213&r1=72212&r2=72213&view=diff ============================================================================== --- trunk/reactos/base/services/eventlog/eventlog.h [iso-8859-1] (original) +++ trunk/reactos/base/services/eventlog/eventlog.h [iso-8859-1] Fri Aug 12 19:14:55 2016 @@ -11,12 +11,18 @@ #include <stdarg.h> +/* PSDK/NDK Headers */ #define WIN32_NO_STATUS - #include <windef.h> #include <winbase.h> + +#define NTOS_MODE_USER #include <ndk/rtlfuncs.h> #include <ndk/obfuncs.h> + +#define ROUND_DOWN(n, align) (((ULONG)n) & ~((align) - 1l)) +#define ROUND_UP(n, align) ROUND_DOWN(((ULONG)n) + (align) - 1, (align)) + #include <eventlogrpc_s.h> #include <strsafe.h> @@ -26,21 +32,21 @@ IO_ERROR_LOG_MESSAGE Message; } IO_ERROR_LPC, *PIO_ERROR_LPC; -#define MAJORVER 1 -#define MINORVER 1 /* * Our file format will be compatible with NT's */ +#define MAJORVER 1 +#define MINORVER 1 #define LOGFILE_SIGNATURE 0x654c664c /* * Flags used in logfile header */ -#define ELF_LOGFILE_HEADER_DIRTY 1 -#define ELF_LOGFILE_HEADER_WRAP 2 +#define ELF_LOGFILE_HEADER_DIRTY 1 +#define ELF_LOGFILE_HEADER_WRAP 2 #define ELF_LOGFILE_LOGFULL_WRITTEN 4 -#define ELF_LOGFILE_ARCHIVE_SET 8 +#define ELF_LOGFILE_ARCHIVE_SET 8 /* FIXME: MSDN reads that the following two structs are in winnt.h. Are they? */ typedef struct _EVENTLOGHEADER @@ -114,22 +120,38 @@ WCHAR szName[1]; } LOGHANDLE, *PLOGHANDLE; + +/* eventlog.c */ +extern HANDLE MyHeap; +extern PEVENTSOURCE EventLogSource; + +VOID PRINT_HEADER(PEVENTLOGHEADER header); +VOID PRINT_RECORD(PEVENTLOGRECORD pRec); + + +/* eventsource.c */ +VOID InitEventSourceList(VOID); + +BOOL +LoadEventSources(HKEY hKey, + PLOGFILE pLogFile); + +PEVENTSOURCE +GetEventSourceByName(LPCWSTR Name); + + /* file.c */ VOID LogfListInitialize(VOID); -PLOGFILE LogfListHead(VOID); - -INT LogfListItemCount(VOID); - -PLOGFILE LogfListItemByIndex(INT Index); - -PLOGFILE LogfListItemByName(WCHAR * Name); - -INT LogfListItemIndexByName(WCHAR * Name); - -VOID LogfListAddItem(PLOGFILE Item); - -VOID LogfListRemoveItem(PLOGFILE Item); +DWORD LogfListItemCount(VOID); + +PLOGFILE LogfListItemByIndex(DWORD Index); + +PLOGFILE LogfListItemByName(LPCWSTR Name); + +// DWORD LogfListItemIndexByName(WCHAR * Name); + + DWORD LogfReadEvent(PLOGFILE LogFile, DWORD Flags, @@ -171,61 +193,34 @@ DWORD LogfGetCurrentRecord(PLOGFILE LogFile); -ULONG LogfOffsetByNumber(PLOGFILE LogFile, - DWORD RecordNumber); - -BOOL LogfAddOffsetInformation(PLOGFILE LogFile, - ULONG ulNumber, - ULONG ulOffset); - -BOOL LogfDeleteOffsetInformation(PLOGFILE LogFile, - ULONG ulNumber); - -PBYTE LogfAllocAndBuildNewRecord(LPDWORD lpRecSize, - DWORD dwRecordNumber, - WORD wType, - WORD wCategory, - DWORD dwEventId, - LPCWSTR SourceName, - LPCWSTR ComputerName, - DWORD dwSidLength, - PSID lpUserSid, - WORD wNumStrings, - WCHAR * lpStrings, - DWORD dwDataSize, - LPVOID lpRawData); +PBYTE +LogfAllocAndBuildNewRecord(PULONG lpRecSize, + ULONG dwRecordNumber, // FIXME! + USHORT wType, + USHORT wCategory, + ULONG dwEventId, + PCWSTR SourceName, + PCWSTR ComputerName, + ULONG dwSidLength, + PSID lpUserSid, + USHORT wNumStrings, + WCHAR* lpStrings, + ULONG dwDataSize, + PVOID lpRawData); + +static __inline void LogfFreeRecord(LPVOID Rec) +{ + HeapFree(MyHeap, 0, Rec); +} VOID -LogfReportEvent(WORD wType, - WORD wCategory, - DWORD dwEventId, - WORD wNumStrings, - WCHAR *lpStrings, - DWORD dwDataSize, - LPVOID lpRawData); - -/* eventlog.c */ -extern HANDLE MyHeap; - -VOID PRINT_HEADER(PEVENTLOGHEADER header); - -VOID PRINT_RECORD(PEVENTLOGRECORD pRec); - -VOID EventTimeToSystemTime(DWORD EventTime, - SYSTEMTIME * SystemTime); - -VOID SystemTimeToEventTime(SYSTEMTIME * pSystemTime, - DWORD * pEventTime); - -/* eventsource.c */ -VOID InitEventSourceList(VOID); - -BOOL -LoadEventSources(HKEY hKey, - PLOGFILE pLogFile); - -PEVENTSOURCE -GetEventSourceByName(LPCWSTR Name); +LogfReportEvent(USHORT wType, + USHORT wCategory, + ULONG dwEventId, + USHORT wNumStrings, + WCHAR* lpStrings, + ULONG dwDataSize, + PVOID lpRawData); /* logport.c */ @@ -238,9 +233,4 @@ /* rpc.c */ DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter); -static __inline void LogfFreeRecord(LPVOID Rec) -{ - HeapFree(MyHeap, 0, Rec); -} - #endif /* __EVENTLOG_H__ */ Modified: trunk/reactos/base/services/eventlog/eventsource.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/eventlog/eventsource.c?rev=72213&r1=72212&r2=72213&view=diff ============================================================================== --- trunk/reactos/base/services/eventlog/eventsource.c [iso-8859-1] (original) +++ trunk/reactos/base/services/eventlog/eventsource.c [iso-8859-1] Fri Aug 12 19:14:55 2016 @@ -70,7 +70,7 @@ NULL, NULL, NULL, NULL, NULL); if (Result != ERROR_SUCCESS) { - DPRINT1("RegQueryInfoKey failed: %lu\n", Result); + DPRINT1("RegQueryInfoKeyW failed: %lu\n", Result); return FALSE; } @@ -81,12 +81,11 @@ Buf = HeapAlloc(MyHeap, 0, dwMaxSubKeyLength * sizeof(WCHAR)); if (!Buf) { - DPRINT1("Error: can't allocate heap!\n"); + DPRINT1("Error: cannot allocate heap!\n"); return FALSE; } dwEventSourceNameLength = dwMaxSubKeyLength; - dwIndex = 0; while (RegEnumKeyExW(hKey, dwIndex, @@ -127,7 +126,7 @@ GetEventSourceByName(LPCWSTR Name) { PLIST_ENTRY CurrentEntry; - PEVENTSOURCE Result = NULL; + PEVENTSOURCE Item, Result = NULL; DPRINT("GetEventSourceByName(%S)\n", Name); EnterCriticalSection(&EventSourceListCs); @@ -135,9 +134,9 @@ CurrentEntry = EventSourceListHead.Flink; while (CurrentEntry != &EventSourceListHead) { - PEVENTSOURCE Item = CONTAINING_RECORD(CurrentEntry, - EVENTSOURCE, - EventSourceListEntry); + Item = CONTAINING_RECORD(CurrentEntry, + EVENTSOURCE, + EventSourceListEntry); DPRINT("Item->szName: %S\n", Item->szName); // if ((*(Item->szName) != 0) && !_wcsicmp(Item->szName, Name)) Modified: trunk/reactos/base/services/eventlog/file.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/eventlog/file.c?rev=72213&r1=72212&r2=72213&view=diff ============================================================================== --- trunk/reactos/base/services/eventlog/file.c [iso-8859-1] (original) +++ trunk/reactos/base/services/eventlog/file.c [iso-8859-1] Fri Aug 12 19:14:55 2016 @@ -4,24 +4,253 @@ * FILE: base/services/eventlog/file.c * PURPOSE: Event logging service * COPYRIGHT: Copyright 2005 Saveliy Tretiakov - Michael Martin + * Michael Martin */ -/* INCLUDES *****************************************************************/ +/* INCLUDES ******************************************************************/ #include "eventlog.h" #include <ndk/iofuncs.h> +#include <ndk/kefuncs.h> #define NDEBUG #include <debug.h> -/* GLOBALS ******************************************************************/ +/* LOG FILE LIST - GLOBALS ***************************************************/ static LIST_ENTRY LogFileListHead; static CRITICAL_SECTION LogFileListCs; -/* FUNCTIONS ****************************************************************/ +/* LOG FILE LIST - FUNCTIONS *************************************************/ + +VOID LogfCloseAll(VOID) +{ + EnterCriticalSection(&LogFileListCs); + + while (!IsListEmpty(&LogFileListHead)) + { + LogfClose(CONTAINING_RECORD(LogFileListHead.Flink, LOGFILE, ListEntry), TRUE); + } + + LeaveCriticalSection(&LogFileListCs); + + DeleteCriticalSection(&LogFileListCs); +} + +VOID LogfListInitialize(VOID) +{ + InitializeCriticalSection(&LogFileListCs); + InitializeListHead(&LogFileListHead); +} + +PLOGFILE LogfListItemByName(LPCWSTR Name) +{ + PLIST_ENTRY CurrentEntry; + PLOGFILE Item, Result = NULL; + + EnterCriticalSection(&LogFileListCs); + + CurrentEntry = LogFileListHead.Flink; + while (CurrentEntry != &LogFileListHead) + { + Item = CONTAINING_RECORD(CurrentEntry, + LOGFILE, + ListEntry); + + if (Item->LogName && !lstrcmpi(Item->LogName, Name)) + { + Result = Item; + break; + } + + CurrentEntry = CurrentEntry->Flink; + } + + LeaveCriticalSection(&LogFileListCs); + return Result; +} + +#if 0 +/* Index starting from 1 */ +DWORD LogfListItemIndexByName(WCHAR * Name) +{ + PLIST_ENTRY CurrentEntry; + DWORD Result = 0; + DWORD i = 1; + + EnterCriticalSection(&LogFileListCs); + + CurrentEntry = LogFileListHead.Flink; + while (CurrentEntry != &LogFileListHead) + { + PLOGFILE Item = CONTAINING_RECORD(CurrentEntry, + LOGFILE, + ListEntry); + + if (Item->LogName && !lstrcmpi(Item->LogName, Name)) + { + Result = i; + break; + } + + CurrentEntry = CurrentEntry->Flink; + i++; + } + + LeaveCriticalSection(&LogFileListCs); + return Result; +} +#endif + +/* Index starting from 1 */ +PLOGFILE LogfListItemByIndex(DWORD Index) +{ + PLIST_ENTRY CurrentEntry; + PLOGFILE Result = NULL; + DWORD i = 1; + + EnterCriticalSection(&LogFileListCs); + + CurrentEntry = LogFileListHead.Flink; + while (CurrentEntry != &LogFileListHead) + { + if (i == Index) + { + Result = CONTAINING_RECORD(CurrentEntry, LOGFILE, ListEntry); + break; + } + + CurrentEntry = CurrentEntry->Flink; + i++; + } + + LeaveCriticalSection(&LogFileListCs); + return Result; +} + +DWORD LogfListItemCount(VOID) +{ + PLIST_ENTRY CurrentEntry; + DWORD i = 0; + + EnterCriticalSection(&LogFileListCs); + + CurrentEntry = LogFileListHead.Flink; + while (CurrentEntry != &LogFileListHead) + { + CurrentEntry = CurrentEntry->Flink; + i++; + } + + LeaveCriticalSection(&LogFileListCs); + return i; +} + +static VOID +LogfListAddItem(PLOGFILE Item) +{ + EnterCriticalSection(&LogFileListCs); + InsertTailList(&LogFileListHead, &Item->ListEntry); + LeaveCriticalSection(&LogFileListCs); +} + +static VOID +LogfListRemoveItem(PLOGFILE Item) +{ + EnterCriticalSection(&LogFileListCs); + RemoveEntryList(&Item->ListEntry); + LeaveCriticalSection(&LogFileListCs); +} + + +/* FUNCTIONS *****************************************************************/ + +/* Returns 0 if nothing is found */ +static ULONG +LogfOffsetByNumber(PLOGFILE LogFile, + DWORD RecordNumber) +{ + DWORD i; + + for (i = 0; i < LogFile->OffsetInfoNext; i++) + { + if (LogFile->OffsetInfo[i].EventNumber == RecordNumber) + return LogFile->OffsetInfo[i].EventOffset; + } + return 0; +} + +DWORD LogfGetOldestRecord(PLOGFILE LogFile) +{ + return LogFile->Header.OldestRecordNumber; +} + +DWORD LogfGetCurrentRecord(PLOGFILE LogFile) +{ + return LogFile->Header.CurrentRecordNumber; +} + +static BOOL +LogfAddOffsetInformation(PLOGFILE LogFile, + ULONG ulNumber, + ULONG ulOffset) +{ + LPVOID NewOffsetInfo; + + if (LogFile->OffsetInfoNext == LogFile->OffsetInfoSize) + { + NewOffsetInfo = HeapReAlloc(MyHeap, + HEAP_ZERO_MEMORY, + LogFile->OffsetInfo, + (LogFile->OffsetInfoSize + 64) * + sizeof(EVENT_OFFSET_INFO)); + + if (!NewOffsetInfo) + { + DPRINT1("Cannot reallocate heap.\n"); + return FALSE; + } + + LogFile->OffsetInfo = (PEVENT_OFFSET_INFO)NewOffsetInfo; + LogFile->OffsetInfoSize += 64; + } + + LogFile->OffsetInfo[LogFile->OffsetInfoNext].EventNumber = ulNumber; + LogFile->OffsetInfo[LogFile->OffsetInfoNext].EventOffset = ulOffset; + LogFile->OffsetInfoNext++; + + return TRUE; +} + +static BOOL +LogfDeleteOffsetInformation(PLOGFILE LogFile, + ULONG ulNumber) +{ + DWORD i; + + /* + * As the offset information is listed in increasing order, and we want + * to keep the list without holes, we demand that ulNumber is the first + * element in the list. + */ + if (ulNumber != LogFile->OffsetInfo[0].EventNumber) + return FALSE; + + /* + * RtlMoveMemory(&LogFile->OffsetInfo[0], + * &LogFile->OffsetInfo[1], + * sizeof(EVENT_OFFSET_INFO) * (LogFile->OffsetInfoNext - 1)); + */ + for (i = 0; i < LogFile->OffsetInfoNext - 1; i++) + { + LogFile->OffsetInfo[i].EventNumber = LogFile->OffsetInfo[i + 1].EventNumber; + LogFile->OffsetInfo[i].EventOffset = LogFile->OffsetInfo[i + 1].EventOffset; + } + LogFile->OffsetInfoNext--; + + return TRUE; +} static NTSTATUS LogfInitializeNew(PLOGFILE LogFile, @@ -466,141 +695,6 @@ return; } -VOID LogfCloseAll(VOID) -{ - while (!IsListEmpty(&LogFileListHead)) - { - LogfClose(LogfListHead(), TRUE); - } - - DeleteCriticalSection(&LogFileListCs); -} - -VOID LogfListInitialize(VOID) -{ - InitializeCriticalSection(&LogFileListCs); - InitializeListHead(&LogFileListHead); -} - -PLOGFILE LogfListHead(VOID) -{ - return CONTAINING_RECORD(LogFileListHead.Flink, LOGFILE, ListEntry); -} - -PLOGFILE LogfListItemByName(WCHAR * Name) -{ - PLIST_ENTRY CurrentEntry; - PLOGFILE Result = NULL; - - EnterCriticalSection(&LogFileListCs); - - CurrentEntry = LogFileListHead.Flink; - while (CurrentEntry != &LogFileListHead) - { - PLOGFILE Item = CONTAINING_RECORD(CurrentEntry, - LOGFILE, - ListEntry); - - if (Item->LogName && !lstrcmpi(Item->LogName, Name)) - { - Result = Item; - break; - } - - CurrentEntry = CurrentEntry->Flink; - } - - LeaveCriticalSection(&LogFileListCs); - return Result; -} - -/* Index starting from 1 */ -INT LogfListItemIndexByName(WCHAR * Name) -{ - PLIST_ENTRY CurrentEntry; - INT Result = 0; - INT i = 1; - - EnterCriticalSection(&LogFileListCs); - - CurrentEntry = LogFileListHead.Flink; - while (CurrentEntry != &LogFileListHead) - { - PLOGFILE Item = CONTAINING_RECORD(CurrentEntry, - LOGFILE, - ListEntry); - - if (Item->LogName && !lstrcmpi(Item->LogName, Name)) - { - Result = i; - break; - } - - CurrentEntry = CurrentEntry->Flink; - i++; - } - - LeaveCriticalSection(&LogFileListCs); - return Result; -} - -/* Index starting from 1 */ -PLOGFILE LogfListItemByIndex(INT Index) -{ - PLIST_ENTRY CurrentEntry; - PLOGFILE Result = NULL; - INT i = 1; - - EnterCriticalSection(&LogFileListCs); - - CurrentEntry = LogFileListHead.Flink; - while (CurrentEntry != &LogFileListHead) - { - if (i == Index) - { - Result = CONTAINING_RECORD(CurrentEntry, LOGFILE, ListEntry); - break; - } - - CurrentEntry = CurrentEntry->Flink; - i++; - } - - LeaveCriticalSection(&LogFileListCs); - return Result; -} - -INT LogfListItemCount(VOID) -{ - PLIST_ENTRY CurrentEntry; - INT i = 0; - - EnterCriticalSection(&LogFileListCs); - - CurrentEntry = LogFileListHead.Flink; - while (CurrentEntry != &LogFileListHead) - { - CurrentEntry = CurrentEntry->Flink; - i++; - } - - LeaveCriticalSection(&LogFileListCs); - return i; -} - -VOID LogfListAddItem(PLOGFILE Item) -{ - EnterCriticalSection(&LogFileListCs); - InsertTailList(&LogFileListHead, &Item->ListEntry); - LeaveCriticalSection(&LogFileListCs); -} - -VOID LogfListRemoveItem(PLOGFILE Item) -{ - EnterCriticalSection(&LogFileListCs); - RemoveEntryList(&Item->ListEntry); - LeaveCriticalSection(&LogFileListCs); -} static BOOL ReadAnsiLogEntry(HANDLE hFile, @@ -930,7 +1024,7 @@ { DWORD dwWritten; DWORD dwRead; - SYSTEMTIME st; + LARGE_INTEGER SystemTime; EVENTLOGEOF EofRec; PEVENTLOGRECORD RecBuf; LARGE_INTEGER logFileSize; @@ -940,10 +1034,10 @@ if (!Buffer) return FALSE; - GetSystemTime(&st); - SystemTimeToEventTime(&st, &((PEVENTLOGRECORD) Buffer)->TimeWritten); - RtlAcquireResourceExclusive(&LogFile->Lock, TRUE); + + NtQuerySystemTime(&SystemTime); + RtlTimeToSecondsSince1970(&SystemTime, &((PEVENTLOGRECORD)Buffer)->TimeWritten); if (!GetFileSizeEx(LogFile->hFile, &logFileSize)) { @@ -1111,7 +1205,6 @@ return TRUE; } - NTSTATUS LogfClearFile(PLOGFILE LogFile, PUNICODE_STRING BackupFileName) @@ -1123,12 +1216,11 @@ if (BackupFileName->Length > 0) { /* Write a backup file */ - Status = LogfBackupFile(LogFile, - BackupFileName); + Status = LogfBackupFile(LogFile, BackupFileName); if (!NT_SUCCESS(Status)) { DPRINT1("LogfBackupFile failed (Status: 0x%08lx)\n", Status); - return Status; + goto Quit; } } @@ -1140,11 +1232,10 @@ DPRINT1("LogfInitializeNew failed (Status: 0x%08lx)\n", Status); } +Quit: RtlReleaseResource(&LogFile->Lock); - return Status; } - NTSTATUS LogfBackupFile(PLOGFILE LogFile, @@ -1347,134 +1438,84 @@ } -/* Returns 0 if nothing found. */ -ULONG LogfOffsetByNumber(PLOGFILE LogFile, DWORD RecordNumber) -{ - DWORD i; - - for (i = 0; i < LogFile->OffsetInfoNext; i++) - { - if (LogFile->OffsetInfo[i].EventNumber == RecordNumber) - return LogFile->OffsetInfo[i].EventOffset; - } - return 0; -} - -DWORD LogfGetOldestRecord(PLOGFILE LogFile) -{ - return LogFile->Header.OldestRecordNumber; -} - -DWORD LogfGetCurrentRecord(PLOGFILE LogFile) -{ - return LogFile->Header.CurrentRecordNumber; -} - -BOOL LogfDeleteOffsetInformation(PLOGFILE LogFile, ULONG ulNumber) -{ - DWORD i; - - if (ulNumber != LogFile->OffsetInfo[0].EventNumber) - { - return FALSE; - } - - for (i = 0; i < LogFile->OffsetInfoNext - 1; i++) - { - LogFile->OffsetInfo[i].EventNumber = LogFile->OffsetInfo[i + 1].EventNumber; - LogFile->OffsetInfo[i].EventOffset = LogFile->OffsetInfo[i + 1].EventOffset; - } - LogFile->OffsetInfoNext--; - return TRUE; -} - -BOOL LogfAddOffsetInformation(PLOGFILE LogFile, ULONG ulNumber, ULONG ulOffset) -{ - LPVOID NewOffsetInfo; - - if (LogFile->OffsetInfoNext == LogFile->OffsetInfoSize) - { - NewOffsetInfo = HeapReAlloc(MyHeap, - HEAP_ZERO_MEMORY, - LogFile->OffsetInfo, - (LogFile->OffsetInfoSize + 64) * - sizeof(EVENT_OFFSET_INFO)); - - if (!NewOffsetInfo) - { - DPRINT1("Can't reallocate heap.\n"); - return FALSE; - } - - LogFile->OffsetInfo = (PEVENT_OFFSET_INFO) NewOffsetInfo; - LogFile->OffsetInfoSize += 64; - } - - LogFile->OffsetInfo[LogFile->OffsetInfoNext].EventNumber = ulNumber; - LogFile->OffsetInfo[LogFile->OffsetInfoNext].EventOffset = ulOffset; - LogFile->OffsetInfoNext++; - - return TRUE; -} - -PBYTE LogfAllocAndBuildNewRecord(LPDWORD lpRecSize, - DWORD dwRecordNumber, - WORD wType, - WORD wCategory, - DWORD dwEventId, - LPCWSTR SourceName, - LPCWSTR ComputerName, - DWORD dwSidLength, - PSID lpUserSid, - WORD wNumStrings, - WCHAR * lpStrings, - DWORD dwDataSize, - LPVOID lpRawData) +PBYTE +LogfAllocAndBuildNewRecord(PULONG lpRecSize, + ULONG dwRecordNumber, // FIXME! + USHORT wType, + USHORT wCategory, + ULONG dwEventId, + PCWSTR SourceName, + PCWSTR ComputerName, + ULONG dwSidLength, + PSID lpUserSid, + USHORT wNumStrings, + WCHAR* lpStrings, + ULONG dwDataSize, + PVOID lpRawData) { DWORD dwRecSize; PEVENTLOGRECORD pRec; - SYSTEMTIME SysTime; + LARGE_INTEGER SystemTime; WCHAR *str; UINT i, pos; PBYTE Buffer; dwRecSize = - sizeof(EVENTLOGRECORD) + (lstrlenW(ComputerName) + - lstrlenW(SourceName) + 2) * sizeof(WCHAR); - - if (dwRecSize % 4 != 0) - dwRecSize += 4 - (dwRecSize % 4); + sizeof(EVENTLOGRECORD) + (lstrlenW(SourceName) + + lstrlenW(ComputerName) + 2) * sizeof(WCHAR); + + /* Align on DWORD boundary for the SID */ + dwRecSize = ROUND_UP(dwRecSize, sizeof(ULONG)); dwRecSize += dwSidLength; + /* Add the sizes for the strings array */ for (i = 0, str = lpStrings; i < wNumStrings; i++) { dwRecSize += (lstrlenW(str) + 1) * sizeof(WCHAR); str += lstrlenW(str) + 1; } + /* Add the data size */ dwRecSize += dwDataSize; - if (dwRecSize % 4 != 0) - dwRecSize += 4 - (dwRecSize % 4); - - dwRecSize += 4; + + /* Align on DWORD boundary for the full structure */ + dwRecSize = ROUND_UP(dwRecSize, sizeof(ULONG)); + + /* Size of the trailing 'Length' member */ + dwRecSize += sizeof(ULONG); Buffer = HeapAlloc(MyHeap, HEAP_ZERO_MEMORY, dwRecSize); - if (!Buffer) { - DPRINT1("Can't allocate heap!\n"); + DPRINT1("Cannot allocate heap!\n"); return NULL; } - pRec = (PEVENTLOGRECORD) Buffer; + pRec = (PEVENTLOGRECORD)Buffer; pRec->Length = dwRecSize; pRec->Reserved = LOGFILE_SIGNATURE; + + // FIXME: The problem with this technique is that it is possible + // to allocate different records with the same number. Suppose that + // two concurrent events writes happen for the same log, and the + // execution goes inside this function. The callers of this function + // have normally retrieved the 'CurrentRecordNumber' of this log, where + // the access to the log was non locked and no write operation happened + // in between. Then we have two different records for the same log with + // the very same record number, that will be written later. It is only in + // 'LogfWriteRecord' that the 'CurrentRecordNumber' is incremented!! + // + // Therefore we need to rewrite those functions. This function must + // not take any "precomputed" record number. It should attribute a new + // record number under lock, and then increment it atomically, so that + // all event records have unique record numbers. pRec->RecordNumber = dwRecordNumber; - GetSystemTime(&SysTime); - SystemTimeToEventTime(&SysTime, &pRec->TimeGenerated); - SystemTimeToEventTime(&SysTime, &pRec->TimeWritten); + NtQuerySystemTime(&SystemTime); + RtlTimeToSecondsSince1970(&SystemTime, &pRec->TimeGenerated); + // FIXME: Already done in LogfWriteRecord. Is it needed to do that here first?? + RtlTimeToSecondsSince1970(&SystemTime, &pRec->TimeWritten); pRec->EventID = dwEventId; pRec->EventType = wType; @@ -1487,11 +1528,10 @@ lstrcpyW((WCHAR *) (Buffer + pos), ComputerName); pos += (lstrlenW(ComputerName) + 1) * sizeof(WCHAR); + /* Align on DWORD boundary for the SID */ + pos = ROUND_UP(pos, sizeof(ULONG)); + pRec->UserSidOffset = pos; - - if (pos % 4 != 0) - pos += 4 - (pos % 4); - if (dwSidLength) { CopyMemory(Buffer + pos, lpUserSid, dwSidLength); @@ -1517,53 +1557,49 @@ pos += dwDataSize; } - if (pos % 4 != 0) - pos += 4 - (pos % 4); - + /* Align on DWORD boundary for the full structure */ + pos = ROUND_UP(pos, sizeof(ULONG)); + + /* Initialize the trailing 'Length' member */ *((PDWORD) (Buffer + pos)) = dwRecSize; *lpRecSize = dwRecSize; return Buffer; } - VOID -LogfReportEvent(WORD wType, - WORD wCategory, - DWORD dwEventId, - WORD wNumStrings, - WCHAR *lpStrings, - DWORD dwDataSize, - LPVOID lpRawData) +LogfReportEvent(USHORT wType, + USHORT wCategory, + ULONG dwEventId, + USHORT wNumStrings, + WCHAR* lpStrings, + ULONG dwDataSize, + PVOID lpRawData) { WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1; - PEVENTSOURCE pEventSource = NULL; PBYTE logBuffer; DWORD lastRec; DWORD recSize; DWORD dwError; + if (!EventLogSource) + return; + if (!GetComputerNameW(szComputerName, &dwComputerNameLength)) { - szComputerName[0] = 0; - } - - pEventSource = GetEventSourceByName(L"EventLog"); - if (pEventSource == NULL) - { - return; - } - - lastRec = LogfGetCurrentRecord(pEventSource->LogFile); + szComputerName[0] = L'\0'; + } + + lastRec = LogfGetCurrentRecord(EventLogSource->LogFile); logBuffer = LogfAllocAndBuildNewRecord(&recSize, - lastRec, + lastRec, // FIXME! wType, wCategory, dwEventId, - pEventSource->szName, - (LPCWSTR)szComputerName, + EventLogSource->szName, + szComputerName, 0, NULL, wNumStrings, @@ -1571,10 +1607,10 @@ dwDataSize, lpRawData); - dwError = LogfWriteData(pEventSource->LogFile, recSize, logBuffer); + dwError = LogfWriteData(EventLogSource->LogFile, recSize, logBuffer); if (!dwError) { - DPRINT1("ERROR WRITING TO EventLog %S\n", pEventSource->LogFile->FileName); + DPRINT1("ERROR WRITING TO EventLog %S\n", EventLogSource->LogFile->FileName); } LogfFreeRecord(logBuffer); Modified: trunk/reactos/base/services/eventlog/logport.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/eventlog/logport.c?rev=72213&r1=72212&r2=72213&view=diff ============================================================================== --- trunk/reactos/base/services/eventlog/logport.c [iso-8859-1] (original) +++ trunk/reactos/base/services/eventlog/logport.c [iso-8859-1] Fri Aug 12 19:14:55 2016 @@ -18,8 +18,8 @@ /* GLOBALS ******************************************************************/ -HANDLE ConnectPortHandle = NULL; -HANDLE MessagePortHandle = NULL; +static HANDLE ConnectPortHandle = NULL; +static HANDLE MessagePortHandle = NULL; extern BOOL onLiveCD; /* FUNCTIONS ****************************************************************/ @@ -70,7 +70,6 @@ } Status = NtListenPort(ConnectPortHandle, &Request); - if (!NT_SUCCESS(Status)) { DPRINT1("NtListenPort() failed (Status %lx)\n", Status); @@ -79,7 +78,6 @@ Status = NtAcceptConnectPort(&MessagePortHandle, ConnectPortHandle, NULL, TRUE, NULL, NULL); - if (!NT_SUCCESS(Status)) { DPRINT1("NtAcceptConnectPort() failed (Status %lx)\n", Status); @@ -93,7 +91,7 @@ goto ByeBye; } - ByeBye: +ByeBye: if (!NT_SUCCESS(Status)) { if (ConnectPortHandle != NULL) @@ -114,6 +112,8 @@ DWORD dwRecSize; NTSTATUS Status; PLOGFILE SystemLog = NULL; + WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1; DPRINT("ProcessPortMessage() called\n"); @@ -150,18 +150,27 @@ Message = (PIO_ERROR_LOG_MESSAGE) & Request.Message; ulRecNum = SystemLog ? SystemLog->Header.CurrentRecordNumber : 0; - pRec = (PEVENTLOGRECORD) LogfAllocAndBuildNewRecord(&dwRecSize, - ulRecNum, Message->Type, Message->EntryData.EventCategory, - Message->EntryData.ErrorCode, - (WCHAR *) (((PBYTE) Message) + Message->DriverNameOffset), - L"MyComputer", /* FIXME */ - 0, - NULL, - Message->EntryData.NumberOfStrings, - (WCHAR *) (((PBYTE) Message) + Message->EntryData.StringOffset), - Message->EntryData.DumpDataSize, - (LPVOID) (((PBYTE) Message) + sizeof(IO_ERROR_LOG_PACKET) - - sizeof(ULONG))); + if (!GetComputerNameW(szComputerName, &dwComputerNameLength)) + { + szComputerName[0] = L'\0'; + } + + // TODO: Log more information?? + + pRec = (PEVENTLOGRECORD) LogfAllocAndBuildNewRecord( + &dwRecSize, + ulRecNum, // FIXME! + Message->Type, + Message->EntryData.EventCategory, + Message->EntryData.ErrorCode, + (WCHAR *) ((ULONG_PTR)Message + Message->DriverNameOffset), // FIXME: Use DriverNameLength too! + szComputerName, + 0, + NULL, + Message->EntryData.NumberOfStrings, + (WCHAR *) ((ULONG_PTR)Message + Message->EntryData.StringOffset), + Message->EntryData.DumpDataSize, + (LPVOID) ((ULONG_PTR)Message + FIELD_OFFSET(IO_ERROR_LOG_PACKET, DumpData))); if (pRec == NULL) { Modified: trunk/reactos/base/services/eventlog/rpc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/eventlog/rpc.c?rev=72213&r1=72212&r2=72213&view=diff ============================================================================== --- trunk/reactos/base/services/eventlog/rpc.c [iso-8859-1] (original) +++ trunk/reactos/base/services/eventlog/rpc.c [iso-8859-1] Fri Aug 12 19:14:55 2016 @@ -5,6 +5,7 @@ * PURPOSE: Event logging service * COPYRIGHT: Copyright 2005 Saveliy Tretiakov * Copyright 2008 Michael Martin + * Copyright 2010-2011 Eric Kohl */ /* INCLUDES *****************************************************************/ @@ -49,27 +50,31 @@ static NTSTATUS -ElfCreateEventLogHandle(PLOGHANDLE *LogHandle, - LPCWSTR Name, - BOOL Create) -{ +ElfCreateEventLogHandle(PLOGHANDLE* LogHandle, + PUNICODE_STRING LogName, + BOOLEAN Create) +{ + NTSTATUS Status = STATUS_SUCCESS; PLOGHANDLE lpLogHandle; PLOGFILE currentLogFile = NULL; - INT i, LogsActive; + DWORD i, LogsActive; PEVENTSOURCE pEventSource; - NTSTATUS Status = STATUS_SUCCESS; - - DPRINT("ElfCreateEventLogHandle(Name: %S)\n", Name); - - lpLogHandle = HeapAlloc(GetProcessHeap(), 0, sizeof(LOGHANDLE) - + ((wcslen(Name) + 1) * sizeof(WCHAR))); + + DPRINT("ElfCreateEventLogHandle(Name: %wZ)\n", LogName); + + *LogHandle = NULL; + + i = (LogName->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR); + lpLogHandle = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + FIELD_OFFSET(LOGHANDLE, szName[i])); if (!lpLogHandle) { DPRINT1("Failed to allocate Heap!\n"); return STATUS_NO_MEMORY; } - wcscpy(lpLogHandle->szName, Name); + StringCchCopy(lpLogHandle->szName, i, LogName->Buffer); /* Get the number of Log Files the EventLog service found */ LogsActive = LogfListItemCount(); @@ -81,9 +86,9 @@ } /* If Creating, default to the Application Log in case we fail, as documented on MSDN */ - if (Create == TRUE) - { - pEventSource = GetEventSourceByName(Name); + if (Create) + { + pEventSource = GetEventSourceByName(LogName->Buffer); DPRINT("EventSource: %p\n", pEventSource); if (pEventSource) { @@ -106,9 +111,9 @@ { currentLogFile = LogfListItemByIndex(i); - if (_wcsicmp(Name, currentLogFile->LogName) == 0) + if (_wcsicmp(LogName->Buffer, currentLogFile->LogName) == 0) { - lpLogHandle->LogFile = LogfListItemByIndex(i); + lpLogHandle->LogFile = currentLogFile; lpLogHandle->CurrentRecord = LogfGetOldestRecord(lpLogHandle->LogFile); break; } @@ -150,14 +155,15 @@ static NTSTATUS -ElfCreateBackupLogHandle(PLOGHANDLE *LogHandle, +ElfCreateBackupLogHandle(PLOGHANDLE* LogHandle, PUNICODE_STRING FileName) { + NTSTATUS Status = STATUS_SUCCESS; PLOGHANDLE lpLogHandle; - NTSTATUS Status = STATUS_SUCCESS; - DPRINT("ElfCreateBackupLogHandle(FileName: %wZ)\n", FileName); + + *LogHandle = NULL; lpLogHandle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LOGHANDLE)); if (lpLogHandle == NULL) @@ -202,7 +208,8 @@ } -PLOGHANDLE ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle) +static PLOGHANDLE +ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle) { PLIST_ENTRY CurrentEntry; PLOGHANDLE lpLogHandle; @@ -224,38 +231,38 @@ static NTSTATUS -ElfDeleteEventLogHandle(IELF_HANDLE LogHandle) +ElfDeleteEventLogHandle(PIELF_HANDLE LogHandle) { PLOGHANDLE lpLogHandle; + + lpLogHandle = ElfGetLogHandleEntryByHandle(*LogHandle); + if (!lpLogHandle) + return STATUS_INVALID_HANDLE; + + RemoveEntryList(&lpLogHandle->LogHandleListEntry); + LogfClose(lpLogHandle->LogFile, FALSE); + + HeapFree(GetProcessHeap(), 0, lpLogHandle); + + *LogHandle = NULL; + + return STATUS_SUCCESS; +} + + +/* Function 0 */ +NTSTATUS +ElfrClearELFW( + IELF_HANDLE LogHandle, + PRPC_UNICODE_STRING BackupFileName) +{ + PLOGHANDLE lpLogHandle; + + DPRINT("ElfrClearELFW()\n"); lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); if (!lpLogHandle) - { return STATUS_INVALID_HANDLE; - } - - RemoveEntryList(&lpLogHandle->LogHandleListEntry); - LogfClose(lpLogHandle->LogFile, FALSE); - - HeapFree(GetProcessHeap(), 0, lpLogHandle); - - return STATUS_SUCCESS; -} - -/* Function 0 */ -NTSTATUS ElfrClearELFW( - IELF_HANDLE LogHandle, - PRPC_UNICODE_STRING BackupFileName) -{ - PLOGHANDLE lpLogHandle; - - DPRINT("ElfrClearELFW()\n"); - - lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); - if (!lpLogHandle) - { - return STATUS_INVALID_HANDLE; - } /* Fail, if the log file is a backup file */ if (lpLogHandle->Flags & LOG_HANDLE_BACKUP_FILE) @@ -267,7 +274,8 @@ /* Function 1 */ -NTSTATUS ElfrBackupELFW( +NTSTATUS +ElfrBackupELFW( IELF_HANDLE LogHandle, PRPC_UNICODE_STRING BackupFileName) { @@ -277,9 +285,7 @@ lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); if (!lpLogHandle) - { return STATUS_INVALID_HANDLE; - } return LogfBackupFile(lpLogHandle->LogFile, (PUNICODE_STRING)BackupFileName); @@ -287,25 +293,28 @@ /* Function 2 */ -NTSTATUS ElfrCloseEL( - IELF_HANDLE *LogHandle) -{ - return ElfDeleteEventLogHandle(*LogHandle); +NTSTATUS +ElfrCloseEL( + PIELF_HANDLE LogHandle) +{ + return ElfDeleteEventLogHandle(LogHandle); } /* Function 3 */ -NTSTATUS ElfrDeregisterEventSource( - IELF_HANDLE *LogHandle) -{ - return ElfDeleteEventLogHandle(*LogHandle); +NTSTATUS +ElfrDeregisterEventSource( + PIELF_HANDLE LogHandle) +{ + return ElfDeleteEventLogHandle(LogHandle); } /* Function 4 */ -NTSTATUS ElfrNumberOfRecords( - IELF_HANDLE LogHandle, - DWORD *NumberOfRecords) +NTSTATUS +ElfrNumberOfRecords( + IELF_HANDLE LogHandle, + PULONG NumberOfRecords) { PLOGHANDLE lpLogHandle; PLOGFILE lpLogFile; @@ -314,9 +323,10 @@ lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); if (!lpLogHandle) - { return STATUS_INVALID_HANDLE; - } + + if (!NumberOfRecords) + return STATUS_INVALID_PARAMETER; lpLogFile = lpLogHandle->LogFile; @@ -332,22 +342,19 @@ /* Function 5 */ -NTSTATUS ElfrOldestRecord( - IELF_HANDLE LogHandle, - DWORD *OldestRecordNumber) +NTSTATUS +ElfrOldestRecord( + IELF_HANDLE LogHandle, + PULONG OldestRecordNumber) { PLOGHANDLE lpLogHandle; lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); if (!lpLogHandle) - { return STATUS_INVALID_HANDLE; - } if (!OldestRecordNumber) - { - return STATUS_INVALID_PARAMETER; - } + return STATUS_INVALID_PARAMETER; *OldestRecordNumber = LogfGetOldestRecord(lpLogHandle->LogFile); @@ -356,26 +363,26 @@ /* Function 6 */ -NTSTATUS ElfrChangeNotify( +NTSTATUS +ElfrChangeNotify( IELF_HANDLE LogHandle, RPC_CLIENT_ID ClientId, - DWORD Event) -{ - DPRINT("ElfrChangeNotify()"); - + ULONG Event) +{ UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; } /* Function 7 */ -NTSTATUS ElfrOpenELW( +NTSTATUS +ElfrOpenELW( EVENTLOG_HANDLE_W UNCServerName, PRPC_UNICODE_STRING ModuleName, PRPC_UNICODE_STRING RegModuleName, - DWORD MajorVersion, - DWORD MinorVersion, - IELF_HANDLE *LogHandle) + ULONG MajorVersion, + ULONG MinorVersion, + PIELF_HANDLE LogHandle) { if ((MajorVersion != 1) || (MinorVersion != 1)) return STATUS_INVALID_PARAMETER; @@ -384,24 +391,25 @@ if (RegModuleName->Length > 0) return STATUS_INVALID_PARAMETER; - /*FIXME: UNCServerName must specify the server */ - - /*FIXME: Must verify that caller has read access */ - - return ElfCreateEventLogHandle((PLOGHANDLE *)LogHandle, - ModuleName->Buffer, + /* FIXME: UNCServerName must specify the server */ + + /* FIXME: Must verify that caller has read access */ + + return ElfCreateEventLogHandle((PLOGHANDLE*)LogHandle, + (PUNICODE_STRING)ModuleName, FALSE); } /* Function 8 */ -NTSTATUS ElfrRegisterEventSourceW( +NTSTATUS +ElfrRegisterEventSourceW( EVENTLOG_HANDLE_W UNCServerName, PRPC_UNICODE_STRING ModuleName, PRPC_UNICODE_STRING RegModuleName, - DWORD MajorVersion, - DWORD MinorVersion, - IELF_HANDLE *LogHandle) + ULONG MajorVersion, + ULONG MinorVersion, + PIELF_HANDLE LogHandle) { DPRINT("ElfrRegisterEventSourceW()\n"); @@ -412,49 +420,51 @@ if (RegModuleName->Length > 0) return STATUS_INVALID_PARAMETER; - DPRINT("ModuleName: %S\n", ModuleName->Buffer); - - /*FIXME: UNCServerName must specify the server or empty for local */ - - /*FIXME: Must verify that caller has write access */ - - return ElfCreateEventLogHandle((PLOGHANDLE *)LogHandle, - ModuleName->Buffer, + DPRINT("ModuleName: %wZ\n", ModuleName); + + /* FIXME: UNCServerName must specify the server or empty for local */ + + /* FIXME: Must verify that caller has write access */ + + return ElfCreateEventLogHandle((PLOGHANDLE*)LogHandle, + (PUNICODE_STRING)ModuleName, TRUE); } /* Function 9 */ -NTSTATUS ElfrOpenBELW( +NTSTATUS +ElfrOpenBELW( EVENTLOG_HANDLE_W UNCServerName, PRPC_UNICODE_STRING BackupFileName, - DWORD MajorVersion, - DWORD MinorVersion, - IELF_HANDLE *LogHandle) + ULONG MajorVersion, + ULONG MinorVersion, + PIELF_HANDLE LogHandle) { DPRINT("ElfrOpenBELW(%wZ)\n", BackupFileName); if ((MajorVersion != 1) || (MinorVersion != 1)) return STATUS_INVALID_PARAMETER; - /*FIXME: UNCServerName must specify the server */ - - /*FIXME: Must verify that caller has read access */ - - return ElfCreateBackupLogHandle((PLOGHANDLE *)LogHandle, + /* FIXME: UNCServerName must specify the server */ + + /* FIXME: Must verify that caller has read access */ + + return ElfCreateBackupLogHandle((PLOGHANDLE*)LogHandle, (PUNICODE_STRING)BackupFileName); } /* Function 10 */ -NTSTATUS ElfrReadELW( - IELF_HANDLE LogHandle, - DWORD ReadFlags, - DWORD RecordOffset, +NTSTATUS +ElfrReadELW( + IELF_HANDLE LogHandle, + ULONG ReadFlags, + ULONG RecordOffset, RULONG NumberOfBytesToRead, - BYTE *Buffer, - DWORD *NumberOfBytesRead, - DWORD *MinNumberOfBytesNeeded) + PBYTE Buffer, + PULONG NumberOfBytesRead, + PULONG MinNumberOfBytesNeeded) { PLOGHANDLE lpLogHandle; DWORD dwError; @@ -462,9 +472,7 @@ lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); if (!lpLogHandle) - { return STATUS_INVALID_HANDLE; - } if (!Buffer) return STATUS_INVALID_PARAMETER; @@ -479,11 +487,16 @@ RecordNumber = RecordOffset; } - dwError = LogfReadEvent(lpLogHandle->LogFile, ReadFlags, &RecordNumber, - NumberOfBytesToRead, Buffer, NumberOfBytesRead, MinNumberOfBytesNeeded, + dwError = LogfReadEvent(lpLogHandle->LogFile, + ReadFlags, + &RecordNumber, + NumberOfBytesToRead, + Buffer, + NumberOfBytesRead, + MinNumberOfBytesNeeded, FALSE); - /* Update the handles CurrentRecord if success*/ + /* Update the handle's CurrentRecord if success */ if (dwError == ERROR_SUCCESS) { lpLogHandle->CurrentRecord = RecordNumber; @@ -498,21 +511,22 @@ /* Function 11 */ -NTSTATUS ElfrReportEventW( - IELF_HANDLE LogHandle, - DWORD Time, +NTSTATUS +ElfrReportEventW( + IELF_HANDLE LogHandle, + ULONG Time, USHORT EventType, USHORT EventCategory, - DWORD EventID, + ULONG EventID, USHORT NumStrings, - DWORD DataSize, + ULONG DataSize, PRPC_UNICODE_STRING ComputerName, PRPC_SID UserSID, PRPC_UNICODE_STRING Strings[], - BYTE *Data, + PBYTE Data, USHORT Flags, - DWORD *RecordNumber, - DWORD *TimeWritten) + PULONG RecordNumber, + PULONG TimeWritten) { USHORT i; PBYTE LogBuffer; @@ -527,15 +541,11 @@ lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); if (!lpLogHandle) - { return STATUS_INVALID_HANDLE; - } /* Flags must be 0 */ if (Flags) - { - return STATUS_INVALID_PARAMETER; - } + return STATUS_INVALID_PARAMETER; lastRec = LogfGetCurrentRecord(lpLogHandle->LogFile); @@ -571,7 +581,7 @@ DPRINT1("Type %hu: %wZ\n", EventType, Strings[i]); break; } - dwStringsSize += Strings[i]->Length + sizeof UNICODE_NULL; + dwStringsSize += Strings[i]->Length + sizeof(UNICODE_NULL); } lpStrings = HeapAlloc(GetProcessHeap(), 0, dwStringsSize); @@ -583,16 +593,16 @@ for (i = 0; i < NumStrings; i++) { - CopyMemory(lpStrings + pos, Strings[i]->Buffer, Strings[i]->Length); + RtlCopyMemory(lpStrings + pos, Strings[i]->Buffer, Strings[i]->Length); pos += Strings[i]->Length / sizeof(WCHAR); lpStrings[pos] = UNICODE_NULL; - pos += sizeof UNICODE_NULL / sizeof(WCHAR); + pos += sizeof(UNICODE_NULL) / sizeof(WCHAR); } if (UserSID) dwUserSidLength = FIELD_OFFSET(SID, SubAuthority[UserSID->SubAuthorityCount]); LogBuffer = LogfAllocAndBuildNewRecord(&recSize, - lastRec, + lastRec, // FIXME! EventType, EventCategory, EventID, @@ -620,7 +630,8 @@ /* Function 12 */ -NTSTATUS ElfrClearELFA( +NTSTATUS +ElfrClearELFA( IELF_HANDLE LogHandle, PRPC_STRING BackupFileName) { @@ -643,7 +654,8 @@ /* Function 13 */ -NTSTATUS ElfrBackupELFA( +NTSTATUS +ElfrBackupELFA( IELF_HANDLE LogHandle, PRPC_STRING BackupFileName) { @@ -666,13 +678,14 @@ /* Function 14 */ -NTSTATUS ElfrOpenELA( +NTSTATUS +ElfrOpenELA( EVENTLOG_HANDLE_A UNCServerName, PRPC_STRING ModuleName, PRPC_STRING RegModuleName, - DWORD MajorVersion, - DWORD MinorVersion, - IELF_HANDLE *LogHandle) + ULONG MajorVersion, + ULONG MinorVersion, + PIELF_HANDLE LogHandle) { UNICODE_STRING ModuleNameW; NTSTATUS Status; @@ -690,8 +703,8 @@ /* FIXME: Must verify that caller has read access */ - Status = ElfCreateEventLogHandle((PLOGHANDLE *)LogHandle, - ModuleNameW.Buffer, + Status = ElfCreateEventLogHandle((PLOGHANDLE*)LogHandle, + &ModuleNameW, FALSE); RtlFreeUnicodeString(&ModuleNameW); @@ -701,13 +714,14 @@ /* Function 15 */ -NTSTATUS ElfrRegisterEventSourceA( +NTSTATUS +ElfrRegisterEventSourceA( EVENTLOG_HANDLE_A UNCServerName, PRPC_STRING ModuleName, PRPC_STRING RegModuleName, - DWORD MajorVersion, - DWORD MinorVersion, - IELF_HANDLE *LogHandle) + ULONG MajorVersion, + ULONG MinorVersion, + PIELF_HANDLE LogHandle) { UNICODE_STRING ModuleNameW; NTSTATUS Status; @@ -736,8 +750,8 @@ /* FIXME: Must verify that caller has write access */ - Status = ElfCreateEventLogHandle((PLOGHANDLE *)LogHandle, - ModuleNameW.Buffer, + Status = ElfCreateEventLogHandle((PLOGHANDLE*)LogHandle, + &ModuleNameW, TRUE); RtlFreeUnicodeString(&ModuleNameW); @@ -747,12 +761,13 @@ /* Function 16 */ -NTSTATUS ElfrOpenBELA( +NTSTATUS +ElfrOpenBELA( EVENTLOG_HANDLE_A UNCServerName, PRPC_STRING BackupFileName, - DWORD MajorVersion, - DWORD MinorVersion, - IELF_HANDLE *LogHandle) + ULONG MajorVersion, + ULONG MinorVersion, + PIELF_HANDLE LogHandle) { UNICODE_STRING BackupFileNameW; NTSTATUS Status; @@ -774,11 +789,11 @@ return STATUS_INVALID_PARAMETER; } - /*FIXME: UNCServerName must specify the server */ - - /*FIXME: Must verify that caller has read access */ - - Status = ElfCreateBackupLogHandle((PLOGHANDLE *)LogHandle, + /* FIXME: UNCServerName must specify the server */ + + /* FIXME: Must verify that caller has read access */ + + Status = ElfCreateBackupLogHandle((PLOGHANDLE*)LogHandle, &BackupFileNameW); RtlFreeUnicodeString(&BackupFileNameW); @@ -788,14 +803,15 @@ /* Function 17 */ -NTSTATUS ElfrReadELA( - IELF_HANDLE LogHandle, - DWORD ReadFlags, - DWORD RecordOffset, +NTSTATUS +ElfrReadELA( + IELF_HANDLE LogHandle, + ULONG ReadFlags, + ULONG RecordOffset, RULONG NumberOfBytesToRead, - BYTE *Buffer, - DWORD *NumberOfBytesRead, - DWORD *MinNumberOfBytesNeeded) + PBYTE Buffer, + PULONG NumberOfBytesRead, + PULONG MinNumberOfBytesNeeded) { PLOGHANDLE lpLogHandle; DWORD dwError; @@ -803,9 +819,7 @@ lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); if (!lpLogHandle) - { return STATUS_INVALID_HANDLE; - } if (!Buffer) return STATUS_INVALID_PARAMETER; @@ -829,7 +843,7 @@ MinNumberOfBytesNeeded, TRUE); - /* Update the handles CurrentRecord if success*/ + /* Update the handle's CurrentRecord if success */ if (dwError == ERROR_SUCCESS) { lpLogHandle->CurrentRecord = RecordNumber; @@ -844,21 +858,22 @@ /* Function 18 */ -NTSTATUS ElfrReportEventA( - IELF_HANDLE LogHandle, - DWORD Time, +NTSTATUS +ElfrReportEventA( + IELF_HANDLE LogHandle, + ULONG Time, USHORT EventType, USHORT EventCategory, - DWORD EventID, + ULONG EventID, USHORT NumStrings, - DWORD DataSize, + ULONG DataSize, PRPC_STRING ComputerName, PRPC_SID UserSID, PRPC_STRING Strings[], - BYTE *Data, + PBYTE Data, USHORT Flags, - DWORD *RecordNumber, - DWORD *TimeWritten) + PULONG RecordNumber, + PULONG TimeWritten) { UNICODE_STRING ComputerNameW; PUNICODE_STRING *StringsArrayW = NULL; @@ -891,7 +906,7 @@ { StringsArrayW = HeapAlloc(MyHeap, HEAP_ZERO_MEMORY, - NumStrings * sizeof (PUNICODE_STRING)); + NumStrings * sizeof(PUNICODE_STRING)); if (StringsArrayW == NULL) { Status = STATUS_NO_MEMORY; @@ -964,7 +979,8 @@ /* Function 19 */ -NTSTATUS ElfrRegisterClusterSvc( +NTSTATUS +ElfrRegisterClusterSvc( handle_t BindingHandle) { UNIMPLEMENTED; @@ -973,7 +989,8 @@ /* Function 20 */ -NTSTATUS ElfrDeregisterClusterSvc( +NTSTATUS +ElfrDeregisterClusterSvc( handle_t BindingHandle) { UNIMPLEMENTED; @@ -982,7 +999,8 @@ /* Function 21 */ -NTSTATUS ElfrWriteClusterEvents( +NTSTATUS +ElfrWriteClusterEvents( handle_t BindingHandle) { UNIMPLEMENTED; @@ -991,16 +1009,20 @@ /* Function 22 */ -NTSTATUS ElfrGetLogInformation( - IELF_HANDLE LogHandle, - DWORD InfoLevel, - BYTE *Buffer, - DWORD cbBufSize, - DWORD *pcbBytesNeeded) +NTSTATUS +ElfrGetLogInformation( + IELF_HANDLE LogHandle, + ULONG InfoLevel, + PBYTE Buffer, + ULONG cbBufSize, + PULONG pcbBytesNeeded) { NTSTATUS Status = STATUS_SUCCESS; - - /* FIXME: check handle first */ + PLOGHANDLE lpLogHandle; + + lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); + if (!lpLogHandle) + return STATUS_INVALID_HANDLE; switch (InfoLevel) { @@ -1011,10 +1033,16 @@ *pcbBytesNeeded = sizeof(EVENTLOG_FULL_INFORMATION); if (cbBufSize < sizeof(EVENTLOG_FULL_INFORMATION)) { - return STATUS_BUFFER_TOO_SMALL; + Status = STATUS_BUFFER_TOO_SMALL; + break; } - efi->dwFull = 0; /* FIXME */ + /* + * FIXME. To check whether an event log is "full" one needs + * to compare its current size with respect to the maximum + * size threshold "MaxSize" contained in its header. + */ + efi->dwFull = 0; } break; @@ -1028,7 +1056,8 @@ /* Function 23 */ -NTSTATUS ElfrFlushEL( +NTSTATUS +ElfrFlushEL( IELF_HANDLE LogHandle) { UNIMPLEMENTED; @@ -1037,22 +1066,23 @@ /* Function 24 */ -NTSTATUS ElfrReportEventAndSourceW( - IELF_HANDLE LogHandle, - DWORD Time, +NTSTATUS +ElfrReportEventAndSourceW( + IELF_HANDLE LogHandle, + ULONG Time, USHORT EventType, USHORT EventCategory, ULONG EventID, PRPC_UNICODE_STRING SourceName, USHORT NumStrings, - DWORD DataSize, + ULONG DataSize, PRPC_UNICODE_STRING ComputerName, PRPC_SID UserSID, PRPC_UNICODE_STRING Strings[], - BYTE *Data, + PBYTE Data, USHORT Flags, - DWORD *RecordNumber, - DWORD *TimeWritten) + PULONG RecordNumber, + PULONG TimeWritten) { UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; @@ -1073,4 +1103,6 @@ void __RPC_USER IELF_HANDLE_rundown(IELF_HANDLE LogHandle) { -} + /* Close the handle */ + ElfDeleteEventLogHandle(&LogHandle); // ElfrCloseEL(&LogHandle); +}