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

📄 minitow.c

📁 内含纯DOS,WIN32控制台和WIN32 GUI三个版本.它们生成的备份文件可以在任何版本中使用. WIN32 GUI版本暂使用备份功能(其他模块也都已全部写好,全是完整的,现在仅开启备份功能),如
💻 C
📖 第 1 页 / 共 5 页
字号:

#include "win1.c"

#define MAXPATH 256

#define MAX_DRIVE_NUM 20
#define MAX_PARTITION_NUM 100
#define MAX_TASK_NUM 10
#define DEFAULT_EVERY_VOLUME_MB 2047 /* The byte maximum of every file is 2048<FAT16>,4096<FAT32> MBs in MS-DOS */
#define DEFAULT_COMPRESS_LEVEL 6

#define ARGUMENT_DISK 1
#define ARGUMENT_PARTITION 2
#define ARGUMENT_DOSLETTER 3
#define ARGUMENT_IMAGE 4

#define PRINT_DRIVE_ALL -2
#define PRINT_DRIVE_FLOPPY -3

#define PRINT_PARTITION_ALL 0
#define PRINT_PARTITION_DOSLETTER 1
#define PRINT_PARTITION_FAT 2
#define PRINT_PARTITION_NTFS 3
#define PRINT_PARTITION_FAT_NTFS 4
#define PRINT_PARTITION_LINUX 5
#define PRINT_PARTITION_NO_HIDDEN 6
#define PRINT_PARTITION_NO_ZERO 7
#define PRINT_PARTITION_NO_ZERO_HIDDEN 8
#define PRINT_PARTITION_FLOPPY 9
#define INVALID_INDEX -1
/*#define SWAP_FLAG -2 */
#define ALL_OR_THIS_TYPE -2

#define DISK_BUF_BYTE 65535
#define COMPRESS_DECOMPRESS_BUF_BYTE 65535


#define NTFSPRO 1
#define IFS 2


#define DPT 0
#define DBR 1
#define FAT 2
#define PRINTFILE 3

#define MAX_BUF_BYTE 65535
/*#define MAX_COMPRESS_BYTE 61440*/
#define MAX_SECTOR_BUF_BYTE /*64512 */ 61440

#define INVALID_MODE -1
#define INVALID_TARGET -1


#define SAVE 0
#define RESTORE 1
#define COMPARE 2
#define REPLACE 3
#define PRINT 4

#define MAX_FAT32_VOL_SEARCH 3UL


short absread(short drive, unsigned long sectorToDo, unsigned long startSector, unsigned char *buf)
{
	
	
	short cmd=0x42;
	char deviceStr[32];
	memset(deviceStr,0,32);
	sprintf(deviceStr,"%d",drive);
	return readWriteDrive(cmd, 
		deviceStr, 
		startSector, 
		sectorToDo,
		buf);
	
}

short abswrite(short drive, unsigned long sectorToDo, unsigned long startSector, unsigned char *buf)
{
	
	
	short cmd=0x43;
	char deviceStr[32];
	memset(deviceStr,0,32);
	sprintf(deviceStr,"%d",drive);
	
	return readWriteDrive(cmd, 
		deviceStr, 
		startSector, 
		sectorToDo,
		buf);
	
}

short extInt13(unsigned short cmd,
			 short drive,
			 unsigned long startSector,
			 unsigned long sectorToDo,
			 char *buf)
{
	char deviceStr[32];
	memset(deviceStr,0,32);
	sprintf(deviceStr,"%d",drive-128);
	return readWriteDrive(cmd, 
		deviceStr, 
		startSector, 
		sectorToDo,
		buf);
	
}

#define int13Error(a,b,c,d);
/*0x42,driveNum+127,start,int13Return); */

char nextDOSletter=0;
short nextLetterNumber=0;
char miniTOtag[]="miniTO_GOTOmsdos\0";


int compareByte(unsigned char *buf1, unsigned char *buf2, unsigned long byte, char pause, unsigned long *diff, unsigned long *offsetAllRecord)
{
unsigned long i,j;

for(i=0,j=0;i<byte;i++)
{
/*
	if(bioskey(1)!=0)
		{
			if(bioskey(0)==0x11B)
			{
				printf("\nStopped.\n");
				*diff+=j;
				return -1;
			}
		}
		*/
if(buf1[i]==buf2[i]) continue;
else
{
printf("%09lX  %02X %02X\n",i+(*offsetAllRecord),buf1[i],buf2[i]);
j++;
printf("Press other key to continue...");
getch();
printf("\n");
}
if(pause)
{
if(j%24==0)
{
printf("Press other key to continue...");
	getch();
/*
	printf("Press ESC to exit, other key to continue...");
/*while(bioskey(1)==0);

			if(bioskey(0)==0x11B)
			{
				printf("\nStopped.\n");
				*diff+=j;
				return -1;
			}*/
printf("\n");

}
}
}
if(j) *diff+=j;
*offsetAllRecord+=i;

return 0;
}

