zoukankan
html css js c++ java
一段精彩的Thunk代码(转载自 chinaaspx.com)
#include
<
windows.h
>
class
ZWindow;
ZWindow
*
g_pWnd
=
NULL;
#pragma pack(push,
1
)
struct
_WndProcThunk
{
DWORD m_mov;
//
mov dword ptr [esp+0x4], pThis (esp+0x4 is hWnd)
DWORD m_this;
BYTE m_jmp;
//
jmp WndProc
DWORD m_relproc;
//
relative jmp
}
;
#pragma pack(pop)
class
WndProcThunk
{
public
:
_WndProcThunk thunk;
void
Init(WNDPROC proc,
void
*
pThis)
{
thunk.m_mov
=
0x042444C7
;
//
C7 44 24 04
thunk.m_this
=
(DWORD)pThis;
thunk.m_jmp
=
0xe9
;
thunk.m_relproc
=
(
int
)proc
-
((
int
)
this
+
sizeof
(_WndProcThunk));
//
Jump多远?
::FlushInstructionCache(GetCurrentProcess(),
&
thunk,
sizeof
(thunk));
}
}
;
class
ZWindow
{
public
:
virtual
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return
FALSE;
}
HWND m_hWnd;
WndProcThunk m_thunk;
ZWindow(HWND hWnd
=
0
) : m_hWnd(hWnd)
{ }
inline
void
Attach(HWND hWnd)
{ m_hWnd
=
hWnd; }
inline BOOL ShowWindow(
int
nCmdShow)
{
return
::ShowWindow(m_hWnd, nCmdShow); }
inline BOOL UpdateWindow()
{
return
::UpdateWindow(m_hWnd); }
inline HDC BeginPaint(LPPAINTSTRUCT ps)
{
return
::BeginPaint(m_hWnd, ps); }
inline BOOL EndPaint(LPPAINTSTRUCT ps)
{
return
::EndPaint(m_hWnd, ps); }
inline BOOL GetClientRect(LPRECT rect)
{
return
::GetClientRect(m_hWnd, rect); }
BOOL Create(LPCTSTR szClassName, LPCTSTR szTitle, HINSTANCE hInstance, HWND hWndParent
=
0
,
DWORD dwStyle
=
WS_OVERLAPPEDWINDOW, DWORD dwExStyle
=
0
, HMENU hMenu
=
0
,
int
x
=
CW_USEDEFAULT,
int
y
=
CW_USEDEFAULT,
int
nWidth
=
CW_USEDEFAULT,
int
nHeight
=
CW_USEDEFAULT)
{
m_hWnd
=
::CreateWindowEx(dwExStyle, szClassName, szTitle, dwStyle, x, y,
nWidth, nHeight, hWndParent, hMenu, hInstance, NULL);
return
m_hWnd
!=
NULL;
}
static
LRESULT CALLBACK StartWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
ZWindow
*
pThis
=
g_pWnd;
pThis
->
m_hWnd
=
hWnd;
//
initilize the thunk code
pThis
->
m_thunk.Init(WindowProc, pThis);
//
get the address of thunk code
WNDPROC pProc
=
(WNDPROC)
&
(pThis
->
m_thunk.thunk);
::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pProc);
return
pProc(hWnd, uMsg, wParam, lParam);
}
static
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
ZWindow
*
pThis
=
(ZWindow
*
)hWnd;
if
(uMsg
==
WM_NCDESTROY)
::PostQuitMessage(
0
);
if
(
!
pThis
->
ProcessWindowMessage(pThis
->
m_hWnd, uMsg, wParam, lParam))
return
::DefWindowProc(pThis
->
m_hWnd, uMsg, wParam, lParam);
else
return
0
;
}
}
;
class
ZDriveWindow1 :
public
ZWindow
{
public
:
virtual
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnPaint(WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
RECT rect;
hDC
=
BeginPaint(
&
ps);
GetClientRect(
&
rect);
::SetBkMode(hDC, TRANSPARENT);
::DrawText(hDC,
"
ZDriveWindow1
"
,
-
1
,
&
rect, DT_CENTER
|
DT_VCENTER
|
DT_SINGLELINE);
EndPaint(
&
ps);
return
0
;
}
LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam)
{
::MessageBox(NULL,
"
ZDriveWindow1::OnLButtonDown
"
,
"
Msg
"
, MB_OK);
return
0
;
}
}
;
class
ZDriveWindow2 :
public
ZWindow
{
public
:
virtual
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnPaint(WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
RECT rect;
hDC
=
BeginPaint(
&
ps);
GetClientRect(
&
rect);
::SetBkMode(hDC, TRANSPARENT);
::Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom);
::DrawText(hDC,
"
ZDriveWindow2
"
,
-
1
,
&
rect, DT_CENTER
|
DT_VCENTER
|
DT_SINGLELINE);
EndPaint(
&
ps);
return
0
;
}
LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam)
{
::MessageBox(NULL,
"
ZDriveWindow2::OnLButtonDown
"
,
"
Msg
"
, MB_OK);
return
0
;
}
}
;
int
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int
nCmdShow)
{
char
szAppName[]
=
"
Hello world
"
;
MSG msg;
WNDCLASS wnd;
ZDriveWindow1 zwnd1;
ZDriveWindow2 zwnd2;
wnd.cbClsExtra
=
NULL;
wnd.cbWndExtra
=
NULL;
wnd.hbrBackground
=
(HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor
=
::LoadCursor(NULL, IDC_ARROW);
wnd.hIcon
=
::LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance
=
hInstance;
wnd.lpfnWndProc
=
ZWindow::StartWndProc;
wnd.lpszClassName
=
szAppName;
wnd.lpszMenuName
=
NULL;
wnd.style
=
CS_HREDRAW
|
CS_VREDRAW;
if
(
!
RegisterClass(
&
wnd))
{
::MessageBox(NULL,
"
Can not register window class
"
,
"
Error
"
, MB_OK
|
MB_ICONINFORMATION);
return
-
1
;
}
g_pWnd
=
&
zwnd1;
zwnd1.Create(szAppName,
"
Hell world
"
, hInstance);
zwnd1.ShowWindow(nCmdShow);
zwnd1.UpdateWindow();
g_pWnd
=
&
zwnd2;
zwnd2.Create(szAppName,
"
Test
"
, hInstance, zwnd1.m_hWnd,
WS_VISIBLE
|
WS_CHILD
|
ES_MULTILINE, NULL, NULL,
0
,
0
,
150
,
150
);
zwnd2.ShowWindow(nCmdShow);
while
(::GetMessage(
&
msg, NULL,
0
,
0
))
{
DispatchMessage(
&
msg);
}
return
msg.wParam;
}
BOOL ZDriveWindow1::ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch
(uMsg)
{
case
WM_LBUTTONDOWN:
OnLButtonDown(wParam, lParam);
break
;
case
WM_PAINT:
OnPaint(wParam, lParam);
break
;
}
return
FALSE;
}
BOOL ZDriveWindow2::ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch
(uMsg)
{
case
WM_LBUTTONDOWN:
OnLButtonDown(wParam, lParam);
break
;
case
WM_PAINT:
OnPaint(wParam, lParam);
break
;
}
return
FALSE;
}
查看全文
相关阅读:
阿里在线笔试总结
JAVA断言使用
小心人员中的薄弱点
Ubuntu 12.04.4 LTS下linphone-android编译记录
Java基础:异常的限制
Java基础:小知识点
js正则表达式中和\
Maven管理下Struts、Hibernate编译过程中配置文件缺失导致的“No result defined for action”和getSession()发生“NullPointerException”的解决办法
Java基础:final关键字
Java基础:复用类
原文地址:https://www.cnblogs.com/xiaotaoliang/p/235586.html
最新文章
优先级翻转
S5PV210启动过程详解
GPIO接口及点亮第一个LED灯
ARM处理器寻址方式
ARM体系结构_嵌入式概述及开发环境的构建
线程的互斥锁
线程的基础知识
Qt 实现浏览本地文件、双击打开选中的文档
Qt软件的发展历史及优势特点
利用断言实现strcmp,strcmp,strcat,strcpy
热门文章
Qt的发展和优势
作业错题知识点总结8.6~8.10
C++历史发展及优缺点
Linux内存总结
计算机网络
僵尸进程
指针知识点总结
字符串赋值给字符指针变量
观《互联网时代》有感
C语言编程规范
Copyright © 2011-2022 走看看