185 lines
3.5 KiB
C++
185 lines
3.5 KiB
C++
#include <dos.h>
|
||
#include <stdio.h>
|
||
#include <conio.h>
|
||
#include <malloc.h>
|
||
#include <errno.h>
|
||
|
||
typedef struct _EBPB_
|
||
{
|
||
unsigned sectsize;
|
||
char clustsize;
|
||
unsigned ressecs;
|
||
char fatcnt;
|
||
unsigned rootsize;
|
||
unsigned totsecs;
|
||
char media;
|
||
unsigned fatsize;
|
||
unsigned seccnt;
|
||
unsigned headcnt;
|
||
unsigned hiddensec_low;
|
||
unsigned hiddensec_hi;
|
||
unsigned long drvsecs;
|
||
} EBPB;
|
||
|
||
typedef struct _TRK_LY_
|
||
{
|
||
unsigned no;
|
||
unsigned size;
|
||
} TRK_LY;
|
||
|
||
typedef struct _DPB_
|
||
{
|
||
char spec;
|
||
char devtype;
|
||
unsigned devattr;
|
||
unsigned numofcyl;
|
||
char media_type;
|
||
EBPB bpb;
|
||
char reserved[6];
|
||
unsigned trkcnt;
|
||
TRK_LY trk[100];
|
||
} DPB;
|
||
|
||
typedef struct _DPB_FORMAT_
|
||
{
|
||
char spec;
|
||
unsigned head;
|
||
unsigned track;
|
||
} DPB_FORMAT;
|
||
|
||
int main(void)
|
||
{
|
||
union REGS reg;
|
||
struct SREGS segreg;
|
||
DPB far *dbp;
|
||
DPB_FORMAT far *dbp_f;
|
||
int sectors, i;
|
||
|
||
printf("\n<EFBFBD>à®£à ¬¬ ã¨ç⮦¨â ᮤ¥à¦¨¬®¥"
|
||
"\n81-© ¤®à®¦ª¨ ¤¨áª €:."
|
||
"\n†¥« ¥â¥ ¯à®¤®«¦¨âì? (Y,N)\n");
|
||
|
||
i = getch();
|
||
if((i != 'y') && (i != 'Y'))
|
||
return(-1);
|
||
|
||
// ‡ ª §ë¢ ¥¬ ¯ ¬ïâì ¤«ï ¡«®ª ¯ à ¬¥â஢ ãáâனáâ¢
|
||
dbp = (DPB far*)farmalloc(sizeof(DPB));
|
||
|
||
// ‡ ª §ë¢ ¥¬ ¯ ¬ïâì ¤«ï ¡«®ª ¯ à ¬¥â஢ ãáâனá⢠,
|
||
// ª®â®àë© ¡ã¤¥â ¨á¯®«ì§®¢ ¤«ï ä®à¬ â¨à®¢ ¨ï
|
||
dbp_f = (DPB_FORMAT far*)
|
||
farmalloc(sizeof(DPB_FORMAT));
|
||
|
||
if(dbp == NULL || dbp_f == NULL)
|
||
{
|
||
printf("\nŒ «® ¯ ¬ïâ¨");
|
||
return(-1);
|
||
}
|
||
|
||
// <20>®«ãç ¥¬ ⥪ã騥 ¯ à ¬¥âàë ¤¨áª €:
|
||
dbp->spec = 0;
|
||
reg.x.ax = 0x440d;
|
||
reg.h.bl = 1;
|
||
reg.x.cx = 0x0860;
|
||
reg.x.dx = FP_OFF(dbp);
|
||
segreg.ds = FP_SEG(dbp);
|
||
intdosx(®, ®, &segreg);
|
||
|
||
if(reg.x.cflag != 0)
|
||
{
|
||
printf("\nŽè¨¡ª : %d", reg.x.ax);
|
||
return(-1);
|
||
}
|
||
|
||
// ‡ ¯®«ï¥¬ ¡«®ª ¯ ଥâ஢ ¤«ï ä®à¬ â¨à®¢ ¨ï
|
||
dbp->spec = 5;
|
||
|
||
// ‘ç¨âë¢ ¥¬ ¨§ BPB ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤®à®¦ª¥
|
||
sectors = dbp->bpb.seccnt;
|
||
|
||
// <20>®¤£®â ¢«¨¢ ¥¬ â ¡«¨æã, ®¯¨áë¢ îéãî ä®à¬ â ¤®à®¦ª¨
|
||
|
||
// ‡ ¯¨áë¢ ¥¬ ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤®à®¦ª¥
|
||
dbp->trkcnt = sectors;
|
||
|
||
// „«ï ª ¦¤®£® ᥪâ®à ¤®à®¦ª¥ ¢ â ¡«¨æã
|
||
// § ¯¨áë¢ ¥¬ ¥£® ®¬¥à ¨ à §¬¥à.
|
||
for(i = 0; i < sectors; i++)
|
||
{
|
||
dbp->trk[i].no = i+1;
|
||
dbp->trk[i].size = 512;
|
||
}
|
||
|
||
// “áâ ¢«¨¢ ¥¬ ®¢ë¥ ¯ à ¬¥âàë ¤«ï ¤¨áª €:
|
||
reg.x.ax = 0x440d;
|
||
reg.h.bl = 1;
|
||
reg.x.cx = 0x0840;
|
||
reg.x.dx = FP_OFF(dbp);
|
||
segreg.ds = FP_SEG(dbp);
|
||
intdosx(®, ®, &segreg);
|
||
|
||
if(reg.x.cflag != 0)
|
||
{
|
||
printf("\nŽè¨¡ª : %d", reg.x.ax);
|
||
return(-1);
|
||
}
|
||
|
||
// ƒ®â®¢¨¬ ¡«®ª ¯ à ¬¥â஢ ãáâனá⢠,
|
||
// ª®â®àë© ¡ã¤¥â ¨á¯®«ì§®¢ ¯à¨ ¢ë§®¢¥
|
||
// ®¯¥à 樨 ¯à®¢¥àª¨ ¢®§¬®¦®á⨠ä®à¬ â¨à®¢ ¨ï
|
||
// ¤®à®¦ª¨
|
||
dbp_f->spec = 1;
|
||
dbp_f->head = 0;
|
||
dbp_f->track = 81;
|
||
|
||
reg.x.ax = 0x440d;
|
||
reg.h.bl = 1;
|
||
reg.x.cx = 0x0842;
|
||
reg.x.dx = FP_OFF(dbp_f);
|
||
segreg.ds = FP_SEG(dbp_f);
|
||
intdosx(®, ®, &segreg);
|
||
|
||
if(reg.x.cflag != 0)
|
||
{
|
||
printf("\nŽè¨¡ª : %d", reg.x.ax);
|
||
return(-1);
|
||
}
|
||
|
||
// …᫨ 㪠§ ë© ä®à¬ â ¤®à®¦ª¨ ¯®¤¤¥à¦¨¢ ¥âáï,
|
||
// ¯®«¥ á¯¥æ¨ «ìëå äãªæ¨© ¡ã¤¥â ᮤ¥à¦ âì 0.
|
||
// <20>஢¥à塞 íâ®
|
||
if(dbp_f->spec != 0)
|
||
{
|
||
printf("\n”®à¬ â ¤®à®¦ª¨ ¥ ¯®¤¤¥à¦¨¢ ¥âáï");
|
||
return(-1);
|
||
}
|
||
|
||
// ‡ ¯®«ï¥¬ ¡«®ª ¯ à ¬¥â஢ ¤«ï ¢ë¯®«¥¨ï
|
||
// ®¯¥à 樨 ä®à¬ â¨à®¢ ¨ï
|
||
dbp_f->spec = 0;
|
||
dbp_f->head = 0;
|
||
dbp_f->track = 81;
|
||
|
||
// ”®à¬ â¨à㥬 ¤®à®¦ªã á ®¬¥à®¬ 81, £®«®¢ª 0
|
||
reg.x.ax = 0x440d;
|
||
reg.h.bl = 1;
|
||
reg.x.cx = 0x0842;
|
||
reg.x.dx = FP_OFF(dbp_f);
|
||
segreg.ds = FP_SEG(dbp_f);
|
||
intdosx(®, ®, &segreg);
|
||
|
||
if(reg.x.cflag != 0)
|
||
{
|
||
printf("\nŽè¨¡ª : %d", reg.x.ax);
|
||
return(-1);
|
||
}
|
||
|
||
// Žá¢®¡®¦¤ ¥¬ ¯ ¬ïâì
|
||
farfree(dbp);
|
||
farfree(dbp_f);
|
||
|
||
return(0);
|
||
}
|
||
|