NO IMAGE
光碟燒錄程式設計

應朋友求助,給應用軟體加入光碟防拷貝支援,本來想照搬早期的磁碟穿孔技術,不過光碟和軟盤有較大區別,操作起來比較複雜,而且可靠性較差。
一開始想,CD-R 空盤應該有物理序列號可以使用,後來發現不存在這樣的序列號。
即使有,虛擬光碟機軟體一樣可以冒充這樣的序列號,即使它不存在於光碟的檔案系統中。
看來防拷貝似乎沒有簡單的方法,即使 Nero 這樣的燒錄軟體存在一些技巧可以做出防拷貝的效果,但沒有好的自動化方法,不適合批量生產。

於是問 google,查到一些關鍵字:

    ECC:ECC 提供自動糾錯功能,含有資料冗餘,一般光碟機讀入ECC資料,糾錯後丟掉冗餘的部分,如果直接寫入錯誤的ECC,那麼一般的讀取會產生錯誤,而直接讀取(raw read)則不會,以此組織一般的CD拷貝程式。

    EFM:

這些技術怎麼用呢?於是只好從最基礎的燒錄程式設計開始,google 少見有中文資料,於是邊看洋文邊作筆記,便有了本文。

一,使用 Windows XP 內建的燒錄功能

參考
    http://msdn.microsoft.com/msdnmag/issues/04/04/CQA/

1,簡單檔案燒錄

    使用 Shell 的 ICDBurn 介面,其中方法:
        HasRecordableDrive 掃描系統,如果發現可寫的CD驅動器則返回TRUE。
        GetRecorderDriveLetter 返回可寫驅動器。
        Burn 執行燒錄動作,從集結區(staging area)寫入 CD-R。

    其中,在執行燒錄之前必須先把要燒錄的檔案複製到集結區,集結區是一個臨時目錄,位於使用者目錄 “%USERPROFILE%/Local Settings/Application Data/Microsoft/CD Burning” ,也可以通過下面的Shell API獲取:
    SHGetFolderPath(CSIDL_CDBURN_AREA)

    注意這裡的方法只能用於單個燒錄光碟機,如果你有多個燒錄光碟機就不行了。

2,音樂CD、CD-RW 等更復雜的燒錄

    這裡使用的是 IMAPI (映像控制 Image Mastering API),也是 Windows XP 以上版本支援。IMAPI 可用於查詢燒錄機、寫入資料以及一些叫不出名字的先進功能。
    建立 MSDiscMasterObj 物件,該物件有如下介面:
        -o IDiscMaster
        -o IRedbookDiscMaster
        -o IJolietDiscMaster
    稍為解釋一下:CD 一般分為兩種:音訊CD和資料CD,前者遵循紅皮書規範,後者則為ISO-9660規範 (也有其它一些資料規範,Joliet是ISO-9660的擴充套件。)

    首先獲得 IDiscMaster 介面,呼叫 EnumDiscMasterFormats 列舉驅動器支援的媒體格式 (Redbook, Joliet等),根據格式獲取 IRedbookDiscMaster 等對應介面。如果要求更高可以呼叫 Get/SetActiveDiscMasterFormat 以動態更新。

    然後呼叫 EnumDiscRecorders 列出所有燒錄裝置,對應 IDiscRecorder 介面,該介面提供諸如裝置路徑、屬性、彈出、擦除 CD-RW 等功能,但不包括寫入資料。

    具體的寫入資料根據不同格式而不同,對於資料CD,即Joliet 格式,首先呼叫 AddData(IStorage*) 方法加入檔案、目錄等,而對於音訊CD,即紅皮書格式則首先呼叫 AddAudioTrackBlocks 加入音軌。這些方法都是將資料拷貝到集結區,而不是立即寫入。
    當資料都準備好了,最後呼叫 IDiscMaster 的 RecordDisc 方法就可以了。這個方法有一個 bSimulate 的引數用於“模擬寫入”,不過你可能永遠不會去用它。

    關於 IMAPI 就介紹到這,它雖然比較簡單,不過靠著 Windows XP 這棵大樹,對於VB程式設計師也差不多足夠了。

二,MCDB – Magic CD/DVD Burner (C/C Library)

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。
首先建立 MCDBurner 物件,屬性 DeviceCount 和 DeviceName[] 查得燒錄機列表。
通過呼叫 InsertFile/InsertDir 將如要寫入的檔案和目錄,然後執行寫入,有幾種不同的寫入方法:
    BuildISOImage(filename)  寫入ISO映像檔案
    BurnISO(isofile)  將 ISO映像檔案寫入光碟
    Prepare/Burn  直接寫入光碟 (也就是著名的 on-the-fly 寫盤技術)
其它常用的方法有:
    EraseDisc  擦除 CD-RW 碟片
    DiscIs  判斷媒體型別
    MaxWriteSpeed/WriteSpeed  寫入速度
    LoadMedium/EjectMedium  裝入和彈出光碟

MCDB 的 120M 試用版可在 www.binarymagics.com 上下載,零售價為200-400美元不等,同時有原始碼出售,價格2000美元左右。

三,hpCDE

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 提供了其它類的構建方法,大致過程如下:

    初始化:
    hpCDE::CreateEngine     獲得引擎物件
    IEngine::Initialize     初始化引擎,其中win 95/98必須使用ASPI,而NT則不用。
    IEngine::GetDevices     獲得驅動器列表
        – IDeviceCollection::GetItem    列舉驅動器
        – IDevice::GetWritePossible     判斷是否可寫,並忽略不可寫裝置
        – IDevice::GetDriveLetter       查詢碟符
        – IDevice::GetDescription       查詢卷標
        – IDevice::GetMediaFreeSpace    判斷是否碟片是否可用
        – IDevice::GetMediaIsBlank      判斷是否為空盤
        – IDevice::GetMaxWriteSpeed     最高寫入速度
        – IDevice::GetReWritePossible   燒錄機是否支援擦除
        – IDevice::GetMediaIsReWritable 碟片是否可擦除

如果希望CD複製並行進行,因此需要建立兩個執行緒分別用於讀取/寫入,hpCDE 支援多執行緒模型。hpCDE 支援SAO/TAO/DAO,這裡CD複製使用的是 DAO。對於多段寫入,每個段對應於一個ISession,一個Session可以包含多個Track。
   
    寫入過程:
    IDevice::SetCurrentSpeeds   設定寫入速度
    IDevice::Eject              彈出碟片
   
   
參考
http://www.hpcde.com/documentation/index.html

四,cdrdao, cdrtools

參考:
    http://cdrdao.sourceforge.net/
    http://freshmeat.net/projects/cdrecord/
    http://linuxcommand.org/man_pages/cdrecord1.html

cdrdao 是一款開源 DAO 模式燒錄軟體,有 linux 和 windows 兩個版本。

cdrdao 僅支援一種模式 DAO 即一次完成寫盤,這種模式可以實現一些 pre-gaps 的有趣特性,對於光碟防拷貝,則可以實現 ECC 檢查的技巧。因為是專門為 DAO 設計,不是專業人士恐怕無法閱讀其原始碼。

cdrtools 也是開源的,不過它是全功能的,包括IDE/ATAPI/SCSI, 音訊/資料/混合CD,多段燒錄,CD-RW,TAO/DAO/RAW 等等,同時支援很多作業系統。