阅读:3760回复:43
还是跟虚拟磁盘有关的问题
上次的问题解决了
又有新问题,继续来问 我的代码基本上跟ramdisk差不多的(under 9x),唯一的差别就是在处理IOR的时候它把请求重定向到buffer,而我是重定向到disk file(用R0_FileIO) 现在我的虚拟磁盘能够被FSD识别并且在\"我的电脑\"显示出来,也能看到盘上的文件.比较不正常的是当虚拟磁盘驱动被加载之后系统变得很不稳定,很多操作会导致98跟死了一样,又没有异常发生,总之就是没什么反应了.比如双击虚拟盘上的文件,甚至不做任何跟它相关的操作都会导致系统没反应 我不知道这是什么问题,也不知道从何查起,希望有人指点一下,谢谢! 附: 我做了试验,改动我的代码,把请求重定向到buffer里面的话(把FILE_IO改成memcpy) 这样一切都是很正常的 |
|
最新喜欢:![]()
|
沙发#
发布于:2002-12-20 11:13
那本书在候捷的主页上应该有下,这本书台湾就是他翻译的。
|
|
板凳#
发布于:2002-12-20 10:47
我不想做hook
也不再相信Ring0 File I/O了,它让我伤透了心 我现在的方法是这样的: 获取我的image file所在的分区的dcb make一个read/write iop 然后用IlbInternalRequest来进行读写 当然这样狠麻烦,因为要自己计算文件所在的扇区 不过总算是不会那么不稳定了 |
|
|
地板#
发布于:2002-12-20 09:56
可以这样吗?
我创建一个VXD,提供一些文件的读写功能函数,然后在ramdisk里面 调用这些函数进行文件的读写,而这个vxd里面还是使用ring0_fileIO来进行文件读写,或者这个VXD进行filesystem的hook,然后在hook里面获得的各个函数地址保存下来,进行自己的构造ifsior请求进行文件的读写, 不知道这两个猜想可以不? |
|
地下室#
发布于:2002-12-19 01:12
[quote]每个FSD都有一组Volume Function Table。比如,你想打开FAT上的一个文件,就应该先得到VFAT的FS_OpenFile的指针,然后自己构造一个ifsreq(ioreq的超集),把里面的数据自己构造好,最后直接调用那个FS_OpenFile即可。 请问怎么得到这个FS_OpenFile指针呢?我已经把你说的那本书的附盘代码下载了!可是上面并没有这样的代码,而网上我也搜查了,没有“Inside the Windows 95 File System”啊!我知道的就是台湾已经把这本书也翻译了 [/quote] 它的sample里面没有详细的内容,唯一的一些相关的信息就是那几个query的例子,filemon也用到了。 这本书好像没有中文版的,网上也没有。 |
|
|
5楼#
发布于:2002-12-17 09:48
我还没有搞清楚咧
谈不上指教啦 另外那个家伙好像也没有搞定 烦~~ |
|
|
6楼#
发布于:2002-12-16 22:02
两位,我也在郁闷中,也为这个问题,望不吝赐教啊:)
xielinghuan@sina.com |
|
7楼#
发布于:2002-12-16 09:43
我依然在R0 File I/O里面挣扎
似乎真的是有问题,总是IOP超时 不过我觉得这种起线程的方法是不应该引起死锁的,所以我还是坚持这个方法 |
|
|
8楼#
发布于:2002-12-14 14:02
每个FSD都有一组Volume Function Table。比如,你想打开FAT上的一个文件,就应该先得到VFAT的FS_OpenFile的指针,然后自己构造一个ifsreq(ioreq的超集),把里面的数据自己构造好,最后直接调用那个FS_OpenFile即可。 请问怎么得到这个FS_OpenFile指针呢?我已经把你说的那本书的附盘代码下载了!可是上面并没有这样的代码,而网上我也搜查了,没有“Inside the Windows 95 File System”啊!我知道的就是台湾已经把这本书也翻译了 |
|
9楼#
发布于:2002-12-13 15:47
可惜的是没有他说的那本书啊!
|
|
10楼#
发布于:2002-12-13 15:46
我怀疑还是那个重入了vfat的原因!我觉得只有用斑竹说的方法才可以解决的
|
|
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超时的原因 |
|
|
12楼#
发布于:2002-12-13 13:05
我也解决了创建线程的问题了!但是我觉得这个跟原来的没有什么差别吧!因为VFAT是不可以重入的!而系统调用了把一个同步的onrequest发送下来之后就会waite_sem,而在onrequest里面我们却又重新调用VFAT的函数,这样还是死锁的啊
以上是我的猜想、,不知道真实情况是不是这样 |
|
13楼#
发布于:2002-12-13 10:50
我是在系统启动的时候调试的,不管是在初始化代码还是在configdcb里面 我的esi是0 你创建线程会死等??我觉得很奇怪。你在你的ThreadProc里面下断点没有? 我建议你把ThreadProc的部分代码贴出来看看,就是入口部分的代码 我这边仔细测试了一下还是会有IOP的TimeOut发生,这样情况下OS还是会死的。我是否需要相应AEP_IOP_TIMEOUT呢?如何响应它? //今天睡过头了,刚到公司 [编辑 - 12/13/02 by JungleBoy] |
|
|
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
啊!强烈建议共享代码吧!我怎么调线程都启动不了啊!你是在系统启动的时候调试的吗?
|
|
17楼#
发布于:2002-12-12 18:47
活活~~~~~
我搞定啦 感觉真是爽!!!! 谢谢这几天给我支持的兄弟们 大家可以继续讨论一下,因为我觉得这个主题的可讨论性还比较高(或许是我在这方面经验不是很丰富吧?) |
|
|
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\" 我觉得很费解,这不是把参数值都改了吗? 祝你早点把线程的问题调通,后面还有更麻烦的事情等着呢 呵呵,今天晚上加班~! |
|
|
19楼#
发布于:2002-12-12 17:35
不会吧!我的就是不运行啊!只要esi的值为false就不能创建线程!而esi的值为真或者是一个函数的地址的话!就可以。可是线程还是不运行的啊!烦死了
|
|
上一页
下一页