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

📄 mini.c

📁 内含纯DOS,WIN32控制台和WIN32 GUI三个版本.它们生成的备份文件可以在任何版本中使用. WIN32 GUI版本暂使用备份功能(其他模块也都已全部写好,全是完整的,现在仅开启备份功能),如
💻 C
📖 第 1 页 / 共 5 页
字号:
		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)
			sprintf(print+strlen(print)," FLOPPY ");
		else sprintf(print+strlen(print)," %-6d ",driveTable[i]->number);
		/*	printf("%c ",(driveTable[i]->supportExtInt13 ? '*' : ' ')); */
		if(driveTable[i]->number>0)
		{
		/*
		for(;partitionTable[j];j++)
		{
		
		  if(driveTable[i]->number==partitionTable[j]->hardDrive)
		  {
		  part++;
		  if(partitionTable[j+1] && driveTable[i]->number!=partitionTable[j+1]->hardDrive)
		  {
		  j++;
		  break;
		  }
		  }
		  
			}
			*/
			sprintf(print+strlen(print),"%-10d ",driveTable[i]->part);
		}
		else sprintf(print+strlen(print),"%10s ","");
		sprintf(print+strlen(print),"%-10lu %-8lu %-8lu ",
			driveTable[i]->maxCylinder,
			driveTable[i]->maxHead,
			driveTable[i]->maxSectorPerTrack);
		sprintf(print+strlen(print),"%-10lu ",driveTable[i]->totalSector);
		(GB ? printf("%-4lu GB",GB) : printf("%-4lu MB",MB));
		
		pm_print->InsertString(k++,print);

		if(index!=PRINT_DRIVE_ALL) break;
		
	}
/*	(CMiniGUIDlg *)AfxGetApp()->m_pMainWnd->UpdateData(FALSE);*/

	return 0;
}


/*extern void putInDOSletter(Pinfo *part[]);*/

void getPartitionTable(Dinfo *driveTable[], Pinfo *partP[])
{
	short drive,i,j,k,l;
	char pBuffer[512];
	short int13Return=0;
	/*char invalidDrive=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++*/)
	{
		drive=driveTable[l]->number;
		memset(pBuffer,0,512);
		
		int13Return=extInt13(0x42,drive+127,0,1,pBuffer);
		
		if(int13Return!=0)
		{
			/*	int13Error(0x42,int13Return); */
			
			
			/*
			if(drive==MAX_DRIVE_NUM) break;
			else 
			{
				/*invalidDrive++;*/
				continue;
		/*	}*/
		}
		
		for(i=0,k=1;i<4;i++)
		{			
			char active=*(char *)(pBuffer+0x01BE+i*0x10);
			char ID=*(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/*-invalidDrive*/;
				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
			{
				char active;				
				char ID;
				unsigned long startLogic;
				unsigned long total;
				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=*(char *)(pBuffer+0x01BE);
					ID=*(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/*-invalidDrive*/;
					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;
					
				}
			}
		}
		
}

return;
}


