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

📄 minito.c

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

	/*
	printf("Cylinders=%lu Heads=%lu Sectors=%lu\nTotal sectors=%lu (%lu.3f GB)\n",cylinder,head,sector,totalSectorVar,totalSectorVar*512);
	*/
  /*
	printf("Cylinders=%lu Heads=%lu Sectors=%lu\nTotal sectors=%lu (%lu MB)\n\n",
		package.cylns,package.heads,package.sects,package.tslow,package.tslow/2/1024);
	/*
	printf("Cylinders=%lu Heads=%lu Sectors=%lu\nTotal sectors=%lu (%lu.3f GB)\n",*maxCylinder,*maxHead,*maxSector,*totalSector,(*totalSector)*512);
	*/


   /*
*maxCylinder=cylinder;
 *maxHead=head;
*maxSector=sector;
	  *totalSector=totalSectorVar;
	*/

	return 0;

}


int extInt13(unsigned int cmd,
			 int driveNum,
			 unsigned long startSector,
			 unsigned int sectorToDo,
			 char *buf)
{
	union REGS in,out;
	struct SREGS sregs;
	struct DiskAddressPacket
	{
		unsigned char PacketSize; /* 数据包尺寸(16字节) */
		unsigned char Reserved; /* ==0 */
		unsigned int BlockCount; /* 要传输的数据块个数(以扇区为单位) */
		unsigned int BufferAddrOFF; /* 缓冲地址偏移 */
		unsigned int BufferAddrSEG; /* 缓冲地址段地址 */
		unsigned long BlockNumLow; /* 磁盘起始绝对块地址低位,支持4G的扇区数,就是2048G字节 */
		unsigned long BlockNumHigh; /* 磁盘起始绝对块地址高位,可支持天文数字的GB,本程序未用,置0 */
	}dap;
	dap.PacketSize=16;
	dap.Reserved=0;
	dap.BlockCount=sectorToDo;
	dap.BufferAddrOFF=FP_OFF(buf);
	dap.BufferAddrSEG=FP_SEG(buf);
	dap.BlockNumLow=startSector;
	dap.BlockNumHigh=0;
	
	in.h.ah = cmd;
	in.h.dl = driveNum;
	in.h.al = 0; /* 0 为无写校验,1为有 */
	in.x.si = FP_OFF(&dap);
	sregs.ds =  FP_SEG(&dap);
	
	int86x(0x13,&in,&out,&sregs);
	return out.h.ah;
	
}


/* 13中断的出错提示 */
void int13Error(int cmd, int drive, unsigned long start, int returnValue)
{	
   /*	if(cmd==0x42)*/
   printf("\n%s drive:%d sector:%lu error\n",(cmd==0x42 ? "Read" : "Write"),drive,start);
	/*else
	{
	if(cmd==0x43) printf("\nWrite drive error : \n");
	}    */
	
	/* 基本13中断 */
	switch(returnValue)
	{
	case 0x01 : printf("Bad command.\n"); break;
		
	case 0x02 : printf("Address mark not found.\n"); break;
		
	case 0x03 : printf("Attempt to write to write-protected disk.\n"); break;
		
	case 0x04 : printf("Sector not found.\n"); break;
		
	case 0x05 : printf("Reset failed (hard disk).\n"); break;
		
	case 0x06 : printf("Disk changed since last operation.\n"); break;
		
	case 0x07 : printf("Drive parameter activity failed.\n"); break;
		
	case 0x08 : printf("Direct memory access (DMA) overrun.\n"); break;
		
	case 0x09 : printf("Attempt to perform DMA across 64K boundary.\n"); break;
		
	case 0x0A : printf("Bad sector detected.\n"); break;
		
	case 0x0B : printf("Bad track detected.\n"); break;
		
	case 0x0C : printf("Unsupported track.\n"); break;
		
	case 0x10 : printf("Bad CRC/ECC on disk read.\n"); break;
		
	case 0x11 : printf("CRC/ECC corrected data error.\n"); break;
		
	case 0x20 : printf("Controller has failed.\n"); break;
		
	case 0x40 : printf("Seek operation failed.\n"); break;

	case 0x80 : printf("Attachment failed to respond.\n"); break;
		
	case 0xAA : printf("Drive not ready (hard disk only).\n"); break;
		
	case 0xBB : printf("Undefined error occurred (hard disk only).\n"); break;
		
	case 0xCC : printf("Write fault occurred.\n"); break;
		
	case 0xE0 : printf("Status error.\n"); break;
		
	case 0xFF : printf("Sense operation failed.\n"); break;
		
		/* 扩展的13中断 */
	case 0xB0 : printf("Media in drive not locked.\n"); break;
		
	case 0xB1 : printf("Media in drive locked.\n"); break;
		
	case 0xB2 : printf("Media portable.\n"); break;
		
	case 0xB3 : printf("Media being in use.\n"); break;
		
	case 0xB4 : printf("Count of lock overflow.\n"); break;
		
	case 0xB5 : printf("legal request of ejection failed.\n"); break;
	}
	
}

