winapi – CopyItems和MoveItems在Windows-7 64位上崩溃
发布时间:2020-12-14 05:25:48 所属栏目:Windows 来源:网络整理
导读:我正在挂钩函数,即IFileOperation :: CopyItems来实现文件复制监控.我的代码在 windows-7 32位机器上运行完美,但它在 Windows-7 64位机器上崩溃请帮助我,我的代码如下. PVOID GetInterfaceMethod(PVOID intf,DWORD methodIndex){ return *(PVOID*)(*(DWORD*)
我正在挂钩函数,即IFileOperation :: CopyItems来实现文件复制监控.我的代码在
windows-7 32位机器上运行完美,但它在
Windows-7 64位机器上崩溃请帮助我,我的代码如下.
PVOID GetInterfaceMethod(PVOID intf,DWORD methodIndex) { return *(PVOID*)(*(DWORD*)intf + methodIndex * 4); } typedef HRESULT (WINAPI *CopyItemsNext)(IFileOperation * pThis,IUnknown *punkItems,IShellItem *psiDestinationFolder); CopyItemsNext Real_CopyItems = NULL; CopyItemsNext Actual_CopyItems; HRESULT WINAPI CopyItemsCallback(IFileOperation * pThis,IShellItem *psiDestinationFolder) { MessageBoxW(NULL,L"CopyItems Function Called",L"HookedCopyItemS",MB_OK); return Real_CopyItems(pThis,punkItems,psiDestinationFolder); } HRESULT WINAPI CoCreateInstanceCallback(REFCLSID rclsid,LPUNKNOWN pUnkOuter,DWORD dwClsContext,REFIID riid,LPVOID *ppv) { const char *IFileOperation_GUID = "{3AD05575-8857-4850-9277-11B85BDB8E09}"; char GUIDString[64]; HRESULT HR = Real_CoCreateInstance(rclsid,pUnkOuter,dwClsContext,riid,ppv); sprintf_s(GUIDString,64,"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X} ",rclsid.Data1,rclsid.Data2,rclsid.Data3,rclsid.Data4[0],rclsid.Data4[1],rclsid.Data4[2],rclsid.Data4[3],rclsid.Data4[4],rclsid.Data4[5],rclsid.Data4[6],rclsid.Data4[7]); if(strcmp(GUIDString,IFileOperation_GUID) == 0) { MessageBoxA(NULL,"IFileOperation_GUID Found",GUIDString,MB_OK); if(Real_CopyItems == NULL) { Actual_CopyItems = (CopyItemsNext)GetInterfaceMethod(*ppv,17); MessageBoxA(NULL,"AFTER GetInterfaceMethod","TEST",MB_OK); if (MH_CreateHook(Actual_CopyItems,&CopyItemsCallback,reinterpret_cast<void**>(&Real_CopyItems)) != MH_OK) { MessageBoxW(NULL,L"Failed CreateHook Real_CopyItem",L"Info!",MB_ICONWARNING|MB_OK); } if (MH_EnableHook(Actual_CopyItems) != MH_OK) { MessageBoxW(NULL,L"Failed EnableHook Real_CopyItem",MB_ICONWARNING|MB_OK); } } } return HR; } //DllMain Function BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: if (MH_Initialize() != MH_OK) { MessageBoxW(NULL,L"Failed Initialize",MB_ICONWARNING|MB_OK); } if (MH_CreateHook(&CoCreateInstance,&CoCreateInstanceCallback,reinterpret_cast<void**>(&Real_CoCreateInstance)) != MH_OK) { MessageBoxW(NULL,L"Failed MH_CreateHook CoCreateInstance",MB_ICONWARNING|MB_OK); } if (MH_EnableHook(&CoCreateInstance) != MH_OK) { MessageBoxW(NULL,L"Failed MH_EnableHook StartDocA",MB_ICONWARNING|MB_OK); } break; case DLL_PROCESS_DETACH: if (MH_Uninitialize() != MH_OK) { } if (MH_DisableHook(Actual_CopyItems) != MH_OK) { } if (MH_DisableHook(&CoCreateInstance) != MH_OK) { } break; } return TRUE; } 虽然我得到的是Windows-7 64位的调试,但它在返回时会在GetInterfaceMethod()函数内部崩溃,请通过它查找我的代码plz有什么问题. 解决方法
也许你应该使用return *(PVOID *)(*(DWORD_PTR *)intf methodIndex);在x64上.指针将增加指针大小,即8个字节.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- DELL PowerEdge T630安装winserver2012
- hyper-v – Microsoft System Center虚拟机管理器
- 本地IIS上的Windows azure Web角色
- active-directory – dsadd给出“提供的名称不是正确形成的
- windows-server-2008-r2 – Win2008R2:暴力攻击预防
- winapi – “@”在以Windows字体名称作为前缀时的含义是什么
- hyper-v – Win 8 – 如何准备图像以使其不通过设置运行?
- windows – 如何手动确定当前操作系统的CodePage和Locale
- 窗口 – 如何使任务栏闪烁我的应用程序像Messenger当新消息
- 在Windows中使用Makefile编译C源代码
推荐文章
站长推荐
- windows – WiX,如何防止文件卸载虽然我们忘了设
- 证书 – 在Windows 8中,第三方INF驱动程序文件是
- windows – 如何为机器设置本地别名?
- 使用Windows DHCP / DHCPv6服务器而不设置静态地
- .net – 部署到Azure App Service时缺少Applicat
- windows-phone-8 – Windows phone 8模拟器无法接
- 何处下载适用于.NET 4.5的Microsoft Expression
- Microsoft Azure CDN是真正的CDN还是其他什么?
- rdo远程桌面管理快捷键在哪里?
- Windows上有哪些工具可用于模拟/模拟网络问题?
热点阅读