HOOK createfileA 和createfileW的一个问题

naixian1983 2008-04-28 02:53:26
本人以前用Detours做了一个HOOK createfile这个API的程序,我把他直接return 0使整个电脑不能createfile


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)

{


return 0;

HANDLE Result=MyCreateFileW(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
return Result;

}



但我现在想把它改进,当插入u盘时,只有u盘不可以createfile,其他盘如C:D:不受影响,不知道我为什么我这样做法不成功??



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(GetDriveType(lpFileName)==DRIVE_REMOVABLE)
{


return 0;
}

HANDLE Result=MyCreateFileW(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
return Result;
...全文
886 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-04-29
  • 打赏
  • 举报
回复
应该是MyCreateFile函数有问题,你可以试一下,什么都不做直接返回MyCreateFile应该也不行。
naixian1983 2008-04-29
  • 打赏
  • 举报
回复
我换了另外一种方法做


HANDLE WINAPI NewCreateFileA(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile)

{

UINT uDriveType=::GetDriveType(lpFileName);

switch (uDriveType)
{
case DRIVE_REMOVABLE:
{

OutputDebugString("DRIVE_REMOVABLE");
return 0;
break;

}
case DRIVE_FIXED:
{

OutputDebugString("DRIVE_FIXED");

break;

}

case DRIVE_UNKNOWN:
{

OutputDebugString("DRIVE_UNKNOWN");
return 0;
break;
}
case DRIVE_CDROM:
{

OutputDebugString("DRIVE_CDROM");
return 0;
break;
}

}






HANDLE result=MyCreateFileA(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
return result;
}


结果这个方法无论是DRIVE_FIXED还是DRIVE_REMOVABLE,hook createfile这个API失效了,
为什么为什么?????
sam88888 2008-04-29
  • 打赏
  • 举报
回复
up
naixian1983 2008-04-29
  • 打赏
  • 举报
回复
to zoulie,cnzdgs

我不是很明白你们的意思,可以在我的代码上改来看看吗,如果可以,另加分相谢

zoulie 2008-04-29
  • 打赏
  • 举报
回复
调用你的MyCreateFileW后,一定要调用原来的系统API CreateFileW 来维持堆栈平衡,不然就会调用失败
cnzdgs 2008-04-29
  • 打赏
  • 举报
回复
如果想要让CreateFile成功,必须要调原本API的CreateFile函数,现在是你的MyCreateFile没有处理好。另外,前面已经说了GetDriveType的参数必须给根目录的路径,你先把这两个部分处理好,然后再考虑其它问题,以免相互干扰不好判断。
naixian1983 2008-04-29
  • 打赏
  • 举报
回复
to cnzdgs

如果我直接返回MyCreateFile果然还是不行的,如果我去掉

HANDLE result=MyCreateFileW(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
return result;

只是加上
UINT uDriveType=::GetDriveType(lpFileName);

switch (uDriveType)
{
case DRIVE_REMOVABLE:
{

OutputDebugString("DRIVE_REMOVABLE");
return 0;
break;

}
case DRIVE_FIXED:
{

OutputDebugString("DRIVE_FIXED");

break;

}

case DRIVE_UNKNOWN:
{

OutputDebugString("DRIVE_UNKNOWN");
return 0;
break;
}
case DRIVE_CDROM:
{

OutputDebugString("DRIVE_CDROM");
return 0;
break;
}

}


当我插上u盘时,无论是DRIVE_FIXED还是DRIVE_REMOVABLE全部不可以createfile,而且我发现一个奇怪的问题,不如当我点DRIVE_CDROM是,出来的messagebox是DRIVE_FIXED,很奇怪
naixian1983 2008-04-28
  • 打赏
  • 举报
回复
现在我的问题是,如果用
if(GetDriveType(lpFileName)==DRIVE_REMOVABLE)
{
return 0;
}
C 和D drive还是不能createfile,我要的是插入u盘,C 和D drive不受影响,该什么做?
cnzdgs 2008-04-28
  • 打赏
  • 举报
回复
GetDriveType的参数必须是根目录才行。另外要注意,CreateFile的参数可能是相对路径。
vcPlayer 2008-04-28
  • 打赏
  • 举报
回复
if(GetDriveType(lpFileName)==DRIVE_REMOVABLE)
{
return 0;
}

这一句对软盘和较小的U盘是没问题,但对大U盘,返回的也是DRIVE_FIXED。
naixian1983 2008-04-28
  • 打赏
  • 举报
回复
高手帮帮忙

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