光盘刻录编程 |
应朋友求助,给应用软件加入光盘防拷贝支持,本来想照搬早期的磁盘穿孔技术,不过光盘和软盘有较大区别,操作起来比较复杂,而且可靠性较差。 于是问 google,查到一些关键字: ECC:ECC 提供自动纠错功能,含有数据冗余,一般光驱读入ECC数据,纠错后丢掉冗余的部分,如果直接写入错误的ECC,那么一般的读取会产生错误,而直接读取(raw read)则不会,以此组织一般的CD拷贝程序。 EFM: 这些技术怎么用呢?于是只好从最基础的刻录编程开始,google 少见有中文资料,于是边看洋文边作笔记,便有了本文。
参考 1,简单文件刻录 使用 Shell 的 ICDBurn 接口,其中方法: 其中,在执行刻录之前必须先把要刻录的文件复制到集结区,集结区是一个临时目录,位于用户目录 "%USERPROFILE%/Local Settings/Application Data/Microsoft/CD Burning" ,也可以通过下面的Shell API获取: 注意这里的方法只能用于单个刻录光驱,如果你有多个刻录光驱就不行了。
这里使用的是 IMAPI (映像控制 Image Mastering API),也是 Windows XP 以上版本支持。IMAPI 可用于查询刻录机、写入数据以及一些叫不出名字的先进功能。 首先获得 IDiscMaster 接口,调用 EnumDiscMasterFormats 列举驱动器支持的媒体格式 (Redbook, Joliet等),根据格式获取 IRedbookDiscMaster 等对应接口。如果要求更高可以调用 Get/SetActiveDiscMasterFormat 以动态更新。 然后调用 EnumDiscRecorders 列出所有刻录设备,对应 IDiscRecorder 接口,该接口提供诸如设备路径、属性、弹出、擦除 CD-RW 等功能,但不包括写入数据。 具体的写入数据根据不同格式而不同,对于数据CD,即Joliet 格式,首先调用 AddData(IStorage*) 方法加入文件、目录等,而对于音频CD,即红皮书格式则首先调用 AddAudioTrackBlocks 加入音轨。这些方法都是将数据拷贝到集结区,而不是立即写入。 关于 IMAPI 就介绍到这,它虽然比较简单,不过靠着 Windows XP 这棵大树,对于VB程序员也差不多足够了。
MCDB 是 Binary Magic 开发的商用 CD/DVD 刻录组件,易用性比较好,有 VCL 和 ActiveX 两大类别,Audio/CD/DVD/VCD 等不同媒介的几个版本,可用于 Delphi, C++ Builder, C#, VB.net, VB, C++ 等开发语言。MCDB支持UDF接口,Unicode字符集,以及多种刻录机接口,可非常容易的制作MPEG VCD、可启动光盘等,其核心使用ASPI接口(高级SCSI编程接口,也可用于访问IDE接口)。 编写 MCDB 应用程序非常简单,基本类似于 IMAPI。 MCDB 的 120M 试用版可在 www.binarymagics.com 上下载,零售价为200-400美元不等,同时有源码出售,价格2000美元左右。
hpCDE 是 Primo Software 开发的一款高性能CD/DVD刻录组件,目前版本1.78,从特性列表中可以看到它对硬件的支持非常多,在写入中支持 DVD DAO/Incremental、TAO, SAO, DAO, RAW, CD-PLUS 等多种模式,支持 UDF和HFS文件系统,可用于刻录供Mac OS使用的光盘,以及支持飞盘保护如JustLink, SafeBurn, SmartBurn等高级特性。 相较于前面两个,hpCDE明显复杂,没办法~ 强大的东西总是复杂的。 先从CD复制开始,工厂类 hpCDE 提供了其它类的构建方法,大致过程如下: 初始化: 如果希望CD复制并行进行,因此需要建立两个线程分别用于读取/写入,hpCDE 支持多线程模型。hpCDE 支持SAO/TAO/DAO,这里CD复制使用的是 DAO。对于多段写入,每个段对应于一个ISession,一个Session可以包含多个Track。
参考: cdrdao 是一款开源 DAO 模式刻录软件,有 linux 和 windows 两个版本。 cdrdao 仅支持一种模式 DAO 即一次完成写盘,这种模式可以实现一些 pre-gaps 的有趣特性,对于光盘防拷贝,则可以实现 ECC 检查的技巧。因为是专门为 DAO 设计,不是专业人士恐怕无法阅读其源代码。 cdrtools 也是开源的,不过它是全功能的,包括IDE/ATAPI/SCSI, 音频/数据/混合CD,多段刻录,CD-RW,TAO/DAO/RAW 等等,同时支持很多操作系统。 |