如何从OS X上的CD读取明文数据扇区(Mode1)

时间:2016-09-21 10:21:06

标签: macos disk iokit raw-disk

我试图从OS X上的数据CD中读取普通的2048字节大小的数据扇区。

但是当我打开诸如“/ dev / disk8”之类的设备时,我得到的扇区大小为2352,在每个扇区的实际Mode1数据之前有一个16字节的标头。

即使使用hexdump等BSD工具,在阅读Apple制作的旧CD时也可以看到:

$ hexdump -n 512 -C /dev/disk8
00000000  00 ff ff ff ff ff ff ff  ff ff ff 00 00 02 00 01  |................|
00000010  45 52 08 00 00 05 00 00  00 01 00 01 00 00 00 00  |ER..............|
00000020  00 04 00 00 00 10 00 05  00 01 00 00 00 1e 00 19  |................|
00000030  ff ff 00 00 00 41 00 05  07 01 00 00 00 4f 00 1f  |.....A.......O..|
00000040  f8 ff 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

实际扇区的数据从偏移量0x10开始,带“ER”。但“ER”应该偏移0。

如何在我自己的应用程序中完成此工作,而无需在单独的步骤中删除额外的数据?

我查看了“IOCDMediaBSDClient.h”和“IOCDTypes.h”中的各种ioctl函数,但我找不到一个允许我指定我只想从扇区获取纯数据内容的函数

我也相信我15年前编写的现有代码能够按照需要处理这个问题,但是从那时起OS X中出现了一些变化,破坏了我的旧代码。现在我无法弄清楚如何解决这个问题。该代码使用ioctlDKIOCCDREAD,参数sectorArea=kCDSectorAreaUsersectorType=kCDSectorTypeMode1。但是这给了我16字节的标题,就像普通的read调用一样,即使Mode1意味着我应该得到2048字节的扇区,没有任何标题,据我所知。

1 个答案:

答案 0 :(得分:1)

如评论部分所述,答案似乎是使用字符设备(rdisk),而不是块设备(磁盘)节点。据我所知,这种区别没有很好的记录,对于硬盘驱动器和SSD实际上非常小 - 在大多数情况下,你可以使用其中之一。对于光盘来说,无论出于什么原因,它都会有很大差异。

不久前我对此进行了调查,但不幸的是,我忘记了它的细节。如果您对此感兴趣,可以在Apple的https://opensource.apple.com/站点上的“IOStorageFamily”和“IOCDStorageFamily”源代码包中找到实现。

您所关注的代码文件是与“BSD客户端”相关的代码文件 - IOStorageFamily中的IOMediaBSDClient.cpp / .h,以及专门用于CD的IOMediaBSDClient.cpp / .h。块(“磁盘”)设备的ioctl首先在dkioctl_bdev()中处理,然后转发到通用dkioctl(),后者又调用IOCDMediaBSDClient::ioctl()方法。字符设备(“rdisk”)改为使用dkioctl_cdev()