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

📄 minito.c

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




			goto skip;
		}
		
	   else printf("  ");

		if(partitionTable[i]->logicDrive==0)
			printf("   *");
		else printf("    ");
		
skip :     */

		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]->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);
		/*printf((partitionTable[i]->active==0x80 ? "YES" : "NO "));

		printf((hidden ? "YES" : "NO "));
		printf("%2d ",partitionTable[i]->ID);
		printf("%-12s ",FS);
		printf("%-11s ",partitionTable[i]->label);
			/*printf("%c %c %02X %-12s %-11s %-7lu ",
			(partitionTable[i]->active==0x80 ? '*' : ' '),
			(hidden ? '*' : ' '),
			partitionTable[i]->ID,
			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("%-7s","UNREADY"); */
			/*else*/ printf("%-7lu",partitionTable[i]->freeSpaceKB/1024UL);
			}
			}
	 /*  printf("%7lu",MB); */
		printf("\n");

		hidden=0;

		if(index!=ALL_OR_THIS_TYPE) break;
	}
	printf("\n");

}

void putInDOSletter(Pinfo *part[])
{
	
	int 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};

	int 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)
{
int 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]->letter && !partitionTable[i]->logicDrive) || partitionTable[i]->ID & 0x10)))
{
partitionTable[i]->letterNumber=nextLetterNumber++;
partitionTable[i]->letter=nextDOSletter++;
}
}

int getPartitionItem(int drive,
					 char partition,
					 Pinfo *partitionTable[],
					 int *index)
{
	int i=0;
	*index=INVALID_INDEX;
	if(drive!=NULL)
	{
	   /*	while(partitionTable[i]->hardDrive!=drive)
		{
			if(partitionTable[i]==NULL)
			{
				printf("Not found drive %d!\n",drive);
				return -1;
			}
			i++;
		}  */
		while(1)
		{
			if(partitionTable[i]==NULL)
			{
				printf("No drive %d\n",drive);
				return -1;
			}
			if(partitionTable[i]->hardDrive==drive)
			{
			/*
			printf("partitionTable[i]->hardDrive=%d,drive=%d\n",partitionTable[i]->hardDrive,drive);
			printf("partitionTable[i]->hardDrive=%u,drive=%u\n",partitionTable[i]->hardDrive,drive);
			*/
			break;

			}
			i++;
		}

	   /*
		while(partitionTable[i]->number!=partition)
		{
			if(partitionTable[i]->hardDrive>drive || partitionTable[i]==NULL)
			{
				printf("Not found partition %d!\n",partition);
				return -1;
			}
			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)
			{
			/*
			printf("partitionTable[i]->number=%d,partition=%d\n",partitionTable[i]->number,partition);
			printf("partitionTable[i]->number=%u,partition=%u\n",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(partitionTable[i]->letter!=upper)
		{
			if(partitionTable[i]==NULL)
			{
				printf("%c, not an assigned drive letter\n",partition);
				return -1;
			}
			i++;
		}  */
		while(1)
		{
			if(partitionTable[i]==NULL)
			{
				printf("No %c:\n",partition);
				return -1;
			}
			if(partitionTable[i]->letter==upper) break;
			i++;
		}
	}
	
	*index=i;
	
	return 0;
}

int printPartitionItem(Pinfo *partitionTable[], int index)
{
	int 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;

}

int extractFromStr(char *str, unsigned char separateCh, char *strSet[])
{
	char *p,*nextP;
	int 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;
}

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

int getCommonArgFromArg(char *str,
						Dinfo *driveTable[],
						Pinfo *partitionTable[],
						commonArg **arg)
{
	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)
		{
			int 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)
			{
			memset(digit,0,16);
			doPointer=digit;
			if(plus)
				strncpy(digit,minus+1,plus-minus-1);
			else
			 {
			if(equal)
				strncpy(digit,minus+1,equal-minus-1);
			else doPointer=minus+1;
			}

			if(!isNumber(doPointer))
		{
			printf("Non-number found in %s\n",doPointer);
			return -1;
		}
			(*arg)->startToDo=strtoul(doPointer,NULL,10);

			}


		  if((*arg)->startToDo)
		{
			(*arg)->startToDoTRUE=1;
			(*arg)->startToDoGiven=(*arg)->startToDo;
		}
		if((*arg)->sectorToDo) (*arg)->sectorToDoTRUE=1;
   /*
	printf("(");
	exit(0);  */
	if(str[0]=='(')
	{
		
		char killBracket[256];
		char *fileArg[10];
		int index=INVALID_INDEX;
		int i;
		char *plus;
		char *minus;
		char *equal;
	  	char *end;  
		char *qmin[4];
		(*arg)->argMode=ARGUMENT_IMAGE;
		
		memset(killBracket,0,256);
		for(i=0;i<10;i++)
			fileArg[i]=NULL;


		if((end=strchr(str,')'))==NULL)
		{
		printf("No \")\" found\n");
		return -1;
		}


		strncpy(killBracket,str+1,strchr(str,')')-str-1);
		extractFromStr(killBracket,'=',fileArg);

		strcpy((*arg)->name,fileArg[0]);

		if(strchr((*arg)->name,':'))
		{
		if((*arg)->name[0])	(*arg)->letter=(*arg)->name[0];
		else
		{
		printf("No drive in %s\n",(*arg)->name);

		return -1;
		}
		}

		else
		{
		char buf[MAXPATH];
		buf[0]='\0';
		getcwd(buf,MAXPATH);
		if(buf[0]) (*arg)->letter=buf[0];
		else printf("Problem occured getting current working directory\n");
		}

		getPartitionItem(NULL,(*arg)->letter,partitionTable,&index);
		(*arg)->drive=partitionTable[index]->hardDrive;
		(*arg)->number=partitionTable[index]->number;


		for(i=1;fileArg[i];i++)
		{
			
			if(toupper(fileArg[i][0])=='C')
			{
				(*arg)->compressDecompress=1;
				if(strlen(fileArg[i])>1) (*arg)->compressLevel=atoi(&fileArg[i][1]);
				else (*arg)->compressLevel=DEFAULT_COMPRESS_LEVEL;
			}
			
			else if(toupper(fileArg[i][0])=='K') (*arg)->keyTRUE=1;
			
			else if(toupper(fileArg[i][0])=='V')
			{
				(*arg)->separatedVolume=1;
				if(strlen(fileArg[i])>1)  (*arg)->separatedMB=strtoul(&fileArg[i][1],NULL,10);
                                else (*arg)->separatedMB=DEFAULT_EVERY_VOLUME_MB;
			}
			
			else if(toupper(fileArg[i][0])=='E')
			{
				
				if(!((*arg)->compressDecompress) || !((*arg)->keyTRUE) || !((*arg)->separatedVolume))
				{
					printf("E needs C K V\n");
					return -1;
				}
				
				(*arg)->keyEveryTRUE=1;
				if(fileArg[i][1]=='?') (*arg)->keyEveryPromptTRUE=1;
				
			}
			
		}
		
	}
	
	else
	{
		typedef struct _deviceArg
		{
			char device[10];
			unsigned long startToDo;
			unsigned long sectorToDo;

⌨️ 快捷键说明

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