JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2002-12-12 15:00
进度:
现在计算FAT32里文件占据的sector没问题了,可是调R0_READABSOLUTEDISK总出错.
暂时不用这个方法了
还是按照起线程的方式来做,毕竟这种方式是微软基本上承认的方法

自己给_VWin32_CreateR0Thread写了一个Wrapper

等写完了代码了调试之后继续报告
I'm upgrading……
21楼#
发布于:2002-12-12 16:03
不行的啊!这个相当于
VWIN32_CreateRing0Thread(4096,0,ProcessThread,FASLE,&hRing3Thread);
我已经试过了啊!
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2002-12-12 16:06
我靠!
正兴冲冲的写到一半看到有新邮件
你别吓我啊?

你的那边是什么问题啊?

我继续写!
I'm upgrading……
23楼#
发布于:2002-12-12 16:31
_asm {
mov ecx, 4096
mov edi, 0
mov ebx, [t]
xor esi, esi
}
VxDCall (_VWIN32_CreateRing0Thread)
}
调用的时候也是在创建了线程之后线程根本就不运行
我怀疑是不是因为在加载的时候线程是不会运行的!因为我是在系统启动的时候才加载的VXD
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2002-12-12 16:38
因为是做实验,所以我在AEP_CONFIG_DCB里面调用的CreateR0Thread,很多必要的参数都是用全局的,这样比较方便

我的线程运行啊~!

正在调试呢
I'm upgrading……
25楼#
发布于:2002-12-12 17:35
不会吧!我的就是不运行啊!只要esi的值为false就不能创建线程!而esi的值为真或者是一个函数的地址的话!就可以。可是线程还是不运行的啊!烦死了
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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\"


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

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

呵呵,今天晚上加班~!
I'm upgrading……
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2002-12-12 18:47
活活~~~~~
我搞定啦

感觉真是爽!!!!

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

大家可以继续讨论一下,因为我觉得这个主题的可讨论性还比较高(或许是我在这方面经验不是很丰富吧?)
I'm upgrading……
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 有没有呢!电子版的
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
31楼#
发布于: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……
32楼#
发布于: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分
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超时的原因
I'm upgrading……
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即可。
以后要对这个文件进行读写,就要用Open File时得到的另外一组Handle Based Function。

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

请问怎么得到这个FS_OpenFile指针呢?我已经把你说的那本书的附盘代码下载了!可是上面并没有这样的代码,而网上我也搜查了,没有“Inside the Windows 95 File System”啊!我知道的就是台湾已经把这本书也翻译了
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
37楼#
发布于:2002-12-16 09:43
我依然在R0 File I/O里面挣扎
似乎真的是有问题,总是IOP超时
不过我觉得这种起线程的方法是不应该引起死锁的,所以我还是坚持这个方法
I'm upgrading……
delux9704
驱动牛犊
驱动牛犊
  • 注册日期2002-11-14
  • 最后登录2010-11-15
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
38楼#
发布于:2002-12-16 22:02
两位,我也在郁闷中,也为这个问题,望不吝赐教啊:)

xielinghuan@sina.com
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
39楼#
发布于:2002-12-17 09:48
我还没有搞清楚咧
谈不上指教啦
另外那个家伙好像也没有搞定
烦~~
I'm upgrading……
游客

返回顶部