光碟燒錄程式設計 收藏

2021-05-12 20:06:06 字數 4058 閱讀 5844

***光碟燒錄程式設計 收藏

光碟燒錄程式設計

應朋友求助,給應用軟體加入光碟防拷貝支援,本來想照搬早期的磁碟穿孔技術,不過光碟和軟盤有較大區別,操作起來比較複雜,而且可靠性較差。

一開始想,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...