20楼#
发布于:2002-12-12 15:00
进度:
现在计算FAT32里文件占据的sector没问题了,可是调R0_READABSOLUTEDISK总出错. 暂时不用这个方法了 还是按照起线程的方式来做,毕竟这种方式是微软基本上承认的方法 自己给_VWin32_CreateR0Thread写了一个Wrapper 等写完了代码了调试之后继续报告 |
|
|
21楼#
发布于:2002-12-12 16:03
不行的啊!这个相当于
VWIN32_CreateRing0Thread(4096,0,ProcessThread,FASLE,&hRing3Thread); 我已经试过了啊! |
|
22楼#
发布于:2002-12-12 16:06
我靠!
正兴冲冲的写到一半看到有新邮件 你别吓我啊? 你的那边是什么问题啊? 我继续写! |
|
|
23楼#
发布于:2002-12-12 16:31
_asm {
mov ecx, 4096 mov edi, 0 mov ebx, [t] xor esi, esi } VxDCall (_VWIN32_CreateRing0Thread) } 调用的时候也是在创建了线程之后线程根本就不运行 我怀疑是不是因为在加载的时候线程是不会运行的!因为我是在系统启动的时候才加载的VXD |
|
24楼#
发布于:2002-12-12 16:38
因为是做实验,所以我在AEP_CONFIG_DCB里面调用的CreateR0Thread,很多必要的参数都是用全局的,这样比较方便
我的线程运行啊~! 正在调试呢 |
|
|
25楼#
发布于:2002-12-12 17:35
不会吧!我的就是不运行啊!只要esi的值为false就不能创建线程!而esi的值为真或者是一个函数的地址的话!就可以。可是线程还是不运行的啊!烦死了
|
|
26楼#
发布于: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\" 我觉得很费解,这不是把参数值都改了吗? 祝你早点把线程的问题调通,后面还有更麻烦的事情等着呢 呵呵,今天晚上加班~! |
|
|
27楼#
发布于:2002-12-12 18:47
活活~~~~~
我搞定啦 感觉真是爽!!!! 谢谢这几天给我支持的兄弟们 大家可以继续讨论一下,因为我觉得这个主题的可讨论性还比较高(或许是我在这方面经验不是很丰富吧?) |
|
|
28楼#
发布于:2002-12-13 09:11
啊!强烈建议共享代码吧!我怎么调线程都启动不了啊!你是在系统启动的时候调试的吗?
|
|
29楼#
发布于: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) } 可以创建线程!可是线程运行不了 |
|
30楼#
发布于:2002-12-13 09:16
我觉得rayyang2000 说的有道理的!可是我目前没有那本书啊!不知道rayyang2000 有没有呢!电子版的
|
|
31楼#
发布于:2002-12-13 10:50
我是在系统启动的时候调试的,不管是在初始化代码还是在configdcb里面 我的esi是0 你创建线程会死等??我觉得很奇怪。你在你的ThreadProc里面下断点没有? 我建议你把ThreadProc的部分代码贴出来看看,就是入口部分的代码 我这边仔细测试了一下还是会有IOP的TimeOut发生,这样情况下OS还是会死的。我是否需要相应AEP_IOP_TIMEOUT呢?如何响应它? //今天睡过头了,刚到公司 [编辑 - 12/13/02 by JungleBoy] |
|
|
32楼#
发布于:2002-12-13 13:05
我也解决了创建线程的问题了!但是我觉得这个跟原来的没有什么差别吧!因为VFAT是不可以重入的!而系统调用了把一个同步的onrequest发送下来之后就会waite_sem,而在onrequest里面我们却又重新调用VFAT的函数,这样还是死锁的啊
以上是我的猜想、,不知道真实情况是不是这样 |
|
33楼#
发布于: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超时的原因 |
|
|
34楼#
发布于:2002-12-13 15:46
我怀疑还是那个重入了vfat的原因!我觉得只有用斑竹说的方法才可以解决的
|
|
35楼#
发布于:2002-12-13 15:47
可惜的是没有他说的那本书啊!
|
|
36楼#
发布于: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”啊!我知道的就是台湾已经把这本书也翻译了 |
|
37楼#
发布于:2002-12-16 09:43
我依然在R0 File I/O里面挣扎
似乎真的是有问题,总是IOP超时 不过我觉得这种起线程的方法是不应该引起死锁的,所以我还是坚持这个方法 |
|
|
38楼#
发布于:2002-12-16 22:02
两位,我也在郁闷中,也为这个问题,望不吝赐教啊:)
xielinghuan@sina.com |
|
39楼#
发布于:2002-12-17 09:48
我还没有搞清楚咧
谈不上指教啦 另外那个家伙好像也没有搞定 烦~~ |
|
|