📄 minito.c
字号:
*maxSector=package.sects;
*totalSector=package.tslow;
/*
printf("Cylinders=%lu Heads=%lu Sectors=%lu\nTotal sectors=%lu (%lu.3f GB)\n",cylinder,head,sector,totalSectorVar,totalSectorVar*512);
*/
/*
printf("Cylinders=%lu Heads=%lu Sectors=%lu\nTotal sectors=%lu (%lu MB)\n\n",
package.cylns,package.heads,package.sects,package.tslow,package.tslow/2/1024);
/*
printf("Cylinders=%lu Heads=%lu Sectors=%lu\nTotal sectors=%lu (%lu.3f GB)\n",*maxCylinder,*maxHead,*maxSector,*totalSector,(*totalSector)*512);
*/
/*
*maxCylinder=cylinder;
*maxHead=head;
*maxSector=sector;
*totalSector=totalSectorVar;
*/
return 0;
}
int extInt13(unsigned int cmd,
int driveNum,
unsigned long startSector,
unsigned int sectorToDo,
char *buf)
{
union REGS in,out;
struct SREGS sregs;
struct DiskAddressPacket
{
unsigned char PacketSize; /* 数据包尺寸(16字节) */
unsigned char Reserved; /* ==0 */
unsigned int BlockCount; /* 要传输的数据块个数(以扇区为单位) */
unsigned int BufferAddrOFF; /* 缓冲地址偏移 */
unsigned int BufferAddrSEG; /* 缓冲地址段地址 */
unsigned long BlockNumLow; /* 磁盘起始绝对块地址低位,支持4G的扇区数,就是2048G字节 */
unsigned long BlockNumHigh; /* 磁盘起始绝对块地址高位,可支持天文数字的GB,本程序未用,置0 */
}dap;
dap.PacketSize=16;
dap.Reserved=0;
dap.BlockCount=sectorToDo;
dap.BufferAddrOFF=FP_OFF(buf);
dap.BufferAddrSEG=FP_SEG(buf);
dap.BlockNumLow=startSector;
dap.BlockNumHigh=0;
in.h.ah = cmd;
in.h.dl = driveNum;
in.h.al = 0; /* 0 为无写校验,1为有 */
in.x.si = FP_OFF(&dap);
sregs.ds = FP_SEG(&dap);
int86x(0x13,&in,&out,&sregs);
return out.h.ah;
}
/* 13中断的出错提示 */
void int13Error(int cmd, int drive, unsigned long start, int returnValue)
{
/* if(cmd==0x42)*/
printf("\n%s drive:%d sector:%lu error\n",(cmd==0x42 ? "Read" : "Write"),drive,start);
/*else
{
if(cmd==0x43) printf("\nWrite drive error : \n");
} */
/* 基本13中断 */
switch(returnValue)
{
case 0x01 : printf("Bad command.\n"); break;
case 0x02 : printf("Address mark not found.\n"); break;
case 0x03 : printf("Attempt to write to write-protected disk.\n"); break;
case 0x04 : printf("Sector not found.\n"); break;
case 0x05 : printf("Reset failed (hard disk).\n"); break;
case 0x06 : printf("Disk changed since last operation.\n"); break;
case 0x07 : printf("Drive parameter activity failed.\n"); break;
case 0x08 : printf("Direct memory access (DMA) overrun.\n"); break;
case 0x09 : printf("Attempt to perform DMA across 64K boundary.\n"); break;
case 0x0A : printf("Bad sector detected.\n"); break;
case 0x0B : printf("Bad track detected.\n"); break;
case 0x0C : printf("Unsupported track.\n"); break;
case 0x10 : printf("Bad CRC/ECC on disk read.\n"); break;
case 0x11 : printf("CRC/ECC corrected data error.\n"); break;
case 0x20 : printf("Controller has failed.\n"); break;
case 0x40 : printf("Seek operation failed.\n"); break;
case 0x80 : printf("Attachment failed to respond.\n"); break;
case 0xAA : printf("Drive not ready (hard disk only).\n"); break;
case 0xBB : printf("Undefined error occurred (hard disk only).\n"); break;
case 0xCC : printf("Write fault occurred.\n"); break;
case 0xE0 : printf("Status error.\n"); break;
case 0xFF : printf("Sense operation failed.\n"); break;
/* 扩展的13中断 */
case 0xB0 : printf("Media in drive not locked.\n"); break;
case 0xB1 : printf("Media in drive locked.\n"); break;
case 0xB2 : printf("Media portable.\n"); break;
case 0xB3 : printf("Media being in use.\n"); break;
case 0xB4 : printf("Count of lock overflow.\n"); break;
case 0xB5 : printf("legal request of ejection failed.\n"); break;
}
}
int getDiskFree(Pinfo **partitionTable, unsigned char DOSletter, unsigned long *freeSpaceKB)
{
struct diskfree_t free;
unsigned long avail;
unsigned char buf[1024];
/*unsigned long bytePerSect; */
unsigned long sectPerCluster;
unsigned long freeCluster;
unsigned char fatnt[]={0x04,0x06,0x0B,0x0C,0x01,0x0E,
0x14,0x16,0x1B,0x1C,0x11,0x1E,
0x07,0x17,0x00};
char fatntTRUE=0;
char fat32=1;
int int13Return;
int i,j=0;
for(i=0;partitionTable[i];i++)
{
if(tolower(partitionTable[i]->letter)==tolower(DOSletter)) break;
}
if(!partitionTable[i])
{
printf("No disk \"%c:\"\n",DOSletter);
return -1;
}
/*printf("%c:\n",partitionTable[i]->letter); */
for(j=0;fatnt[j];j++)
{
if(fatnt[j]==partitionTable[i]->ID)
{
fatntTRUE=1;
break;
}
}
/*
switch(partitionTable[i]->ID)
{
case 0x0B : break;
case 0x1B : break;
case 0x0C : break;
case 0x1C : break;
default : fat32=0;
} */
/*printf("%c fatntTRUE=%d\n",DOSletter,fatntTRUE); */
if(fatntTRUE)
{
if(partitionTable[i]->hardDrive==-127 || partitionTable[i]->hardDrive==-126)
{
if (absread(partitionTable[i]->hardDrive+127, 1, 0, buf) != 0)
{
printf("Failed to read %c:\n",partitionTable[i]->letter);
return -1;
}
}
else
{
int13Return=extInt13(0x42,
partitionTable[i]->hardDrive+127,
partitionTable[i]->start,
2,
buf);
if(int13Return!=0)
{
int13Error(0x42,partitionTable[i]->hardDrive+127,partitionTable[i]->start,int13Return);
/*printf("Failed to get disk free space info\n"); */
return -1;
}
}
if(*(unsigned short *)(buf+0x1FE)!=0xAA55)
{
printf("%c: unformated or invalid\n",DOSletter);
return -1;
}
/*printf("55aa=%X\n",*(unsigned short *)(buf+0x1FE)); */
if(strncmpi(buf+0x36,"FAT16",5)==0 && *(unsigned short *)(buf+0x16))
{
fat32=0;
}
else if(strncmpi(buf+0x52,"FAT32",5)==0 && *(unsigned long *)(buf+0x24))
fat32=1;
else
{
printf("Invalid FAT partition\n");
return -1;
}
}
/*
if(partitionTable[i]->ID==0x0B || partitionTable[i]->ID==0x0C)
fat32=1; */
/*switch(partitionTable[i]->ID)
{
fat32=1;
case 0x0B : break;
case 0x1B : break;
case 0x0C : break;
case 0x1C : break;
default : fat32=0;
}
if(fat32)
{
int13Return=extInt13(0x42,
partitionTable[i]->hardDrive+127,
partitionTable[i]->start,
2,
buf);
if(int13Return!=0)
{
int13Error(0x42,partitionTable[i]->hardDrive+127,partitionTable[i]->start,int13Return);
printf("Failed to get disk free space info\n");
return -1;
}
*/
/*printf("%c fat32=%d\n",DOSletter,fat32); */
if(fat32)
{
/*bytePerSect=*(unsigned short *)(buf+0x0B); */
sectPerCluster=*(unsigned char *)(buf+0x0D);
freeCluster=*(unsigned long *)(buf+0x0200+0x01E8);
*freeSpaceKB=sectPerCluster*freeCluster/2UL;
}
else
{
if (_dos_getdiskfree(tolower(DOSletter)-96, &free) != 0)
{
printf("Error getting %c: disk free\n",DOSletter);
return -1;
}
*freeSpaceKB = (unsigned long) free.avail_clusters
/** (unsigned long) free.bytes_per_sector */
* (unsigned long) free.sectors_per_cluster/2UL;
}
/*printf("%lu bytes free\n",*freeByte); */
return 0;
}
void takeFS(unsigned char ID, char *FS, char *hidden)
{
memset(FS,0,16);
switch(ID)
{
case 0x0C : strcpy(FS,"FAT32(LBA)"); break;
case 0x1C : strcpy(FS,"FAT32(LBA)"); *hidden=1; break;
case 0x0B : strcpy(FS,"FAT32"); break;
case 0x1B : strcpy(FS,"FAT32"); *hidden=1; break;
case 0x07 : strcpy(FS,"NTFS/HPFS"); break;
case 0x17 : strcpy(FS,"NTFS/HPFS"); *hidden=1; break;
case 0x06 : strcpy(FS,"FAT16(32M+)"); break;
case 0x16 : strcpy(FS,"FAT16(32M+)"); *hidden=1; break;
case 0x04 : strcpy(FS,"FAT16(32M-)"); break;
case 0x14 : strcpy(FS,"FAT16(<32M-)"); *hidden=1; break;
case 0x01 : strcpy(FS,"FAT12"); break;
case 0x11 : strcpy(FS,"FAT12"); *hidden=1; break;
case 0x0E : strcpy(FS,"FATs(LBA)"); break;
case 0x1E : strcpy(FS,"FATs(LBA)"); *hidden=1; break;
case 0x83 : strcpy(FS,"Linux Native"); break;
case 0x82 : strcpy(FS,"Linux Swap"); break;
case 0x26 : *hidden=1; break;
default : strcpy(FS,"");
}
}
int getDrive(int drive,
char *supportExtInt13,
unsigned long *maxCylinder,
unsigned long *maxHead,
unsigned long *maxSectorPerTrack,
unsigned long *totalSector,
char ignoreHDDparameter)
{
int result;
char buffer[512];
if(drive==-127 || drive==-126)
{
result = biosdisk(4,0,0,0,0,1,buffer);
if(result>>8) return -1;
/* result &= 0x02;
/*if(!result) return -1; */
if((unsigned char)result ==128) return -1;
if(int13DriveParameter(drive+127,maxCylinder,maxHead,maxSectorPerTrack,totalSector)==0) return 0;
return -1;
}
/* printf("checking if drive %d support extint13...\n",drive); */
*supportExtInt13=checkExtInt13(drive+127);
/* printf("passed\n"); */
if(*supportExtInt13)
{
if(ignoreHDDparameter) return 0;
/* printf("geting drive %d info...\n",drive); */
if(extInt13DriveParameter(drive+127,maxCylinder,maxHead,maxSectorPerTrack,totalSector)==0) return 0;
{
/* printf("error\n"); */
return -1;
}
}
else return -1;
}
void getDriveTable(Dinfo *driveTable[], char useFloppy, char ignoreHDDparameter)
{
int i,j,k;
int floppy;
int hard;
for(i=0,j=0,k=1,floppy=-127,hard=1;j<MAX_DRIVE_NUM;j++,floppy++)
{
driveTable[i]=(Dinfo *)malloc(sizeof(Dinfo));
memset(driveTable[i],0,sizeof(Dinfo));
if(!useFloppy || floppy>-126) floppy=0;
if(getDrive((floppy ? floppy : hard++),
&(driveTable[i]->supportExtInt13),
&(driveTable[i]->maxCylinder),
&(driveTable[i]->maxHead),
&(driveTable[i]->maxSectorPerTrack),
&(driveTable[i]->totalSector),
ignoreHDDparameter)==-1)
{
driveTable[i]=NULL;
if(!floppy) break;
else continue;
}
else
{
if(floppy)
{
driveTable[i]->floppy=1;
driveTable[i]->number=floppy;
}
else driveTable[i]->number=k++;
i++;
}
}
}
int getDriveItem(char drive,
Dinfo *driveTable[],
int *driveIndex)
{
int i=0;
*driveIndex=INVALID_INDEX;
/*
if(driveTable==NULL)
{
printf("No drive table\n");
return -1;
} */
if(driveTable[0]==NULL)
{
printf("No drive\n");
return -1;
}
/*
while(driveTable[i]->number!=drive)
{
if(driveTable[i]==NULL)
{
printf("No such drive %d\n",drive);
return -1;
}
i++;
} */
while(1)
{
if(driveTable[i]==NULL)
{
printf("No drive %d\n",drive);
return -1;
}
if(driveTable[i]->number==drive) break;
i++;
}
*driveIndex=i;
return 0;
}
int printDrive(Dinfo *driveTable[], Pinfo *partitionTable[], int index)
{
int i=0,j=0;
if(index==INVALID_INDEX) return -1;
else if(index==ALL_OR_THIS_TYPE) i=0;
else if(index!=PRINT_DRIVE_FLOPPY) i=index;
/*if(driveTable==NULL)
{
printf("No drive\n");
return -1;
} */
if(driveTable[0]==NULL)
{
printf("No drive\n");
return -1;
}
if(driveTable[0] && driveTable[i]==NULL)
{
printf("No drive %d\n",driveTable[i]->number);
return -1;
}
printf("\n DRIVE PARTITIONS CYLINDER HEAD SECTOR ALL SECTOR CAPACITY\n");
for(;driveTable[i]/*!=NULL*/;i++)
{
unsigned long GB=0;
unsigned long MB=0;
/* int part=0; */
if(index==PRINT_DRIVE_FLOPPY)
{
if(driveTable[i]->number!=-127 && driveTable[i]->number!=-126)
break;
}
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)
printf(" FLOPPY ");
else printf(" %-6d ",driveTable[i]->number);
/* printf("%c ",(driveTable[i]->supportExtInt13 ? '*' : ' ')); */
/* if(driveTable[i]->number>0)
{
for(j=0;partitionTable[j];j++)
{
if(driveTable[i]->number==partitionTable[j]->hardDrive)
{
part++;
if(partitionTable[j+1] && driveTable[i]->number!=partitionTable[j+1]->hardDrive)
{
j++;
break;
}
}
}
printf("%-10d ",part);
}
else printf("%10s ",""); */
printf("%-10d ",driveTable[i]->part);
printf("%-10lu %-8lu %-8lu ",
driveTable[i]->maxCylinder,
driveTable[i]->maxHead,
driveTable[i]->maxSectorPerTrack);
printf("%-10lu ",driveTable[i]->totalSector);
(GB ? printf("%-4lu GB\n",GB) : printf("%-4lu MB\n",MB));
if(index!=ALL_OR_THIS_TYPE) break;
}
return 0;
}
int putInFATlabel(Pinfo *part, unsigned char *buf)
{
/*unsigned char buf[512]; */
if(part->ID==0x0C || part->ID==0x0B ||
part->ID==0x1C || part->ID==0x1B)
strncpy(part->label,buf+0x47,11);
else strncpy(part->label,buf+0x2B,11);
return 0;
}
int putInFATvol(Pinfo *part, unsigned char *buf)
{
unsigned long reservedSector=*(unsigned short *)(buf+0xE);
char FATcount=buf[0x10];
/* 获取FAT所占的扇区数 */
unsigned long FATsector=0;
unsigned short fat1216=*(unsigned short *)(buf+0x16);
unsigned long fat32=*(unsigned long *)(buf+0x24);
unsigned long fat1216TotalFileItem=0;
unsigned long startClusterForFirstCluster=0;
unsigned long sectorsPerCluster=0;
unsigned long volSearchTime=0;
unsigned long posToSearch=0;
unsigned char *buf2=NULL;
char foundVol;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -