當拷貝機遇到78 Bytes



贊助商連結


bx2aa
2004-04-14, 04:52 PM
原本想寫一個比較方便的硬碟對硬碟的 GHOST 小程式
但是經過兩三個小時透過 DEBUG 寫出使用 LBA 的方式拷貝硬碟
以一個硬碟的磁扇區對另一個硬碟的同一個磁扇區複製
寫出的程式碼在沒有 Display (PS:也就是不顯示拷貝多少磁扇區的訊息)的狀況下只需要 78 Bytes
而且支援超大硬碟的拷貝, 最大支援 18446744073709551616 Sector 的 LBA MODE 硬碟對拷
也就是 9444732965739290427392 bytes
也就是 9223372036854775808 Kbytes
也就是 9007199254740992 Mbytes
也就是 8796093022208 Gbytes
也就是 8589934592 Tbytes
也就是 8388608 Pbytes
也就是 8192 Ebytes
也就是 8 Zbytes

只需在 INT 13 後加上判斷 CF = 0 則繼續下一個磁扇區的複製, 若 CF = 1 則跳出
依我的 CPU CyRIX 166MHZ 超頻到 PR233 實際是 187MHZ 跑 30000000 次的 CPU 指令只需 0.13 秒左右.
判斷 2T 硬碟的 SECTOR 數量 4294967296 個 SECTOR , 除了讀入和寫出時間外,
會增加 (0.13秒 * (4294967296/30000000)) = 判斷 CF 是否為 0 ,
COPY 2T 的硬碟會多浪費約 18.6 秒多的時間來判斷 每一個 Sector COPY 的 CF 是否等於 1
2T 以下硬碟對拷的程式碼會縮減到 60 個 BYTES 以下.
因為可以省下 MOV BP,[SI+12] INC BP MOV [SI+12],BP JO ??? JMP (跳到MOV AX,4200) 的 BYTES 數 * 2
算了一下大約可以省 22 Bytes
記憶體空間也不需要太大, 除了本身的 78 Bytes 和 16 Bytes 的 Disk Address Packet 外,
只要能放 1 個 Sector 的 512Bytes 當 兩個硬碟的 Swap 空間就夠了.
只要將這 78 Bytes 放到一張磁片或是燒到光碟.
用這張磁片或是光碟開機, 那 PC 就變拷貝機.
這 78 Bytes 一經 BIOS 載入執行,
就會開始對 第一個硬碟的 Sector 內的資料 COPY 到 第二個硬碟相同位置的 Sector 內.
經測試, 因為沒有兩個未用的硬碟只好設定計數 20 從 LBA:1 開始
先修改 Cylinder:0 Head:0 Sector:2 前 16 Bytes 和 Cylinder:0 Head:0 Sector:21 前 16 Bytes
然後把第一個硬碟(接在 IDE0)的 Cylinder:0 Head:0 Sector:2 到 21
Copy 到第二個硬碟(接在 IDE1)的 Cylinder:0 Head:0 Sector:2 到 21
執行完後查看
第二個硬碟的 Cylinder:0 Head:0 Sector:2 和 Cylinder:0 Head:0 Sector:21
結果確實將第一個硬碟的資料完整的 Copy 到第二個硬碟相同位置內

然後修改讀取資料到 大於 8GB 的位置 00 00 00 00 01 22 7B 60 (9GB多的位置),
讀取一個磁扇區的資料, 就是我的擴展分區的第一個磁扇區
發現確實讀出我的擴展分區的資料.

至此, 完成了我的第一部 PC 的硬碟拷貝機 僅 78 Bytes

沒有完全釋放 Source Code 是因為殺傷力太大.
如果有人裝錯, 資料立刻全部不見.
現在想到另一個方法就是將目的硬碟寫一個扇區的資料.
然後自動判斷到有這個扇區資料的為目的硬碟.
變成要 COPY 前要先把目的硬碟裝上 Run 一個程式.