gongxp
驱动牛犊
驱动牛犊
  • 注册日期2001-05-25
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2392回复:3

改变文件请求问题,附源代码

楼主#
更多 发布于:2001-06-07 17:01
改变文件请求问题
我们知道可以用VXD拦截和附加文件请求,但如何改变却有难题。比如希望将对D盘的文件操作改为对E盘的操作:

首先,试图这么简单的来,直接改变HOOK函数的nDrive的值,象这样:
int _cdecl OurFileHook(pIFSFunc pfn, int nFunction, int nDrive, int nResources, int Cp, pioreq pir)
{

if(nDrive==3)nDrive=4;
iRet=(*(*ppPrevHook))(pfn, nFunction, nDrive, nResources, Cp, pir);
return iRet;
}

但是不行,系统是通过资源句柄来访问文件的,于是这么来:

int _cdecl OurFileHook(pIFSFunc pfn, int nFunction, int nDrive, int nResources, int Cp, pioreq pir)
{
int iRet;
ifsreq ifs;
fhandle irrh;
iRet=0;
if(nFunction==IFSFN_DELETE){
if(nDrive==4)memcpy(&irrh,pir->ir_rh,sizeof(fhandle));
if(nDrive==3){
memcpy(&ifs,pir,sizeof(ifsreq));
memcpy(ifs.ifs_ir.ir_rh,&irrh,sizeof(fhandle));
iRet= (*(*ppPrevHook))(pfn, nFunction, nDrive, nResources, Cp, (pioreq)&ifs);
return iRet;
}
}
iRet=(*(*ppPrevHook))(pfn, nFunction, nDrive, nResources, Cp, pir);
return iRet;
}

也不行,至此我无招了,请高手指点。
[gongxp 编辑于 2001-05-25 11:24]
gongxp
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-06-07 17:41
我的理解:
系统在DEL一个文件时,总是先通过Openfile或CreateFile或得了其HANDLE,你的HOOK只在捕获DEL时,其实已无效了,原来要DEL的文件一样会被DEL,它没有进入你的HOOK中,而现在要DEL的文件由于没有取得其HANDLE,也DEL不掉。
当然这只是我的理解。
一剑西来,天外飞仙
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2001-06-08 19:34
这时其实是把文件改名放进回收站。不是真正的删除文件。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
gongxp
驱动牛犊
驱动牛犊
  • 注册日期2001-05-25
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-06-11 10:47
我的本意是要通过改变IFSREQ来改变文件请求,删除文件不过是一个例子,如果仅是要改变删除文件请求好办,如:
int _cdecl OurFileHook(pIFSFunc pfn, int nFunction, int nDrive, int nResources, int Cp, pioreq pir)
{
if(nFunction==IFSFN_DELETE){
if(nDrive==3);
R0_DeleteFile("e:\\test\\te.c");
iRet=(*(*ppPrevHook))(pfn, nFunction, nDrive, nResources, Cp, pir);
return iRet;
}




gongxp
游客

返回顶部