int getDiskFree(Pinfo **partitionTable, unsigned char DOSletter, unsigned long *freeSpaceKB)
{
struct diskfree_t free;
  unsigned long avail;

unsigned char buf[1024];
/*unsigned long bytePerSect;  */
unsigned long sectPerCluster;
unsigned long freeCluster;
unsigned char fatnt[]={0x04,0x06,0x0B,0x0C,0x01,0x0E,
					   0x14,0x16,0x1B,0x1C,0x11,0x1E,
					   0x07,0x17,0x00};
char fatntTRUE=0;
char fat32=1;
int int13Return;
int i,j=0;
for(i=0;partitionTable[i];i++)
{
if(tolower(partitionTable[i]->letter)==tolower(DOSletter)) break;
}

if(!partitionTable[i])
{
printf("No disk \"%c:\"\n",DOSletter);
return -1;
}
/*printf("%c:\n",partitionTable[i]->letter); */

for(j=0;fatnt[j];j++)
{
if(fatnt[j]==partitionTable[i]->ID)
{
fatntTRUE=1;
break;
}
}

/*
switch(partitionTable[i]->ID)
{

case  0x0B : break;
case  0x1B : break;
case  0x0C : break;
case  0x1C : break;
default : fat32=0;
}  */
/*printf("%c fatntTRUE=%d\n",DOSletter,fatntTRUE); */

if(fatntTRUE)
{

if(partitionTable[i]->hardDrive==-127 || partitionTable[i]->hardDrive==-126)
{
if (absread(partitionTable[i]->hardDrive+127, 1, 0, buf) != 0)
{
   printf("Failed to read %c:\n",partitionTable[i]->letter);
   return -1;
}
}
else
{
int13Return=extInt13(0x42,
			 partitionTable[i]->hardDrive+127,
			 partitionTable[i]->start,
			 2,
			 buf);

 if(int13Return!=0)
 {
 int13Error(0x42,partitionTable[i]->hardDrive+127,partitionTable[i]->start,int13Return);
 /*printf("Failed to get disk free space info\n"); */
 return -1;
 }
 }
 if(*(unsigned short *)(buf+0x1FE)!=0xAA55)
 {
 printf("%c: unformated or invalid\n",DOSletter);
 return -1;
 }
 /*printf("55aa=%X\n",*(unsigned short *)(buf+0x1FE));  */

   if(strncmpi(buf+0x36,"FAT16",5)==0 && *(unsigned short *)(buf+0x16))
   {
   fat32=0;

   }
   else if(strncmpi(buf+0x52,"FAT32",5)==0 && *(unsigned long *)(buf+0x24))
   fat32=1;
	else
	{
	printf("Invalid FAT partition\n");
	return -1;
	}


}
/*
if(partitionTable[i]->ID==0x0B || partitionTable[i]->ID==0x0C)

fat32=1;  */
/*switch(partitionTable[i]->ID)
{
fat32=1;
case  0x0B : break;
case  0x1B : break;
case  0x0C : break;
case  0x1C : break;
default : fat32=0;
}
if(fat32)
{
int13Return=extInt13(0x42,
			 partitionTable[i]->hardDrive+127,
			 partitionTable[i]->start,
			 2,
			 buf);

 if(int13Return!=0)
 {
 int13Error(0x42,partitionTable[i]->hardDrive+127,partitionTable[i]->start,int13Return);
 printf("Failed to get disk free space info\n");
 return -1;
 }
 */
 /*printf("%c fat32=%d\n",DOSletter,fat32); */
 if(fat32)
 {
 /*bytePerSect=*(unsigned short *)(buf+0x0B); */
 sectPerCluster=*(unsigned char *)(buf+0x0D);
 freeCluster=*(unsigned long *)(buf+0x0200+0x01E8);

 *freeSpaceKB=sectPerCluster*freeCluster/2UL;
 }
 else
 {
 if (_dos_getdiskfree(tolower(DOSletter)-96, &free) != 0)
 {
	printf("Error getting %c: disk free\n",DOSletter);
	return -1;
  }
  *freeSpaceKB = (unsigned long) free.avail_clusters
		/** (unsigned long) free.bytes_per_sector */
		* (unsigned long) free.sectors_per_cluster/2UL;
 }

 /*printf("%lu bytes free\n",*freeByte);  */

 return 0;
}


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,"");
		}
}


