在 Windows XP 中,可以使用以下 shell32 挂钩来挂钩资源管理器:
Real_SHFileOperation = (T_SHFileOperation) DetourFindFunction("shell32.dll", "SHFileOperationW");
nError = DetourAttach(&(PVOID&)Real_SHFileOperation, Detoured_SHFileOperation);
if(nError != NO_ERROR)
{
TRACE_ERROR(g_hTrace, "DetourAttach SHFileOperation Failed (%d)", nError);
}
出于某种原因,在 Windows 7 上,即使 DetourAttach 仍然返回成功,这也不再有效。我安装的所有其他钩子(例如在 ntdll.dll 中)仍然有效,但我在 shell32.dll 中创建的钩子不再有效。
我将 Windbg 附加到资源管理器并运行uf shell32!SHFileOperationW
它表明该函数确实现在确实跳转到了我的函数:
SHELL32!SHFileOperationW:
76239708 e9039658fc jmp myhook!Detoured_SHFileOperation (727c2d10)
然而,不知何故,资源管理器跳过了我的弯路,进入了 SHFileOperation 函数的其他部分......