我想知道用一个全局钩子去hook createfile API,能否做到只是一个drive受影响,别的drive不受影响,比如说,当插入u盘是,u盘不能createfile,而C:和D:可以createfile,不受影响,只用全局钩子能否做到?
解决方案 »
- 求助各位!!!一个简单的windows api程序问题!!!!
- 求QueryPerformanceFrequency和QueryPerformanceCounter如何实现四十毫秒的精确计时 求高手解答
- 请问如果将别人做好的C++类封装成dll文件啊?
- dll的问题
- 在rich edit控件中输出数据时的问题
- MFC应该程序如何和WIN32命令行应用程序通信???
- 为什么在调试程序的时候发现指向一个类(eg CView)的指针有值,而其句柄却是用问号显示?
- 开一个数的3次方用什么函数?
- 运用Kmeans算法解决一个模式识别的问题
- 十分菜的问题。如何动态改变对话框的标题,如mp3播放器标题是歌的名字
- VC编译和运行不正常
- 请问同个窗口如何如何既可以有模也可以无模
可以做个例子看看吗?什么是全路径?比如我G drive是u盘,那么“G:\\"是全路径吗?
还是我只是拿G来做判断?我现在是用DRIVE_REMOVABLE来作判断,当系统发现有u盘时createfile return 0,
问题是现在不单单u盘不可以createfile,连其他drive都受到影响,不知道怎么做,,很急
我是这样理解的,因为现在我做的全局钩子,当插入u盘时,我就要createfile return 0,所以当系统发现有u盘插入时,不管时DRIVE_FIXED还是DRIVE_REMOVABLE,一律return 0,但我现在只是想u盘不可以createfile,而其他盘不受影响,不知道怎样做,
很急
1、插入U盘,系统会有发现新硬件的消息
2、根据此消息应该能获得U盘盘符
3、根据createfile的传入路径参数判断是否U盘盘符
你说的第三点,是在那里做判断,是在dll里面吗?谢了
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);}
if(strncmp(lpFileName,"G:",2) ==0 || strncmp(lpFileName,"g:",2) ==0)
{
return 0;
}
当我一return 0,就会变成全部drive都不可以createfile了
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);}
qq;183209937
邮箱;[email protected]
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.