int getDrive(int drive,
			 char *supportExtInt13,
			 unsigned long *maxCylinder,
			 unsigned long *maxHead,
			 unsigned long *maxSectorPerTrack,
			 unsigned long *totalSector,
			 char ignoreHDDparameter)
{
	int result;
	char buffer[512];
	if(drive==-127 || drive==-126)
	{
	result = biosdisk(4,0,0,0,0,1,buffer);
   if(result>>8) return -1;

 /*  result &= 0x02;
   /*if(!result) return -1;  */
   if((unsigned char)result ==128) return -1;
	if(int13DriveParameter(drive+127,maxCylinder,maxHead,maxSectorPerTrack,totalSector)==0) return 0;
	return -1;
	}

   /*	printf("checking if drive %d support extint13...\n",drive); */
    *supportExtInt13=checkExtInt13(drive+127);
  /*  printf("passed\n"); */
	if(*supportExtInt13)
	{
		if(ignoreHDDparameter) return 0;
	  /*	printf("geting drive %d info...\n",drive);  */
		if(extInt13DriveParameter(drive+127,maxCylinder,maxHead,maxSectorPerTrack,totalSector)==0) return 0;
	    {
	 /*   printf("error\n");   */
    return -1;
        }
	}

	else return -1;
}

void getDriveTable(Dinfo *driveTable[], char useFloppy, char ignoreHDDparameter)
{
	int i,j,k;
	int floppy;
	int hard;

	for(i=0,j=0,k=1,floppy=-127,hard=1;j<MAX_DRIVE_NUM;j++,floppy++)
	{

		driveTable[i]=(Dinfo *)malloc(sizeof(Dinfo));
		memset(driveTable[i],0,sizeof(Dinfo));

		if(!useFloppy || floppy>-126) floppy=0;
		if(getDrive((floppy ? floppy : hard++),
			&(driveTable[i]->supportExtInt13),
			&(driveTable[i]->maxCylinder),
			&(driveTable[i]->maxHead),
			&(driveTable[i]->maxSectorPerTrack),
			&(driveTable[i]->totalSector),
			ignoreHDDparameter)==-1)
		{
			driveTable[i]=NULL;
			if(!floppy) break;
			else continue;
		}

		else
		{
		if(floppy)
		{
		driveTable[i]->floppy=1;
		driveTable[i]->number=floppy;
		}
		else driveTable[i]->number=k++;
		i++;
		}
	}

}

int getDriveItem(char drive,
				 Dinfo *driveTable[],
				 int *driveIndex)
{
	int i=0;
	*driveIndex=INVALID_INDEX;
	/*
	if(driveTable==NULL)
	{
		printf("No drive table\n");
		return -1;
	}   */

	if(driveTable[0]==NULL)
	{
		printf("No drive\n");
		return -1;
	}
	/*
	while(driveTable[i]->number!=drive)
	{
		if(driveTable[i]==NULL)
		{
			printf("No such drive %d\n",drive);
			return -1;
		}
		i++;
	}  */

	while(1)
	{
		if(driveTable[i]==NULL)
		{
			printf("No drive %d\n",drive);
			return -1;
		}
		if(driveTable[i]->number==drive) break;
		i++;
	}
			 *driveIndex=i;
			 
			 return 0;
}

