4

我正在挂钩函数,即 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, 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 () 函数内部崩溃,请仔细检查并找出我的代码有什么问题。

4

1 回答 1

3

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

于 2012-08-20T07:30:51.733 回答