📄 minitow.c
字号:
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 + -