中易网

typedef int(WINAPI* PFNMESSAGEBOX)(HWND,LPCSTR,LPCSTR,UINT uType);这是一个什么玩艺?

答案:3  悬赏:20  
解决时间 2021-03-12 12:08
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"user32.lib")

BOOL SetHook(HMODULE);
typedef int(WINAPI* PFNMESSAGEBOX)(HWND,LPCSTR,LPCSTR,UINT uType); //在什么情况下,怎么用? 谢谢!
PROC g_orgProc = (PROC)MessageBoxA;

void main()
{
::MessageBox(NULL,"original function.", "testDemo",0);
SetHook(::GetModuleHandle(NULL));
::MessageBox(NULL, "original function.", "testDemo",0);
getchar();
}

int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return ((PFNMESSAGEBOX)g_orgProc)(hWnd,"new function","testDemo",uType);
}

BOOL SetHook(HMODULE hMod)
{
IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hMod;
IMAGE_OPTIONAL_HEADER * pOptHeader = (IMAGE_OPTIONAL_HEADER*)((BYTE*)hMod + pDosHeader->e_lfanew + 24);
IMAGE_IMPORT_DESCRIPTOR * pImportDesc = (IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)hMod+pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while ( pImportDesc->FirstThunk )
{
char* pszDllName = (char*)((BYTE*)hMod + pImportDesc->Name);

if ( lstrcmpiA(pszDllName,"user32.dll") == 0 )
{
break;
}
pImportDesc++;
}

if ( pImportDesc->FirstThunk )
{
IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)hMod + pImportDesc->FirstThunk);

while ( pThunk->u1.Function )
{
DWORD* lpAddr = (DWORD*)&(pThunk->u1.Function);

if ( *lpAddr == (DWORD)g_orgProc )
{
DWORD* lpNewProc = (DWORD*)MyMessageBoxA;
::WriteProcessMemory(GetCurrentProcess(), lpAddr, &lpNewProc, sizeof(DWORD), NULL);
return TRUE;
}
pThunk++;
}
}

return FALSE;
}
最佳答案
申明了一个函数指针,(HWND,LPCSTR,LPCSTR,UINT uType)是参数类型,前面部分是返回类型,PFNMESSAGEBOX是类型符号
可以这样使用:

PFNMESSAGEBOX pMsgBox=MyMessageBox;
pMsgBox(hWnd,"asdf","asdf",0);就相当与执行MyMessageBox(hWnd,"asdf","asdf",0);
指向的函数返回类型和参数相同
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return 0;
}
全部回答
typedef 是类型重定义的关键词 typedef int(WINAPI* PFNMESSAGEBOX .... 表示定义一个函数指针类型
声名函数指针 定义 PFNMESSAGEBOX是一个函数指针,指向 返回 int,类型是WINAPI,参数4个,HWND,LPCSTR,LPCSTR,UINT 用处就是指向函数地址... 可以详细百度一下函数指针..
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎样知道别人查询我的银行卡余额
数学题:a,b,c为三角形三边,且满足a²(b-
甲从A地已每小时6千米的速度向B地行驶,40分
免维护电瓶发热是怎么回事
贷款买的车,半年就有质量有问题怎么办?
阿杰超市这个地址在什么地方,我要处理点事
算法在将来的项目开发中到底占有多大的分量,
求海信的GPON光模块LTB3468L的详细资料~Data
焊接完电焊焊把怎样放置
如何提升员工的企业归属感?
我存在你的过去式繁体字
七峰站这个地址在什么地方,我要处理点事
太行大峡谷桃花谷可单独买票吗
招商银行支票到平安银行进账多久时间可以到账
齿鲜香麻辣烫在哪里啊,我有事要去这个地方
推荐资讯
起亚k2怂车是怎么回事
关于Excel导入bartender的问题。表格中有一列
膳魔师在什么地方啊,我要过去处理事情
I visit my grandparents twice a month.对划
贷款信息提交快一月了,为什么什么消息也没有
哪里的闽南话最标准.
沙子在哪里可以弄到
联通宽带电视机顶盒错误代码025是什么意思
南京辰创文化发展有限公司在什么地方啊,我要
梦幻西游1千万放在家里会变成储备金吧
各位大神,这两串哪个好啊?怎么盘金刚啊?到
酒瓶兰叶子发黄怎么办
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?