JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3476回复: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……
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-09 18:11
DEAD LOCK IN VFAT.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-09 18:14
谢谢版主
可以说的详细点吗?
I'm upgrading……
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-10 12:01
Oney的ramdisk没有对iop进行排队
而98DDK中的block port driver的例子使用ILB_enqueue_iop和ILB_dequeue_iop来管理iop队列
我的问题跟这个有关系吗?
I'm upgrading……
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-10 13:38
lu0说得很对
我找到相关的资料了

谢谢你!
不过班门弄斧一下,原文上是\"Blocking in VFAT\",呵呵!

不过好像不是很容易解决的

[编辑 -  12/10/02 by  JungleBoy]
I'm upgrading……
5楼#
发布于:2002-12-10 15:28
我也碰到了这个情况了!现在是一筹莫展啊!老兄能否相告如何解决啊!
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-10 15:44
我也还没有完全解决,只是知道大概的原因
这个问题产生的原因就是在IOS Port Driver里面不可以调用IFSMgr_Ring0_FileIO Service,因为VFAT不允许重入.一旦重入就会死锁(blocking,应该是这个意思吧?)

推荐几个连接给你看看先:
http://groups.google.com/groups?hl=zh-CN&lr=&ie=UTF-8&inlang=zh-CN&selm=01bbaa74%24f0d2dda0%2437f91fcc%40%23mhervin.ix.netcom.com&rnum=7
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iosguide/hh/iosguide/iosguide95_4i09.asp

可以发邮件讨论一下:JungleKnight@163.com
I'm upgrading……
7楼#
发布于:2002-12-11 11:18
呵呵!我也看到了!
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iosguide/hh/iosguide/iosguide95_4i09.asp

请看这个
Here is a reportedly successful implementation of an IOS port driver that uses the above R0_MM_READ_WRITE Ring0_FileIo to access a local FAT file:

Open the file with the following flags: R0_OpenFile(R0_NO_CACHE | R0_MM_READ_WRITE)
CreateSemaphore()
VWIN32_CreateRing0Thread()
Set_Thread_Win32_Pri(16) - other values may work
Set a worker thread running:
Thread()
while not stop
Wait_Semaphore(BLOCK_THREAD_IDLE)
Dequeue IOP
Do R0 file I/O
Do CallBack
endwhile

The IOP Handler:
IOHandler(IOP)
if read or write
Enqueue IOP    
Signal_Semaphore()
return
endif

Also, the developer reported the need to do periodic forced volume flushes to the memory mapped file (virtual drive) when a long file is being copied to it. This is done using IFSMGR_InstallFileSystemApiHook. After write operations to the virtual volume, a data byte counter is incremented and direct calls to volume\'s flush function through its function table occur if the counter = 1Mb. Without this, the reading of the file from system volume slows down and would ultimately result in being locked up in Ring0_FileIo.

When R0_NO_CACHE is used, the system does not do any buffering during I/O. For example, the buffer address goes directly to the ESDI port driver.

JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-11 11:33
说老实话我没有完全搞懂这段话.

我做了相关的试验:在R0_OpenCreateFile的时候给flags与上一个R0_MM_READ_WRITE,没有任何变化,系统照旧在驱动加载后过一会儿就没有反应

我想应该是要启一个线程的,所有的R0_File I/O都在这个线程里面去完成.IOP routine只是起个通知线程有request到来的作用.
这样是否能够解决重入的问题呢?

昨天我问了一个高手他说IOS port driver里面是不可以调R0_File IO service的,我不知道他考虑过上面那个途径没有.他提出了两个方案:

1.在Pagable memory中分配内存buffer,然后在init的时候把文件内容读到buffer中去;(这个方法似乎不好,因为我们的image file可能会很大)
2.用绝对磁盘读写.也就是说我们得知道image file所在的扇区.这个是比较麻烦的.并且如果在mount上virtual disk之后万一有人在image file所在的磁盘上做defragment操作就完蛋了.

我很想知道能否通过启动一个Ring0线程来完成这项工作.可惜暂时还没有人来指点我.只能自己摸索了

[编辑 -  12/11/02 by  JungleBoy]
I'm upgrading……
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-11 22:49
直接调用FSD的对应的routine,不要用Ring0 File I/O。
天天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分
10楼#
发布于:2002-12-12 09:14
??
可以说的详细点吗?
I'm upgrading……
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-12 11:33
每个FSD都有一组Volume Function Table。比如,你想打开FAT上的一个文件,就应该先得到VFAT的FS_OpenFile的指针,然后自己构造一个ifsreq(ioreq的超集),把里面的数据自己构造好,最后直接调用那个FS_OpenFile即可。
以后要对这个文件进行读写,就要用Open File时得到的另外一组Handle Based Function。