short printOption(char mode, Pinfo *partitionTable,char win)
{
	char DOSLetter[]={0x04,0x06,0x0B,0x0C,0x01,0x0E,0x00};
	char hiddenFAT[]={0x14,0x16,0x1B,0x1C,0x11,0x1E,0x00};
	char NTFS[]={0x07,0x17,0x00};
	char linux[]={0x82,0x83,0x00};
	char hidden[]={0x17,0x26,0x00};
	char zero[]={0x00,0x00};
	short floppy[]={-127,-126,0};
	short 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(win ? partitionTable->WINletter : 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, short index, short printOneDrive,char win)
{
	short i=0;
	short driveNumber=0;
	short j=(partition_Table[0] ? partition_Table[i]->hardDrive : 0);
	short k,l;
	Pinfo **partitionTable=partition_Table;
	
	char FS[16];
	char hidden=0;
	char fat[]={0x04,0x06,0x0B,0x0C,0x01,0x0E,
		0x14,0x16,0x1B,0x1C,0x11,0x1E,0x00};
	char fatTRUE=0;

	CComboBox *pm_print=(CComboBox *)AfxGetApp()->m_pMainWnd->GetDlgItem(IDC_COMBO4);
	

	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;
				
			}
		}
	}
	k=0;
	pm_print->InsertString(k++," N:N    DOS WIN PRI/LOG ACT HIDE ID FILE SYSTEM  LABEL       TOTALmb FREEmb ");
	for(l=1;partitionTable[i] && i<100;i++)
	{
		
		unsigned long MB=0;
		char print[256];
		memset(print,0,256);
		
		/*	unsigned long freeSpace=0;  */
		takeFS(partitionTable[i]->ID,FS,&hidden);

		
		MB=partitionTable[i]->total/2/1024;
		
		
		
		if(printOption(mode,partitionTable[i],win)==0) continue;
		if(printOneDrive!=NULL && partitionTable[i]->hardDrive!=printOneDrive) continue;
		
		
		if(partitionTable[i]->hardDrive==-127 || partitionTable[i]->hardDrive==-126)
			sprintf(print+strlen(print),"      ");
		else sprintf(print+strlen(print),"%2d:%-2d ",partitionTable[i]->hardDrive,partitionTable[i]->number);
		
		if(partitionTable[i]->letterNumber)
			sprintf(print+strlen(print),"= %c: ",partitionTable[i]->letter/*,partitionTable[i]->letterNumber*/);
		else sprintf(print+strlen(print),"     ");
		if(partitionTable[i]->WINletter)
			sprintf(print+strlen(print)," %c:  ",partitionTable[i]->WINletter);
		else sprintf(print+strlen(print),"     ");
		
		if(partitionTable[i]->hardDrive==-127 || partitionTable[i]->hardDrive==-126)
			sprintf(print+strlen(print),"FLOPPY  ");
		else if(partitionTable[i]->hardDrive>0)
			sprintf(print+strlen(print),(partitionTable[i]->logicDrive ? "LOGICAL " : "PRIMARY "));
		
		
		if(partitionTable[i]->hardDrive==-127 || partitionTable[i]->hardDrive==-126)
			sprintf(print+strlen(print),"%-11s ","");
		else sprintf(print+strlen(print),"%-3s %-4s %02X ",
			(partitionTable[i]->active==0x80 ? "YES" : "NO"),
			(hidden ? "YES" : "NO"),
			partitionTable[i]->ID),

		
		sprintf(print+strlen(print),"%-12s %-11s %-7lu ",
			FS,
			partitionTable[i]->label,
			MB);
		
		
		sprintf(print+strlen(print),"%-7lu",partitionTable[i]->freeSpaceKB/1024UL);
		/*	printf(" %c",partitionTable[i]->WINletter);*/
		/*  printf("%7lu",MB); */
		/*printf("\n");*/
		
		hidden=0;

		pm_print->InsertString(k++,print);
		
		if(index!=ALL_OR_THIS_TYPE) break;
	}

/*pm_print->UpdateData(FALSE);*/
	/*printf("\n");*/
	
}

