C++ 弯钩FindNextFileW悬挂

C++ 弯钩FindNextFileW悬挂,c++,windows,winapi,detours,C++,Windows,Winapi,Detours,当使用迂回挂接FindNextFileW时,如果不挂起进程,我无法修改返回的条目。我正在尝试创建一个垫片,将归档文件作为文件夹公开在文件系统上 当我将LPWIN32\u FIND\u DATAW->dwFileAttributes设置为FILE\u ATTRIBUTE\u目录或使用逻辑or操作时,也会发生同样的情况。当使用存档调用钩子时,文件的属性通常是file\u ATTRIBUTE\u ARCHIVE 以下是我用于此目的的代码,为了简洁起见,删除了错误处理和日志记录 #include <

当使用迂回挂接
FindNextFileW
时,如果不挂起进程,我无法修改返回的条目。我正在尝试创建一个垫片,将归档文件作为文件夹公开在文件系统上

当我将
LPWIN32\u FIND\u DATAW->dwFileAttributes
设置为
FILE\u ATTRIBUTE\u目录
或使用逻辑or操作时,也会发生同样的情况。当使用存档调用钩子时,文件的属性通常是
file\u ATTRIBUTE\u 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;
}
#包括
#包括
#包括
#定义真
#定义false false
#定义空值
静态BOOL endsWithWide(WCHAR*文本,WCHAR*键){
BOOL endsWith=真;
大小\u t size=wcslen(文本);
大小\u t键大小=wcslen(键);
对于(int i=0;i<4;i++){
if(text[size-i-1]!=key[keySize-i-1]){
endsWith=false;
打破
}
}
返回端开关;
}
静态BOOL(WINAPI*realfindextfilew)(
_在uuhandle hFindFile中,
_Out_uwWin32_FIND_DATAW lpFindFileData
)=FindNextFileW;
静态BOOL WINAPI ourFindNextFileW(
_在uuhandle hFindFile中,
_Out_uwWin32_FIND_DATAW lpFindFileData
) {
BOOL result=realfindextfilew(
hFindFile,
lpFindFileData
);
如果(结果){
if(endsWithWide(lpFindFileData->cFileName,(WCHAR*)L.zip”)){
lpFindFileData->dwFileAttributes |=文件属性目录;
lpFindFileData->nFileSizeHigh=0;
lpFindFileData->nFileSizeLow=0;
}
}
返回结果;
}
BOOL WINAPI/*APIENTRY*/DllMain(
HMODULE模块,
德沃德理由,
保留LPVOID
){
if(迂回过程()){
返回true;
}
如果(原因==DLL\U进程\U附加){
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)realfindextfilew,ourFindNextFileW);
DetourTransactionCommit();
}
else if(原因==DLL\u进程\u分离){
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)realfindextfilew,ourFindNextFileW);
DetourTransactionCommit();
}
返回true;
}

我确信钩子正在被调用,因为启用钩子后,我可以将信息转储到日志文件中。

endsWithWide
应该检查文件名的长度,否则可能会出现未定义的行为。但除此之外,您是否使用调试器查看它挂起的位置?这不是问题所在,因为我可以在调用后打印到日志中。它在离开我的钩子后挂起,目标进程恢复。我没有访问它的来源或类似的东西。我没有说这是问题所在。但是这是一个问题。哦,我没有发布,我没有更新for循环,从我把它拉出来并把它变成一个函数开始。至少第二个参数总是.zip。我想知道当它是一个目录时,应用程序/系统是否以某种方式使用了保留字段。也许我需要为此计算一些值?知道他们可能是什么吗?