/*
void help()
{
	
	printf("\n");
	printf("miniTO DPT/DBR/FAT/CMOS Backup Tool Version 1.8a\n");
	printf("Copyright(c) by GOTOmsdos 2007\n");
	printf("EMail: tdaim@sina.com\n");
	printf("\n");
	printf("Some common arguments:\n");
	printf("    x:y     = drive:partition, both begin from 1\n");
	printf("              e.g. 1:2(drive 1 partition 2)\n");
	printf("              floppy unsupported\n");
	printf("    ?:      = DOS disk letter, e.g. D:\n");
	printf("   -ntfspro = support DOS letters after ntfspro\n");
	printf("   -ifs     = ...                       ifs\n");
	printf("   -nohp    = not get hard drive parameter\n");
	printf("   -floppy  = support floppy\n");
	printf("    file    = file to do\n");
	printf("Press any to continue...");
	getch();
	
	printf("\n");
	printf("Show Drives/Partitions info\n");
	printf("Syntax:\n");
	printf("miniTO -D|P[argument] [-ntfspro|ifs] [-nohp] [-floppy] [-vol]\n");
	printf("\n");
	printf("   -D                  = show all Drives\n");
	printf("   -Dn                 = Show Drive n\n");
	printf("   -Da|floppy          = show all floppy Drives\n");
	printf("   -P                  = show all Partitions\n");
	printf("   -Pa|floppy          = show all floppy partitions\n");
	printf("   -Pf|fat             = show all fat Partitions\n");
	printf("   -Pn|ntfs            = show all ntfs Partitions\n");
	printf("   -Pfn|fatntfs        = show all fat&ntfs Partitions\n");
	printf("   -Pl|linux           = show all linux Partitions\n");
	printf("   -Pnoz|nozero        = not show all 0x00-ID Partitions\n");
	printf("   -Pnoh|nohidden      = not show all hidden Partitions\n");
	printf("   -Pnozh|nozerohidden = not show all 0x00-ID&hidden Partitions\n");
	printf("   -Pn                 = show all Partitions of drive n\n");
	printf("   -Px:y               = show Partition y of drive x\n");
	printf("   -P:                 = show all Partitions with DOS letter\n");
	printf("   -vol                = volume prior to label\n");
	/*printf("   -ntfspro            = support DOS letters after ntfspro\n");
	printf("   -ifs                = ...                       ifs\n");  
	printf("Press any to continue...");
	getch();
	/* clrscr() */
	/*printf("\n"); 
	printf("Do DPT&DBR of all partitions of all/one drive(s) (floppy unsupported)\n");
	printf("Syntax:\n");
	printf("miniTO -Sall|Rall|Call [n] file [-nohp]\n");
	printf("\n");
	printf("   -Sall = Save    DPT & DBR of all partitions to   file\n");
	printf("   -Rall = Restore ...                         from ...\n");
	printf("   -Call = Compare ...                         with ...\n");
	printf("    n    = No. drive to do\n");
	/*printf("    file = file      ...\n"); 
	printf("\n");
	printf("Do DPT/DBR/FAT (floppy unsupported)\n");
	printf("Syntax:\n");
	printf("miniTO -SDPT|SDBR|SFAT  x:y|?: file [-ntfspro|ifs] [-nohp]\n");
	printf("\n");
	printf("   -SDPT = Save DPT to file\n");
	printf("   -SDBR = ...  DBR ...\n");
	printf("   -SFAT = ...  FAT ...\n");
	
	printf("\n");  
	printf("Syntax:\n");
	printf("miniTO -R|C file [-nohp]\n");
	printf("       -FAT2|DBR2 [-nohp]\n");
	printf("\n");
	printf("   -R    = Restore DPT/DBR/FAT from file\n");
	printf("   -C    = Compare ...         with ...\n");
	printf("   -FAT2 = Replace FAT 1       with FAT 2\n");
	printf("   -DBR2 = Replace DBR 1       with DBR 2\n");
	
	/*printf("    file = file to do\n");  
	printf("Press any to continue...");
	getch();
	/* clrscr() 
	printf("\n");
	printf("Do CMOS\n");
	printf("Syntax:\n");
	printf("miniTO -SCMOS|RCMOS|CCMOS file\n");
	printf("       -CMOSkey\n");
	printf("\n");
	printf("   -SCMOS   = Save    CMOS to   file\n");
	printf("   -RCMOS   = Restore ...  from ...\n");
	printf("   -CCMOS   = Compare ...  with ...\n");
	/*printf("    file    = file to do\n");   
	printf("   -CMOSkey = Generate CMOS key\n");
	printf("\n");
	printf("Show x:y to|from ?: (floppy unsupported)\n");
	printf("Syntax:\n");
	printf("miniTO -Turn x:y|?: [-ntfspro|ifs] [-nohp]\n");
	printf("\n");
	printf("   -Turn = show x:y to|from ?:\n");
}*/
/*
short DOSgetVolumeSerialNumber(Pinfo *part)
{

}*/


void help()
{
printf(" miniTOw MBR/BOOT/FAT Tool 1.0 Copyright(c) GOTOmsdos tdaim@sina.com\n");
printf(" miniTOw [/?|/H]\n");
printf("         [/D[.]] [/P[...]] [/V] [Common]\n");
printf("         /S|/R|/E|/C|/L [n|n:n|?:] [/MBR|/BOOT|/FAT] [/A] [/Fxx] [/Y] [Common]\n");
printf("         /T n:n|?: [Common]\n");
printf(" Common:\n"); 
printf(" /FLOPPY  : Support Floppy\n");
printf(" /NoHP    : Do not get HDD Parameter\n");
printf(" /NTFSPRO : Support NTFSPRO DOS letter\n");
printf(" /IFS     : ...     IFS     ...\n");
printf(" /DOS     : Take ?: as DOS letter\n");
printf("\n");
printf(" n        : No.drive\n");
printf(" n:n      : drive:partition, e.g. 1:2\n");
printf(" ?:       : WIN letter, e.g. D:\n");
printf("\n");
printf(" /?|/H    : Print help\n");
printf(" /D[.]    : Print Drive info. n=drive; A=Floppy\n");
printf(" /P[...]  : Print Partition info. A=Floppy; :=DOS letters; F=FAT N=NTFS\n"); 
printf("            FN=FAT&NTFS; L=Linux; NoH=No Hidden\n");
printf(" /V       : WIN Vol prior to DOS label\n");   
printf(" /S       : Save\n");
printf(" /R       : Restore\n");
printf(" /E       : rEplace BOOT1/FAT1 with BOOT2/FAT2, FAT32 only\n");
printf(" /C       : Compare with file (/MBR|/BOOT/FAT UNneeded)\n");
printf(" /L       : Look info in drive/file\n");
printf(" /MBR     : Master Boot Record\n");
printf(" /BOOT    : DOS Boot Record. i.e. DBR\n");
printf(" /FAT     : File Allocation Table\n");
printf(" /A       : All partitions/drives, allowed with n\n");
printf(" /Fxx     : File, xx=name\n");
printf(" /Y       : Yes to write drive\n");
printf(" /T       : Turn to print ?:|n:n from n:n|?:\n");
}
typedef struct driveInfo
{
	char floppy;
	/*	char orderNumber;  */
	char number;
	char supportExtInt13;
	unsigned long maxCylinder;
	unsigned long maxHead;
	unsigned long maxSectorPerTrack;
	unsigned long totalSector;
	char part;
}Dinfo,*DinfoP;

typedef struct partitionInfo
{
	unsigned char letterNumber;
	unsigned char letter;
	unsigned char WINletter;
	
	/*	unsigned char totalNumber;  */
	short hardDrive;
	unsigned char number;
	char logicDrive;
	unsigned char active;
	unsigned short activeOffset;
	unsigned char ID;
	unsigned short IDoffset;
	char label[12];
unsigned long volumeSerialNumber;
	unsigned long start;
	unsigned long total;
	unsigned long freeSpaceKB;
	char error;
}Pinfo,*PinfoP;

typedef struct _commonArg
{
	char argMode;
	
	short drive;
	unsigned char number;
	unsigned char letter;
	unsigned char WINletter;
	short index;
	unsigned long totalSector;
	char startToDoTRUE;
	unsigned long startToDoGiven;
	unsigned long startToDo;
	
	char sectorToDoTRUE;
	
	unsigned long sectorToDo;
	
	char name[256];
	char compressDecompress;
	char compressLevel;
	char keyTRUE;
	char separatedVolume;
	unsigned long separatedMB;
	char keyEveryTRUE;
	char keyEveryPromptTRUE;
	
	unsigned long size;
	unsigned long realSize;
	char continueUnfinished;
	unsigned long lastPos;
	
	unsigned long *lastDoneSector;
	unsigned long *unfinishedSector;
	
	unsigned long sectorToUnfinishedVolume;
	char indexToAddName;
	char addONE;
	char quiet;
	char mute;
	char ignore;
	char next;
	
}commonArg;