具体的细节,应该去看Inside the Windows 95 File System,虽然里面没有直接的实现方法,但看过之后肯定就明白了。
天天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分
12楼#
发布于:2002-12-12 12:04
那你能不能够解释一下FSD的routine跟R0 File I/O有什么不同呢?

我觉得原先产生死锁的原因是这样的:
1、FSD(VFAT) send IOP 给我的驱动(因为我的虚拟设备是FAT格式的);
2、在我的IOP routine里面调用R0_File I/O;
3、R0_File I/O又会send IOP给VFAT;
这样就造成VFAT重入了,然而VFAT是不可以重入的。所以系统被hang住

这是我的理解,可能有些偏差。
按照我这样理解的话,如果不是做虚拟磁盘,而是虚拟光驱的话在IOP routine里面应该是可以使用R0_File I/O的(因为CD_ROM的I/O请求是由CDFS发过来的,所以不会造成VFAT重入),但是我没做过,所以不知道。

我目前的做法是计算磁盘镜像文件的sectors,然后用0环下的磁盘读写进行I/O。这个方法不是很好,首先计算sector就是一件很麻烦的事情,而且不同的文件系统计算方法也不一样,我做了FAT32的,根本不知道NTFS的怎么算。麻烦!

我觉得这个问题虽然有些过时,但是涵盖了9x IOS的许多方面,希望高手们来讨论一下解决方案。谢谢!
I'm upgrading……
13楼#
发布于:2002-12-12 12:45
我做了创建线程的方法!可是在创建线程的时候就有问题啊!
基本的结构和CreateSemaphore()
VWIN32_CreateRing0Thread()
Set_Thread_Win32_Pri(16) - other values may work
Set a worker thread running:
Thread()
while not stop
Wait_Semaphore(BLOCK_THREAD_IDLE)
Dequeue IOP
Do R0 file I/O
Do CallBack
endwhile

The IOP Handler:
IOHandler(IOP)
if read or write
Enqueue IOP
Signal_Semaphore()
return
endif
说的一样
可是不管我在驱动程序的初始化里面创建线程还是在onrequest里面创建线程都不行!线程体现出来的是同步的!就是说当调用
VWIN32_CreateRing0Thread的时候,线程运行,而我在线程里面是
while(1)
{
   Wait_Semaphore(pSemHandle, BLOCK_POLL);
   。。。。。。。。。。。。。
}
结果系统也是死等了!
以下是我创建线程的代码,不知道错在哪里呢!
hThread = VWIN32_CreateRing0Thread(4096,(ULONG)pDCB,(PVOIDFUNCOFDW)ProcessThread,OnCallBack,&hRing3Thread);
if(hThread)
{
     LOCK_Set_Thread_Win32_Pri(hThread,16);
//LOCK_Set_Thread_Static_Boost(hThread,16);
}

JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-12 12:55
我觉得你这样的话不会死啊?

你的线程一直在Wait_Semaphore
当有IOP需要处理的时候,IOP routine调用Signal_Semaphore.然后线程就开始处理了

//你用VTools的吗?好爽!我不能用.不知道应该怎么写VWIN32_CreateRing0Thread的Wrapper,所以没有尝试这个办法
I'm upgrading……
15楼#
发布于:2002-12-12 13:11
啊!你没有vtools吗?ds里面带有的啊!
16楼#
发布于:2002-12-12 13:12
对了!98DDK里面带有的那个port例子,里面提供了一个isr的函数呢!
JungleBoy
驱动牛犊
驱动牛犊
  • 注册日期2002-10-17
  • 最后登录2009-09-07
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-12-12 13:15
我有,不过我不能用
我只能用DDK

你那边的情况怎么样了?
I'm upgrading……
18楼#
发布于:2002-12-12 13:37
呵呵!持续的郁闷中啊!只好自己再看看了!
wangleo
驱动牛犊
驱动牛犊
  • 注册日期2002-01-23
  • 最后登录2003-08-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-12-12 14:39
int
installthread(
    void* t
    )
{
    _asm {
        mov     ecx, 4096
        mov     edi, 0
        mov     ebx, [t]
        xor     esi, esi
    }
    VxDCall (_VWIN32_CreateRing0Thread)
}

void __Ring0Thread(
    void
    )
{
    nSemaphore = Create_Semaphore(1);

    while (1) {
        Wait_Semaphore(nSemaphore, BLOCK_THREAD_IDLE);
        if (terminatethread)
            break;
        DeQueueIOP();
        if (terminatethread)
            break;
    }
    threadid = -1;
    Destroy_Semaphore(nSemaphore);
}

void
InstallR0Thread(
    void
    )
{
    if (threadid == -1)
        threadid = installthread(&__Ring0Thread);
}


Control_Dispatch W32_DeviceIoControl

里面创建R0Thread。所有变量为注明的都是全局int。
上一页
游客

返回顶部