[EVENTVWR]

- Fix the flags used in LoadLibraryEx calls for loading DLLs as resource files.
- Use a nice flag (FORMAT_MESSAGE_MAX_WIDTH_MASK) in FormatMessage calls so that no useless extra newlines are appended to the message strings that are recovered.
  This is especially useful when some strings as localized event log names are retrieved to be displayed in the menu (amongst other things)...
  This fixes CORE-8915 and fixes also the presentation of some event descriptions.
- Fix BuildLogList.

svn path=/trunk/; revision=71378
This commit is contained in:
Hermès Bélusca-Maïto 2016-05-22 19:00:55 +00:00
parent 5e80e9c714
commit 859060f887

View file

@ -83,8 +83,8 @@ OPENFILENAMEW sfn;
LPWSTR lpSourceLogName = NULL; LPWSTR lpSourceLogName = NULL;
LPWSTR lpComputerName = NULL; LPWSTR lpComputerName = NULL;
DWORD dwNumLogs = 0; DWORD dwNumLogs = 0;
LPWSTR* LogNames; LPWSTR* LogNames = NULL;
/* Forward declarations of functions included in this code module: */ /* Forward declarations of functions included in this code module: */
ATOM MyRegisterClass(HINSTANCE hInstance); ATOM MyRegisterClass(HINSTANCE hInstance);
@ -294,13 +294,13 @@ GetEventCategory(IN LPCWSTR KeyName,
goto Quit; goto Quit;
hLibrary = LoadLibraryExW(szMessageDLL, NULL, hLibrary = LoadLibraryExW(szMessageDLL, NULL,
DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE); LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE);
if (hLibrary == NULL) if (hLibrary == NULL)
goto Quit; goto Quit;
/* Retrieve the message string. */ /* Retrieve the message string without appending extra newlines */
if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE | if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE |
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY, FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_MAX_WIDTH_MASK,
hLibrary, hLibrary,
pevlr->EventCategory, pevlr->EventCategory,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
@ -395,7 +395,7 @@ GetEventMessage(IN LPCWSTR KeyName,
while ((szDll != NULL) && (!Success)) while ((szDll != NULL) && (!Success))
{ {
hLibrary = LoadLibraryExW(szDll, NULL, hLibrary = LoadLibraryExW(szDll, NULL,
DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE); LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE);
if (hLibrary == NULL) if (hLibrary == NULL)
{ {
/* The DLL could not be loaded try the next one (if any) */ /* The DLL could not be loaded try the next one (if any) */
@ -403,9 +403,9 @@ GetEventMessage(IN LPCWSTR KeyName,
continue; continue;
} }
/* Retrieve the message string. */ /* Retrieve the message string without appending extra newlines */
if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE | if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE |
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY, FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_MAX_WIDTH_MASK,
hLibrary, hLibrary,
pevlr->EventID, pevlr->EventID,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
@ -894,7 +894,7 @@ MyRegisterClass(HINSTANCE hInstance)
} }
VOID BOOL
GetDisplayNameFile(IN LPCWSTR lpLogName, GetDisplayNameFile(IN LPCWSTR lpLogName,
OUT PWCHAR lpModuleName) OUT PWCHAR lpModuleName)
{ {
@ -908,7 +908,7 @@ GetDisplayNameFile(IN LPCWSTR lpLogName,
KeyPath = HeapAlloc(GetProcessHeap(), 0, cbKeyPath); KeyPath = HeapAlloc(GetProcessHeap(), 0, cbKeyPath);
if (!KeyPath) if (!KeyPath)
{ {
return; return FALSE;
} }
StringCbCopyW(KeyPath, cbKeyPath, EVENTLOG_BASE_KEY); StringCbCopyW(KeyPath, cbKeyPath, EVENTLOG_BASE_KEY);
@ -917,7 +917,7 @@ GetDisplayNameFile(IN LPCWSTR lpLogName,
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, KeyPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, KeyPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
{ {
HeapFree(GetProcessHeap(), 0, KeyPath); HeapFree(GetProcessHeap(), 0, KeyPath);
return; return FALSE;
} }
cbData = sizeof(szModuleName); cbData = sizeof(szModuleName);
@ -928,6 +928,8 @@ GetDisplayNameFile(IN LPCWSTR lpLogName,
RegCloseKey(hKey); RegCloseKey(hKey);
HeapFree(GetProcessHeap(), 0, KeyPath); HeapFree(GetProcessHeap(), 0, KeyPath);
return TRUE;
} }
@ -970,86 +972,114 @@ VOID
BuildLogList(void) BuildLogList(void)
{ {
HKEY hKey; HKEY hKey;
DWORD lpcName;
DWORD dwIndex; DWORD dwIndex;
DWORD dwMessageID;
DWORD dwMaxKeyLength; DWORD dwMaxKeyLength;
LPWSTR LogName = NULL;
WCHAR szModuleName[MAX_PATH]; WCHAR szModuleName[MAX_PATH];
DWORD lpcName;
DWORD dwMessageID;
LPWSTR lpDisplayName; LPWSTR lpDisplayName;
HMODULE hLibrary = NULL; HMODULE hLibrary = NULL;
/* Open the EventLog key */
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, EVENTLOG_BASE_KEY, 0, KEY_READ, &hKey) != ERROR_SUCCESS) if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, EVENTLOG_BASE_KEY, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
{ {
return; return;
} }
/* Retrieve the number of event logs enumerated as registry keys */
if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &dwNumLogs, &dwMaxKeyLength, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &dwNumLogs, &dwMaxKeyLength, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
{ {
RegCloseKey(hKey); RegCloseKey(hKey);
return; return;
} }
if (!dwNumLogs) if (!dwNumLogs)
{ {
RegCloseKey(hKey); RegCloseKey(hKey);
return; return;
} }
LogNames = HeapAlloc(GetProcessHeap(), 0, (dwNumLogs + 1) * sizeof(LPWSTR)); /* Take the NULL terminator into account */
++dwMaxKeyLength;
if (!LogNames) /* Allocate the temporary buffer */
LogName = HeapAlloc(GetProcessHeap(), 0, dwMaxKeyLength * sizeof(WCHAR));
if (!LogName)
{ {
RegCloseKey(hKey); RegCloseKey(hKey);
return; return;
} }
/* Allocate the list of event logs (add 1 to dwNumLogs in order to have one guard entry) */
LogNames = HeapAlloc(GetProcessHeap(), 0, (dwNumLogs + 1) * sizeof(LPWSTR));
if (!LogNames)
{
HeapFree(GetProcessHeap(), 0, LogName);
RegCloseKey(hKey);
return;
}
/* Enumerate and retrieve each event log name */
for (dwIndex = 0; dwIndex < dwNumLogs; dwIndex++) for (dwIndex = 0; dwIndex < dwNumLogs; dwIndex++)
{ {
LogNames[dwIndex] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ((dwMaxKeyLength + 1) * sizeof(WCHAR))); lpcName = dwMaxKeyLength;
if (RegEnumKeyExW(hKey, dwIndex, LogName, &lpcName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
if (LogNames[dwIndex] != NULL)
{ {
lpcName = dwMaxKeyLength + 1; LogNames[dwIndex] = NULL;
continue;
}
if (RegEnumKeyExW(hKey, dwIndex, LogNames[dwIndex], &lpcName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) /* Take the NULL terminator into account */
++lpcName;
/* Allocate the event log name string and copy it from the temporary buffer */
LogNames[dwIndex] = HeapAlloc(GetProcessHeap(), 0, lpcName * sizeof(WCHAR));
if (LogNames[dwIndex] == NULL)
continue;
StringCchCopyW(LogNames[dwIndex], lpcName, LogName);
/* Get the display name for the event log */
lpDisplayName = NULL;
ZeroMemory(szModuleName, sizeof(szModuleName));
if (GetDisplayNameFile(LogNames[dwIndex], szModuleName))
{
dwMessageID = GetDisplayNameID(LogNames[dwIndex]);
hLibrary = LoadLibraryExW(szModuleName, NULL, LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE);
if (hLibrary != NULL)
{ {
lpDisplayName = NULL; /* Retrieve the message string without appending extra newlines */
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE |
ZeroMemory(szModuleName, sizeof(szModuleName)); FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK,
GetDisplayNameFile(LogNames[dwIndex], szModuleName); hLibrary,
dwMessageID = GetDisplayNameID(LogNames[dwIndex]); dwMessageID,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
hLibrary = LoadLibraryExW(szModuleName, NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE); (LPWSTR)&lpDisplayName,
if (hLibrary != NULL) 0,
{ NULL);
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE, FreeLibrary(hLibrary);
hLibrary,
dwMessageID,
0,
(LPWSTR)&lpDisplayName,
0,
NULL);
FreeLibrary(hLibrary);
}
if (lpDisplayName)
{
InsertMenuW(hMainMenu, IDM_SAVE_EVENTLOG, MF_BYCOMMAND | MF_STRING, ID_FIRST_LOG + dwIndex, lpDisplayName);
}
else
{
InsertMenuW(hMainMenu, IDM_SAVE_EVENTLOG, MF_BYCOMMAND | MF_STRING, ID_FIRST_LOG + dwIndex, LogNames[dwIndex]);
}
/* Free the buffer allocated by FormatMessage */
if (lpDisplayName)
LocalFree(lpDisplayName);
} }
} }
if (lpDisplayName)
{
InsertMenuW(hMainMenu, IDM_SAVE_EVENTLOG, MF_BYCOMMAND | MF_STRING, ID_FIRST_LOG + dwIndex, lpDisplayName);
}
else
{
InsertMenuW(hMainMenu, IDM_SAVE_EVENTLOG, MF_BYCOMMAND | MF_STRING, ID_FIRST_LOG + dwIndex, LogNames[dwIndex]);
}
/* Free the buffer allocated by FormatMessage */
if (lpDisplayName)
LocalFree(lpDisplayName);
} }
InsertMenuW(hMainMenu, IDM_SAVE_EVENTLOG, MF_BYCOMMAND | MF_SEPARATOR, ID_FIRST_LOG + dwIndex + 1, NULL); InsertMenuW(hMainMenu, IDM_SAVE_EVENTLOG, MF_BYCOMMAND | MF_SEPARATOR, ID_FIRST_LOG + dwIndex + 1, NULL);
HeapFree(GetProcessHeap(), 0, LogName);
RegCloseKey(hKey); RegCloseKey(hKey);
return; return;
@ -1079,7 +1109,7 @@ FreeLogList(void)
DeleteMenu(hMainMenu, ID_FIRST_LOG + dwIndex + 1, MF_BYCOMMAND); DeleteMenu(hMainMenu, ID_FIRST_LOG + dwIndex + 1, MF_BYCOMMAND);
HeapFree(GetProcessHeap(), 0, LogNames); HeapFree(GetProcessHeap(), 0, LogNames);
LogNames = NULL;
dwNumLogs = 0; dwNumLogs = 0;
return; return;