線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4489
推到 Plurk!
推到 Facebook!

燒錄光碟映像檔

缺席
hichcock
一般會員


發表:2
回覆:11
積分:17
註冊:2009-09-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-12-29 11:08:42 IP:60.251.xxx.xxx 訂閱
其實市面上已經有很多的燒錄軟體
不過小弟自己好奇心作祟, 因為之前因為工作關係寫了個 USB 隨身碟燒錄軟體
所以想說也來寫個光碟燒錄軟體之類的

目前遇到之前寫 USB 隨身碟初期同樣的問題
之前我可以用 DeviceIoControl IOCTL_STORAGE_GET_DEVICE_NUMBER
來確定隨身碟是屬於哪個 PhysicalDrive
因為需要用 PhysicalDrive 來進行 IOCTL_DISK_GET_DRIVE_GEOMETRY
才可以拿到最完整的 sector 大小

目前遇到的問題是我不知道需要將 PhysicalDrive 改成什麼才能讀取到完整的 sector 大小
請教一下有這方面經驗的前輩, 先謝謝了

hichcock
一般會員


發表:2
回覆:11
積分:17
註冊:2009-09-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-12-29 16:38:31 IP:60.251.xxx.xxx 訂閱
目前參考過  http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=27077#4 這篇實戰 DeviceIOControl 的文章後
參考過裡面的作法
不過還是遇到相同的問題
目前我的驗證方式如下, 如方式有錯也請指教

1. 使用虛擬光碟載入一光碟, 該 img 檔案大小為 242141184 Byte
3. 透過 DeviceIOControl 算出的大小為239075328 Byte

計算方式如下
#define MEDIA_INFO_SIZE sizeof(GET_MEDIA_TYPES) 15*sizeof(DEVICE_MEDIA_INFO)

PhysicalDriveIOCTL = CreateFile( "\\\\.\\CDROM0" , GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

DISK_GEOMETRY pdg;
GET_MEDIA_TYPES *pmt = (GET_MEDIA_TYPES *)new BYTE[MEDIA_INFO_SIZE];
if((hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE) &&
(DeviceIoControl(hPhysicalDriveIOCTL, IOCTL_STORAGE_GET_MEDIA_TYPES_EX, NULL, 0, pmt, MEDIA_INFO_SIZE, &rByte, NULL)))
{
m_Total_Size = pdg.Cylinders.QuadPart * pdg.TracksPerCylinder * pdg.SectorsPerTrack * pdg.BytesPerSector;
}

不知道為何中間會有這樣的落差





hichcock
一般會員


發表:2
回覆:11
積分:17
註冊:2009-09-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-02-02 14:38:24 IP:60.251.xxx.xxx 訂閱
 自己回答

之前的方式......放棄, 不知道要怎麼改

不過找到其他方式來做計算了, 就是用 WMI 的方式直接取得就可以了
系統時間:2024-11-22 13:59:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!