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

📄 minito.c

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

	unsigned long j,k;
	int returnValue;
   char	fat32TRUE;
   if((strncmpi(buf+0x36,"FAT16",5)==0 || strncmpi(buf+0x36,"FAT12",5)==0) && fat1216) fat32TRUE=0;
   else if(strncmpi(buf+0x52,"FAT32",5)==0 && fat32) fat32TRUE=1;
	else  return -1;
	/*if(fat1216)
	{
		FATsector=fat1216;

	}
	else if(fat32)
	{
		FATsector=fat32;

	}
	*/
	/*
	switch(part->ID)
{
case  0x0B : break;
case  0x1B : break;
case  0x0C : break;
case  0x1C : break;
default : fat32TRUE=0;
}  */
	if(fat32TRUE)
	{
		if(fat32) FATsector=fat32;
	   /*	printf("This is FAT32. Sector number per FAT is %lu.\n",*FATsector);
	*/
	}
	else /* 如果是 FAT16 */
	{
		if(fat1216) FATsector=fat1216;
	   /*	printf("This is FAT16. Sector number per FAT is %lu.\n",*FATsector);
	*/
	}

	 if(!FATsector) return -1;


	  if(FATcount>2) return -1;

	  if(reservedSector+FATsector*FATcount>part->total) return -1;
	  posToSearch=part->start+reservedSector+FATsector*FATcount;
	  volSearchTime=MAX_FAT32_VOL_SEARCH;

	  if(fat32TRUE)
	  {

	  startClusterForFirstCluster=*(unsigned long *)(buf+0x2C);

	  sectorsPerCluster=buf[0x0D];

	  if(startClusterForFirstCluster>part->total) startClusterForFirstCluster=2;
	  if(sectorsPerCluster>64) sectorsPerCluster=64;

	  posToSearch+=(startClusterForFirstCluster-2UL)*sectorsPerCluster;

	  }
	 /*
	  else
	  {

	  fat1216TotalFileItem=*(unsigned short *)(buf+0x11);
	 if(fat1216TotalFileItem>512) fat1216TotalFileItem=512;
	 /* volSearchTime=fat1216TotalFileItem*32UL/51200UL+(fat1216TotalFileItem*32UL%51200UL ? 1 : 0);

	  volSearchTime=(fat1216TotalFileItem/1600UL)+(fat1216TotalFileItem/1600UL ? 1 : 0);



	  }   
	 /* else */
	/*
	 printf(" %c: FileItem=%lu FirstCluster=%lu sectorsPerCluster=%lu posToSearch=%lu\n",
	 part->letter,fat1216TotalFileItem,startClusterForFirstCluster,sectorsPerCluster,posToSearch);
	  getch();
	  */

	  buf2=(unsigned char *)malloc(51200);
	  foundVol=0;
	  for(j=0;j<volSearchTime;j++)
	  {

	  if(part->hardDrive<0)
		{
		if (absread(part->hardDrive+127, 100, posToSearch, buf2) != 0)
{
  /* printf("Failed to read %c:\n",part[i]->letter);  */
   return -1;
}
		}

	  else
	  {
	  if(returnValue=extInt13(0x42,part->hardDrive+127,posToSearch,100,buf2))
	  return -1;
	  /*
	  if(returnValue)
	  {
	  int13Error(0x42, part->hardDrive+127, posToSearch, returnValue);
	  return -1;
	  }  */
	  }

	  posToSearch+=100;
	  for(k=0;k<(/*fat1216 ? fat1216TotalFileItem*2 :*/ 16*200);)
	  {
	  if((buf2[11+16*k]==(unsigned char)0x08 || buf2[11+16*k]==(unsigned char)0x28) &&
	  *(unsigned long *)(buf2+12+16*k)==0 &&
	  *(unsigned short *)(buf2+26+16*k)==0 &&
	  *(unsigned long *)(buf2+28+16*k)==0)
	  {
	  memset(part->label,0,11);
	  strncpy(part->label,buf2+(16*k),11);
	  foundVol=1;
	  break;
	  }
	  /*if(fat1216) k+=2;
	  else*/ k++;
	  }

	  if(foundVol) break;

	  }
	  if(buf2) free(buf2);
		return 0;
		}


