장 – 16
디스크용 추가 유틸리티 개발
소개
이 장에서는 MBR, DBR, FAT 및 루트 디렉터리의 정보를 사용하여 데이터 관리, 저장소 최적화 또는 디스크 문제 해결 작업에 도움이 될 수 있는 유틸리티 프로그램을 개발하는 방법에 대해 설명합니다.
일반적으로 이러한 프로그램은 특정 문제에 대한 솔루션입니다. 이 장에서는 일부 유틸리티 프로그램과 해당 프로그래밍에 대해 논의했습니다.
파티션 숨기기
일반적으로 파티션 숨김 유틸리티는 사용자가 사용하는 컴퓨터 시스템에서 작업하는 사용자가 사용합니다. 같은 컴퓨터에 여러 명의 사용자가 있는 경우 다른 사용자의 데이터를 읽거나 도용하거나 삭제할 가능성이 매우 큽니다.
이러한 경우 사용자가 같은 컴퓨터에 중요한 데이터나 기밀 정보가 있는 경우 운영 체제에서 파티션에 액세스하지 못하도록 자신의 데이터가 있는 파티션을 숨길 수 있습니다. 다른 사용자가 액세스할 수 없도록 합니다.
사용자가 시스템에서 작업하기를 원할 때 파티션을 숨김 해제하여 파티션에 다시 액세스할 수 있습니다. 일반적으로 이러한 유형의 이벤트는 많은 학생들이 컴퓨터를 사용하지만 고등학생은 항상 중요한 데이터나 프로젝트 작업에 대해 걱정하는 전문 기관에서 발생합니다. 지식 부족과 마찬가지로 신입생은 데이터를 손상시키거나 삭제할 수도 있습니다.
파티션이 숨겨지는 방법
다음 표는 MBR의 파티션 테이블에서 파티션 형식을 나타냅니다.
Offset |
Meaning |
Size |
Description |
00H |
Boot Type Indicator Byte |
1 Byte |
If Byte is 00H, the Partition is Inactive and if Byte is 80H, The Partition is Active (or Bootable) |
01H |
Head Number of Beginning of the Partition |
1 Byte |
Starting Head number of the Partition in Hexadecimal System |
02H |
Sector and Cylinder Number of Beginning of the Partition |
2 Bytes |
6 Bits of First Byte make Starting Sector Number and Combination of remaining 2 Bits (as Two Most Significant Bits) plus 8 Bits of another Byte (Rest 8 least Significant Bits of the 10-Bit Number ) make the Starting Cylinder Number of the Partition |
04H |
File System indicator Byte |
1 Byte |
File System Indicator Byte in Hexadecimal system (for complete list of partition indicator bytes, refer the chapter “Logical Approach to Disks and OS” discussed earlier in this book) |
05H |
Head Number of End of the Partition |
1 Byte |
Ending Head Number of the Partition in Hexadecimal System |
06H |
Sector and Cylinder Number of End of the Partition |
2 Bytes |
6 Bits of First Byte make Ending Sector Number and Combination of remaining 2 Bits (as Two Most Significant Bits) plus 8 Bits of another Byte (Rest 8 least Significant Bits of the 10-Bit Number ) make the Ending Cylinder Number of the Partition |
08H |
Absolute Sector number of Beginning of the Partition |
4 Bytes |
Number of Sectors Between the MBR and the First Sector in the Partition |
0CH |
Absolute Sector number of End of the Partition |
4 Bytes |
Number of Sectors in the Partition |
|
|
Total = 16 Bytes |
|
오프셋 04H에서 모든 파티션 항목에는 파일 시스템 표시기 바이트가 있습니다. 이 표시기 바이트는 해당 파티션의 파일 시스템 유형을 나타냅니다. 이 바이트의 값이 변경되면 파티션의 ID가 변경됩니다.
예를 들어, "DOS 12-Bit FAT"에 대한 파티션 표시기 바이트의 값은 0x01입니다. 이 값이 0x11로 변경되면 파티션 테이블 항목의 파일 시스템 ID가 "Hidden DOS 12-Bit FAT"로 변경됩니다(파티션 표시기 바이트의 전체 목록은 논의된 "디스크 및 OS에 대한 논리적 접근" 장 참조). 이 책의 앞부분).
다음 표는 일부 파티션 유형에 대한 파일 시스템 표시기 바이트의 몇 가지 추가 예를 보여줍니다.
Partition type indicator Byte |
Description of File System of Partition |
0x01 |
DOS 12–bit FAT |
0x11 |
Hidden DOS 12–bit FAT |
0x04 |
DOS 16–bit FAT (<=32MB) |
0x14 |
Hidden DOS 16–bit FAT (<=32MB) |
0x05 |
DOS Extended |
0x15 |
Hidden DOS Extended |
0x06 |
DOS 16–bit big (> 32MB) |
0x16 |
Hidden DOS 16–bit big (> 32MB) |
0x07 |
NTFS |
0x17 |
Hidden NTFS |
0x0B |
Windows FAT32 |
0x1B |
Hidden Windows FAT32 |
0x0C |
Windows FAT32 (LBA) |
0x1C |
Hidden Windows FAT32 (LBA) |
0x0E |
Windows FAT16 (LBA) |
0x1E |
Hidden Windows FAT16 (LBA) |
0x0F |
Windows Extended |
0x1F |
Hidden Windows Extended |
여기에서 시스템 표시기 바이트에 0x10 값을 추가하여 모든 파일 시스템에 해당하는 숨겨진 파티션을 찾습니다.
파티션을 숨기는 것이 어렵고 빠른 규칙은 아니지만 대부분의 파일 시스템에서도 작동합니다. 그 이유는 파티션 표시기 바이트의 값을 변경할 때 파티션 테이블 항목의 파일 시스템 ID가 변경되기 때문입니다. 그리고 새 파일 시스템이 동일한 운영 체제에서도 지원되는 경우는 매우 드뭅니다.
파티션을 숨기는 프로그램 작성
다음에 주어진 프로그램은 MBR의 파티션 테이블에서 해당 파티션의 파티션 항목을 사용하여 파티션을 숨기는 데 사용됩니다. 확장 볼륨에서 다른 논리 파티션을 숨기려면 확장 MBR에 액세스해야 합니다.
프로그램 코딩은 다음과 같습니다.
/* MBR에서 해당 파티션의 파티션 테이블 항목을 사용하여 파티션을 숨기는 프로그램 */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo;
int result, tohide;
int i;
static char dbuf[512];/* Data Buffer to read-Write the
Sector information */
clrscr();
dinfo.drive = 0x80; /* drive number for First
Hard Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
/* 디스크의 첫 번째 섹터 읽기 */
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) == 0)
{
printf("The Partition Codes of Four Partition Entries are,
0x%02x, 0x%02x, 0x%02x And 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
textcolor(15);
gotoxy(5,5);cprintf("Partition Entry in MBR is as
follows:");
gotoxy(10,7);cprintf("1. "); showtype(dbuf[450] & 0xff);
gotoxy(10,8);cprintf("2. "); showtype(dbuf[466] & 0xff);
gotoxy(10,9);cprintf("3. "); showtype(dbuf[482] & 0xff);
gotoxy(10,10);cprintf("4. "); showtype(dbuf[498] & 0xff);
/* 파티션 숨기기를 위한 사용자 입력 얻기 */
gotoxy(1,15);
printf("Enter The partition no. you want to hide,
Or Press any other key to Exit... ");
tohide=getche();
switch(tohide)
{
case '1': /* Hide First Partition in partition Table */
dbuf[450] = dbuf[450] +16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
case '2': /* Hide second Partition in partition Table */
dbuf[466] = dbuf[466]+16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
case '3': /* Hide third Partition in partition Table */
dbuf[482] = dbuf[482] +16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
case '4': /* Hide Fourth Partition in partition Table */
dbuf[498] = dbuf[498]+16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
default:
exit(0);
}
if ((result & 0xff00) == 0)
{
printf("\n\nThe New Partition Codes of Four Partition
Entries are, 0x%02x, 0x%02x, 0x%02x And 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
else
{
printf("Cannot Change the Byte, status = 0x%02x\n",
result);
getch();
}
}
return 0;
}
코딩에 대한 의견:
프로그램은 MBR의 파티션 테이블에 있는 4개의 파티션 항목 모두의 파일 시스템 표시기 바이트를 읽습니다. showtype() 함수는 파일 시스템 표시기 바이트의 해당 값에 대한 파일 시스템 이름을 표시하는 데 사용됩니다.
사용자가 화면에 표시되는 메뉴에서 숨길 파티션을 선택하면 해당 파티션의 파일 시스템 표시기 바이트 값에 16(0x10)을 더하여 숨깁니다.
showtype() 함수의 코딩은 다음과 같습니다.
/* 파일 시스템 표시자 바이트 값에 해당하는 파일 시스템 이름을 표시하는 기능 */
showtype(i)
{
switch (i)
{
case 0x00 :cprintf("Empty"); break;
case 0x01 :cprintf("DOS 12-bit FAT"); break;
case 0x02 :cprintf("XENIX root"); break;
case 0x03 :cprintf("XENIX usr"); break;
case 0x04 :cprintf("DOS 16-bit <32M"); break;
case 0x05 :cprintf("Extended"); break;
case 0x06 :cprintf("DOS 16-bit >=32M"); break;
case 0x07 :cprintf("OS/2 HPFS"); break;
case 0x08 :cprintf("AIX"); break;
case 0x09 :cprintf("AIX bootable"); break;
case 0xa :cprintf("OS/2 Boot Manag"); break;
case 0xb :cprintf("Win95/98/ME FAT32"); break;
case 0xc :cprintf("Win95/98/ME FAT32 (LBA)"); break;
case 0xd :cprintf("Win95 FAT16"); break;
case 0xe :cprintf("Win95 FAT16 (LBA)"); break;
case 0xf :cprintf("Win95 Extended"); break;
case 0x11 :cprintf("Hidden FAT-12");break;
case 0x12 :cprintf("Compaq Diagnostics");break;
case 0x14 :cprintf("Hidden FAT-16 (<32)");break;
case 0x15 :cprintf("Hidden Extended");break;
case 0x16 :cprintf("Hidden FAT-16");break;
case 0x17 :cprintf("NTFS"); break;
case 0x40 :cprintf("Venix 80286"); break;
case 0x51 :cprintf("Novell?"); break;
case 0x52 :cprintf("Microport"); break;
case 0x63 :cprintf("GNU HURD"); break;
case 0x64 :
case 0x65 :cprintf("Novell Netware"); break;
case 0x75 :cprintf("PC/IX"); break;
case 0x80 :cprintf("Old MINIX"); break;
case 0x81 :cprintf("Linux/MINIX"); break;
case 0x82 :cprintf("Linux swap"); break;
case 0x83 :cprintf("Linux native"); break;
case 0x85 :cprintf("Linux Extended"); break;
case 0x93 :cprintf("Amoeba"); break;
case 0x94 :cprintf("Amoeba BBT"); break;
case 0xa5 :cprintf("BSD/386"); break;
case 0xa6 :cprintf("OpenBSD"); break;
case 0xa7 :cprintf("NEXTSTEP"); break;
case 0xb7 :cprintf("BSDI fs"); break;
case 0xb8 :cprintf("BSDI swap"); break;
case 0xc7 :cprintf("Syrinx"); break;
case 0xdb :cprintf("CP/M"); break;
case 0xe1 :cprintf("DOS access"); break;
case 0xe3 :cprintf("DOS R/O"); break;
case 0xf2 :cprintf("DOS secondary"); break;
case 0xff :cprintf("BBT"); break;
default :cprintf("UNKOWN");
}
return 0;
}
파티션 숨기기를 해제하는 프로그램 작성
숨겨진 파티션 숨기기를 해제하는 프로그램은 프로그램을 숨기는 프로그램과 정반대로 작동합니다. 이 프로그램에서 숨겨진 파티션의 파일 시스템 표시기 바이트 값에서 16(0x10)을 뺍니다.
다음과 같이 프로그램의 코딩:
/* 이전 프로그램에 의해 숨겨진 파티션을 숨김 해제하는 프로그램 */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo;
int result, tohide;
int i;
static char dbuf[512];/* Data buffer */
clrscr();
dinfo.drive = 0x80; /* drive number for
First Hard Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) == 0)
{
printf("The Partition Codes of Four Partition
Entries are, 0x%02x, 0x%02x, 0x%02x And 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
textcolor(15);
gotoxy(5,5);
cprintf("Partition Entry in MBR is as follows:");
gotoxy(10,7);cprintf("1. "); showtype(dbuf[450] & 0xff);
gotoxy(10,8);cprintf("2. "); showtype(dbuf[466] & 0xff);
gotoxy(10,9);cprintf("3. "); showtype(dbuf[482] & 0xff);
gotoxy(10,10);cprintf("4. "); showtype(dbuf[498] & 0xff);
/* 파티션 숨기기를 해제하려면 입력을 사용하세요. */
gotoxy(1,15);printf("Enter The partition no., Which to
unhide, Or Press any other key to
Exit... ");
tohide=getche();
switch(tohide)
{
/* 파티션 테이블의 첫 번째 파티션 숨기기 해제 */
case '1':
dbuf[450] = dbuf[450] -16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
/* Unhide second partition of partition table */
case '2':
dbuf[466] = dbuf[466]-16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
/* Unhide third partition of partition table */
case '3':
dbuf[482] = dbuf[482] -16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
/* Unhide fourth partition of partition table */
case '4':
dbuf[498] = dbuf[498]-16;
result = _bios_disk(_DISK_WRITE, &dinfo);
break;
default:
exit(0);
}
if ((result & 0xff00) == 0)
{
printf("\n\nThe New Partition Codes of Four Partition
Entries are, 0x%02x, 0x%02x, 0x%02x And 0x%02x.\n",
dbuf[450] & 0xff, dbuf[466] & 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
else
{
printf("Cannot Change the Byte, status = 0x%02x\n",
result);
getch();
}
}
return 0;
}
프로그램에 대한 의견
숨김을 해제할 파티션 번호를 지정하는 동안 주의하십시오. 파티션 번호를 실수로 잘못 입력한 경우 해당 파티션의 파일 시스템 정보가 변경되어 파티션에 액세스할 수 없게 될 수 있습니다. 그러나 이전에 파티션을 숨기기 위해 논의한 프로그램은 해당 파티션의 파일 시스템 표시기 바이트를 치료하는 데 도움이 될 수 있습니다.
파티션 삭제 프로그램 작성
파티션을 삭제하는 프로그램은 문제 해결을 위해 사용됩니다. 예를 들어 디스크에 FAT32 파일 시스템 파티션이 있다고 가정합니다. 이제 디스크에 LINUX 운영 체제를 동시에 설치하기로 결정했습니다.
어쨌든 MBR의 파티션 테이블이 수정되는 단계에서 운영 체제의 설치가 중간에 중단됩니다. 이러한 경우 다른 운영 체제를 설치하려는 파티션에 액세스할 수 없게 될 가능성이 많습니다.
이 경우 손실된 파티션의 디스크 공간은 액세스할 수 없기 때문에 무용지물이 됩니다. 그러나 파티션 테이블에서 해당 파티션의 파티션 정보를 어떻게든 삭제하면 DOS의 FDISK 명령을 사용하여 이 공간을 다시 사용할 수 있습니다.
MBR의 파티션 테이블에서 파티션 항목을 삭제하는 프로그램은 다음과 같습니다.
/* MBR의 파티션 테이블에서 두 번째 파티션 항목을 삭제하는 프로그램 */
# include <bios.h>
/* structure to read the partition entry from partition table */
struct partition
{
/* Active Partition Byte */
unsigned char bootable ;
/* Starting Head */
unsigned char start_side ;
/* combination of Starting sector and cylinder number */
unsigned int start_sec_cyl ;
/* File system Indicator Byte */
unsigned char parttype ;
/* Ending Head */
unsigned char end_side ;
/* combination of Starting sector and cylinder number */
unsigned int end_sec_cyl ;
/* Relative Sector Number */
unsigned long part_beg ;
/* Partition length in sectors */
unsigned long plen ;
} ;
/* Structure to read-write MBR */
struct part
{
/* IPL (Initial Program Loader) */
unsigned char master_boot[446] ;
/* Partition table */
struct partition pt[4] ;
/* Magic Number */
int lasttwo ;
} ;
struct part p ;
void main()
{
unsigned int t1,t2;
clrscr();
biosdisk ( 2, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* display the information of
Partition table */
getch();
p.pt[1].bootable = 0;
p.pt[1].start_side = 0 ;
p.pt[1].start_sec_cyl = 0 ;
p.pt[1].parttype = 0;
p.pt[1].end_side = 0;
p.pt[1].end_sec_cyl = 0;
p.pt[1].part_beg = 0;
p.pt[1].plen = 0;
printf("\n\n\n After Deleting the Second Partition
Entry From MBR Partition Table,");
printf("\n The Partition Table will Be Changed as
Follows: ");
/* To Delete Second Partition Information from partition
table of MBR Remove the forward slashes from the
biosdisk( ) function. Do not use Carelessly, Partition
information of Second Partition of Partition Table will
be Erased Completely. */
////// biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* Display the information of partition
table after modification */
getch();
}
프로그램에 대한 의견:
biosdisk( 3, 0x80, 0, 0, 1, 1, &p) 함수의 주석 처리를 제거하여 MBR의 파티션 테이블에서 두 번째 파티션을 삭제합니다.
파티션을 삭제하려면 파티션의 모든 매개변수를 MBR의 파티션 테이블 항목에서 0으로 설정합니다. 확장 파티션을 삭제하면 해당 확장 파티션의 모든 논리 파티션도 액세스할 수 없게 된다는 점을 항상 기억하십시오.
기능 display( )는 MBR의 파티션 테이블을 표시하는 데 사용됩니다. 함수의 코딩은 다음과 같습니다.
/* MBR의 파티션 테이블을 표시하는 기능 */
display()
{
unsigned int s_sec, s_trk, e_sec, e_trk, i, t1, t2 ;
char type[20], boot[5] ;
printf("\n\nPart. Boot Starting location Ending Location
Relative Number of");
printf("\nType Side Cylinder Sector Side Cylinder
Sector Sectors Sectors\n");
for ( i = 0 ; i <= 3 ; i++ )
{
if ( p.pt[i].bootable == 0x80 )
strcpy ( boot, "Yes" ) ;
else
strcpy ( boot, "No" ) ;
switch ( p.pt[i].parttype )
{
case 0x00 :
strcpy ( type, "Unused" ) ; break ;
case 0x1 :
strcpy ( type, "FAT12" ) ; break ;
case 0x2 :
strcpy ( type, "Xenix" ) ; break ;
case 0x3 :
strcpy ( type, "Xenix:usr" ) ; break ;
case 0x4 :
strcpy ( type, "FAT16<32M" ) ; break ;
case 0x5 :
strcpy ( type, "DOS-Ext." ) ; break ;
case 0x6 :
strcpy ( type, "FAT16>32M" ) ; break ;
case 0x7 :
strcpy ( type, "NTFS" ) ; break ;
case 0x0b :
strcpy ( type, "FAT32" ) ; break ;
case 0x0c :
strcpy ( type, "FAT32-LBA" ) ; break ;
case 0x0d :
strcpy ( type, "VFAT16" ) ; break ;
case 0x0e :
strcpy ( type, "VFAT16-LBA" ) ; break ;
case 0x0f :
strcpy ( type, "FAT EXT" ) ; break ;
case 0x17 :
strcpy ( type, "HPFS" ) ; break ;
case 0x81 :
strcpy ( type, "Old LINUX" ) ; break ;
case 0x82 :
strcpy ( type, "LinuxSwap" ) ; break ;
case 0x83 :
strcpy ( type, "LinuxNative" ) ; break ;
case 0x85 :
strcpy ( type, "Linux Ext." ) ; break ;
default :
strcpy ( type, "Unknown" ) ; break ;
}
s_sec = ( p.pt[i].start_sec_cyl & 0x3f ) ;
t1 = ( p.pt[i].start_sec_cyl & 0xff00 ) >> 8 ;
t2 = ( p.pt[i].start_sec_cyl & 0x00c0 ) << 2 ;
s_trk = t1 | t2 ;
e_sec = ( p.pt[i].end_sec_cyl & 0x3f ) ;
t1 = ( p.pt[i].end_sec_cyl & 0xff00 ) >> 8 ;
t2 = ( p.pt[i].end_sec_cyl & 0x00c0 ) << 2 ;
e_trk = t1 | t2 ;
printf ( "\n%6s %3s", type, boot ) ;
printf ( "%4d %6d %8d", p.pt[i].start_side,
s_trk,s_sec ) ;
printf ( "%7d %6u %8u", p.pt[i].end_side, e_trk,
e_sec ) ;
printf ( " %10lu %10lu", p.pt[i].part_beg,
p.pt[i].plen ) ;
}
return 0;
}
"트랙 0 불량" 플로피 포맷
이 프로그램은 트랙 0에 불량 섹터가 있는 플로피를 포맷하는 데 사용되며 DOS 또는 Windows로 포맷할 때 "트랙 0 BAD"와 같은 오류 메시지를 표시합니다. 그러나 일반 플로피를 포맷하는 데 사용할 수도 있습니다.
프로그램의 코딩은 "TTFORMAT.C"라는 이름으로 이 책에 포함된 디스크에 있습니다. 프로그램의 작동 논리는 2003년 2월판 PCQUEST 컴퓨터 잡지에 발표된 프로그램과 동일합니다.
이 프로그램에서는 이러한 유형의 플로피를 포맷하여 재사용할 수 있도록 합니다. 프로그램에서는 불량 섹터가 있는 플로피 디스크를 처리할 수 있다고 합니다. 단, 디스크의 첫 번째 섹터가 불량이면 플로피를 포맷할 수 없습니다.
프로그램은 모든 DBR, FAT 및 루트 디렉토리 정보를 다시 씁니다. 디스크 표면에 불량 섹터가 있으면 FAT에서 불량 섹터로 표시됩니다.
프로그램 코딩에서 구조 BPB는 DBR의 BIOS 매개변수 블록을 작성하는 데 사용됩니다. boot_sector 구조는 디스크의 DBR을 쓰는 데 사용됩니다. address_field 구조는 트랙당 실린더, 헤드 및 섹터 수 및 섹터 크기와 상호 작용하는 데 사용됩니다.
프로그램 코딩에 사용되는 다양한 기능과 설명은 다음 표에 나와 있습니다.
플로피 디스크의 볼륨 일련 번호는 시스템 시계의 현재 날짜와 시간에 따라 DOS에 의해 계산됩니다.
일련 번호의 첫 번째 부분은 시간(초 및 1/100초)과 날짜(월 및 일)의 합으로 계산됩니다. 일련 번호의 두 번째 부분은 시간(시 및 분)과 날짜(년)의 합과 같습니다.
모든 계산은 16진법으로 수행됩니다. 예를 들어, 2003년 10월 23일 11:16:28:65에 DOS 환경에서 플로피를 포맷했다고 가정합니다. 이제 디스크의 일련 번호를 계산해 보겠습니다.
The time in (seconds and Hundredths of seconds) format is
= (28 and 65)
= (1CH and 41H)
Write it as 1C41
Similarly, date in (month and day) format is
= (10 and 23)
= (0AH and 17H)
Write it as 0A17
Similarly, time in (hours and minutes) format is,
= (11 and 16)
= (0BH and 10H)
Write it as 0B10
And the year will be
= 2003
= 07D3
이제 앞에서 설명한 대로 플로피 디스크의 일련 번호를 계산해 보겠습니다. 일련 번호 우물의 첫 번째 부분은 (1C41 + 0A17) = 2658이고 일련 번호의 두 번째 부분은 (0B10 + 07D3) = 12E3입니다.
디스크 편집 도구 작성
디스크 편집 프로그램의 코딩은 이 책에 포함된 디스크에 "TTEDITOR.C"라는 파일 이름으로 제공됩니다. 이 프로그램을 사용하여 하드 디스크 또는 플로피 디스크 표면을 분석할 수 있습니다. 이 책을 쓰는 동안 대부분의 연구에서도 디스크 표면을 분석하거나 디스크 수정을 수행하기 위해 TTEDITOR를 사용했습니다.
이 편집 프로그램이 수행할 수 있는 중요한 작업 중 일부는 다음과 같습니다.
- 하드 디스크 및 플로피 디스크 표면의 섹터 정보를 읽습니다.
- 모든 섹터의 백업을 파일에 씁니다.
- 파일에서 섹터 데이터를 복원합니다.
- 단일 바이트를 수정합니다.
- 16진수에서 10진수 및 2진수로의 계산기.
이 프로그램은 biosdisk( ) 및 _bios_disk( ) 함수를 사용하여 디스크에 액세스합니다. 8.4GB 이상의 디스크를 분석하려면 INT 13H의 Extensions를 사용하여 프로그램을 수정하십시오. 프로그램에서 사용되는 기능에 대한 설명은 다음 표에 나와 있습니다.
Function |
Description |
bkground( ) |
creates the back ground and frame of first screen |
clsline( ) |
Used to clear the complete row from the screen specified by row number. |
refresh( ) |
Function to recall all the display functions on the screen |
writetofile( ) |
Function to write the data of a sector to user defined file. |
writetosector( ) |
Function to restore the sector from specified file. |
msgdisp( ) |
Function to display messages on the screen. |
modify( ) |
Function to modify a single byte of any sector, specified by user. |
frame( ) |
Function to draw the frame structure of sector display |
dispmax( ) |
Display maximum CHS number of the disk (Valid Up to 8.4 GB Disk) |
display( ) |
Display the sector and information on the screen. |
hextodec( ) |
Function to Calculate hexadecimal number to corresponding decimal and binary numbers. |