📄 minitow.c
字号:
#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,§PerCluster,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 + -