int putInFATlabelVol(Pinfo *part[], char vol)
{
	unsigned char buf[512];
	int i,j,k;
    char fatTRUE=0;
	unsigned char fat[]={0x04,0x06,0x0B,0x0C,0x01,0x0E,
						 0x14,0x16,0x1B,0x1C,0x11,0x1E,0x00};
	char labelVolTRUE=0;

	Pinfo *partForVol;
	unsigned char *bufForVol;
	char foundVol=0;
	int(* pFunc1)();
	int(* pFunc2)();
	for(i=0;part[i];i++)
	{
		fatTRUE=0;
		for(j=0;fat[j];j++)
		{
		if(part[i]->ID==fat[j])
		{
		fatTRUE=1;
		break;
		}

		}
		if(!fatTRUE) continue;

		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(!vol)
	  {
	  pFunc1=putInFATlabel;
	  pFunc2=putInFATvol;
	  }
	  else
	  {
	  pFunc1=putInFATvol;
	  pFunc2=putInFATlabel;
	  }

	 /* if((*pFunc1)(part[i],buf)) continue; */
	  partForVol=part[i];
		bufForVol=buf;

	  if((*pFunc1)(partForVol,bufForVol)) continue;
		labelVolTRUE=0;
		for(j=0;j<11;j++)
		{
		if(part[i]->label[j])
		{
		labelVolTRUE=1;
		break;
		}
		}

		if(!vol && labelVolTRUE)
		{
		if(strcmpi(part[i]->label,"NO NAME    ")==0 ||
		strcmpi(part[i]->label,"NO NAME")==0)
		labelVolTRUE=0;
		}

		if(!labelVolTRUE)
		{
		/* part[i] and buf can't be used for more than two functions!
		don't know why! */
	  /*	partForVol=part[i];
		bufForVol=buf;    */

		(*pFunc2)(partForVol,bufForVol);
		}






	}
	return 0;
}

extern void putInDOSletter(Pinfo *part[]);

void getPartitionTable(Dinfo *driveTable[], Pinfo *partP[])
{
	int drive,i,j,k,l;
	unsigned char pBuffer[512];
	int int13Return=0;


	for(l=0,j=0,drive=-127;driveTable[l] && drive<=-126;drive++)
	{
		if(driveTable[l]->floppy)
		{
		partP[j]=(Pinfo *)malloc(sizeof(Pinfo));
					memset(partP[j],0,sizeof(Pinfo));

				  /*	partP[j]->totalNumber=j+1;  */
					partP[j]->hardDrive=drive;
					partP[j]->number=1;
					partP[j]->ID=0x01;
					partP[j]->start=0;
					partP[j]->total=driveTable[j]->totalSector;
	   l++;
	   j++;

	}
	}
	for(drive=1/*,j=0*/;driveTable[l] && drive<MAX_DRIVE_NUM+1;l++,drive++)
	{
		memset(pBuffer,0,512);
	  /*  printf("reading drive %d DPT...\n",drive);  */
		int13Return=extInt13(0x42,drive+127,0,1,pBuffer);
	/*	printf("passed\n"); */
        if(int13Return!=0)
		{
		   /*	int13Error(0x42,int13Return); */
			if(drive==MAX_DRIVE_NUM) break;
			else continue;
		}
		
		for(i=0,k=1;i<4;i++)
		{			
			unsigned char active=*(unsigned char *)(pBuffer+0x01BE+i*0x10);
			unsigned char ID=*(unsigned char *)(pBuffer+0x01C2+i*0x10);
			unsigned long start=*(unsigned long *)(pBuffer+0x01C6+i*0x10);
			unsigned long total=*(unsigned long *)(pBuffer+0x01CA+i*0x10);
			
			if(start==0 || total==0)
			{
				if(i==0)
				{
				printf("Drive %d partition table error!\n",drive);
				break;
				}
                else continue;
			}
			
			if(ID!=0x05 && ID!=0x0F)
			{
				partP[j]=(Pinfo *)malloc(sizeof(Pinfo));
				memset(partP[j],0,sizeof(Pinfo));
				
			  /*	partP[j]->totalNumber=j+1;   */
				partP[j]->hardDrive=drive;
				partP[j]->number=k;
				partP[j]->logicDrive=0;
				partP[j]->active=active;
				partP[j]->activeOffset=0x01BE+i*0x10;
				partP[j]->ID=ID;
				partP[j]->IDoffset=0x01C2+i*0x10;
				partP[j]->start=start;
				partP[j]->total=total;
				
				j++;
				k++;
				
			}
			
			else
			{
				unsigned char active;				
				unsigned char ID;
				unsigned long startLogic;
				unsigned long total;
				unsigned char pBuffer[512];
				unsigned long nextExtended=0,size;
				
				while(1)
				{
				   /*	printf("reading sector %lu...\n",start+nextExtended);  */
                    int13Return=extInt13(0x42,drive+127,start+nextExtended,1,pBuffer);
				   /*	printf("passed\n");   */
                    	if(int13Return!=0)
						{
					   /*	int13Error(0x42,int13Return); */
						break;
						}


					active=*(unsigned char *)(pBuffer+0x01BE);
					ID=*(unsigned char *)(pBuffer+0x01C2);
					startLogic=*(unsigned long *)(pBuffer+0x01C6);
					total=*(unsigned long *)(pBuffer+0x01CA);

					if(startLogic==0 || total==0)
					{
					   /*	printf("Found logical drive error!\n");  */
						break;
					}
					
					partP[j]=(Pinfo *)malloc(sizeof(Pinfo));
					memset(partP[j],0,sizeof(Pinfo));

				 /*	partP[j]->totalNumber=j+1; */
					partP[j]->hardDrive=drive;
					partP[j]->number=k;
					partP[j]->logicDrive=1;
					partP[j]->active=active;
					partP[j]->activeOffset=0x01BE;
					partP[j]->ID=ID;
					partP[j]->IDoffset=0x01C2;
					partP[j]->start=start+nextExtended+startLogic;
					partP[j]->total=total;

					j++;
					k++;
					
					nextExtended=*(unsigned long *)(pBuffer+0x01C6+0x10);
					size=*(unsigned long *)(pBuffer+0x01CA+0x10);
					
					if(nextExtended==0 || size==0) break;

				}
			}
		}
		
}
/*
putInDOSletter(partP);
putInFATlabelVol(partP,label);
*/
return;
}

