阅读:3650回复:22
改变文件请求――高手请看
我们知道可以用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] |
|
最新喜欢:![]()
|
沙发#
发布于:2004-05-23 17:10
我也碰到了这个问题,怎么把对D盘的操作转到C或者其他盘上面去啊,恳请大虾指点。
|
|
板凳#
发布于:2002-12-03 10:57
我也碰到类似的问题!!
|
|
|
地板#
发布于:2002-12-03 10:17
Lu老大,终于见到你了 :)
这是ifsreq的全结构,来自win95InSide的资料。你觉得那部分呢? /* ifsreq structure */ typedef struct { ioreq ifs_ir; /* 00 - nested ioreq structure */ /* These members are known only to IFSMgr */ fhandle* ifs_pfh; /* 74 - ptr to fhandle structure */ void* ifs_psft; /* 78 - ptr to SFT entry */ shres* ifs_psr; /* 7C - ptr to shell resource */ DWORD ifs_pdb; /* 80 - linear base address of owner PSP */ DWORD ifs_proid; /* 84 - provider ID */ BYTE ifs_func; /* 88 - function of dispatched command */ BYTE ifs_drv; /* 89 - drive of dispatched command */ BYTE ifs_hflag; /* 8A - flags of dispatched command */ BYTE ifs_nflags; /* 8B - flags of dispatched command */ void* ifs_pbuffer; /* 8C - ptr to parse buffer */ HVM ifs_VMHandle; /* 90 - VM of request */ void* ifs_PV; /* 94 - ptr to per-VM data area */ /* Client registers follow - three possible structures are used */ union { CLIENT_STRUCT ifs_crs; /* \"standard\" client register structure */ /* Server DOS Call structure */ /* IFSMgr_Ring0_FileIO structure */ }; } ifsreq; 我在处理请求时,如果将来自c盘的请求的ir_rh改为d盘的ir_rh,也可以将其请求转移到D盘。而且当操作系统初始化完毕后,c盘和d盘的ir_rh都是永远固定的。 我说的有没有错。但我不会如何在操作系统初始化完后,立刻获得c盘的ir_rh和D盘的ir_rh |
|
|
地下室#
发布于:2002-12-03 09:17
IOREQ并不是IFS文件REQ的全部数据结构. 完整的数据结构是IFSREQ.在MS的任何文档中都没有描述. 在IFSREQ中, 有个FIELD描述用到的盘符是哪一个.
具体的内容我忘记了. 你们自己查一下WINDOWS 95 FILE SYSTEM INTERNALS. |
|
|
5楼#
发布于:2002-12-02 12:29
改ir_rh 的确可以改盘符。
但如何在VXD加载时,马得获得与所有盘符的各个ir_rh呢? 有那位兄弟知道呀? 我的邮件是 sunming@saleonnet.com |
|
|
6楼#
发布于:2002-07-27 14:10
horesdo兄,
您是怎么改同一分区的路径的?能告诉我吗? gsmstock@21cn.com |
|
7楼#
发布于:2002-07-27 10:42
horsedo
我给您回了EMAIL 我的EMIAL gsmstock@21cn.com |
|
8楼#
发布于:2002-07-26 09:45
改 ir_rh 能改本地盘符,但不能改成网络映射盘符? 老兄能先说说怎么通过改 ir_rh 来改本地盘符吗? 能否贴点代码?谢谢 |
|
9楼#
发布于:2002-07-26 09:39
改 ir_rh 能改本地盘符,但不能改成网络映射盘符?
|
|
10楼#
发布于:2002-07-25 11:03
为什么只能改文件,不能盘符?
有高手吗? |
|
11楼#
发布于:2002-07-25 08:25
关注!关注!关注!
|
|
|
12楼#
发布于:2002-07-24 16:44
还是没有解决,没有大侠知道吗??
:( :( :( |
|
13楼#
发布于:2002-07-22 10:33
.
|
|
14楼#
发布于:2002-07-19 16:30
急,怎么没人知道吗?
|
|
15楼#
发布于:2002-07-18 14:15
我也碰到相同的问题,不知道怎么解决,顶一下 我再顶一下 |
|
16楼#
发布于:2002-07-17 10:28
我也碰到相同的问题,不知道怎么解决,顶一下
|
|
17楼#
发布于:2002-07-16 17:47
惭愧,这个问题烦我一个星期了
试出来98下可以改变某个分区内部的目录重定向到同一个分区例外的目录,可是遇到了和 gongxp 老兄一样的问题 怎么把对D盘的文件操作改为对E盘的操作呢。 :( :( :( :mad: :mad: :mad: :mad: |
|
18楼#
发布于:2002-07-04 22:33
呵呵,肯定在这个前面改的了, 看看 ioreq 结构struct ioreq { unsigned int ir_length; /* length of user buffer (eCX) */ unsigned char ir_flags; /* misc. status flags (AL) */ uid_t ir_user; /* user ID for this request */ sfn_t ir_sfn; /* System File Number of file handle */ pid_t ir_pid; /* process ID of requesting task */ path_t ir_ppath; /* unicode pathname */ aux_t ir_aux1; /* secondary user data buffer (CurDTA) */ ubuffer_t ir_data; /* ptr to user data buffer (DS:eDX) */ unsigned short ir_options; /* request handling options */ short ir_error; /* error code (0 if OK) */ rh_t ir_rh; /* resource handle */ fh_t ir_fh; /* file (or find) handle */ pos_t ir_pos; /* file position for request */ aux_t ir_aux2; /* misc. extra API parameters */ aux_t ir_aux3; /* misc. extra API parameters */ pevent ir_pev; /* ptr to IFSMgr event for async requests */ fsdwork_t ir_fsd; /* Provider work space */ }; /* ioreq */ 我只改了 ir_ppath 没有影响 我想是不是还和 rh_t ir_rh; /* resource handle */ fh_t ir_fh; /* file (or find) handle */ 这两个句柄有关呢?改怎么改呢,俺再试试 :D |
|
19楼#
发布于:2002-07-04 21:19
你程序写错了,所有的工作必须在 retval = (*PrevIFSHookProc)(pfn, fn, Drive, ResType, CodePage, pir); 之前做。 如果,该的不对系统给你错误的可能性是有的,但是你说[没有效果]恐怕你是在系统之后该的。那没有任何作用。 另外,至少在内存dump中可以看到, 你想要的path,不仅仅在ir_aux2->aux_pp,ir_aux3->aux_pp中也有描述,如何使用我不知道,查查资料吧。 |
|
上一页
下一页