159 lines
5.8 KiB
C++
159 lines
5.8 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
|
|
|