short putInDrivePartNum(Dinfo *driveTable[], Pinfo *partitionTable[])
{
	int i,j;
	for(i=0,j=0;driveTable[i];i++)
		if(driveTable[i]->number>0)
		{
			
			
			for(;partitionTable[j] && driveTable[i]->number==partitionTable[j]->hardDrive;j++)
				
				driveTable[i]->part++;
				/*if(driveTable[i]->number==partitionTable[j]->hardDrive)
				{
				part++;
				if(partitionTable[j+1] && driveTable[i]->number!=partitionTable[j+1]->hardDrive)
				{
				driveTable[i]->part=part;
				j++;
				break;
				}
		}*/
			
			
			
			
		}	
		return 0;
		
}


int printOption(char mode, Pinfo *partitionTable)
{
	unsigned char DOSLetter[]={0x04,0x06,0x0B,0x0C,0x01,0x0E,0x00};
	unsigned char hiddenFAT[]={0x14,0x16,0x1B,0x1C,0x11,0x1E,0x00};
	unsigned char NTFS[]={0x07,0x17,0x00};
	unsigned char linux[]={0x82,0x83,0x00};
	unsigned char hidden[]={0x17,0x26,0x00};
	unsigned char zero[]={0x00,0x00};
	int floppy[]={-127,-126,0};
	int i;

	if(mode==PRINT_PARTITION_ALL) return 1;
	
   else	if(mode==PRINT_PARTITION_DOSLETTER)
	{
	  /*
	  for(i=0;DOSLetter[i];i++)
	  if(partitionTable->ID==DOSLetter[i]) return 1;
	  */
	  if(partitionTable->letter) return 1;
	}

	else if(mode==PRINT_PARTITION_FAT)
	{
	  for(i=0;DOSLetter[i];i++)
	  if(partitionTable->ID==DOSLetter[i]) return 1;
	  for(i=0;hiddenFAT[i];i++)
	  if(partitionTable->ID==hiddenFAT[i]) return 1;

	}

	else if(mode==PRINT_PARTITION_NTFS)
	{
	 for(i=0;NTFS[i];i++)
	 if(partitionTable->ID==NTFS[i]) return 1;
	}

	else if(mode==PRINT_PARTITION_FAT_NTFS)
	{
	 for(i=0;DOSLetter[i];i++)
	  if(partitionTable->ID==DOSLetter[i]) return 1;
	  for(i=0;hiddenFAT[i];i++)
	  if(partitionTable->ID==hiddenFAT[i]) return 1;
	  for(i=0;NTFS[i];i++)
	  if(partitionTable->ID==NTFS[i]) return 1;
	}


	   else	if(mode==PRINT_PARTITION_LINUX)
		{

		for(i=0;linux[i];i++)
	  if(partitionTable->ID==linux[i]) return 1;

		}
		
		   else	if(mode==PRINT_PARTITION_NO_HIDDEN)
			{

			for(i=0;hiddenFAT[i];i++)
	  if(partitionTable->ID==hiddenFAT[i]) return 0;
	  for(i=0;hidden[i];i++)
	  if(partitionTable->ID==hidden[i]) return 0;

	  return 1;
			}
			  else if(mode==PRINT_PARTITION_NO_ZERO)
				{
					
				   for(i=0;zero[i];i++)
	  if(partitionTable->ID==zero[i]) return 0;

				return 1;
				}
		   else	if(mode==PRINT_PARTITION_NO_ZERO_HIDDEN)
			{
			 for(i=0;zero[i];i++)
	  if(partitionTable->ID==zero[i]) return 0;
			for(i=0;hiddenFAT[i];i++)
	  if(partitionTable->ID==hiddenFAT[i]) return 0;
			for(i=0;hidden[i];i++)
	  if(partitionTable->ID==hidden[i]) return 0;
			return 1;
			}

			else if(mode==PRINT_PARTITION_FLOPPY)
			for(i=0;floppy[i];i++)
			if(partitionTable->hardDrive==floppy[i]) return 1;
				return 0;
}

