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

改变文件请求――高手请看

楼主#
更多 发布于:2001-05-25 11:14
   我们知道可以用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]

最新喜欢:

lgqiang888lgqian...
gongxp
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-23 17:10
我也碰到了这个问题,怎么把对D盘的操作转到C或者其他盘上面去啊,恳请大虾指点。
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-03 10:57
我也碰到类似的问题!!
知之为知之,不知为不知 有错则改之
SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于: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
梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-03 09:17
IOREQ并不是IFS文件REQ的全部数据结构. 完整的数据结构是IFSREQ.在MS的任何文档中都没有描述. 在IFSREQ中, 有个FIELD描述用到的盘符是哪一个.
具体的内容我忘记了. 你们自己查一下WINDOWS 95 FILE SYSTEM INTERNALS.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-02 12:29
改ir_rh 的确可以改盘符。

但如何在VXD加载时,马得获得与所有盘符的各个ir_rh呢?

有那位兄弟知道呀?

我的邮件是 sunming@saleonnet.com
梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
lgqiang888
驱动牛犊
驱动牛犊
  • 注册日期2002-07-19
  • 最后登录2003-03-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-27 14:10
horesdo兄,
   您是怎么改同一分区的路径的?能告诉我吗?
   gsmstock@21cn.com
lgqiang888
驱动牛犊
驱动牛犊
  • 注册日期2002-07-19
  • 最后登录2003-03-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-27 10:42
horsedo
  我给您回了EMAIL
   我的EMIAL gsmstock@21cn.com
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-07-26 09:45
改 ir_rh 能改本地盘符,但不能改成网络映射盘符?

老兄能先说说怎么通过改 ir_rh 来改本地盘符吗?
能否贴点代码?谢谢
lgqiang888
驱动牛犊
驱动牛犊
  • 注册日期2002-07-19
  • 最后登录2003-03-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-26 09:39
改 ir_rh 能改本地盘符,但不能改成网络映射盘符?
lgqiang888
驱动牛犊
驱动牛犊
  • 注册日期2002-07-19
  • 最后登录2003-03-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-25 11:03
为什么只能改文件,不能盘符?
有高手吗?
wl135
驱动牛犊
驱动牛犊
  • 注册日期2002-07-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-25 08:25
关注!关注!关注!
abc...abc
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2002-07-24 16:44
还是没有解决,没有大侠知道吗??
 :( :( :(
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-07-22 10:33
.
dengzg
驱动牛犊
驱动牛犊
  • 注册日期2002-07-16
  • 最后登录2012-07-23
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-07-19 16:30
急,怎么没人知道吗?
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-07-18 14:15
我也碰到相同的问题,不知道怎么解决,顶一下
 

我再顶一下
dengzg
驱动牛犊
驱动牛犊
  • 注册日期2002-07-16
  • 最后登录2012-07-23
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-07-17 10:28
我也碰到相同的问题,不知道怎么解决,顶一下
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2002-07-16 17:47
惭愧,这个问题烦我一个星期了
试出来98下可以改变某个分区内部的目录重定向到同一个分区例外的目录,可是遇到了和 gongxp 老兄一样的问题
怎么把对D盘的文件操作改为对E盘的操作呢。
  :( :( :( :mad: :mad: :mad: :mad:
horsedo
驱动小牛
驱动小牛
  • 注册日期2001-11-29
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2002-07-04 22:33

你程序写错了,所有的工作必须在
retval = (*PrevIFSHookProc)(pfn, fn, Drive, ResType, CodePage, pir);
之前做。

如果,该的不对系统给你错误的可能性是有的,但是你说[没有效果]恐怕你是在系统之后该的。那没有任何作用。

另外,至少在内存dump中可以看到,
你想要的path,不仅仅在ir_aux2->aux_pp,ir_aux3->aux_pp中也有描述,如何使用我不知道,查查资料吧。

呵呵,肯定在这个前面改的了,
看看 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
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2002-07-04 21:19

你程序写错了,所有的工作必须在
retval = (*PrevIFSHookProc)(pfn, fn, Drive, ResType, CodePage, pir);
之前做。

如果,该的不对系统给你错误的可能性是有的,但是你说[没有效果]恐怕你是在系统之后该的。那没有任何作用。

另外,至少在内存dump中可以看到,
你想要的path,不仅仅在ir_aux2->aux_pp,ir_aux3->aux_pp中也有描述,如何使用我不知道,查查资料吧。
上一页
游客

返回顶部