장 - 16
더 많은 디스크 유틸리티 개발
소개
이번 장에서는 MBR, DBR, FAT 및 루트 디렉터리 정보를 사용하여 데이터 관리, 스토리지 최적화 또는 많은 디스크 문제 해결에 도움이 되는 유틸리티를 개발하는 방법에 대해 설명합니다.
일반적으로 이러한 프로그램은 특정 문제에 대한 해결책입니다. 이 장에서는 일부 유틸리티와 프로그래밍에 대해 설명했습니다.
섹션 숨기기
일반적으로 파티션 숨기기 유틸리티는 사용자와 동일한 컴퓨터 시스템에서 작업하는 사용자가 사용합니다. 한 컴퓨터에 많은 사용자가 있는 경우, 다른 사용자의 데이터가 읽히거나, 도난당하거나, 삭제될 가능성이 높습니다.
이런 경우, 사용자가 동일한 컴퓨터에 중요한 데이터나 기밀 정보가 있다면, 데이터가 있는 파티션을 숨겨 운영 체제가 해당 파티션에 접근할 수 없고, 다른 사용자가 해당 파티션에 접근할 수 없도록 하고 싶을 수 있습니다.
사용자가 시스템에서 작업하고 싶을 때는 간단히 섹션을 열어서 해당 섹션에 다시 접근할 수 있습니다. 일반적으로 이런 행사는 학생들이 컴퓨터를 많이 사용하는 전문 기관에서 일어나는데, 고학년 학생들은 항상 중요한 데이터나 프로젝트 작업에 대해 걱정합니다. 지식이 부족하면 새로운 학생이 자신의 데이터를 손상시키거나 삭제할 수도 있습니다.
섹션은 어떻게 숨겨지나요?
다음 표는 MBR 파티션 테이블의 파티션 형식을 보여줍니다.
보상하다 |
의미 |
크기 |
설명 |
00시 |
부팅 유형 표시기 바이트 |
1바이트 |
바이트가 00H 이면 파티션이 비활성화되고, 바이트가 80H 이면 파티션이 활성화(또는 부팅 가능)됩니다. |
01시 |
시작 섹션 번호 |
1바이트 |
16진수 시작 파티션 번호 |
02시 |
파티션 시작 부분의 섹터 및 실린더 번호 |
2바이트 |
첫 번째 바이트의 6비트는 시작 섹터 번호를 구성하고 나머지 2비트(최상위 2비트)와 다른 바이트의 8비트(10비트 숫자의 나머지 최하위 8비트)를 결합하여 파티션의 시작 실린더 번호를 구성합니다. |
04시 |
파일 시스템 표시 바이트 |
1바이트 |
16진법의 파일 시스템 표시기 바이트 (파티션 표시기 바이트의 전체 목록은 이 책의 앞 부분에서 설명한 "디스크 및 OS에 대한 논리적 접근 방식" 장을 참조하세요) |
05시 |
섹션 제목 번호의 끝 |
1바이트 |
16진수로 끝 파티션 번호 |
06시 |
섹션 끝의 섹터 및 실린더 번호 |
2바이트 |
첫 번째 바이트의 6비트는 최종 섹터 번호를 구성하고, 나머지 2비트(최상위 2비트)와 다른 바이트의 8비트(10비트 숫자의 나머지 최하위 8비트)를 결합하여 파티션의 최종 실린더 번호를 구성합니다. |
08시 |
파티션 시작 부분의 절대 섹터 번호 |
4바이트 |
MBR과 파티션의 첫 번째 섹터 사이의 섹터 수 |
0H |
파티션 끝의 절대 섹터 번호 |
4바이트 |
섹션의 섹터 수 |
|
|
총 = 16바이트 |
|
오프셋 04H에는 각 파티션 항목에 파일 시스템 표시기 바이트가 있습니다. 이 표시기 바이트는 이 파티션의 파일 시스템 유형을 나타냅니다. 이 바이트의 값이 변경되면 섹션 식별이 변경됩니다.
예를 들어, "DOS 12-Bit FAT"의 파티션 표시기 바이트 값은 0x01입니다. 이 값을 0x11로 변경하면 파티션 테이블 항목의 파일 시스템 식별자가 "숨겨진 DOS 12비트 FAT"로 변경됩니다(파티션 표시기 바이트의 전체 목록은 이 책의 앞 부분에서 설명한 "디스크 및 OS에 대한 논리적 접근 방식" 장을 참조하십시오).
아래 표는 일부 파티션 유형에 대한 파일 시스템 표시기 바이트의 몇 가지 예를 보여줍니다.
파티션 유형 표시기 바이트 |
파티션 파일 시스템 설명 |
0x01 |
DOS 12비트 FAT |
0x11 |
숨겨진 DOS 12비트 FAT |
0x04 |
DOS 16비트 FAT(<=32MB) |
0x14 |
숨겨진 DOS 16비트 FAT(<=32MB) |
0x05 |
DOS 확장 |
0x15 |
숨겨진 DOS 확장 |
0x06 |
DOS 16비트 대형(>32MB) |
0x16 |
숨겨진 DOS 16비트 대형(>32MB) |
0x07 |
한국어: |
0x17 |
숨겨진 NTFS |
0x0B |
윈도우 FAT32 |
0x1B |
숨겨진 Windows FAT32 |
0x0C |
윈도우 FAT32(LBA) |
0x1C |
숨겨진 Windows FAT32(LBA) |
0x0E |
윈도우 FAT16(LBA) |
0x1E |
숨겨진 Windows FAT16(LBA) |
0x0F |
윈도우 확장 |
0x1F |
숨겨진 창 확장 |
여기서는 0x10 값을 시스템 표시 바이트에 더하여 모든 파일 시스템에 해당하는 숨겨진 파티션을 찾는 것을 볼 수 있습니다.
파티션을 숨기는 데 엄격하고 빠른 규칙은 아니지만 대부분의 파일 시스템에서도 작동합니다. 그 이유는 파티션 표시자 바이트의 값을 변경하면 파티션 테이블 항목의 파일 시스템 ID가 변경되기 때문입니다. 그리고 새 파일 시스템이 동일한 운영 체제에서 지원되는 경우는 매우 드뭅니다.
파티션을 숨기는 프로그램 작성
다음에 주어진 프로그램은 MBR의 파티션 테이블에서 해당 파티션의 파티션 항목을 사용하여 파티션을 숨기는 데 사용됩니다. 확장된 볼륨에서 다른 논리적 파티션을 숨기려면 확장된 MBR에 액세스해야 합니다.
프로그램의 코딩은 다음과 같습니다.
/* MBR에서 해당 파티션의 파티션 테이블 항목을 사용하여 파티션을 숨기는 프로그램 */
#include <bios.h>
#include <stdio.h>
int 메인(공백)
{
구조체 diskinfo_t dinfo;
int 결과, 숨기기;
안녕하세요.
static char dbuf[512];/* 읽기-쓰기용 데이터 버퍼
섹터 정보 */
영어: clrscr();
dinfo.drive = 0x80; /* First의 드라이브 번호
하드디스크 */
dinfo.head = 0; /* 디스크 헤드 번호 */
dinfo.track = 0; /* 트랙 번호 */
dinfo.sector = 1; /* 섹터 번호 */
dinfo.nsectors = 1; /* 섹터 수 */
dinfo.buffer = dbuf; /* 데이터 버퍼 */
/* 디스크의 첫 번째 섹터를 읽습니다. */
결과 = _bios_disk(_DISK_READ, &dinfo);
if ((결과 & 0xff00) == 0)
{
printf("4개 파티션 항목의 파티션 코드는 다음과 같습니다.
0x%02x, 0x%02x, 0x%02x 그리고 0x%02x.\n",
dbuf[450] 및 0xff, dbuf[466] 및 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
텍스트색상(15);
gotoxy(5,5);cprintf("MBR의 파티션 항목은 다음과 같습니다.
다음과 같습니다:");
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);
/* 파티션 숨기기에 대한 사용자 입력 가져오기 */
고톡시(1,15);
printf("숨기고 싶은 파티션 번호를 입력하세요.
또는 다른 키를 눌러 종료하세요... ");
숨기기=getche();
(숨기기) 전환
{
case '1': /* 파티션 테이블의 첫 번째 파티션 숨기기 */
dbuf[450] = dbuf[450] +16;
결과 = _bios_disk(_DISK_WRITE, &dinfo);
부서지다;
case '2': /* 파티션 테이블에서 두 번째 파티션 숨기기 */
dbuf[466] = dbuf[466]+16;
결과 = _bios_disk(_DISK_WRITE, &dinfo);
부서지다;
case '3': /* 파티션 테이블의 세 번째 파티션 숨기기 */
**dbuf[482]** = **dbuf[482] +16입니다.
결과 = _bios_disk(_DISK_WRITE, &dinfo);
부서지다;
case '4': /* 파티션 테이블에서 네 번째 파티션 숨기기 */
dbuf[498] = dbuf[498]+16;
결과 = _bios_disk(_DISK_WRITE, &dinfo);
부서지다;
기본:
종료(0);
}
if ((결과 & 0xff00) == 0)
{
printf("\n\n4개 분할의 새로운 분할 코드
항목은 0x%02x, 0x%02x, 0x%02x 및 0x%02x입니다.\n",
dbuf[450] 및 0xff, dbuf[466] 및 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
또 다른
{
printf("바이트를 변경할 수 없습니다, 상태 = 0x%02x\n",
결과);
getch();
}
}
0을 반환합니다.
}
코딩에 대한 의견:
이 프로그램은 MBR의 파티션 테이블에 있는 네 개의 모든 파티션 항목의 파일 시스템 인디케이터 바이트를 읽습니다. showtype( ) 함수는 파일 시스템 인디케이터 바이트의 해당 값에 대한 파일 시스템 이름을 표시하는 데 사용됩니다.
사용자는 화면에 표시된 메뉴에서 숨길 파티션을 선택한 다음, 해당 파티션의 파일 시스템 표시기 바이트 값에 16(0x10)을 추가하여 숨깁니다.
함수 showtype( )의 코딩은 다음과 같습니다.
/* 파일 시스템 표시기 바이트 값에 해당하는 파일 시스템 이름을 표시하는 함수 */
쇼타입(i)
{
스위치 (i)
{
case 0x00 :cprintf("비어 있음"); break;
case 0x01 :cprintf("DOS 12비트 FAT"); break;
case 0x02 :cprintf("XENIX 루트"); break;
케이스 0x03 :cprintf("XENIX usr"); 중단;
case 0x04 :cprintf("DOS 16비트 <32M"); break;
case 0x05 :cprintf("확장됨"); break;
case 0x06 :cprintf("DOS 16비트 >=32M"); break;
케이스 0x07 :cprintf("OS/2 HPFS"); 중단;
케이스 0x08 :cprintf("AIX"); 중단;
case 0x09 :cprintf("AIX 부팅 가능"); break;
case 0xa :cprintf("OS/2 부트 관리자"); break;
케이스 0xb :cprintf("Win95/98/ME FAT32"); 중단;
케이스 0xc :cprintf("Win95/98/ME FAT32 (LBA)"); 중단;
케이스 0xd :cprintf("Win95 FAT16"); 중단;
케이스 0xe :cprintf("Win95 FAT16 (LBA)"); 중단;
case 0xf :cprintf("Win95 확장"); break;
case 0x11 :cprintf("숨겨진 FAT-12");break;
case 0x12 :cprintf("Compaq 진단");break;
case 0x14 :cprintf("숨겨진 FAT-16 (<32)");break;
case 0x15 :cprintf("숨겨진 확장");break;
case 0x16 :cprintf("숨겨진 FAT-16");break;
케이스 0x17 :cprintf("NTFS"); 중단;
케이스 0x40 :cprintf("Venix 80286"); 브레이크;
case 0x51 :cprintf("노벨?"); break;
case 0x52 :cprintf("마이크로포트"); break;
case 0x63 :cprintf("GNU HURD"); break;
케이스 0x64 :
case 0x65 :cprintf("Novell Netware"); break;
케이스 0x75 :cprintf("PC/IX"); 중단;
case 0x80 :cprintf("이전 MINIX"); break;
case 0x81 :cprintf("Linux/MINIX"); break;
case 0x82 :cprintf("리눅스 스왑"); break;
case 0x83 :cprintf("Linux 네이티브"); break;
case 0x85 :cprintf("Linux 확장"); break;
case 0x93 :cprintf("아메바"); break;
case 0x94 :cprintf("아메바 BBT"); break;
케이스 0xa5 :cprintf("BSD/386"); 중단;
케이스 0xa6 :cprintf("OpenBSD"); 중단;
케이스 0xa7 :cprintf("다음 단계"); 중단;
케이스 0xb7 :cprintf("BSDI fs"); 중단;
케이스 0xb8 :cprintf("BSDI 스왑"); 중단;
케이스 0xc7 :cprintf("Syrinx"); 중단;
케이스 0xdb :cprintf("CP/M"); 중단;
case 0xe1 :cprintf("DOS 접근"); break;
case 0xe3 :cprintf("DOS R/O"); break;
case 0xf2 :cprintf("DOS 보조"); break;
케이스 0xff :cprintf("BBT"); 중단;
기본값 :cprintf("알 수 없음");
}
0을 반환합니다.
}
파티션을 숨기기 위한 프로그램 작성
숨겨진 파티션을 숨기기 해제하는 프로그램은 프로그램을 숨기는 프로그램과 정반대로 작동합니다. 이 프로그램에서는 숨겨진 파티션의 파일 시스템 표시자 바이트 값에서 16(0x10)을 뺍니다.
프로그램의 코딩은 다음과 같습니다.
/* 이전 프로그램에 의해 숨겨진 파티션을 다시 표시하는 프로그램 */
#include <bios.h>
#include <stdio.h>
int 메인(공백)
{
구조체 diskinfo_t dinfo;
int 결과, 숨기기;
안녕하세요.
정적 char dbuf[512];/* 데이터 버퍼 */
영어: clrscr();
dinfo.drive = 0x80; /* 드라이브 번호
첫 번째 하드 디스크 */
dinfo.head = 0; /* 디스크 헤드 번호 */
dinfo.track = 0; /* 트랙 번호 */
dinfo.sector = 1; /* 섹터 번호 */
dinfo.nsectors = 1; /* 섹터 수 */
dinfo.buffer = dbuf; /* 데이터 버퍼 */
결과 = _bios_disk(_DISK_READ, &dinfo);
if ((결과 & 0xff00) == 0)
{
printf("4개 분할의 분할 코드
항목은 0x%02x, 0x%02x, 0x%02x 및 0x%02x입니다.\n",
dbuf[450] 및 0xff, dbuf[466] 및 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
텍스트색상(15);
고톡시(5,5);
cprintf("MBR의 파티션 항목은 다음과 같습니다:");
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("분할 번호를 입력하세요.
숨기기 해제 또는 다른 키를 누르세요
출구... ");
숨기기=getche();
(숨기기) 전환
{
/* 파티션 테이블의 첫 번째 파티션 숨기기 해제 */
케이스 '1':
dbuf[450] = dbuf[450] -16;
결과 = _bios_disk(_DISK_WRITE, &dinfo);
부서지다;
/* 파티션 테이블의 두 번째 파티션 표시 */
케이스 '2':
dbuf[466] = dbuf[466]-16;
결과 = _bios_disk(_DISK_WRITE, &dinfo);
부서지다;
/* 파티션 테이블의 세 번째 파티션 표시 */
케이스 '3':
dbuf[482] = dbuf[482] -16;
결과 = _bios_disk(_DISK_WRITE, &dinfo);
부서지다;
/* 파티션 테이블의 네 번째 파티션 표시 */
케이스 '4':
dbuf[498] = dbuf[498]-16;
결과 = _bios_disk(_DISK_WRITE, &dinfo);
부서지다;
기본:
종료(0);
}
if ((결과 & 0xff00) == 0)
{
printf("\n\n4개 분할의 새로운 분할 코드
항목은 0x%02x, 0x%02x, 0x%02x 및 0x%02x입니다.\n",
dbuf[450] 및 0xff, dbuf[466] 및 0xff,
dbuf[482] & 0xff, dbuf[498] & 0xff);
getch();
}
또 다른
{
printf("바이트를 변경할 수 없습니다, 상태 = 0x%02x\n",
결과);
getch();
}
}
0을 반환합니다.
}
프로그램에 대한 의견
숨김 해제할 파티션 번호를 입력할 때는 조심하세요. 실수로 파티션 번호를 잘못 입력하면 해당 파티션의 파일 시스템 정보가 변경되고 파티션에 액세스할 수 없게 될 수 있습니다. 그러나 이전에 논의한 파티션 숨기기 프로그램은 해당 파티션의 파일 시스템 표시기 바이트를 치료하는 데 도움이 될 수 있습니다.
파티션 삭제 프로그램 작성
파티션을 삭제하는 프로그램은 문제 해결 목적으로 사용됩니다. 예를 들어, 디스크에 FAT32 파일 시스템 파티션이 있다고 가정해 보겠습니다. 이제 디스크에 LINUX 운영 체제를 동시에 설치하기로 했습니다.
어떤 경우든, MBR의 파티션 테이블에 수정이 이루어지는 단계에서 운영 체제 설치가 중단됩니다. 이런 경우 다른 운영 체제를 설치하려고 했던 파티션에 액세스할 수 없게 될 가능성이 많습니다.
이 경우 손실된 파티션의 디스크 공간은 액세스할 수 없기 때문에 쓸모없게 됩니다. 그러나 파티션 테이블에서 해당 파티션의 파티션 정보를 어떻게든 삭제하면 DOS의 FDISK 명령을 사용하여 이 공간을 다시 사용할 수 있습니다.
MBR의 파티션 테이블에서 파티션 항목을 삭제하는 프로그램은 다음과 같습니다.
/* MBR 파티션 테이블에서 두 번째 파티션 항목을 삭제하는 프로그램 */
# <bios.h>를 포함합니다.
/* 파티션 테이블에서 파티션 항목을 읽는 구조 */
구조 파티션
{
/* 활성 파티션 바이트 */
unsigned char 부팅 가능;
/* 시작 헤드 */
부호 없는 char 시작측;
/* 시작 섹터와 실린더 번호의 조합 */
부호 없는 int 시작_초_실시간;
/* 파일 시스템 표시기 바이트 */
unsigned char 부분 유형;
/* 끝 머리 */
부호 없는 char end_side;
/* 시작 섹터와 실린더 번호의 조합 */
부호 없는 int end_sec_cyl ;
/* 상대 섹터 번호 */
부호 없는 긴 part_beg ;
/* 섹터의 파티션 길이 */
서명이 없는 긴 plen ;
} ;
/* MBR 읽기-쓰기 구조 */
구조 부분
{
/* IPL(초기 프로그램 로더) */
부호 없는 char master_boot[446] ;
/* 파티션 테이블 */
구조체 파티션 pt[4] ;
/* 마법의 숫자 */
int 마지막 두 개 ;
} ;
구조체 부분 p;
void 메인()
{
부호 없는 int t1,t2;
영어: clrscr();
바이오스디스크(2, 0x80, 0, 0, 1, 1, &p);
display(); /* 정보를 표시합니다
파티션 테이블 */
getch();
p.pt[1].부팅 가능 = 0;
p.pt[1].시작_측면 = 0;
p.pt[1].시작_초_실린더 = 0;
p.pt[1].부품유형 = 0;
p.pt[1].끝_측면 = 0;
p.pt[1].초_끝_시간 = 0;
p.pt[1].part_beg = 0;
p.pt[1].플렌 = 0;
printf("\n\n\n 두 번째 파티션을 삭제한 후
MBR 파티션 테이블에서 항목 가져오기,");
printf("\n 파티션 테이블은 다음과 같이 변경됩니다.
다음과 같습니다: ");
/* 파티션에서 두 번째 파티션 정보를 삭제하려면
MBR 테이블에서 슬래시를 제거합니다.
biosdisk( ) 함수입니다. Carelessly, Partition을 사용하지 마십시오.
파티션 테이블의 두 번째 파티션 정보는
완전히 지워짐. */
////// 바이오스디스크(3, 0x80, 0, 0, 1, 1, &p) ;
display(); /* 파티션 정보를 표시합니다.
수정 후 테이블 */
getch();
}
프로그램에 대한 의견:
MBR 파티션 테이블에서 두 번째 파티션을 삭제하려면 biosdisk(3, 0x80, 0, 0, 1, 1, &p) 함수의 주석 처리를 제거합니다.
파티션을 삭제하려면 MBR의 파티션 테이블 항목에서 모든 매개변수를 0으로 설정합니다. 확장 파티션을 삭제하면 해당 확장 파티션의 모든 논리 파티션도 액세스할 수 없게 된다는 점을 항상 기억하세요.
display( ) 함수는 MBR의 파티션 테이블을 표시하는 데 사용됩니다. 함수의 코딩은 다음과 같습니다.
/* MBR의 파티션 테이블을 표시하는 함수 */
표시하다()
{
부호 없는 int s_sec, s_trk, e_sec, e_trk, i, t1, t2;
char 유형[20], 부팅[5];
printf("\n\nPart.Boot 시작 위치 종료 위치
"의 상대적인 숫자")
printf("\n타입 사이드 실린더 섹터 사이드 실린더
부문 부문 부문\n");
i = 0 ; i <= 3 ; i++ 에 대하여
{
(p.pt[i].부팅 가능 == 0x80)
strcpy(부팅, "예");
또 다른
strcpy(부팅, "아니요");
스위치(p.pt[i].parttype)
{
케이스 0x00 :
strcpy(type, "사용되지 않음"); break;
케이스 0x1 :
strcpy(유형, "FAT12"); 중단;
케이스 0x2 :
strcpy(유형, "Xenix"); break;
케이스 0x3 :
strcpy(유형, "Xenix:usr"); 중단;
케이스 0x4 :
strcpy(유형, "FAT16<32M" ); break;
케이스 0x5 :
strcpy(type, "DOS-Ext."); break;
케이스 0x6 :
strcpy(유형, "FAT16>32M"); 중단;
케이스 0x7 :
strcpy(유형, "NTFS"); 중단;
케이스 0x0b :
strcpy(유형, "FAT32"); 중단;
케이스 0x0c :
strcpy(유형, "FAT32-LBA"); 중단;
케이스 0x0d :
strcpy(유형, "VFAT16"); 중단;
케이스 0x0e :
strcpy(유형, "VFAT16-LBA"); 중단;
케이스 0x0f :
strcpy(유형, "FAT EXT"); break;
케이스 0x17 :
strcpy(유형, "HPFS"); 중단;
케이스 0x81 :
strcpy(type, "Old LINUX"); break;
케이스 0x82 :
strcpy(유형, "LinuxSwap"); break;
케이스 0x83 :
strcpy(유형, "LinuxNative"); 중단;
케이스 0x85 :
strcpy(type, "Linux Ext."); break;
기본 :
strcpy(유형, "알 수 없음"); break;
}
s_sec = ( p.pt[i].시작_초_실린더 & 0x3f );
t1 = ( p.pt[i].시작_초_실린더 & 0xff00 ) >> 8 ;
t2 = ( p.pt[i].시작_초_실린더 & 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].초당_시간_한계 & 0x00c0 ) << 2 ;
e_trk = t1 | t2 ;
printf("\n%6s %3s", type, 부팅) ;
printf ( "%4d %6d %8d", p.pt[i].시작_측면,
s_trk,s_sec) ;
printf ( "%7d %6u %8u", p.pt[i].end_side, e_trk,
초) ;
printf ( " %10lu %10lu", p.pt[i].part_beg,
p.pt[i].plen ) ;
}
0을 반환합니다.
}
“트랙 0 불량” 플로피 포맷
이 프로그램은 트랙 0에 불량 섹터가 있는 플로피를 포맷하는 데 사용되며 DOS 또는 Windows로 포맷하면 "트랙 0 불량"과 같은 오류 메시지가 표시됩니다. 그러나 일반 플로피를 포맷하는 데에도 사용할 수 있습니다.
이 프로그램의 코딩은 이 책에 포함된 디스크에 "TTFORMAT.C"라는 이름으로 제공되었습니다. 이 프로그램의 작동 논리는 2003년 2월호 PCQUEST 컴퓨터 잡지에 게재된 프로그램과 동일합니다.
이 프로그램에서는 이런 종류의 플로피를 포맷하여 재사용 가능하게 만들려고 합니다. 이 프로그램은 플로피 디스크에 불량 섹터가 있어도 다룰 수 있는 것처럼 들립니다. 하지만 디스크의 첫 번째 섹터가 불량이면 플로피를 포맷할 수 없습니다.
이 프로그램은 모든 DBR, FAT 및 루트 디렉토리 정보를 다시 씁니다. 디스크 표면에 불량 섹터가 있으면 FAT에서 불량으로 표시됩니다.
프로그램 코딩에서 BPB 구조는 DBR의 BIOS 매개변수 블록을 작성하는 데 사용됩니다. boot_sector 구조는 디스크의 DBR을 작성하는 데 사용됩니다. address_field 구조는 트랙당 실린더, 헤드 및 섹터 수와 섹터 크기와 상호 작용하는 데 사용됩니다.
다음 표에는 프로그램 코딩에 사용된 다양한 기능과 그에 대한 설명이 나와 있습니다.

플로피 디스크의 볼륨 일련 번호는 시스템 시계의 현재 날짜와 시간에 따라 DOS에 의해 계산됩니다.
일련 번호의 첫 번째 부분은 시간(초와 백분의 일)과 날짜(월과 일)의 합으로 계산됩니다. 일련 번호의 두 번째 부분은 시간(시와 분)과 날짜(년)의 합과 같습니다.
모든 계산은 16진법으로 수행됩니다. 예를 들어, 2003년 10월 23일 11:16:28:65에 DOS 환경에서 플로피를 포맷했다고 가정해 보겠습니다. 이제 디스크의 일련 번호를 계산해 보겠습니다.
시간은 (초 및 100분의 1초) 형식으로 표시됩니다.
= (28과 65)
= (1CH와 41H)
1C41로 쓰세요
마찬가지로 (월, 일) 형식의 날짜는 다음과 같습니다.
= (10과 23)
= (0AH와 17H)
0A17로 쓰세요
마찬가지로, (시간과 분) 형식의 시간은 다음과 같습니다.
= (11과 16)
= (0BH와 10H)
0B10으로 쓰세요
그리고 그 해는
= 2003
= 07D3
이제 이전에 주어진 설명에 따라 플로피 디스크의 일련 번호를 계산해 보겠습니다. 일련 번호의 첫 번째 부분은 (1C41 + 0A17) = 2658이고 일련 번호의 두 번째 부분은 (0B10 + 07D3) = 12E3이 될 것입니다.
디스크 편집 도구 작성
디스크 편집 프로그램의 인코딩은 이 책에 포함된 디스크에 "TTEDITOR.C"라는 파일 이름으로 들어있습니다. 이 프로그램을 사용하면 하드 드라이브나 플로피 디스크의 표면을 분석할 수 있습니다. 이 책을 쓰는 동안에도 대부분의 시간 동안 TTEDITOR를 사용하여 디스크 표면을 분석하거나 디스크를 수정했습니다.
이 편집 프로그램이 수행할 수 있는 몇 가지 중요한 작업은 다음과 같습니다.
- 하드 디스크와 플로피 디스크 표면에서 섹터별 정보를 읽습니다.
- 모든 섹터의 백업 사본을 파일에 씁니다.
- 파일에서 섹터 데이터를 복구합니다.
- 한 바이트를 변경합니다.
- 16진수를 10진수, 2진수로 변환하는 계산기입니다.
이 프로그램은 biosdisk( ) 및 _bios_disk( ) 함수를 사용하여 디스크에 액세스합니다. 8.4GB를 넘는 디스크를 분석하려면 INT 13H 확장을 사용하도록 프로그램을 수정하세요. 다음 표에서는 프로그램에서 사용되는 기능에 대한 설명을 제공합니다.
기능 |
설명 |
배경() |
첫 번째 화면의 배경과 프레임을 생성합니다 |
clsline( ) |
줄 번호로 지정된 화면에서 전체 줄을 지우는 데 사용됩니다. |
업데이트( ) |
화면의 모든 디스플레이 기능을 호출하는 함수 |
writetofile() |
사용자 파일에 섹터 데이터를 쓰는 기능입니다. |
( ) 부문에 쓰세요 |
지정된 파일에서 섹터를 복원하는 기능. |
메시지 디스패치() |
화면에 메시지를 표시하는 기능. |
변화( ) |
사용자가 지정한 모든 섹터의 한 바이트를 변경하는 기능입니다. |
액자( ) |
섹터 디스플레이 프레임 구조 그리기 기능 |
디스프맥스( ) |
디스크의 최대 CHS 번호를 표시합니다(최대 8.4GB 디스크에 유효) |
표시하다( ) |
화면에 섹터와 정보를 표시합니다. |
헥스토덱( ) |
16진수를 해당 10진수, 2진수로 변환하는 함수입니다. |