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