void putInDOSletter(Pinfo *part[])
{
	
	short i,j,k=1,l,m;
	char logicDrive=0;
	char A=65;
	char C=67;
	char dos[]={0x0C,0x0B,0x06,0x04,0x01,0x0E,0x00};
	
	short hardDrive=1;
	char foundPrimary=0;
	
	
	for(i=0,m=0;part[i] && i<2;i++)
	{
		if(part[i]->hardDrive==-127 || part[i]->hardDrive==-126)
		{
			part[i]->letterNumber=k++;
			part[i]->letter=A++;
			m++;
		}
		
	}
	
	
	for(l=m;part[l];l++)
	{
		if(part[l]->logicDrive) continue;
		for(j=0;dos[j];j++)
			if(part[l]->ID==dos[j]) break;
			if(dos[j]==0) continue;
			
			if((part[l]->hardDrive==hardDrive && !foundPrimary) ||
				part[l]->hardDrive!=hardDrive)
			{
				foundPrimary=1;
				hardDrive=part[l]->hardDrive;
				/*for(j=0;dos[j];j++)
				if(part[l]->ID==dos[j])
				{ */
				part[l]->letterNumber=k++;
				part[l]->letter=C++;
				
				/*	 } */
				
			}
			
	}
	
	for(l=m;part[l];l++)
	{
		if(part[l]->logicDrive==0) continue;
		for(j=0;dos[j];j++)
			
			if(part[l]->ID==dos[j])
			{
				part[l]->letterNumber=k++;
				part[l]->letter=C++;
			}
			
	}
	nextDOSletter=C;
	nextLetterNumber=k;
	
}


void putInExtraLetter(Pinfo *partitionTable[], char extraMode)
{
	short i;
	for(i=0;partitionTable[i];i++)
		
		if(((extraMode==NTFSPRO || extraMode==IFS) && (partitionTable[i]->ID==0x07 || partitionTable[i]->ID==0x17)) ||
			(extraMode==IFS && partitionTable[i]->ID==0x83))
		{
			partitionTable[i]->letterNumber=nextLetterNumber++;
			partitionTable[i]->letter=nextDOSletter++;
		}
}

short getPartitionItem(short drive,
					   char partition,
					   Pinfo *partitionTable[],
					   short *index,
					   char win)
{
	short i=0;
	*index=INVALID_INDEX;
	if(drive!=NULL)
	{
		
		while(1)
		{
			if(partitionTable[i]==NULL)
			{
				printf("No drive %d\n",drive);
				return -1;
			}
			if(partitionTable[i]->hardDrive==drive)
			{
				
				break;
				
			}
			i++;
		}
		
		
		while(1)
		{
			if(partitionTable[i]==NULL || partitionTable[i]->hardDrive>drive)
			{
				printf("No drive %d : partition %d\n",partition);
				return -1;
			}
			if(partitionTable[i]->number==partition)
			{
				
				break;
			}
			i++;
		}
		
	}
	
	else
	{
		char upper=toupper(partition);
		
		if(partition<65 || partition>90)
		{
			printf("No %c:\n",partition);
			return -1;
		}
		
		
		
		while(1)
		{
			
			
			if(partitionTable[i]==NULL)
			{
				
				
				printf("No %c:\n",partition);
				return -1;
			}
			if((win ? toupper(partitionTable[i]->WINletter) : toupper(partitionTable[i]->letter))==upper) break;
			i++;
		}
	}
	
	*index=i;
	
	return 0;
}

short printPartitionItem(Pinfo *partitionTable[], short index)
{
	short i;
	if(index==INVALID_INDEX) return -1;
	if(partitionTable[index]==NULL)
	{
		printf("No partition item %d\n",index);
		return -1;
	}
	else i=index;
	
	printf("\n");
	printf("[%2d]  ",i+1/*partitionTable[i]->totalNumber*/);
	
	printf("%d >> ",partitionTable[i]->hardDrive);
	
	if(partitionTable[i]->logicDrive==0)
		printf("*");
	else printf(" ");
	
	printf("%d ",partitionTable[i]->number);
	
	if(partitionTable[i]->letterNumber)
		printf("%2d %c: ",partitionTable[i]->letterNumber,partitionTable[i]->letter);
	else printf("      ");
	printf("%d %02X %04X %02X %04X %10lu %10lu",
		partitionTable[i]->logicDrive,
		partitionTable[i]->active,
		partitionTable[i]->activeOffset,
		partitionTable[i]->ID,
		partitionTable[i]->IDoffset,
		partitionTable[i]->start,
		partitionTable[i]->total);
	return 0;
	

⌨️ 快捷键说明

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