int printDrive(Dinfo *driveTable[], Pinfo *partitionTable[], int index)
{
	int i=0,j=0;
	if(index==INVALID_INDEX) return -1;
	else if(index==ALL_OR_THIS_TYPE) i=0;
	else if(index!=PRINT_DRIVE_FLOPPY) i=index;

	/*if(driveTable==NULL)
	{
		printf("No drive\n");
		return -1;
	} */

	if(driveTable[0]==NULL)
	{
		printf("No drive\n");
		return -1;
	}

	if(driveTable[0] && driveTable[i]==NULL)
	{
		printf("No drive %d\n",driveTable[i]->number);
		return -1;
	}
	
	printf("\n DRIVE  PARTITIONS CYLINDER   HEAD     SECTOR   ALL SECTOR CAPACITY\n");
	for(;driveTable[i]/*!=NULL*/;i++)
	{
		unsigned long GB=0;
		unsigned long MB=0;
	   /*	int part=0; */

		if(index==PRINT_DRIVE_FLOPPY)
		{
		if(driveTable[i]->number!=-127 && driveTable[i]->number!=-126)
		break;
		}

		if(driveTable[i]->totalSector/2/1024/1024>=1)
			GB=driveTable[i]->totalSector/2/1024/1024;
		else MB=driveTable[i]->totalSector/2/1024;
		
		/*printf("[%-2d] ",i+1); */
			/*driveTable[i]->number*/
			if(driveTable[i]->number==-127 || driveTable[i]->number==-126)
			printf(" FLOPPY ");
			else printf(" %-6d ",driveTable[i]->number);
		   /*	printf("%c ",(driveTable[i]->supportExtInt13 ? '*' : ' ')); */
		  /* if(driveTable[i]->number>0)
		   {

		   for(j=0;partitionTable[j];j++)
		   {

		   if(driveTable[i]->number==partitionTable[j]->hardDrive)
		   {
		   part++;
		   if(partitionTable[j+1] && driveTable[i]->number!=partitionTable[j+1]->hardDrive)
		   {
		   j++;
		   break;
		   }
		   }

		   }

		printf("%-10d ",part);
		}
		else printf("%10s ","");  */
		printf("%-10d ",driveTable[i]->part);
		printf("%-10lu %-8lu %-8lu ",
			driveTable[i]->maxCylinder,
			driveTable[i]->maxHead,
			driveTable[i]->maxSectorPerTrack);
		printf("%-10lu ",driveTable[i]->totalSector);
		(GB ? printf("%-4lu GB\n",GB) : printf("%-4lu MB\n",MB));
		if(index!=ALL_OR_THIS_TYPE) break;
	}
	return 0;
}

int putInFATlabel(Pinfo *part, unsigned char *buf)
{
/*unsigned char buf[512]; */

		if(part->ID==0x0C || part->ID==0x0B ||
			part->ID==0x1C || part->ID==0x1B)
			strncpy(part->label,buf+0x47,11);
		else strncpy(part->label,buf+0x2B,11);
   return 0;
}

int putInFATvol(Pinfo *part, unsigned char *buf)
{
unsigned long reservedSector=*(unsigned short *)(buf+0xE);
  char	FATcount=buf[0x10];
	/* 获取FAT所占的扇区数 */
  unsigned long FATsector=0;

  unsigned short	fat1216=*(unsigned short *)(buf+0x16);
   unsigned long	fat32=*(unsigned long *)(buf+0x24);
  unsigned long fat1216TotalFileItem=0;
  unsigned long startClusterForFirstCluster=0;
  unsigned long sectorsPerCluster=0;
  unsigned long volSearchTime=0;
  unsigned long posToSearch=0;
	unsigned char *buf2=NULL;
	char foundVol;

⌨️ 快捷键说明

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