***光碟燒錄程式設計 收藏
光碟燒錄程式設計
應朋友求助,給應用軟體加入光碟防拷貝支援,本來想照搬早期的磁碟穿孔技術,不過光碟和軟盤有較大區別,操作起來比較複雜,而且可靠性較差。
一開始想,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。
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/*** burner (c/c++ library)
mcdb 是 binary magic 開發的商用 cd/*** 燒錄元件,易用性比較好,有 vcl 和 activex 兩大類別,audio/cd/***/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 裝入和彈出光碟
三,hpcde
hpcde 是 primo software 開發的一款高效能cd/***燒錄元件,目前版本1.78,從特性列表中可以看到它對硬體的支援非常多,在寫入中支援 *** 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/
cdrdao 是一款開源 dao 模式燒錄軟體,有 linux 和 windows 兩個版本。
cdrdao 僅支援一種模式 dao 即一次完成寫盤,這種模式可以實現一些 pre-gaps 的有趣特性,對於光碟防拷貝,則可以實現 ecc 檢查的技巧。因為是專門為 dao 設計,不是專業人士恐怕無法閱讀其源**。
cdrtools 也是開源的,不過它是全功能的,包括ide/atapi/scsi, 音訊/資料/混合cd,多段燒錄,cd-rw,tao/dao/raw 等等,同時支援很多作業系統。
linux 燒錄光碟
1.檢視 燒錄機名稱和最大寫入速度 cat proc sys dev cdrom infowodim prcap or cdrecord prcap 以上兩種方法任選其一 2.掛載光碟 如果不能自動掛載 ls l dev grep cdrom mount dev cdrom mnt 第一條命令結果的...
燒錄光碟 cdrom
description 在fjoi2010夏令營快要結束的時候,很多營員提出來要把整個夏令營期間的資料燒錄成一張光碟給大家,以便大家回去後繼續學習。組委會覺得這個主意不錯!可是組委會一時沒有足夠的空光碟,沒法保證每個人都能拿到燒錄上資料的光碟,怎麼辦呢?dyj分析了一下所有營員的地域關係,發現有些營...
燒錄光碟 題解
題目 在p jo ipjoi pjoi 2010夏令營快要結束的時候,很多營員提出來要把整個夏令營期間的資料燒錄成一張光碟給大家,以便大家回去後繼續學習。組委會覺得這個主意不錯!可是組委會一時沒有足夠的空光碟,沒法保證每個人都能拿到燒錄上資料的光碟,又來不及去買了,怎麼辦呢?組委會把這個難題交給了d...