JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3760回复:43

还是跟虚拟磁盘有关的问题

楼主#
更多 发布于:2002-12-09 17:51
上次的问题解决了
又有新问题,继续来问

我的代码基本上跟ramdisk差不多的(under 9x),唯一的差别就是在处理IOR的时候它把请求重定向到buffer,而我是重定向到disk file(用R0_FileIO)
现在我的虚拟磁盘能够被FSD识别并且在\"我的电脑\"显示出来,也能看到盘上的文件.比较不正常的是当虚拟磁盘驱动被加载之后系统变得很不稳定,很多操作会导致98跟死了一样,又没有异常发生,总之就是没什么反应了.比如双击虚拟盘上的文件,甚至不做任何跟它相关的操作都会导致系统没反应

我不知道这是什么问题,也不知道从何查起,希望有人指点一下,谢谢!

附:
我做了试验,改动我的代码,把请求重定向到buffer里面的话(把FILE_IO改成memcpy)
这样一切都是很正常的

最新喜欢:

TOMG2004TOMG20...
I'm upgrading……
yxjoyce
驱动牛犊
驱动牛犊
  • 注册日期2002-04-15
  • 最后登录2003-04-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-20 11:13
那本书在候捷的主页上应该有下,这本书台湾就是他翻译的。
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-20 10:47
我不想做hook
也不再相信Ring0 File I/O了,它让我伤透了心

我现在的方法是这样的:
获取我的image file所在的分区的dcb
make一个read/write iop
然后用IlbInternalRequest来进行读写
当然这样狠麻烦,因为要自己计算文件所在的扇区

不过总算是不会那么不稳定了
I'm upgrading……
地板#
发布于:2002-12-20 09:56
可以这样吗?
我创建一个VXD,提供一些文件的读写功能函数,然后在ramdisk里面
调用这些函数进行文件的读写,而这个vxd里面还是使用ring0_fileIO来进行文件读写,或者这个VXD进行filesystem的hook,然后在hook里面获得的各个函数地址保存下来,进行自己的构造ifsior请求进行文件的读写,
不知道这两个猜想可以不?
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-19 01:12
[quote]每个FSD都有一组Volume Function Table。比如,你想打开FAT上的一个文件,就应该先得到VFAT的FS_OpenFile的指针,然后自己构造一个ifsreq(ioreq的超集),把里面的数据自己构造好,最后直接调用那个FS_OpenFile即可。
以后要对这个文件进行读写,就要用Open File时得到的另外一组Handle Based Function。

具体的细节,应该去看Inside the Windows 95 File System,虽然里面没有直接的实现方法,但看过之后肯定就明白了。

请问怎么得到这个FS_OpenFile指针呢?我已经把你说的那本书的附盘代码下载了!可是上面并没有这样的代码,而网上我也搜查了,没有“Inside the Windows 95 File System”啊!我知道的就是台湾已经把这本书也翻译了 [/quote]
它的sample里面没有详细的内容,唯一的一些相关的信息就是那几个query的例子,filemon也用到了。
这本书好像没有中文版的,网上也没有。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-17 09:48
我还没有搞清楚咧
谈不上指教啦
另外那个家伙好像也没有搞定
烦~~
I'm upgrading……
delux9704
驱动牛犊
驱动牛犊
  • 注册日期2002-11-14
  • 最后登录2010-11-15
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-16 22:02
两位,我也在郁闷中,也为这个问题,望不吝赐教啊:)

xielinghuan@sina.com
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-16 09:43
我依然在R0 File I/O里面挣扎
似乎真的是有问题,总是IOP超时
不过我觉得这种起线程的方法是不应该引起死锁的,所以我还是坚持这个方法
I'm upgrading……
8楼#
发布于:2002-12-14 14:02
每个FSD都有一组Volume Function Table。比如,你想打开FAT上的一个文件,就应该先得到VFAT的FS_OpenFile的指针,然后自己构造一个ifsreq(ioreq的超集),把里面的数据自己构造好,最后直接调用那个FS_OpenFile即可。
以后要对这个文件进行读写,就要用Open File时得到的另外一组Handle Based Function。

具体的细节,应该去看Inside the Windows 95 File System,虽然里面没有直接的实现方法,但看过之后肯定就明白了。

请问怎么得到这个FS_OpenFile指针呢?我已经把你说的那本书的附盘代码下载了!可是上面并没有这样的代码,而网上我也搜查了,没有“Inside the Windows 95 File System”啊!我知道的就是台湾已经把这本书也翻译了
9楼#
发布于:2002-12-13 15:47
可惜的是没有他说的那本书啊!
10楼#
发布于:2002-12-13 15:46
我怀疑还是那个重入了vfat的原因!我觉得只有用斑竹说的方法才可以解决的
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-13 13:25
我觉得跟原来是不太一样,我觉得是这样的:
原来是VFAT来调用我们的OnRequest然后我们的OnRequest调用Ring0 File I/O,结果R0 File I/O又调回VFAT去了
现在的情况是VFAT调用OnRequest,OnRequest收到request后将其放入设备的iop队列里面然后signal一个semaphore通知R0线程去处理这个
request,然后在R0 thread里面调用R0 File I/O

