[USER32][UXTHEME]

- Make API hooks type-safe. Fixes stack pointer corruption when calling ThemeGetScrollInfo. Powered by /RTC1

svn path=/trunk/; revision=73862
This commit is contained in:
Thomas Faber 2017-02-20 17:31:50 +00:00
parent 2475975c7d
commit ea43e3d3dc
3 changed files with 52 additions and 40 deletions

View file

@ -269,7 +269,7 @@ int WINAPI ThemeSetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw)
return user32ApiHook.SetWindowRgn(hWnd, hRgn, bRedraw); return user32ApiHook.SetWindowRgn(hWnd, hRgn, bRedraw);
} }
BOOL ThemeGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi) BOOL WINAPI ThemeGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
{ {
PWND_CONTEXT pwndContext; PWND_CONTEXT pwndContext;
DWORD style; DWORD style;
@ -341,7 +341,7 @@ ThemeInitApiHook(UAPIHK State, PUSERAPIHOOK puah)
puah->DlgProcArray.Size = UAHOWP_MAX_SIZE; puah->DlgProcArray.Size = UAHOWP_MAX_SIZE;
puah->SetWindowRgn = ThemeSetWindowRgn; puah->SetWindowRgn = ThemeSetWindowRgn;
puah->GetScrollInfo = (FARPROC)ThemeGetScrollInfo; puah->GetScrollInfo = ThemeGetScrollInfo;
UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCPAINT); UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCPAINT);
UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCACTIVATE); UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCACTIVATE);

View file

@ -204,6 +204,18 @@ BOOL WINAPI DrawCaptionTempW(HWND,HDC,const RECT*,HFONT,HICON,LPCWSTR,UINT);
typedef LRESULT(CALLBACK *WNDPROC_OWP)(HWND,UINT,WPARAM,LPARAM,ULONG_PTR,PDWORD); typedef LRESULT(CALLBACK *WNDPROC_OWP)(HWND,UINT,WPARAM,LPARAM,ULONG_PTR,PDWORD);
typedef int (WINAPI *SETWINDOWRGN)(HWND hWnd, HRGN hRgn, BOOL bRedraw); typedef int (WINAPI *SETWINDOWRGN)(HWND hWnd, HRGN hRgn, BOOL bRedraw);
typedef BOOL (WINAPI *GETSCROLLINFO)(HWND,INT,LPSCROLLINFO);
typedef INT (WINAPI *SETSCROLLINFO)(HWND,int,LPCSCROLLINFO,BOOL);
typedef BOOL (WINAPI *ENABLESCROLLBAR)(HWND,UINT,UINT);
typedef BOOL (WINAPI *ADJUSTWINDOWRECTEX)(LPRECT,DWORD,BOOL,DWORD);
typedef int (WINAPI *GETSYSTEMMETRICS)(int);
typedef BOOL (WINAPI *SYSTEMPARAMETERSINFOA)(UINT,UINT,PVOID,UINT);
typedef BOOL (WINAPI *SYSTEMPARAMETERSINFOW)(UINT,UINT,PVOID,UINT);
typedef BOOL (__fastcall *FORCERESETUSERAPIHOOK)(HINSTANCE);
typedef BOOL (WINAPI *DRAWFRAMECONTROL)(HDC,LPRECT,UINT,UINT);
typedef BOOL (WINAPI *DRAWCAPTION)(HWND,HDC,LPCRECT,UINT);
typedef BOOL (WINAPI *MDIREDRAWFRAME)(HWND,DWORD);
typedef DWORD (WINAPI *GETREALWINDOWOWNER)(HWND);
typedef struct _UAHOWP typedef struct _UAHOWP
{ {
@ -221,10 +233,10 @@ typedef struct tagUSERAPIHOOK
WNDPROC DefWindowProcA; WNDPROC DefWindowProcA;
WNDPROC DefWindowProcW; WNDPROC DefWindowProcW;
UAHOWP DefWndProcArray; UAHOWP DefWndProcArray;
FARPROC GetScrollInfo; GETSCROLLINFO GetScrollInfo;
FARPROC SetScrollInfo; SETSCROLLINFO SetScrollInfo;
FARPROC EnableScrollBar; ENABLESCROLLBAR EnableScrollBar;
FARPROC AdjustWindowRectEx; ADJUSTWINDOWRECTEX AdjustWindowRectEx;
SETWINDOWRGN SetWindowRgn; SETWINDOWRGN SetWindowRgn;
WNDPROC_OWP PreWndProc; WNDPROC_OWP PreWndProc;
WNDPROC_OWP PostWndProc; WNDPROC_OWP PostWndProc;
@ -232,14 +244,14 @@ typedef struct tagUSERAPIHOOK
WNDPROC_OWP PreDefDlgProc; WNDPROC_OWP PreDefDlgProc;
WNDPROC_OWP PostDefDlgProc; WNDPROC_OWP PostDefDlgProc;
UAHOWP DlgProcArray; UAHOWP DlgProcArray;
FARPROC GetSystemMetrics; GETSYSTEMMETRICS GetSystemMetrics;
FARPROC SystemParametersInfoA; SYSTEMPARAMETERSINFOA SystemParametersInfoA;
FARPROC SystemParametersInfoW; SYSTEMPARAMETERSINFOW SystemParametersInfoW;
FARPROC ForceResetUserApiHook; FORCERESETUSERAPIHOOK ForceResetUserApiHook;
FARPROC DrawFrameControl; DRAWFRAMECONTROL DrawFrameControl;
FARPROC DrawCaption; DRAWCAPTION DrawCaption;
FARPROC MDIRedrawFrame; MDIREDRAWFRAME MDIRedrawFrame;
FARPROC GetRealWindowOwner; GETREALWINDOWOWNER GetRealWindowOwner;
} USERAPIHOOK, *PUSERAPIHOOK; } USERAPIHOOK, *PUSERAPIHOOK;
typedef enum _UAPIHK typedef enum _UAPIHK

