⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddcopy16.cpp

📁 ddcopy的硬盘拷贝源码程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/***********************************
	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 + -