c++ - Detours Hook FindNextFileW Hang
问题描述
与 Detours挂钩FindNextFileW
时,我无法在没有进程挂起的情况下修改返回的条目。我正在尝试创建一个 shim,将存档作为文件系统上的文件夹公开。
当我设置或使用逻辑或操作时LPWIN32_FIND_DATAW->dwFileAttributes
,也会发生同样的事情。FILE_ATTRIBUTE_DIRECTORY
文件的属性通常是FILE_ATTRIBUTE_ARCHIVE
在使用存档调用挂钩时。
这是我为此使用的代码,为简洁起见,删除了错误处理和日志记录。
#include <stdio.h>
#include <Windows.h>
#include <detours.h>
#define true TRUE
#define false FALSE
#define null NULL
static BOOL endsWithWide(WCHAR* text, WCHAR* key) {
BOOL endsWith = true;
size_t size = wcslen(text);
size_t keySize = wcslen(key);
for (int i = 0; i < 4; i++) {
if (text[size - i - 1] != key[keySize - i - 1]) {
endsWith = false;
break;
}
}
return endsWith;
}
static BOOL(WINAPI* realFindNextFileW)(
_In_ HANDLE hFindFile,
_Out_ LPWIN32_FIND_DATAW lpFindFileData
) = FindNextFileW;
static BOOL WINAPI ourFindNextFileW(
_In_ HANDLE hFindFile,
_Out_ LPWIN32_FIND_DATAW lpFindFileData
) {
BOOL result = realFindNextFileW(
hFindFile,
lpFindFileData
);
if (result) {
if (endsWithWide(lpFindFileData->cFileName, (WCHAR*)L".zip")) {
lpFindFileData->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
lpFindFileData->nFileSizeHigh = 0;
lpFindFileData->nFileSizeLow = 0;
}
}
return result;
}
BOOL WINAPI /*APIENTRY*/ DllMain(
HMODULE module,
DWORD reason,
LPVOID reserved
){
if (DetourIsHelperProcess()) {
return true;
}
if (reason == DLL_PROCESS_ATTACH) {
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)realFindNextFileW, ourFindNextFileW);
DetourTransactionCommit();
}
else if (reason == DLL_PROCESS_DETACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)realFindNextFileW, ourFindNextFileW);
DetourTransactionCommit();
}
return true;
}
我确信钩子会被调用,因为当我启用它时,我可以将信息转储到我的日志文件中。
解决方案
推荐阅读
- nginx - 多个服务器块 - 无法解析主机
- javascript - 创建客户端 Spotify 播放器
- python - 使用上下文管理器复制 Tensorflow - __enter__ 和 __exit__ 错误
- c# - 使用 DependencyProperty 自定义控件的设计器行为
- javascript - 将用户输入保存到 PHP,然后在 Javascript 函数中使用
- boost-spirit-qi - 提升精神,phoenix::push_back 和语义动作中的功能
- geolocation - 在屏幕上加载地图时,地理位置会变慢
- python - 比较两个图像中连接组件的标签
- powershell - Powershell v5.1 Invoke-RestMethod 和绕过代理
- python - Python 中的包导入