View file

@ -28,7 +28,7 @@ INT WINAPI RealSetScrollInfo(HWND,int,LPCSCROLLINFO,BOOL);
BOOL WINAPI RealSystemParametersInfoA(UINT,UINT,PVOID,UINT); BOOL WINAPI RealSystemParametersInfoA(UINT,UINT,PVOID,UINT);
BOOL WINAPI RealSystemParametersInfoW(UINT,UINT,PVOID,UINT); BOOL WINAPI RealSystemParametersInfoW(UINT,UINT,PVOID,UINT);
DWORD WINAPI GetRealWindowOwner(HWND); DWORD WINAPI GetRealWindowOwner(HWND);
LRESULT WINAPI RealUserDrawCaption(HWND hWnd, HDC hDC, LPCRECT lpRc, UINT uFlags); BOOL WINAPI RealUserDrawCaption(HWND hWnd, HDC hDC, LPCRECT lpRc, UINT uFlags);
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
@ -137,10 +137,10 @@ ResetUserApiHook(PUSERAPIHOOK puah)
puah->DefWindowProcW = RealDefWindowProcW; puah->DefWindowProcW = RealDefWindowProcW;
puah->DefWndProcArray.MsgBitArray = NULL; puah->DefWndProcArray.MsgBitArray = NULL;
puah->DefWndProcArray.Size = 0; puah->DefWndProcArray.Size = 0;
puah->GetScrollInfo = (FARPROC)RealGetScrollInfo; puah->GetScrollInfo = RealGetScrollInfo;
puah->SetScrollInfo = (FARPROC)RealSetScrollInfo; puah->SetScrollInfo = RealSetScrollInfo;
puah->EnableScrollBar = (FARPROC)NtUserEnableScrollBar; puah->EnableScrollBar = NtUserEnableScrollBar;
puah->AdjustWindowRectEx = (FARPROC)RealAdjustWindowRectEx; puah->AdjustWindowRectEx = RealAdjustWindowRectEx;
puah->SetWindowRgn = NtUserSetWindowRgn; puah->SetWindowRgn = NtUserSetWindowRgn;
puah->PreWndProc = DefaultOWP; puah->PreWndProc = DefaultOWP;
puah->PostWndProc = DefaultOWP; puah->PostWndProc = DefaultOWP;
@ -150,14 +150,14 @@ ResetUserApiHook(PUSERAPIHOOK puah)
puah->PostDefDlgProc = DefaultOWP; puah->PostDefDlgProc = DefaultOWP;
puah->DlgProcArray.MsgBitArray = NULL; puah->DlgProcArray.MsgBitArray = NULL;
puah->DlgProcArray.Size = 0; puah->DlgProcArray.Size = 0;
puah->GetSystemMetrics = (FARPROC)RealGetSystemMetrics; puah->GetSystemMetrics = RealGetSystemMetrics;
puah->SystemParametersInfoA = (FARPROC)RealSystemParametersInfoA; puah->SystemParametersInfoA = RealSystemParametersInfoA;
puah->SystemParametersInfoW = (FARPROC)RealSystemParametersInfoW; puah->SystemParametersInfoW = RealSystemParametersInfoW;
puah->ForceResetUserApiHook = (FARPROC)ForceResetUserApiHook; puah->ForceResetUserApiHook = ForceResetUserApiHook;
puah->DrawFrameControl = (FARPROC)RealDrawFrameControl; puah->DrawFrameControl = RealDrawFrameControl;
puah->DrawCaption = (FARPROC)RealUserDrawCaption; puah->DrawCaption = RealUserDrawCaption;
puah->MDIRedrawFrame = (FARPROC)RealMDIRedrawFrame; puah->MDIRedrawFrame = RealMDIRedrawFrame;
puah->GetRealWindowOwner = (FARPROC)GetRealWindowOwner; puah->GetRealWindowOwner = GetRealWindowOwner;
} }
BOOL BOOL
@ -262,7 +262,7 @@ InitUserApiHook(HINSTANCE hInstance, USERAPIHOOKPROC pfn)
RtlEnterCriticalSection(&gcsUserApiHook); RtlEnterCriticalSection(&gcsUserApiHook);
if (!pfn(uahLoadInit,&uah) || // Swap data, User32 to and Uxtheme from! if (!pfn(uahLoadInit,&uah) || // Swap data, User32 to and Uxtheme from!
uah.ForceResetUserApiHook != (FARPROC)ForceResetUserApiHook || uah.ForceResetUserApiHook != ForceResetUserApiHook ||
uah.size <= 0 ) uah.size <= 0 )
{ {
RtlLeaveCriticalSection(&gcsUserApiHook); RtlLeaveCriticalSection(&gcsUserApiHook);
@ -347,10 +347,10 @@ USERAPIHOOK guah =
RealDefWindowProcA, RealDefWindowProcA,
RealDefWindowProcW, RealDefWindowProcW,
{NULL, 0}, {NULL, 0},
(FARPROC)RealGetScrollInfo, RealGetScrollInfo,
(FARPROC)RealSetScrollInfo, RealSetScrollInfo,
(FARPROC)NtUserEnableScrollBar, NtUserEnableScrollBar,
(FARPROC)RealAdjustWindowRectEx, RealAdjustWindowRectEx,
NtUserSetWindowRgn, NtUserSetWindowRgn,
DefaultOWP, DefaultOWP,
DefaultOWP, DefaultOWP,
@ -358,14 +358,14 @@ USERAPIHOOK guah =
DefaultOWP, DefaultOWP,
DefaultOWP, DefaultOWP,
{NULL, 0}, {NULL, 0},
(FARPROC)RealGetSystemMetrics, RealGetSystemMetrics,
(FARPROC)RealSystemParametersInfoA, RealSystemParametersInfoA,
(FARPROC)RealSystemParametersInfoW, RealSystemParametersInfoW,
(FARPROC)ForceResetUserApiHook, ForceResetUserApiHook,
(FARPROC)RealDrawFrameControl, RealDrawFrameControl,
(FARPROC)NtUserDrawCaption, NtUserDrawCaption,
(FARPROC)RealMDIRedrawFrame, RealMDIRedrawFrame,
(FARPROC)GetRealWindowOwner, GetRealWindowOwner,
}; };
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/