?? ddcopy16.cpp
字號:
/***********************************
DDcopy V1.6
by Li Zhi (ddcopy@263.net)
2003-7-4
TC++ 3.0
* V1.6d by lizhi 2004-11-6
1.修改映像文件壓縮錯誤
* V1.6c by lizhi 2004-10-30
1.修改映像文件拷貝功能中的錯誤
2.增加指定拷貝扇區范圍功能
***********************************/
/*
Table 00650
===========
Format of hard disk master boot sector:
Offset Size Description
00h 446 BYTEs Master bootstrap loader code
1BEh 16 BYTEs partition record for partition 1 (see #00651)
1CEh 16 BYTEs partition record for partition 2
1DEh 16 BYTEs partition record for partition 3
1EEh 16 BYTEs partition record for partition 4
1FEh WORD signature, AA55h indicates valid boot block
Table 00651
===========
Format of partition record:
Offset Size Description
00h BYTE boot indicator (80h = active partition)
01h BYTE partition start head
02h BYTE partition start sector (bits 0-5)
03h BYTE partition start track (bits 8,9 in bits 6,7 of sector)
04h BYTE operating system indicator (see #00652)
05h BYTE partition end head
06h BYTE partition end sector (bits 0-5)
07h BYTE partition end track (bits 8,9 in bits 6,7 of sector)
08h DWORD sectors preceding partition
0Ch DWORD length of partition in sectors
Table 00652
===========
Values for operating system indicator:
00h empty partition-table entry
01h DOS 12-bit FAT
02h XENIX root file system
03h XENIX /usr file system (obsolete)
04h DOS 16-bit FAT (up to 32M)
05h DOS 3.3+ extended partition
06h DOS 3.31+ Large File System (16-bit FAT, over 32M)
07h QNX
07h OS/2 HPFS
07h Windows NT NTFS
07h Advanced Unix
07h see partition boot record; could be any of the above or others
08h OS/2 (v1.0-1.3 only)
08h AIX bootable partition, SplitDrive
08h Commodore DOS
08h DELL partition spanning multiple drives
09h AIX data partition
09h Coherent filesystem
0Ah OS/2 Boot Manager
0Ah OPUS
0Ah Coherent swap partition
0Bh Windows95 with 32-bit FAT
0Ch Windows95 with 32-bit FAT (using LBA-mode INT 13 extensions)
0Eh logical-block-addressable VFAT (same as 06h but using LBA-mode INT 13)
0Fh logical-block-addressable VFAT (same as 05h but using LBA-mode INT 13)
10h OPUS
11h OS/2 Boot Manager hidden 12-bit FAT partition
12h Compaq Diagnostics partition
14h (resulted from using Novell DOS 7.0 FDISK to delete Linux Native part)
14h OS/2 Boot Manager hidden sub-32M 16-bit FAT partition
16h OS/2 Boot Manager hidden over-32M 16-bit FAT partition
17h OS/2 Boot Manager hidden HPFS partition
17h hidden NTFS partition
18h AST special Windows swap file ("Zero-Volt Suspend" partition)
19h Willowtech Photon coS
1Bh hidden Windows95 FAT32 partition
1Ch hidden Windows95 FAT32 partition (using LBA-mode INT 13 extensions)
1Eh hidden LBA VFAT partition
20h Willowsoft Overture File System (OFS1)
21h officially listed as reserved
21h FSo2
23h officially listed as reserved
24h NEC MS-DOS 3.x
26h officially listed as reserved
31h officially listed as reserved
33h officially listed as reserved
34h officially listed as reserved
36h officially listed as reserved
38h Theos
3Ch PowerQuest PartitionMagic recovery partition
40h VENIX 80286
41h Personal RISC Boot
41h PowerPC boot partition
42h SFS (Secure File System) by Peter Gutmann
45h EUMEL/Elan
46h EUMEL/Elan
47h EUMEL/Elan
48h EUMEL/Elan
4Fh Oberon boot/data partition
50h OnTrack Disk Manager, read-only partition
51h OnTrack Disk Manager, read/write partition
51h NOVELL
52h CP/M
52h Microport System V/386
53h OnTrack Disk Manager, write-only partition???
54h OnTrack Disk Manager (DDO)
55h EZ-Drive (see also INT 13/AH=FFh"EZ-Drive")
56h GoldenBow VFeature
5Ch Priam EDISK
61h SpeedStor
63h Unix SysV/386, 386/ix
63h Mach, MtXinu BSD 4.3 on Mach
63h GNU HURD
64h Novell NetWare 286
64h SpeedStore
65h Novell NetWare (3.11)
67h Novell
68h Novell
69h Novell
70h DiskSecure Multi-Boot
71h officially listed as reserved
73h officially listed as reserved
74h officially listed as reserved
75h PC/IX
76h officially listed as reserved
7Eh F.I.X.
80h Minix v1.1 - 1.4a
81h Minix v1.4b+
81h Linux
81h Mitac Advanced Disk Manager
82h Linux Swap partition
82h Prime
82h Solaris (Unix)
83h Linux native file system (ext2fs/xiafs)
84h OS/2-renumbered type 04h partition (related to hiding DOS C: drive)
85h Linux EXT
86h FAT16 volume/stripe set (Windows NT)
87h HPFS Fault-Tolerant mirrored partition
87h NTFS volume/stripe set
93h Amoeba file system
94h Amoeba bad block table
98h Datalight ROM-DOS SuperBoot
99h Mylex EISA SCSI
A0h Phoenix NoteBIOS Power Management "Save-to-Disk" partition
A1h officially listed as reserved
A3h officially listed as reserved
A4h officially listed as reserved
A5h FreeBSD, BSD/386
A6h OpenBSD
A9h NetBSD (http://www.netbsd.org/)
B1h officially listed as reserved
B3h officially listed as reserved
B4h officially listed as reserved
B6h officially listed as reserved
B6h Windows NT mirror set (master), FAT16 file system
B7h BSDI file system (secondarily swap)
B7h Windows NT mirror set (master), NTFS file system
B8h BSDI swap partition (secondarily file system)
BEh Solaris boot partition
C0h DR DOS/DR-DOS/Novell DOS secured partition
C0h CTOS
C1h DR DOS 6.0 LOGIN.EXE-secured 12-bit FAT partition
C4h DR DOS 6.0 LOGIN.EXE-secured 16-bit FAT partition
C6h DR DOS 6.0 LOGIN.EXE-secured Huge partition
C6h corrupted FAT16 volume/stripe set (Windows NT)
C6h Windows NT mirror set (slave), FAT16 file system
C7h Syrinx Boot
C7h corrupted NTFS volume/stripe set
C7h Windows NT mirror set (slave), NTFS file system
CBh Reserved for DR DOS/DR-DOS/OpenDOS secured FAT32
CCh Reserved for DR DOS/DR-DOS secured FAT32 (LBA)
CEh Reserved for DR DOS/DR-DOS secured FAT16 (LBA)
D0h Multiuser DOS secured FAT12
D1h Old Multiuser DOS secured FAT12
D4h Old Multiuser DOS secured FAT16 (<= 32M)
D5h Old Multiuser DOS secured extended partition
D6h Old Multiuser DOS secured FAT16 (> 32M)
D8h CP/M-86
DBh CP/M, Concurrent CP/M, Concurrent DOS
DBh CTOS (Convergent Technologies OS)
E1h SpeedStor 12-bit FAT extended partition
E2h DOS read-only (Florian Painke's XFDISK 1.0.4)
E3h DOS read-only
E3h Storage Dimensions
E4h SpeedStor 16-bit FAT extended partition
E5h officially listed as reserved
E6h officially listed as reserved
EBh BeOS BFS (BFS1)
F1h Storage Dimensions
F2h DOS 3.3+ secondary partition
F3h officially listed as reserved
F4h SpeedStor
F4h Storage Dimensions
F5h Prologue
F6h officially listed as reserved
FEh LANstep
FEh IBM PS/2 IML (Initial Microcode Load) partition
FFh Xenix bad block table
Note: for partition type 07h, one should inspect the partition boot record
for the actual file system type
Table 00273
===========
Format of IBM/MS INT 13 Extensions drive parameters:
Offset Size Description
00h WORD (call) size of buffer
(001Ah for v1.x, 001Eh for v2.x, 42h for v3.0)
(ret) size of returned data
02h WORD information flags (see #00274)
04h DWORD number of physical cylinders on drive
08h DWORD number of physical heads on drive
0Ch DWORD number of physical sectors per track
10h QWORD total number of sectors on drive
18h WORD bytes per sector
---v2.0+ ---
1Ah DWORD -> EDD configuration parameters (see #00278)
FFFFh:FFFFh if not available
---v3.0 ---
1Eh WORD signature BEDDh to indicate presence of Device Path info
20h BYTE length of Device Path information, including signature and this
byte (24h for v3.0)
21h 3 BYTEs reserved (0)
24h 4 BYTEs ASCIZ name of host bus ("ISA" or "PCI")
28h 8 BYTEs ASCIZ name of interface type
"ATA"
"ATAPI"
"SCSI"
"USB"
"1394" IEEE 1394 (FireWire)
"FIBRE" Fibre Channel
30h 8 BYTEs Interface Path (see #00275)
38h 8 BYTEs Device Path (see #00276)
40h BYTE reserved (0)
41h BYTE checksum of bytes 1Eh-40h (two's complement of sum, which makes
the 8-bit sum of bytes 1Eh-41h equal 00h)
Note: if the size is less than 30 on call, the final DWORD will not be
returned by a v2.x implementation; similarly for the Device Path info
(Table 00234)
Values for disk operation status:
00h successful completion
01h invalid function in AH or invalid parameter
02h address mark not found
03h disk write-protected
04h sector not found/read error
05h reset failed (hard disk)
05h data did not verify correctly (TI Professional PC)
06h disk changed (floppy)
07h drive parameter activity failed (hard disk)
08h DMA overrun
09h data boundary error (attempted DMA across 64K boundary or >80h sectors)
0Ah bad sector detected (hard disk)
0Bh bad track detected (hard disk)
0Ch unsupported track or invalid media
0Dh invalid number of sectors on format (PS/2 hard disk)
0Eh control data address mark detected (hard disk)
0Fh DMA arbitration level out of range (hard disk)
10h uncorrectable CRC or ECC error on read
11h data ECC corrected (hard disk)
20h controller failure
31h no media in drive (IBM/MS INT 13 extensions)
32h incorrect drive type stored in CMOS (Compaq)
40h seek failed
80h timeout (not ready)
AAh drive not ready (hard disk)
B0h volume not locked in drive (INT 13 extensions)
B1h volume locked in drive (INT 13 extensions)
B2h volume not removable (INT 13 extensions)
B3h volume in use (INT 13 extensions)
B4h lock count exceeded (INT 13 extensions)
B5h valid eject request failed (INT 13 extensions)
B6h volume present but read protected (INT 13 extensions)
BBh undefined error (hard disk)
CCh write fault (hard disk)
E0h status register error (hard disk)
FFh sense operation failed (hard disk)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <time.h>
#include "lzss.h"
#define PR_LOGO 1
#define PR_CMDLINE 2
#define PR_OPTIONS 4
#define PR_EXAMPLE 8
#define PR_INFO 16
#define MAXDISKS 32
#define CMDBUFF 250
#define BLOCKS 64
short disks [MAXDISKS] = {0}; // 硬盤號, 1=>80h, 2=>81h, ...
short parts [MAXDISKS] = {0}; // 硬盤分區號, 1=>第一分區, 2=>第二分區, ...
unsigned long starts [MAXDISKS] = {0}; // 源起始拷貝扇區號及目標起始拷貝扇區
unsigned long sectors [MAXDISKS] = {0}; // 源數據塊數及目標數據塊
char * imgfiles [MAXDISKS] = {NULL}; // 映像文件名
FILE * FILES [MAXDISKS] = {NULL}; // 映像文件指針
char nextvolume[MAXDISKS] = {0};
class LZSS lzss;
char title [16] = "DDcopy";
char ver [8] = "V1.6d"; // 版本號(中間不能有空格)
short Blocks = BLOCKS;
short ErrorNum = 0;
short (* read_sour) (unsigned char *);
struct conf {
short defaultmode;
short showinfo;
short printhelp;
short diskmode;
short confirm;
short compress;
short imgsize;
unsigned long copysectors;
} conf = {
0, // default copy mode
0, // show disk info
0, // printhelp
2, // diskmode (1:disk mode, 0:partition mode, 2:no use)
1, // confirm
0, // compress img file
0, // img file size (MB)
0, // copy sectors from begin
};
struct _diskinfo {
unsigned short size_of_buffer;
unsigned short information_flags;
unsigned long number_of_physical_cylinders_on_drive;
unsigned long number_of_physical_heads_on_drive;
unsigned long number_of_physical_sectors_per_track;
unsigned long total_number_of_sectors_low;
unsigned long total_number_of_sectors_high;
unsigned short bytes_per_sector;
};
void print_program_help (int print_type)
{
if (print_type & PR_LOGO){
printf ("\n%s %s http://ddcopy.126.com\n", title, ver);
}
if (print_type & PR_CMDLINE){
printf (" \nddcopy [-d s=m d=d1,dn]|[-p s=m:i d=d1:j,dn:k] [-v n] [-e n] [-s] [-c] [-f] [-y] [-h]\n\n");
}
if (print_type & PR_OPTIONS){
printf ("Options:\n");
printf (" -d : Disk copy mode -y : No confirm messages\n");
printf (" -p : Partition copy mode -s : Show disks information\n");
printf (" -v : Multi-volume imagefile size (MB) -f : Default copy mode\n");
printf (" -e : Copy n sectors\n");
printf (" -c : Compress mode. (Slowly) -h : Print help message\n\n");
}
if (print_type & PR_EXAMPLE){
printf ("Examples:\n");
printf (" ddcopy -f -y : Copy disk 1 to disk 2,3, ...\n");
printf (" ddcopy -d s=1 d=2,3,4\t\t: Copy disk 1 to disk 2,3 and 4\n");
printf (" ddcopy -d s=1 d=2,c:\\d1.img\t : Copy disk 1 to disk 2 and imgfile \n");
printf (" ddcopy -d s=c:\\d1.img d=1,3\t : Copy imgfile to disk 1 and 3\n");
printf (" ddcopy -p s=1:1 d=2:2,2:3\t : Copy the first partition on disk 1 to\n\t\t\t\t\t the secend partition on disk 2 and\n\t\t\t\t\t the third partition on disk 2\n");
printf (" ddcopy -p s=1:1 d=2:2,c:\\p1.img : Copy the first partition on disk 1 to\n\t\t\t\t\t the secend partition on disk 2 and\n\t\t\t\t\t the imgfile\n");
printf (" ddcopy -p s=c:\\p1.img d=2:2,3:3 : Copy the imgfile to\n\t\t\t\t\t the secend partition on disk 2 and\n\t\t\t\t\t the third partition on disk 3\n");
}
if (print_type & PR_INFO){
printf ("\nBy Li Zhi (Oct,2004)\n");
printf ("E-mail:ddcopy@263.net\n");
printf ("http://ddcopy.126.com\n");
}
}
// 顯示確認信息
short show_confirm_msg (char * text)
{
short c;
if (conf.confirm){
// 顯示確認信息
printf ("%s", text);
do {
c = getch () | 0x20;
} while (c != 'y' && c != 'n' && c!='a');
printf ("%c\n", c);
if (c == 'y'){
// 返回"是"
return (1);
}
if (c == 'a'){
// 返回"全是"
conf.confirm = 0;
return (1);
}
// 返回"不"
return (0);
}
else { // conf.confirm == 0
// 不顯示確認信息,并返回"是"
return (1);
}
}
void print_memory (void * buffer, unsigned short len)
{
unsigned short i;
printf ("\n");
for (i=0; i<len; i++){
printf (" %02X ", ((unsigned char *) buffer)[i]);
}
printf ("\n");
}
/**
* 硬盤操作:"讀"操作(0x42),"寫"操作(0x43),\n
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -