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

📄 minitow.c

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


short printOption(char mode, Pinfo *partitionTable,char win)
{
	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};
	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;
	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;
				
			}
		}
	}
	printf("\n N:N    DOS WIN 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],win)==0) continue;
		if(printOneDrive!=NULL && partitionTable[i]->hardDrive!=printOneDrive) continue;
		
		
		if(partitionTable[i]->hardDrive==-127 || partitionTable[i]->hardDrive==-126)
			printf("      ");
		else printf("%2d:%-2d ",partitionTable[i]->hardDrive,partitionTable[i]->number);
		
		if(partitionTable[i]->letterNumber)
			printf("= %c: ",partitionTable[i]->letter/*,partitionTable[i]->letterNumber*/);
		else printf("     ");
if(partitionTable[i]->WINletter)
printf(" %c:  ",partitionTable[i]->WINletter);
else printf("     ");
		
		if(partitionTable[i]->hardDrive==-127 || partitionTable[i]->hardDrive==-126)
			printf("FLOPPY  ");
		else if(partitionTable[i]->hardDrive>0)
			printf((partitionTable[i]->logicDrive ? "LOGICAL " : "PRIMARY "));
		
		
		if(partitionTable[i]->hardDrive==-127 || partitionTable[i]->hardDrive==-126)
			printf("%-11s ","");
		else printf("%-3s %-4s %02X ",
			(partitionTable[i]->active==0x80 ? "YES" : "NO"),
			(hidden ? "YES" : "NO"),
			partitionTable[i]->ID);
		
		printf("%-12s %-11s %-7lu ",
			FS,
			partitionTable[i]->label,
			MB);
		/*
		if(partitionTable[i]->letter)
		{
            fatTRUE=0;
			for(l=0;fat[l];l++)
			{
				if(partitionTable[i]->ID==fat[l])
				{
					fatTRUE=1;
					break;
				}
			}
			if(fatTRUE)
			{
				fatTRUE=0;
				if(!partitionTable[i]->error) 
					 printf("%-7lu",partitionTable[i]->freeSpaceKB/1024UL);
			}
		}*/
	/*	printf("%-X",partitionTable[i]->volumeSerialNumber);*/
		
		printf("%-7lu",partitionTable[i]->freeSpaceKB/1024UL);
	/*	printf(" %c",partitionTable[i]->WINletter);*/
		/*  printf("%7lu",MB); */
		printf("\n");
		
		hidden=0;
		
		if(index!=ALL_OR_THIS_TYPE) break;
	}
	printf("\n");
	
}

void putInDOSletter(Pinfo *part[])
{
	
	short i,j,k=1,l,m;
	char logicDrive=0;
	unsigned char A=65;
	unsigned char C=67;
	unsigned 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;
		if(partition<65 || (partition>90 && partition<97) || partition>122)
		{
			printf("No %c:\n",partition);
			return -1;
		}
		upper=toupper(partition);
		
		while(1)
		{
			if(partitionTable[i]==NULL)
			{
				printf("No %c:\n",partition);
				return -1;
			}
			if((win ? partitionTable[i]->WINletter : 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;
	
}

short extractFromStr(char *str, unsigned char separateCh, char *strSet[])
{
	char *p,*nextP;
	short i;
	
	if(!str)
	{
		printf("No string\n");
		return -1;
	}
	
	p=str;
	nextP=strchr(str,separateCh);
	
	if(!nextP)
	{
		strSet[0]=(char *)malloc(strlen(str)+1);
		memset(strSet[0],0,strlen(str)+1);
		strcpy(strSet[0],str);
	}
	
	else
	{
		
		for(i=0;nextP;i++)
		{
			strSet[i]=(char *)malloc(nextP-p+1);
			memset(strSet[i],0,nextP-p+1);
			strncpy(strSet[i],p,nextP-p);
			
			p=nextP+1;
			nextP=strchr(p,separateCh);
		}
		
		strSet[i]=(char *)malloc(strlen(str)-(p-str)+1);
		memset(strSet[i],0,strlen(str)-(p-str)+1);
		strncpy(strSet[i],p,strlen(str)-(p-str));
	}
	return 0;
}

short isNumber(char *str)
{
	char *p=str;
	for(;*p;p++)
	{
		if(*p<48 || *p>57) return 0;
	}
	return 1;
}

short getCommonArgFromArg(char *str,
						Dinfo *driveTable[],
						Pinfo *partitionTable[],
						commonArg **arg,
						char win)
{
	char *minus,*plus,*equal;
	char *qmin[16];
	char digit[16];
	char *doPointer;
	char *startToFind;
	if(!str)
	{
		printf("Argument error\n");
		return -1;
	}
	
	*arg=(commonArg *)malloc(sizeof(commonArg));
	memset((*arg),0,sizeof(commonArg));
	(*arg)->index=INVALID_INDEX;
	
	
	startToFind=strchr(str,')');
	startToFind=(startToFind ? startToFind : str);
	minus=strchr(startToFind,'-');
	plus=strchr(startToFind,'+');
	equal=strchr(startToFind,'=');
	
	
	if(equal)
	{
		short i;
		
		for(i=0;i<16;i++)
			qmin[i]=NULL;
		
		
		
		extractFromStr(equal+1,'=',qmin);
		
		for(i=0;qmin[i];i++)
			switch(qmin[i][0])
		{
			 case 'q' : (*arg)->quiet=1;
			 case 'Q' : (*arg)->quiet=1;
				 
			 case 'm' : (*arg)->mute=1;
			 case 'M' : (*arg)->mute=1;
				 
			 case 'i' : (*arg)->ignore=1;
			 case 'I' : (*arg)->ignore=1;
				 
			 case 'n' : (*arg)->next=1;
			 case 'N' : (*arg)->next=1;
		}
		
	   }
	if(plus)
	{
		memset(digit,0,16);
		doPointer=digit;
		if(equal)
			strncpy(digit,plus+1,equal-plus-1);
		else  doPointer=plus+1;
		if(!isNumber(doPointer))
		{
			printf("Non-number found in %s\n",doPointer);
			return -1;
		}
		(*arg)->sectorToDo=strtoul(doPointer,NULL,10);
	}
	
	if(minus)

⌨️ 快捷键说明

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