void printPartitionTable(Pinfo *partition_Table[], char mode, int index, int printOneDrive)
{
	int i=0;
	int driveNumber=0;
	int j=(partition_Table[0] ? partition_Table[i]->hardDrive : 0);
	int k,l;
	Pinfo **partitionTable=partition_Table;

	char FS[16];
	char hidden=0;
	unsigned char fat[]={0x04,0x06,0x0B,0x0C,0x01,0x0E,
						 0x14,0x16,0x1B,0x1C,0x11,0x1E,0x00};
	char fatTRUE=0;
	if(index!=ALL_OR_THIS_TYPE) i=index;

	for(k=0;partitionTable[k];k++)
	{
	if(partitionTable[k]->letter)
	  {
	  for(l=0;fat[l];l++)
	  {
	  if(partitionTable[k]->ID==fat[l])
	  {
	  fatTRUE=1;
	  break;
	  }
	  }
	  if(fatTRUE)
	  {
	  fatTRUE=0;
	  if(getDiskFree(partitionTable,partitionTable[k]->letter,&(partitionTable[k]->freeSpaceKB))==-1)
	  {
	  partitionTable[k]->error=1;
	  continue;
	  }
	  }
	  }
	}
	printf("\n N:N     : PRI/LOG ACT HIDE ID FILE SYSTEM  LABEL       TOTALmb FREEmb \n");
	for(l=1;partitionTable[i] && i<100;i++)
	{

		unsigned long MB=0;
	  /*	unsigned long freeSpace=0;  */
	  takeFS(partitionTable[i]->ID,FS,&hidden);
	  MB=partitionTable[i]->total/2/1024;



	  if(printOption(mode,partitionTable[i])==0) continue;
	  if(printOneDrive!=NULL && partitionTable[i]->hardDrive!=printOneDrive) continue;
	   /*	printf("\n"); */
	   /*	printf("[%-2d] ",l++);  */

	  /*	if(j!=partitionTable[i]->hardDrive)
		{
			j=partitionTable[i]->hardDrive;
			driveNumber=0;
		}

		if(driveNumber==0)
		{
			driveNumber=1;
			if(partitionTable[i]->hardDrive==-127 || partitionTable[i]->hardDrive==-126)
			printf(" > ");

⌨️ 快捷键说明

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