当使用Detours挂钩FindNextFileW
时,如果没有挂起进程,我无法修改返回的条目。我正在尝试创建一个垫片,将存档作为文件系统上的文件夹公开。
当我将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;
}
我确信钩子正在被调用,因为当我启用它时,我可以将信息转储到我的日志文件中。