根据上一篇文章,又对计算器测试了下,发现 RegisterClassW 函数没有断到 窗口类出现。分析了下,发下计算机程序使用RegisterClassEx 函数注册的窗口类,
于是断点RegisterClassExW,成功到注册窗口类的地方:
内存中查看7FDD8:
发现第二项是0,奇怪,什么原因呢,我们在看第一个图,窗口注册类结构的pWndClassEx,可知函数发生变化,窗口注册类的类型也发生变化
其结构为:
#if(WINVER >= 0x0400)
typedef struct tagWNDCLASSEXA {
UINT cbSize;
/* Win 3.x */
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
/* Win 4.0 */
HICON hIconSm;
} WNDCLASSEXA, *PWNDCLASSEXA, NEAR *NPWNDCLASSEXA, FAR *LPWNDCLASSEXA;
typedef struct tagWNDCLASSEXW {
UINT cbSize;
/* Win 3.x */
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
/* Win 4.0 */
HICON hIconSm;
} WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;
#ifdef UNICODE
其结构第三项为 回调函数,后续分析请参考上一篇文章
Ps: 我们在下断点时, RegisterClass,RegisterClassEx 这两种都要测试,其他类似此种情况的函数一样处理。