发布于  更新于 

静态获取MFC的MESSAGE_MAP表

调试MFC程序的时候,每次都要去找MESSAGE_MAP里的处理函数

MESSAGE_MAP的定义

1
2
3
4
5
6
7
BEGIN_MESSAGE_MAP(CMFChelloDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, &CMFChelloDlg::OnBnClickedOk)
ON_WM_DROPFILES()
END_MESSAGE_MAP()

AFX_MSGMAP_ENTRY结构

实际上每个BEGIN_MESSAGE都是一个AFX_MSGMAP_ENTRY结构

1
2
3
4
5
6
7
8
9
struct AFX_MSGMAP_ENTRY
{
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT_PTR nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
};

处理函数pfn

pfn即对应MESSAGE的处理函数

通过观察AFX_MSGMAP_ENTRY结构,其有以下特征

  • nMessage在{0,1024}的范围内
  • nCode似乎一直都是0
  • nSig是对pfn函数参数的sign,不同版本MFC也不同,范围大概在{0,100}
  • pfn肯定要位于代码段
  • AFX_MSGMAP_ENTRY肯定位于rdata段

通过以上限定即可找到所有处理函数pfn

代码地址

https://github.com/howmp/MFCFinder