windows-nt/Source/XPSP1/NT/windows/appcompat/shims/general/loadcomctl32version5.cpp
2020-09-26 16:20:57 +08:00

159 lines
5.7 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
e.cpp
Abstract:
This DLL Hooks CreateWindow, DialogBox, and CreateDialog routines in order to
ensure that Comctl32 version 5 is loaded.
Notes:
This is a general purpose shim.
History:
05/25/2000 lamadio Added initial shims to ensure that comctl32 version 6
is loaded.
--*/
#include "precomp.h"
#include <stdio.h>
IMPLEMENT_SHIM_BEGIN(LoadComctl32Version5)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(CreateWindowExA)
APIHOOK_ENUM_ENTRY(CreateWindowExW)
APIHOOK_ENUM_ENTRY(DialogBoxParamA)
APIHOOK_ENUM_ENTRY(DialogBoxParamW)
APIHOOK_ENUM_ENTRY(DialogBoxIndirectParamA)
APIHOOK_ENUM_ENTRY(DialogBoxIndirectParamW)
APIHOOK_ENUM_ENTRY(CreateDialogParamA)
APIHOOK_ENUM_ENTRY(CreateDialogParamW)
APIHOOK_ENUM_ENTRY(CreateDialogIndirectParamA)
APIHOOK_ENUM_ENTRY(CreateDialogIndirectParamW)
APIHOOK_ENUM_END
BOOL g_fComctl32V5Loaded = FALSE;
typedef BOOL (__stdcall *PFNInitCommonControlsEx)(LPINITCOMMONCONTROLSEX);
void EnsureComctl32Version5IsLoaded()
{
if (g_fComctl32V5Loaded == FALSE) {
HMODULE hMod = GetModuleHandle(TEXT("Comctl32.dll"));
if (hMod == NULL) {
hMod = LoadLibrary(TEXT("Comctl32.dll"));
if (hMod) {
PFNInitCommonControlsEx pfn = (PFNInitCommonControlsEx)GetProcAddress(hMod, "InitCommonControlsEx");
if (pfn) {
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = 0x00003FFF; // Initialize all classes.
pfn(&icc);
}
}
}
g_fComctl32V5Loaded = TRUE; // Well, we tried. If we failed, we shouldn't try more than once.
}
}
HWND APIHOOK(CreateWindowExA)(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y,
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(CreateWindowExA)(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
}
HWND APIHOOK(CreateWindowExW)(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int X, int Y,
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(CreateWindowExW)(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
}
INT_PTR APIHOOK(DialogBoxParamA)(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(DialogBoxParamA)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
}
INT_PTR APIHOOK(DialogBoxParamW)(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(DialogBoxParamW)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
}
INT_PTR APIHOOK(DialogBoxIndirectParamA)(HINSTANCE hInstance, LPCDLGTEMPLATEA hDialogTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(DialogBoxIndirectParamA)(hInstance, hDialogTemplate, hWndParent, lpDialogFunc, dwInitParam);
}
INT_PTR APIHOOK(DialogBoxIndirectParamW)(HINSTANCE hInstance, LPCDLGTEMPLATEW hDialogTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(DialogBoxIndirectParamW)(hInstance, hDialogTemplate, hWndParent, lpDialogFunc, dwInitParam);
}
HWND APIHOOK(CreateDialogParamA)(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(CreateDialogParamA)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
}
HWND APIHOOK(CreateDialogParamW)(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(CreateDialogParamW)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
}
HWND APIHOOK(CreateDialogIndirectParamA)(HINSTANCE hInstance, LPCDLGTEMPLATEA lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(CreateDialogIndirectParamA)(hInstance, lpTemplate, hWndParent, lpDialogFunc, dwInitParam);
}
HWND APIHOOK(CreateDialogIndirectParamW)(HINSTANCE hInstance, LPCDLGTEMPLATEW lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
{
EnsureComctl32Version5IsLoaded();
return ORIGINAL_API(CreateDialogIndirectParamW)(hInstance, lpTemplate, hWndParent, lpDialogFunc, dwInitParam);
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(USER32.DLL, CreateWindowExA)
APIHOOK_ENTRY(USER32.DLL, CreateWindowExW)
APIHOOK_ENTRY(USER32.DLL, DialogBoxParamA)
APIHOOK_ENTRY(USER32.DLL, DialogBoxParamW)
APIHOOK_ENTRY(USER32.DLL, DialogBoxIndirectParamA)
APIHOOK_ENTRY(USER32.DLL, DialogBoxIndirectParamW)
APIHOOK_ENTRY(USER32.DLL, CreateDialogParamA)
APIHOOK_ENTRY(USER32.DLL, CreateDialogParamW)
APIHOOK_ENTRY(USER32.DLL, CreateDialogIndirectParamA)
APIHOOK_ENTRY(USER32.DLL, CreateDialogIndirectParamW)
HOOK_END
IMPLEMENT_SHIM_END