首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CopyItems和MoveItems在windows-7 64位上崩溃

CopyItems和MoveItems在windows-7 64位上崩溃
EN

Stack Overflow用户
提问于 2012-08-20 13:55:07
回答 1查看 809关注 0票数 4

我挂接了函数,即IFileOperation::CopyItems来实现文件复制监控。我的代码在windows-7 32位机器上运行完美,但它在windows-7 64位机器上崩溃,请帮助我,我的代码如下所示。

代码语言:javascript
复制
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, IUnknown *punkItems,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}\0",
      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", L"Info!", 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", L"Info!", MB_ICONWARNING|MB_OK);    
      }
      if (MH_CreateHook(&CoCreateInstance, &CoCreateInstanceCallback, reinterpret_cast<void**>(&Real_CoCreateInstance)) != MH_OK)
      {
          MessageBoxW(NULL,L"Failed MH_CreateHook CoCreateInstance",L"Info!",MB_ICONWARNING|MB_OK);
      }
      if (MH_EnableHook(&CoCreateInstance) != MH_OK)
      {
          MessageBoxW(NULL,L"Failed MH_EnableHook StartDocA",L"Info!",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 ()函数中崩溃,请仔细检查一下,找出我的代码有什么问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-20 15:30:52

也许你应该在x64上使用return *(PVOID*)(*(DWORD_PTR*)intf + methodIndex);。指针将按8字节的指针大小递增。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12032828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档