void getVolumeSerialNumber(Pinfo **part)
	{
unsigned char buf[512];
unsigned short fat1216=0;
unsigned long fat32=0;
char fatTRUE=0;
char fat32TRUE=0;
short i,j;
unsigned char fat[]={0x04,0x06,0x0B,0x0C,0x01,0x0E,
				0x14,0x16,0x1B,0x1C,0x11,0x1E,0x00};
		for(i=0;part[i];i++)
			{
				fatTRUE=0;
				
				
				
				if(part[i]->hardDrive<0)
				{
					if (absread(part[i]->hardDrive+127, 1, 0, buf) != 0)
					{
						/* printf("Failed to read %c:\n",part[i]->letter);  */
						continue;
					}
				}
				else
				{
					if(extInt13(0x42,part[i]->hardDrive+127,part[i]->start,1,buf)!=0) continue;
				}

if(part[i]->ID==0x07 || part[i]->ID==0x17)
part[i]->volumeSerialNumber=*((unsigned long *)(buf+0x48));

				
for(j=0;fat[j];j++)
				{
					if(part[i]->ID==fat[j])
					{
						fatTRUE=1;
						break;
					}
					
				}
				
if(!fatTRUE) continue;

fat1216=*(unsigned short *)(buf+0x16);
fat32=*(unsigned long *)(buf+0x24);

	if((strnicmp(buf+0x36,"FAT16",5)==0 || strnicmp(buf+0x36,"FAT12",5)==0) && fat1216) fat32TRUE=0;
	else if(strnicmp(buf+0x52,"FAT32",5)==0 && fat32) fat32TRUE=1;
	else  /*return -1;*/continue;
	
	part[i]->volumeSerialNumber=*(unsigned long *)(buf+(fat32TRUE ? 0x43 : 0x27));
	
		}	
	}
short putInWINletterVol(Pinfo *part[])
{
	char WINvol[12];
	unsigned long volSNviaWIN=0;
	int i,j;
	char letter='C';


getVolumeSerialNumber(part);

	for(;letter<='Z';letter++)
	{
	char str[4];
	memset(WINvol,0,12);

	strcpy(str,&letter);
strcpy(str+1,":\\\0");

	
volSNviaWIN=0;
		if(GetVolumeInformation(str,WINvol,12,&volSNviaWIN,NULL,NULL,NULL,12))
			/*printf("error\n");
		printf("%X\n",volSNviaWIN);*/
		{
		
		
			for(j=0;part[j];j++)
			{
				if(part[j]->volumeSerialNumber==volSNviaWIN) 
				{
				/*	printf("index=%d %c: %c:\n",j,part[j]->letter,letter);*/
					part[j]->WINletter=letter;
memset(part[j]->label,0,12);
					strcpy(part[j]->label,WINvol);
					break;
				}
			}

		
		}

	}
}

void WINputInDiskFreeSpace(Pinfo *part[])
{
/*bytePerSect=*(unsigned short *)(buf+0x0B); */
 
	unsigned long sectPerCluster=0;
 
 unsigned long freeCluster=0;
 int i;
 char WINletterStr[4];
 for(i=0;part[i];i++)
 {
	
	 strcpy(WINletterStr,&part[i]->WINletter);
strcpy(WINletterStr+1,":\\\0");
/*printf("%s\n",WINletterStr);*/
	 if(GetDiskFreeSpace(WINletterStr,&sectPerCluster,NULL,&freeCluster,NULL))
	 
part[i]->freeSpaceKB=sectPerCluster*freeCluster/2UL;
	 
	 
 }
 

}

void takeFS(unsigned char ID, char *FS, char *hidden)
{
	memset(FS,0,16);
	switch(ID)
	{
	case 0x0C : strcpy(FS,"FAT32(LBA)"); break;
	case 0x1C : strcpy(FS,"FAT32(LBA)"); *hidden=1; break;
		
	case 0x0B : strcpy(FS,"FAT32"); break;
	case 0x1B : strcpy(FS,"FAT32"); *hidden=1; break;
		
	case 0x07 : strcpy(FS,"NTFS/HPFS"); break;
	case 0x17 : strcpy(FS,"NTFS/HPFS"); *hidden=1; break;
		
	case 0x06 : strcpy(FS,"FAT16(32M+)"); break;
	case 0x16 : strcpy(FS,"FAT16(32M+)"); *hidden=1; break;
		
	case 0x04 : strcpy(FS,"FAT16(32M-)"); break;
	case 0x14 : strcpy(FS,"FAT16(32M-)"); *hidden=1; break;
		
	case 0x01 : strcpy(FS,"FAT12"); break;
	case 0x11 : strcpy(FS,"FAT12"); *hidden=1; break;
		
	case 0x0E : strcpy(FS,"FATs(LBA)"); break;
	case 0x1E : strcpy(FS,"FATs(LBA)"); *hidden=1; break;
		
	case 0x83 : strcpy(FS,"Linux Native"); break;
		
	case 0x82 : strcpy(FS,"Linux Swap"); break;
		
	case 0x26 : *hidden=1; break;
		
	default : strcpy(FS,"");
	}
}


short getDrive(short drive,
			 char *supportExtInt13,
			 unsigned long *maxCylinder,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -