FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2155回复:11

关于cdfs: 谁知道cdfs是如何识别一个volum是不是cdrom的??

楼主#
更多 发布于:2004-03-26 18:27
我在inside windows 2000中看到, windows要mount 一个文件系统,就是要每个已经注册了的fsd去查被检测的volum 的第一个sector (一个sector 是不是512Byte?),如果一个fsd找到了他所支持的相应fs的信息, i/o manager就是在该volum的device object的vbp写一些东西,完成mount工作。
但是对于cdrom,这个工作也是一样的么?csfs file system dirver是怎么万成这个工作的呢?也是看cd上面的第一个sector (512k?)
我看了一下iso镜像文件,但是他前64个sector 都是空的阿~~~
iso镜像文件和真正的cd到底有什么不同??

或者,各位谁知道哪里可以弄到关于windows cdfs driver的相关资料??

拜谢了!!!!

最新喜欢:

machlimachli
cool-net
驱动小牛
驱动小牛
  • 注册日期2003-03-18
  • 最后登录2010-01-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-27 02:27
这个问题... ...呵呵,各种MassStor的DeviceObject都是有区别的,比如为CD-ROM调用IoCreateDevice的时候会明确指明DeviceType=FILE_DEVICE_CD_ROM,那从这里mount上来的东东如果不是CD还能是什么呢(DVD跟CD处理大致一样)。
根据ISO标准,CD-ROM的前16个扇区是保留的,所以系统会从第17个扇区读盘片信息,还有,CD-ROM的扇区一般是2048以上(根据读方式不同有变化)。
有错误才会有进步,所以我的人生目标是: 错误不断,毁人不倦!
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-29 15:40
多谢回复,
首先,多谢关于iso的格式问题的回复。
但是关于另外一个问题,我可能没有把我的问题说清楚:
首先,对于cdrom 的fdo 的创建,我是没有问题的,问题在于如何在这个创建的cdrom fdo上面再加上一个cdfs file system driver 的object.所以我的问题在于file system driver而不是cdrom class driver (所以你提到的关于IoCreateDevice哪些东西,虽然对,但是并不能解决我的问题)
不知道你请不清楚iso文件格式和真正的cd 的区别在什么地方?
多谢了~~
phenix_xiaomei
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望57点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-29 17:55
在IRP_MJ_FILE_SYSTEM_CONTROL中,有个IRP_MN_MOUNT_VOLUME。文件系统在这个地方检测光盘的16扇区开始的邻近几个扇区。决定是否能Mount它。如果不行,返回STATUS_UNRECOGNIZED_VOLUME。结束回调例程。如果可以,创建Volume device object。
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-29 18:46
1、建立CDROM的PDO设备对象。

2、开始存取CDROM上的文件。

3、IO管理器检查那个PDO的VPB的Flag,看看是否已经有某个FSD Claim了这个卷。

4、如果卷还没有安装,则IO管理器向当前所有已经注册的FSR发送IRP_MJ_FILE_SYSTEM_CONTROL/IRP_MN_MOUNT_VOLUME请求。FSR一般会读物理设备,看看它(FSR)是否能识别这个设备。如果有某个FSR可以识别这个设备,则它就返回STATUS_FS_DRIVER_REQUIRED。

对于CDROM设备来说,当CDRMO的FSR(“\\FileSystem\\CdfsRecognizer”)接收到请求时,它读物理设备,发现它可以Claim这个设备,所以它返回STATUS_FS_DRIVER_REQUIRED。

5、在第4步,如果有某个FSR返回了STATUS_FS_DRIVER_REQUIRED,则IO管理器接着向这个FSR发送IRP_MJ_FILE_SYSTEM_CONTROL/IRP_MN_LOAD_FILE_SYSTEM请求,这时候这个FSR调用ZwLoadDriver()装载真正的FSD。对于CDROM来说,就是装载“CDFS.SYS”。

6、CDFS.SYS被装载时,它建立控制设备对象“\\CDFS”。

7、IO管理器再次向“\\CDFS”发送IRP_MJ_FILE_SYSTEM_CONTROL/IRP_MN_MOUNT_VOLUME请求,这时候CDFS的FSD“将建立一个新的没有名字的设备对象,并把这个新的设备对象保存到那个PDO的VBP的DeviceObject变量里边”。然后CDFS的FSD会更改VBP的Flag表明这个卷已经被安装。

8、这时候IO管理器就可以构造IRP向CDFS新建立的那个无名设备对象发送IRP_MJ_CREATE、IRP_MJ_READ等请求了。

迷迷糊糊说了这么多,也不知道说对了多少 :D:D:D
cool-net
驱动小牛
驱动小牛
  • 注册日期2003-03-18
  • 最后登录2010-01-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-29 19:07
楼上的兄弟说得基本对,我只补一些:
1、FS在读Medium的时候一般首先读TOC,可以通过TOC来断定Medium是什么格式以及是否存在Multi session,还有数据格式是Mode0、Mode1、Mode2(有些Mode还要区别Form)还是XA等等。
2、关于ISO,并不是一成不变的,比如CDDA做成的ISO的前16个扇区是有用的,而且扇区大小是2352bytes(RedBook spec.),ISO9660格式的CD前16扇区保留,扇区大小是2048,VideoCD符合ISO9660文件系统的标准,但扇区大小较大(因为它没有ECC和LEC数据),还有混合模式的CD,Multi Session等等,不能一概而论;有一些文件辍虽然也是ISO,但它不一定是标准格式(我记得以前的EZCD生成的ISO就是这种类型)比如每个扇区同时还加入96bytes的SUB Channel数据等等... ...但是最常用的也就两种,2048byte/sector(ISO9660/Joliet/Bridge/UDF等等)和2352byte/sector(CDDA或RAW Data)。
3、ISO跟CD的区别,这个不太好说,我觉得它们没什么可比性,如果非要说出区别的话,我想就是CD有leadin、leadout、toc、subchannel、ECC/LEC等等,有时还存在Multi session,而ISO里一般就只有Single session里的“有效数据”。
4、综上,FS在Mount一个Medium的时候,肯定会读取足够多的信息以确定Medium的格式,然后MountMgr才会Mount这个Volume上去(比如原来Windows98好象不能Mount某些DVD,原因就是它的FS Driver只能识别ISO9660/Joliet等等而不能识别UDF)。

[编辑 -  3/29/04 by  cool-net]
有错误才会有进步,所以我的人生目标是: 错误不断,毁人不倦!
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-30 22:51
喔~~一天没来,这么多回复~~,多谢多谢~~~

1、建立CDROM的PDO设备对象。

恩,没问题。。。


2、开始存取CDROM上的文件。

存取??还是读取?



4、如果卷还没有安装,则IO管理器向当前所有已经注册的FSR发送IRP_MJ_FILE_SYSTEM_CONTROL/IRP_MN_MOUNT_VOLUME请求。FSR一般会读物理设备,看看它(FSR)是否能识别这个设备。如果有某个FSR可以识别这个设备,则它就返回STATUS_FS_DRIVER_REQUIRED。

对于CDROM设备来说,当CDRMO的FSR(“FileSystemCdfsRecognizer”)接收到请求时,它读物理设备,发现它可以Claim这个设备,所以它返回STATUS_FS_DRIVER_REQUIRED。
 


我就是这点不明白,CdfsRecognizer怎么读物理设备(cdrom)?读物理设备的什么地方(头几个sector?) 要找到什么data structure才算找到了??……(cdfsRecognizer有source code么?)

实际上,我关心这个问题,是因为我把所有对cdrom的读取都变成了对一个镜像文件的读取。 我开始用iso 9660文件作镜像,但是系统(估计也就是你说的fsRecognizer)分辨不出来,我就像知道cdfs到底是怎样识别cdrom的。。。。。。

哪位高人指点一下啊?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-03-31 00:49
CD-FSR没有源代码,但是IFS里边有CDFS的代码。

我大概看了一下,发现它同样包含了怎样识别一个设备是否是CDROM的代码,你不妨自己去看看。

NTSTATUS
CdMountVolume (
    IN PIRP_CONTEXT IrpContext,
    IN PIRP Irp
    )

/*++

Routine Description:

    This routine performs the mount volume operation.  It is responsible for
    either completing of enqueuing the input Irp.

    Its job is to verify that the volume denoted in the IRP is a Cdrom volume,
    and create the VCB and root DCB structures.  The algorithm it
    uses is essentially as follows:

    1. Create a new Vcb Structure, and initialize it enough to do I/O
       through the on-disk volume descriptors.

    2. Read the disk and check if it is a Cdrom volume.
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      
    3. If it is not a Cdrom volume then delete the Vcb and
       complete the IRP back with an appropriate status.

    4. Check if the volume was previously mounted and if it was then do a
       remount operation.  This involves deleting the VCB, hook in the
       old VCB, and complete the IRP.

    5. Otherwise create a Vcb and root DCB for each valid volume descriptor.

Arguments:

    Irp - Supplies the Irp to process

Return Value:

    NTSTATUS - The return status for the operation
{
......
}
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-03-31 18:04
多谢楼上回复
但是ifs要900美刀呐!!!~~~~
俺买不起啊~~ ifs这东西应该没破解版可下的吧?

(另外,小声问一句,驱动开发网上提供给高级会员下载的ifs怎么这么便宜阿?经过ms授权了么????)
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-03-31 18:37
我的硬盘上有DDK98、2000、XP、2003、IFS 2K、IFS XP、IFS 2003,全部是在网上(注:不是本站)下载的。甚至包括Windows 2K/NT的源代码也是通过BT下载的。

如果你一直坚持使用正版,我就没有可以说了 :D :D :D
machli
驱动牛犊
驱动牛犊
  • 注册日期2003-07-06
  • 最后登录2004-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-01 09:54
我现在也正遇到与楼主类似的问题,但不知楼主能否告知现在问题解决的情况如何。

   再有有一问题想请教5楼的Cool-Net大虾,有关CDROM的IFS的几个关键步骤都是什么?
  
   关于上面的问题,楼上的几位仁兄如果能解释,同样希望不吝赐教!!
Leopard
驱动老牛
驱动老牛
  • 注册日期2001-07-13
  • 最后登录2021-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望53点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
  • 忠实会员
11楼#
发布于:2004-04-03 16:33
我的硬盘上有DDK98、2000、XP、2003、IFS 2K、IFS XP、IFS 2003,全部是在网上(注:不是本站)下载的。甚至包括Windows 2K/NT的源代码也是通过BT下载的。

如果你一直坚持使用正版,我就没有可以说了 :D :D :D

me too! :D
游客

返回顶部