我想知道用一个全局钩子去hook createfile API,能否做到只是一个drive受影响,别的drive不受影响,比如说,当插入u盘是,u盘不能createfile,而C:和D:可以createfile,不受影响,只用全局钩子能否做到?

解决方案 »

  1.   

    to vcPlayer 
    可以做个例子看看吗?什么是全路径?比如我G drive是u盘,那么“G:\\"是全路径吗?
    还是我只是拿G来做判断?我现在是用DRIVE_REMOVABLE来作判断,当系统发现有u盘时createfile return 0,
    问题是现在不单单u盘不可以createfile,连其他drive都受到影响,不知道怎么做,,很急
      

  2.   

    可能是现在的SATA的硬盘,系统也把他当成DRIVE_REMOVABLE了
      

  3.   

    to greatws 如果我不插入u盘,而用DRIVE_FIXED来做判断,也一样全部drive不可以createfile,
    我是这样理解的,因为现在我做的全局钩子,当插入u盘时,我就要createfile return 0,所以当系统发现有u盘插入时,不管时DRIVE_FIXED还是DRIVE_REMOVABLE,一律return 0,但我现在只是想u盘不可以createfile,而其他盘不受影响,不知道怎样做,
    很急
      

  4.   

    根据路径判断吧
    1、插入U盘,系统会有发现新硬件的消息
    2、根据此消息应该能获得U盘盘符
    3、根据createfile的传入路径参数判断是否U盘盘符
      

  5.   

    to greatws 
    你说的第三点,是在那里做判断,是在dll里面吗?谢了
      

  6.   

    detours这样用的话应该可以,假设U盘为H:
    static HANDLE (WINAPI * TrueCreateFile)(LPCTSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE) = CreateFile;HANDLE WINAPI MyCreateFile(
      LPCTSTR lpFileName, 
      DWORD dwDesiredAccess, 
      DWORD dwShareMode, 
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
      DWORD dwCreationDisposition, 
      DWORD dwFlagsAndAttributes, 
      HANDLE hTemplateFile
    )
    {
        if(strncmp(lpFileName,"H:",2) ==0 || strncmp(lpFileName,"h:",2) ==0)
        {
            return NULL;
        }
        return TrueCreateFile(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);}
      

  7.   

    to greatws 你给的代码不可以啊,假设u盘为G:,
    if(strncmp(lpFileName,"G:",2) ==0 || strncmp(lpFileName,"g:",2) ==0)
        {
            return 0;
        }
    当我一return 0,就会变成全部drive都不可以createfile了
      

  8.   

    你这样试下,我测试过,没问题static HANDLE (WINAPI * TrueCreateFile)(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE) = CreateFileW;HANDLE WINAPI MyCreateFile(
      LPCWSTR lpFileName, 
      DWORD dwDesiredAccess, 
      DWORD dwShareMode, 
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
      DWORD dwCreationDisposition, 
      DWORD dwFlagsAndAttributes, 
      HANDLE hTemplateFile
    )
    {
        if(wcsncmp(lpFileName,L"g:",2) ==0 || wcsncmp(lpFileName,L"G:",2) ==0)
        {
            return NULL;
        }
        return TrueCreateFile(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);}
      

  9.   

    to greatws 不知能否把那你的代码发给我看看,我会另外开贴以100分相谢
    qq;183209937
    邮箱;[email protected]
      

  10.   

    我把你的代码中间的一部分放入我的代码中HANDLE WINAPI MyCreateFileW(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);DETOUR_TRAMPOLINE(HANDLE WINAPI MyCreateFileW(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile), CreateFileW);
    HANDLE WINAPI NewCreateFileW(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile){if(strncmp(lpFileName,"g:",2) ==0 || strncmp(lpFileName,"G:",2) ==0)
        {
            return 0;
        } HANDLE result=MyCreateFileW(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile); 
    return result;
    }BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    OutputDebugString("Detour dll Load!");
    DetourFunctionWithTrampoline((PBYTE)MyCreateFileA,(PBYTE)NewCreateFileA);
            DetourFunctionWithTrampoline((PBYTE)MyCreateFileW,(PBYTE)NewCreateFileW);
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    OutputDebugString("Detour dll exit");
    DetourRemove((PBYTE)MyCreateFileA,(PBYTE)NewCreateFileA);
            DetourRemove((PBYTE)MyCreateFileW,(PBYTE)NewCreateFileW);
    break;
        }
        return TRUE;
    }但还是不行,还有请问为什么你createfile 是return NULL?应该return 0才对啊。msdn是这样写的If the file does not exist before the call, GetLastError returns zero. INVALID_HANDLE_VALUE indicates failure.
      

  11.   

    NULL不就是0么?你要用宽字符,就从头到尾都用,别一会宽一会ANSI....工程已经发给你了