这两种情况中R0 File I/O运行的context应该是完全不一样的

虽然我是这么理解的,但是我的那个driver还是有些问题,有时候iop会TIMEOUT,很烦人,不知道是我没有处理好同步的问题还是这条路根本就走不通
我没有搞清楚这些iop超时的原因
I'm upgrading……
12楼#
发布于:2002-12-13 13:05
我也解决了创建线程的问题了!但是我觉得这个跟原来的没有什么差别吧!因为VFAT是不可以重入的!而系统调用了把一个同步的onrequest发送下来之后就会waite_sem,而在onrequest里面我们却又重新调用VFAT的函数,这样还是死锁的啊

以上是我的猜想、,不知道真实情况是不是这样
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-13 10:50
我是在系统启动的时候调试的,不管是在初始化代码还是在configdcb里面
_asm {
mov ecx, 4096
mov edi, 0
mov ebx, processthread
xor esi, esi
}
VxDCall (_VWIN32_CreateRing0Thread)
}
试过不行,死等
_asm {
mov ecx, 4096
mov edi, 0
mov ebx, processthread
mov esi, 1
}
VxDCall (_VWIN32_CreateRing0Thread)
}

可以创建线程!可是线程运行不了
 

我的esi是0
你创建线程会死等??我觉得很奇怪。你在你的ThreadProc里面下断点没有?
我建议你把ThreadProc的部分代码贴出来看看,就是入口部分的代码

我这边仔细测试了一下还是会有IOP的TimeOut发生,这样情况下OS还是会死的。我是否需要相应AEP_IOP_TIMEOUT呢?如何响应它?

//今天睡过头了,刚到公司

[编辑 -  12/13/02 by  JungleBoy]
I'm upgrading……
14楼#
发布于:2002-12-13 09:16
我觉得rayyang2000 说的有道理的!可是我目前没有那本书啊!不知道rayyang2000 有没有呢!电子版的
15楼#
发布于:2002-12-13 09:14
我是在系统启动的时候调试的,不管是在初始化代码还是在configdcb里面
_asm {
mov ecx, 4096
mov edi, 0
mov ebx, processthread
xor esi, esi
}
VxDCall (_VWIN32_CreateRing0Thread)
}
试过不行,死等
_asm {
mov ecx, 4096
mov edi, 0
mov ebx, processthread
mov esi, 1
}
VxDCall (_VWIN32_CreateRing0Thread)
}

可以创建线程!可是线程运行不了
16楼#
发布于:2002-12-13 09:11
啊!强烈建议共享代码吧!我怎么调线程都启动不了啊!你是在系统启动的时候调试的吗?
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-12-12 18:47
活活~~~~~
我搞定啦

感觉真是爽!!!!

谢谢这几天给我支持的兄弟们

大家可以继续讨论一下,因为我觉得这个主题的可讨论性还比较高(或许是我在这方面经验不是很丰富吧?)
I'm upgrading……
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-12-12 17:56
我这边起线程很正常

我的问题是第二次调用R0_ReadFile的时候陷在里面不出来了,然后说我的IOP超时,系统停在Wait_Semaphore里面(肯定是系统调的,不是我调的那个,我的线程是肯定不会把系统搞死的).我也比较烦恼为什么调用R0_ReadFile会hang
看微软那个文档我有一点点疑惑,他上面讲的

The following code, extracted from VWIN32, is used to read a memory-mapped file on behalf of Kernel32:

    mov    eax,R0_READFILE or (R0_MM_READ_WRITE shl 16) ; (eax) = read/write
    mov    al,byte ptr [function]        ; (al) = read (3f) or write(40)
    sub    al,3fh                ; (al) = read (0) or write (1)
    xor    ecx,ecx
    mov    edx,[fileloc]            ; (edx) = seek position
    mov    ecx,[cbLen]            ; (ecx) = number of bytes in i/o
    mov    esi,[memloc]            ; (esi) = transfer address
    VxDCall IFSMgr_Ring0_FileIO        ; do the i/o
    Trace_OutC    \"ReadWritePage: error #EAX from file i/o\"


我觉得很费解,这不是把参数值都改了吗?

祝你早点把线程的问题调通,后面还有更麻烦的事情等着呢

呵呵,今天晚上加班~!
I'm upgrading……
19楼#
发布于:2002-12-12 17:35
不会吧!我的就是不运行啊!只要esi的值为false就不能创建线程!而esi的值为真或者是一个函数的地址的话!就可以。可是线程还是不运行的啊!烦死了
上一页
游客

返回顶部