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