/*++ 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 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