第16章
さらなるディスクユーティリティの開発
導入
この章では、MBR、DBR、FAT、およびルート ディレクトリ情報を使用して、データの管理、ストレージの最適化、または多くのディスクのトラブルシューティング問題の解決に役立つユーティリティを開発する方法について説明します。
通常、これらのプログラムは特定の問題に対する解決策です。この章では、いくつかのユーティリティとそのプログラミングについて説明しました。
セクションを非表示にする
通常、パーティション非表示ユーティリティは、ユーザーが使用しているのと同じコンピュータ システムで作業するユーザーによって使用されます。 1 台のコンピューターに多くのユーザーがいる場合、他のユーザーのデータが読み取られたり、盗まれたり、削除されたりする可能性が高くなります。
このような場合、ユーザーが同じコンピューターに重要なデータや機密情報を持っている場合、そのデータが保存されているパーティションを非表示にして、オペレーティング システムからそのパーティションにアクセスできないようにし、他のユーザーからもアクセスできないようにしたい場合があります。
ユーザーがシステムで作業したいときは、セクションを開くだけでそのセクションにアクセスできます。通常、このような出来事は、多くの学生がコンピューターを使用する専門機関で発生しますが、上級生は常に重要なデータやプロジェクト作業について心配しています。知識不足の場合と同様に、新入生は自分のデータを破損したり、削除したりする可能性があります。
セクションが非表示になるのはなぜですか?
次の表は、MBR パーティション テーブル内のパーティション形式を示しています。
補償する |
意味 |
サイズ |
説明 |
00H |
ブートタイプインジケータバイト |
1バイト |
バイトが00H の場合、パーティションは非アクティブであり、バイトが80Hの場合、パーティションはアクティブ (または起動可能) です。 |
01H |
開始セクション番号 |
1バイト |
16進数での開始パーティション番号 |
02H |
パーティションの先頭のセクターとシリンダ番号 |
2バイト |
最初のバイトの 6 ビットは開始セクター番号を構成し、残りの 2 ビット (最上位 2 ビット) と他のバイトの 8 ビット (10 ビットの数値の残りの最下位 8 ビット) の組み合わせは、パーティションの開始シリンダ番号を構成します。 |
04時間 |
ファイルシステムインジケータバイト |
1バイト |
16 進数のファイル システム インジケータ バイト(パーティション インジケータ バイトの完全なリストについては、この本の前半で説明した「ディスクと OS への論理的アプローチ」の章を参照してください) |
05H |
セクション見出し番号の終了 |
1バイト |
16進数の終了パーティション番号 |
06時間 |
セクション末尾のセクター番号とシリンダ番号 |
2バイト |
最初のバイトの 6 ビットが最終的なセクター番号を構成し、残りの 2 ビット (最上位 2 ビット) と他のバイトの 8 ビット (10 ビットの数値の残りの最下位 8 ビット) の組み合わせがパーティションの最終的なシリンダー番号を構成します。 |
08時間 |
パーティションの先頭の絶対セクター番号 |
4バイト |
MBRとパーティションの最初のセクター間のセクター数 |
0時間 |
パーティションの最後の絶対セクター番号 |
4バイト |
セクション内のセクター数 |
|
|
合計 = 16 バイト |
|
オフセット 04H の各パーティション エントリには、ファイル システム インジケータ バイトがあります。このインジケーター バイトは、このパーティションのファイル システム タイプを表します。このバイトの値が変わると、セクション識別も変わります。
たとえば、「DOS 12 ビット FAT」のパーティション インジケーター バイト値は 0x01 です。この値が 0x11 に変更されると、パーティション テーブル エントリ内のファイル システム識別子は「隠し DOS 12 ビット FAT」に変更されます (パーティション インジケータ バイトの完全なリストについては、この本の前半で説明した「ディスクと OS への論理的アプローチ」の章を参照してください)。
以下の表は、いくつかのパーティション タイプに対するファイル システム インジケーター バイトの例を示しています。
パーティションタイプインジケータバイト |
パーティションファイルシステムの説明 |
0x01 |
DOS 12 ビット FAT |
0x11 |
隠し DOS 12 ビット FAT |
0x04 |
DOS 16 ビット FAT (<=32 MB) |
0x14 |
隠し DOS 16 ビット FAT (<=32 MB) |
0x05 |
DOS拡張 |
0x15 |
隠しDOS拡張 |
0x06 |
DOS 16 ビット ラージ (>32 MB) |
0x16 |
隠し DOS 16 ビット ラージ (>32 MB) |
0x07 |
NTFS |
0x17 |
隠し NTFS |
0x0B |
ウィンドウズFAT32 |
0x1B |
隠し Windows FAT32 |
0x0C |
Windows FAT32 (LBA) |
0x1C |
隠し Windows FAT32 (LBA) |
0x0E |
Windows FAT16 (LBA) |
0x1E |
隠し Windows FAT16 (LBA) |
0x0F |
ウィンドウが拡張されました |
0x1F |
非表示のウィンドウを展開 |
ここで、任意のファイル システムに対応する隠しパーティションは、そのシステム インジケータ バイトに値 0x10 を追加することによって見つかることがわかります。
これはパーティションを隠すための厳格なルールではありませんが、ほとんどのファイル システムでも機能します。その理由は、パーティション インジケーター バイトの値を変更すると、パーティション テーブル エントリ内のファイル システムの ID が変更されるためです。また、新しいファイル システムが同じオペレーティング システムでサポートされることは非常にまれです。
パーティションを隠すプログラムを書く
次に示すプログラムは、MBR のパーティション テーブルからそのパーティションのパーティション エントリを使用してパーティションを非表示にするために使用されます。拡張ボリューム内の他の論理パーティションを非表示にする場合は、拡張 MBR にアクセスする必要があります。
プログラムのコーディングは次のとおりです。
/* MBR からそのパーティションのパーティション テーブル エントリを使用してパーティションを非表示にするプログラム*/
#include <bios.h>
#include <stdio.h>
int メイン(void)
{
構造体 diskinfo_t dinfo;
int 結果、非表示;
整数 i;
static 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);
((結果 & 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("非表示にしたいパーティション番号を入力してください。
または、他のキーを押して終了します... ");
tohide=getche();
スイッチ(非表示)
{
case '1': /* パーティションテーブルの最初のパーティションを非表示にする */
dbuf[450] = dbuf[450] +16;
結果 = _bios_disk(_DISK_WRITE, &dinfo);
壊す;
case '2': /* パーティションテーブル内の2番目のパーティションを非表示にする */
dbuf[466] = dbuf[466]+16;
結果 = _bios_disk(_DISK_WRITE, &dinfo);
壊す;
case '3': /* パーティションテーブル内の3番目のパーティションを非表示にする */
dbuf[482] = dbuf[482] +16;
結果 = _bios_disk(_DISK_WRITE, &dinfo);
壊す;
case '4': /* パーティションテーブルの4番目のパーティションを非表示にする */
dbuf[498] = dbuf[498]+16;
結果 = _bios_disk(_DISK_WRITE, &dinfo);
壊す;
デフォルト:
終了(0);
}
((結果 & 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 のパーティション テーブルにある 4 つのパーティション エントリすべてのファイル システム インジケータ バイトを読み取ります。関数 showtype() は、ファイル システム インジケータ バイトの対応する値に対応するファイル システムの名前を表示するために使用されます。
ユーザーは画面に表示されるメニューから非表示にするパーティションを選択し、そのパーティションのファイル システム インジケーター バイトの値に 16 (0x10) を追加して非表示にします。
関数 showtype() のコーディングは次のとおりです。
/*ファイルシステムインジケータバイトの値に対応するファイルシステムの名前を表示する関数*/
表示タイプ(i)
{
スイッチ(私)
{
case 0x00 :cprintf("空"); break;
case 0x01 :cprintf("DOS 12 ビット FAT"); break;
case 0x02 :cprintf("XENIX ルート"); break;
case 0x03 :cprintf("XENIX usr"); break;
case 0x04 :cprintf("DOS 16 ビット <32M"); break;
case 0x05 :cprintf("Extended"); break;
case 0x06 :cprintf("DOS 16 ビット >=32M"); break;
case 0x07 :cprintf("OS/2 HPFS"); break;
ケース 0x08 :cprintf("AIX"); break;
case 0x09 :cprintf("AIX ブート可能"); break;
case 0xa :cprintf("OS/2 ブート管理"); 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("隠しFAT-12");break;
case 0x12 :cprintf("Compaq Diagnostics");break;
case 0x14 :cprintf("隠しFAT-16 (<32)");break;
case 0x15 :cprintf("Hidden Extended");break;
case 0x16 :cprintf("隠しFAT-16");break;
ケース 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;
ケース 0x64 :
case 0x65 :cprintf("Novell Netware"); break;
ケース 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 ネイティブ"); 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 アクセス"); break;
case 0xe3 :cprintf("DOS R/O"); break;
case 0xf2 :cprintf("DOS セカンダリ"); break;
ケース 0xff :cprintf("BBT"); break;
デフォルト:cprintf("UNKOWN");
}
0を返します。
}
パーティションを再表示するプログラムの作成
隠しパーティションを表示するプログラムは、プログラムを非表示にするプログラムと正反対の動作をします。このプログラムでは、隠しパーティションのファイル システム インジケーター バイトの値から 16 (0x10) を減算します。
プログラムのコーディングは次のとおりです。
/*前のプログラムによって隠されたパーティションを表示するプログラム*/
#include <bios.h>
#include <stdio.h>
int メイン(void)
{
構造体 diskinfo_t dinfo;
int 結果、非表示;
整数 i;
static 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);
((結果 & 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("パーティション番号を入力してください。
非表示を解除するか、他のキーを押して
出口... ");
tohide=getche();
スイッチ(非表示)
{
/*パーティションテーブルの最初のパーティションを表示*/
ケース '1':
dbuf[450] = dbuf[450] -16;
結果 = _bios_disk(_DISK_WRITE, &dinfo);
壊す;
/* パーティションテーブルの 2 番目のパーティションを表示 */
ケース '2':
dbuf[466] = dbuf[466]-16;
結果 = _bios_disk(_DISK_WRITE, &dinfo);
壊す;
/* パーティションテーブルの 3 番目のパーティションを表示 */
ケース '3':
dbuf[482] = dbuf[482] -16;
結果 = _bios_disk(_DISK_WRITE, &dinfo);
壊す;
/* パーティションテーブルの 4 番目のパーティションを表示 */
ケース '4':
dbuf[498] = dbuf[498]-16;
結果 = _bios_disk(_DISK_WRITE, &dinfo);
壊す;
デフォルト:
終了(0);
}
((結果 & 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 のパーティション テーブルから 2 番目のパーティション エントリを削除するプログラム*/
# <bios.h> をインクルードする
/* パーティションテーブルからパーティションエントリを読み取るための構造体 */
構造体パーティション
{
/* アクティブパーティションバイト */
unsigned char ブート可能;
/* 開始ヘッド */
符号なしchar start_side ;
/* 開始セクターとシリンダ番号の組み合わせ */
符号なし整数 start_sec_cyl ;
/* ファイルシステムインジケーターバイト */
符号なしchar型パーツタイプ;
/* 終了ヘッド */
符号なしchar end_side;
/* 開始セクターとシリンダ番号の組み合わせ */
符号なし整数 end_sec_cyl ;
/* 相対セクター番号 */
符号なしロングpart_beg;
/* セクター単位のパーティション長 */
符号なしロング plen ;
} ;
/* 読み書き可能な MBR の構造 */
構造体部分
{
/* IPL (初期プログラムローダー) */
符号なしchar型master_boot[446];
/* パーティションテーブル */
構造体パーティションpt[4];
/* マジックナンバー */
最後の2つを整数にする;
} ;
構造体部分 p ;
void main()
{
符号なし整数 t1,t2;
clrscr();
バイオディスク ( 2, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* 情報を表示する
パーティションテーブル */
getch();
p.pt[1].ブート可能 = 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 2番目のパーティションを削除した後
MBR パーティション テーブルからのエントリ");
printf("\n パーティションテーブルは次のように変更されます
以下: ");
/* パーティションから2番目のパーティション情報を削除する
MBRのテーブルからスラッシュを削除します
biosdisk( )関数。不用意に使用しないでください。パーティション
パーティションテーブルの2番目のパーティションの情報は
完全に消去されます。*/
////// biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* パーティションの情報を表示する
変更後のテーブル */
getch();
}
番組へのコメント:
biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) 関数のコメントを解除して、MBR のパーティション テーブルから 2 番目のパーティションを削除します。
パーティションを削除するには、MBR のパーティション テーブル エントリでそのパーティションのすべてのパラメータを 0 に設定します。拡張パーティションを削除すると、その拡張パーティションのすべての論理パーティションにもアクセスできなくなることを常に覚えておいてください。
関数 display() は、MBR のパーティション テーブルを表示するために使用されます。関数のコーディングは次のとおりです。
/* MBRのパーティションテーブルを表示する関数 */
画面()
{
符号なし整数 s_sec、s_trk、e_sec、e_trk、i、t1、t2 ;
char type[20]、ブート[5];
printf("\n\nPart. ブート開始位置終了位置
相対数");
printf("\nタイプ サイドシリンダ セクターサイドシリンダ
セクター セクター セクター\n");
( i = 0 ; i <= 3 ; i++ ) の場合
{
p.pt[i].bootable == 0x80 の場合
strcpy ( ブート、「はい」 ) ;
それ以外
strcpy ( ブート、「いいえ」 ) ;
スイッチ ( p.pt[i].parttype )
{
0x00の場合:
strcpy ( type, "未使用" ); break ;
ケース0x1:
strcpy ( type, "FAT12" ); break ;
ケース0x2:
strcpy ( type, "Xenix" ); break ;
ケース0x3:
strcpy ( type, "Xenix:usr" ); break ;
ケース0x4:
strcpy ( type, "FAT16<32M" ); break ;
ケース0x5:
strcpy ( type, "DOS-Ext." ); break ;
ケース 0x6:
strcpy ( type, "FAT16>32M" ); break ;
ケース 0x7:
strcpy ( type, "NTFS" ); break ;
ケース 0x0b :
strcpy ( type, "FAT32" ); break ;
ケース 0x0c :
strcpy ( type, "FAT32-LBA" ); break ;
0x0dの場合:
strcpy ( type, "VFAT16" ); break ;
ケース 0x0e :
strcpy ( type, "VFAT16-LBA" ); break ;
0x0fの場合:
strcpy ( type, "FAT EXT" ); break ;
ケース0x17:
strcpy ( type, "HPFS" ); break ;
ケース 0x81 :
strcpy ( type, "Old LINUX" ); break ;
ケース 0x82 :
strcpy ( type, "LinuxSwap" ); break ;
ケース 0x83 :
strcpy ( type, "LinuxNative " ); break ;
ケース 0x85 :
strcpy ( type, "Linux Ext." ); break ;
デフォルト :
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 ;
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,
秒) ;
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 によって計算されます。
シリアル番号の最初の部分は、時間 (秒と 100 分の 1 秒) と日付 (月と日) の合計で計算されます。シリアル番号の 2 番目の部分は、時間 (時間と分) と日付 (年) の合計に等しくなります。
すべての計算は 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 となり、シリアル番号の 2 番目の部分は (0B10 + 07D3) = 12E3 となります。
ディスク編集ツールの作成
ディスク編集プログラムのエンコードは、この本に付属のディスクに「TTEDITOR.C」というファイル名で記載されています。このプログラムを使用すると、ハード ドライブまたはフロッピー ディスクの表面を分析できます。この本を書いている間も、ほとんどの時間、TTEDITOR を使用してディスク表面を分析したり、ディスクの変更を行ったりしていました。
この編集プログラムが実行できる重要なタスクの一部を次に示します。
- ハードディスクやフロッピーディスクの表面からセクターごとに情報を読み取ります。
- 任意のセクターのバックアップ コピーをファイルに書き込みます。
- ファイルからセクターデータを回復します。
- 1バイトを変更します。
- 16 進数を 10 進数と 2 進数に変換するための計算機。
プログラムは、biosdisk( ) および _bios_disk( ) 関数を使用してディスクにアクセスします。 8.4GB を超えるディスクを分析する場合は、INT 13H 拡張機能を使用するようにプログラムを変更します。プログラムで使用される関数の説明を次の表に示します。
関数 |
説明 |
背景() |
最初の画面の背景とフレームを作成します |
clsline() 関数 |
行番号で指定された画面から行全体をクリアするために使用されます。 |
アップデート( ) |
画面上のすべての表示機能を呼び出す関数 |
ファイルに書き込み() |
セクターデータをユーザーファイルに書き込む関数。 |
セクターに書き込む ( ) |
指定されたファイルからセクターを復元する機能。 |
メッセージ表示() |
画面上にメッセージを表示する機能。 |
変化( ) |
ユーザーが指定した任意のセクターの 1 バイトを変更する関数。 |
フレーム( ) |
セクター表示フレーム構造描画機能 |
ディスマックス( ) |
ディスクの最大 CHS 番号を表示します (最大 8.4 GB のディスクに有効) |
画面( ) |
セクターと情報を画面に表示します。 |
16進数( ) |
16 進数を対応する 10 進数と 2 進数に変換する関数。 |