章 – 11
バックアップの作成
なぜバックアップなのか?
“予防は常に治療よりも優れています”. バックアップの作成もデータ災害防止の重要な部分であり、ディスクのクラッシュやその他の種類のデータ損失を克服するのに役立つ可能性があります。この章では、以前に作成したバックアップを使用するだけで、深刻なディスククラッシュが発生した後でもデータを回復する方法について説明します。
以前に保存されたバックアップによって実行されるリカバリは、ほとんどの場合最大100%ですが、いくつかのタイプのディスククラッシュにより、特定の場合にリカバリ結果にばらつきが生じる可能性があります。
バックアップを使用してデータを回復することは非常に簡単で、高速で信頼性が高く、最良の結果をもたらすことができますが、バックアップなしのデータ回復は困難で複雑であり、プロセスに時間がかかる可能性があります。いくつかの場合、100パーセントのデータ。
いつ、何をバックアップするか
ディスクには、1回または異なる時間間隔でバックアップする必要のあるいくつかの異なる領域があります。次の表は、完全なバックアップ手段の概念を示しており、いつ、何をバックアップするかを見つけるのに役立ちます。
What to Backup |
When to be Backed up |
Backup of MBR |
Once after FDISK. The MBR is Created By the FDISK command of DOS. You can take backup of MBR After FDISK, however even after the FORMAT of partitions created by FDISK, The MBR remains Unchanged. |
Backup of DBR |
Back up the DBRs for each logical drive once, after FORMAT. |
Backup of FAT and Directory entries. |
FAT and Directory Entries are changed every time when you create of delete files or directories. Therefore it is recommended that you should take backup daily. |
Backup of User Data |
Should be taken regularly. This type of backup causes the disk imaging to take place. However it is time taking yet most of the companies which have very sensitive data in their disks like to spend their time on disk imaging because by doing this they can backup all of the information described above. |
これに加えて、システムの緊急ブートフロッピーを作成する必要があります。ハードディスク内のデータに何らかの災害が発生した場合は、このフロッピーを使用してシステムを起動し、ディスクのエラーを分析できます。
MBR(マスターブートレコード)のバックアップとその使用
マスターブートレコード(MBR)またはマスターパーティションテーブル(MPT)と呼ばれることもあるこのプログラムには、ハードディスクドライブからアクティブな(または起動可能な)パーティションをロードして起動するための小さなプログラムが含まれています。マスターブートレコードには、4つのプライマリパーティションすべてに関する情報が含まれています。
MBRの詳細については、次の章を参照してください。, “ディスクとOSへの論理的アプローチ”, この本の前半で説明しました。
MBRは絶対セクター0にあります。または、シリンダー0、ヘッド0、およびセクター1にあると言えます。 DOSのFDISK.EXEコマンドを実行することにより、ハードディスクドライブ上に作成されます。
MBRをバックアップする理由:
MBRを使用すると、アクティブパーティションのブートセクターは、システムの起動時に制御を受け取ることができます。
電源投入時自己診断(POST)の後、BIOSはMBR(マスターブートレコード)をハードディスクからメモリにロードして実行します。最初にMBRはハードディスクのアクティブパーティションをチェックし、次にDOSブートレコード(DBR)をメモリにロードし、制御をオペレーティングシステムのブートコードに切り替えます。次に、オペレーティングシステムのブートレコードコードが残りのオペレーティングシステムをにロードします。メモリー。
そのため、ディスクのMBRが破損している場合、ハードディスクはほとんど機能しておらず、システムはオペレーティングシステムを完全に起動または実行できません。このような状態では、ハードディスクに保存されているすべてのデータにアクセスできなくなります。通常、エラーメッセージは次のように表示されます。
“無効なパーティションテーブル” “オペレーティングシステムの読み込み中にエラーが発生しました” “欠落しているオペレーティング・システム"
MBRのバックアップで何を回復できますか?
MBRのバックアップは、上記のエラーメッセージを取り除くのに役立つ場合があります。バックアップを使用すると、次の問題を修正できます。
- IPL(初期プログラムローダー)の破損が原因でオペレーティングシステムの読み込みエラーが発生しました
- 失われたプライマリパーティション
- 破損したパーティション情報
- 無効なマジックナンバー
MBRのバックアップを作成するためのプログラムの作成:
/ * MBRのバックアップを作成するプログラム* /
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo; /* Structure to Hold the
information of disk Parameters */
int result;
int count=0;
char filename[80]; /* Stores the File name given by
User */
static char dbuf[512]; /* Data Buffer of 512 Bytes */
FILE *fp;
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 */
printf("\n Enter The Filename and path to store the
Backup of MBR \n ");
gets(filename);
//ファイルを開いてMBRバックアップを保存する\\
if((fp=fopen(filename,"wb"))==NULL)
{
printf("Could not Create File, Press any key to
Exit...");
getch();
exit(0);
}
printf("Attempting to read from Hard disk drive :\n");
////指定されたディスクセクターを読み取る\\\\
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) == 0)
{
printf("Disk read from hard disk drive :
successful.\n");
/// 512バイトのMBRをファイルに書き込みます\\\\
while(count<512)
{
fprintf(fp,"%c",dbuf[count] & 0xff );
count++;
}
fclose(fp);
}
else
printf("Cannot read Hard Disk drive, status = 0x%02x\n", result);
return 0;
}
プログラムコーディングに関するコメント:
前述のプログラムコーディングでは、基本的に次のタスクを段階的に実行します。
- dinfoは、_bios_disk関数によって実行される操作に必要なパラメーターの情報を含むdiskinfo_t構造体を指します。
- ディスクの最初のセクターを読み取りたいので、セクターの場所は次のようになります。
Parameter |
What it means |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive. |
dinfo.head = 0 |
It points to head number 0 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
>Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
- ユーザーが指定したファイル名とパスのファイルストリームを開き、正確に512バイトのMBRのバックアップを保存します。ファイル名とパスは、文字配列filenameに格納されます。
- _bios_disk(_DISK_READ, &dinfo) dinfoで指定されたハードディスクの最初のセクター(80H)を読み取ります。
- 返されたステータスは結果に保存され、正常に動作するためのメッセージを表示したり、エラーが発生した場合に画面にエラーメッセージを表示したりするために使用されます。
バックアップからMBRを復元するプログラム:
MBRが何らかの形で破損している場合、次に示すプログラムはMBRを元に戻すのに役立ちます。
このプログラムの違法な使用または知識不足での使用は、ハードディスク内のデータ情報を破壊し、データ全体にアクセスできなくなる可能性があることを常に念頭に置いておく必要があります。あなたは自分が何をしようとしているのかを確信しているべきです。そうしないと、問題がさらに複雑になる可能性があります。
バックアップからMBRを復元するプログラム:
プログラムのコーディングは次のとおりです。
/ *バックアップファイルからMBRのバックアップを復元するプログラム* /
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo;
int result;
int count=0;
char filename[80]; /* Stores the File name given
by User */
static char dbuf[512]; /* Data Buffer of 512 Bytes
*/
FILE *fp;
/ * MBRバックアップファイルパスのユーザー入力を取得します* /
printf("\n Enter The Filename and path of Backup File of
MBR \n ");
gets(filename);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("Could not open Backup File, Press any key
to Exit...");
getch();
exit(1);
}
/ * MBRデータは正確に512バイトである必要があります* /
while(count<512)
{
fscanf(fp,"%c",&dbuf[count]);
count++;
}
fclose(fp);
printf("Attempting to Write to Hard disk drive :\n");
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_WRITE, &dinfo);
if ((result & 0xff00) == 0)
{
printf("Restoring the Backup of MBR to The Disk
Sector: successful.\n");
}
else
printf("Cannot Write on Hard Disk drive, status =
0x%02x\n", result);
return 0;
}
プログラムコーディングに関するコメント:
上記のプログラムコーディングでは、基本的に次のタスクを段階的に実行します。
- dinfoは、_bios_disk関数によって実行される操作に必要なパラメーターの情報を含むdiskinfo_t構造体を指します。
- ディスクの最初のセクターに書き込みたいので、セクターの場所は次のようになります。
Parameter |
What it means |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive. |
dinfo.head = 0 |
It points to head number 0 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
- ユーザーが指定したMBRのバックアップのファイル名とパスは、文字配列ファイル名に保存されます。 MBR情報は正確に512バイトである必要があることに注意してください。
- _bios_disk(_DISK_WRITE, &dinfo) dinfoで指定されたハードディスクの最初のセクター(80H)にデータを書き込みます。
- 返されたステータスは結果に保存され、正常に動作するためのメッセージを表示したり、エラーが発生した場合に画面にエラーメッセージを表示したりするために使用されます。
DBR(DOSブートレコード)のバックアップとその使用
パーティションテーブルに続いて、DOSブートレコード(DBR)またはDOSブートセクターと呼ばれることもある、ハードドライブで2番目に重要な情報です。
DBRの詳細については、次の章を参照してください。 “ディスクとOSへの論理的アプローチ”, この本の前半で説明しました。
各DOSパーティションの最初の論理セクターには、DOSブートレコード(DBR)またはDOSブートセクターが含まれます。 DBRの仕事は、オペレーティングシステムをハードディスクドライブからコンピュータのメインメモリにロードし、システムに提供することです。’s ロードされたプログラムへの制御。
ハードディスクの最初のパーティションのDOSブートレコード(DBR)は、通常、絶対セクター63(ディスクドライブの64番目のセクター)またはCHS形式で見つかります。 C–H–S = 0–1–1 ほとんどのドライブで。
ただし、この場所は、ドライブのSPT(トラックあたりのセクター数)によって異なる場合があります。たとえば、SPTが31しかない古い245MBドライブでは、ブートレコードは32番目のセクター(絶対セクター31)にありました。
DBRは、FDISKコマンドを使用してパーティション分割が行われた後、DOSのFORMATコマンドによって作成されます。 DBRが存在するセクターは、DOSの特定のパーティションの論理セクター1になります。 DOSで使用されるセクター番号は、DBRが配置されている物理セクターから始まります。
DBRには、マスターブートレコード(MBR)実行可能プログラムによって実行される小さなプログラムが含まれています。すべてのDOSパーティションには、マシンを起動する、つまりオペレーティングシステムをロードするためのプログラムコードが含まれていますが、そのパーティションのみが、パーティションテーブルエントリでアクティブパーティションとして指定されているマスターブートレコードによって制御されます。
DBRをバックアップする理由:
DBRには、ディスクジオメトリに関するいくつかの重要な情報が含まれています。この情報は、次のように、すべてのパーティションの最初のセクターにあります。
- ジャンプコード+ NOP
- OEMの名前とバージョン
- セクターあたりのバイト数
- クラスターあたりのセクター
- 予約セクター
- FATのコピー数
- 最大ルートディレクトリエントリ(ただし、FAT32では使用できません)
- 32MB未満のパーティション内のセクター数(したがって、FAT32では使用できません)
- メディア記述子(ハードディスクの場合はF8H)
- FATごとのセクター(古いFATシステムでは、FAT32では使用できません)
- トラックあたりのセクター
- 頭の数
- パーティション内の非表示セクターの数
- パーティション内のセクター数
- FATあたりのセクター数
- FAT情報記述子フラグ
- FAT32ドライブのバージョン
- ルートディレクトリの先頭のクラスタ番号
- ファイルシステム情報セクターのセクター番号
- バックアップブートセクターのセクター番号
- 予約済み
- パーティションの論理ドライブ番号
- 拡張署名(29H)
- パーティションのシリアル番号
- パーティションのボリューム名
- FAT名
- 実行可能コード
- 実行可能マーカーまたはマジックナンバー(AAH 55H)
通常、次のエラーメッセージが画面に表示されます。
“ディスクの起動に失敗しました”
“非システムディスクまたはディスクエラー”
“無効なシステムディスクまたはディスクI / Oエラー”
“ディスクを交換してから、任意のキーを押します…”
DBRのバックアップで何を回復できますか?
DBRのバックアップは、上記のエラーメッセージを取り除くのに役立つ場合があります。これらのエラーメッセージ画面上で、ユーザーが上記のプログラムを含む起動可能ディスクをフロッピードライブに挿入し、キーを押すのを待ちます。
起動可能なフロッピーまたはCDからシステムを起動する場合は、ドライブにアクセスできる必要があります。ハードディスクは起動可能ではありませんが、一般的にはディスクドライブのデータへのアクセスに影響を与えることはありません。ブータブルディスクを使用してシステムを起動した後、データにアクセスできます。
DBRのバックアップを復元することにより、前述のように、生成された問題を克服できます。
DBRのバックアップを作成および復元するためのプログラム:
DBRのバックアップを作成するためのプログラム’s それらの復元は、MBRバックアップおよび復元のプログラムとほぼ同じです。
たとえば、ディスクの最初の論理ドライブのDBRをバックアップして復元するプログラムを作成する場合、dinfo構造で指定されたパラメータは次のように変更されます。
Parameter |
What it means |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive> |
dinfo.head = 1 |
It points to head number 1 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
ここでは、読み取り/書き込みを行うセクターの場所のみが変更されていることがわかります。ここでは、最初の論理ドライブのDBRがここに格納されているため、C-H-Sは0-1-1として指定されます。
完全なディスクイメージング
このタイプのバックアップは、今日ますます人気が高まっており、システムに非常に機密性の高いデータを持っているそのような組織によって最も好まれています。彼らの人々は、データ損失の1パーセントでさえチャンスをつかむことができません。
このような組織は、バックアップをディスクイメージ全体として定期的に取得します。少し時間がかかりますが、何も見逃さないことは間違いありません。その人気が高まっているため、プログラマーは、ディスクイメージングソフトウェアをますます高速化して、イメージングプロセスにかかる時間を最小限に抑えるために最善を尽くしています。
ディスクイメージングは良いアイデアです。数十分を費やすだけで、ポケットにすべてのものをバックアップしているという安心感を得ることができるからです。 MBR、BDR、FAT、ルートディレクトリなどのすべての要素がそのまま宛先ディスクにコピーされます。
ディスクイメージングに必要なのは、貴重なデータが保存されているソースハードディスクと同一の(またはほぼ同一の)宛先ハードディスクです。宛先ディスクはソースディスクより小さくしてはならないことに常に留意してください。
完全なイメージを取得した後、ディスクイメージを取得した宛先ディスクを使用してシステムを起動すると、通常、すべてのデータがそのまま取得されます。
完全なディスクイメージングのためのプログラムの作成
次に、ディスクイメージングのプログラムを示します。プログラムはINT13H拡張機能を使用するため、大きなディスクもサポートできます。
プログラムは、最初の物理ハードディスクドライブ(0x80)のイメージを2番目の物理ハードディスクドライブ(0x81)に作成します。したがって、バックアップイメージを作成する前に、宛先ディスク(0x81)のすべてのデータが作成されることに注意してください。セクターごとのソースディスク(0x80)のデータで上書きされます。
プログラムのコーディングは次に与えられました:
/ *最初のハードディスク(0x80)から2番目のハードディスク(0x81)のイメージを作成するプログラム* /
#include<stdio.h>
#include<dos.h>
#include<conio.h>
/ * INT 13H拡張機能、関数番号0x48を使用するgetdrivegeometry関数で使用される構造。 * /
struct geometry
{
unsigned int size ; /* (call) size of Buffer */
unsigned int flags ; /* Information Flags */
unsigned long cyl ; /* Number of Physical
Cylinders on Drive */
unsigned long heads ;/* Number of Physical
Heads on Drive */
unsigned long spt ; /* Number of Physical
Sectors Per Track */
unsigned long sectors[2] ; /* Total Number of
Sectors on Drive */
unsigned int bps ; /* Bytes Per Sector */
} ;
/ *ディスクアドレスパケット形式の構造、関数、readabsolutesectors、およびwriteabsolutesectorsで使用されます* /
struct diskaddrpacket
{
char packetsize ; /* Size of Packet, generally 10H */
char reserved ; /* Reserved (0) */
int blockcount ; /* Number of Blocks to Transfer */
char far *bufferaddress ; /* address to Transfer
Buffer */
unsigned long blocknumber[2] ; /* Starting Absolute
Block Number */
} ;
/////ドライブパラメータを取得する関数\\\\\
unsigned long getdrivegeometry (int drive)
{
union REGS i, o ;
struct SREGS s ;
struct geometry g = { 26, 0, 0, 0, 0, 0, 0, 0 } ;
i.h.ah = 0x48 ; /* Function Number 0x48 of INT 13H
Extensions See the Comments
Below */
i.h.dl = drive; /* Drive Number */
i.x.si = FP_OFF ( (void far*)&g ) ;
s.ds = FP_SEG ( (void far*)&g ) ;
/ *セグメントレジスタ値を使用してINT13H拡張の指定された機能番号を呼び出します* /
int86x ( 0x13, &i, &o, &s ) ;
printf("\n Head = %lu, Sectors Per Track = %lu, Cylinder =
%lu\n", g.heads, g.spt, g.cyl);
/ * get drive Geometry関数が失敗した場合、エラーメッセージを表示して終了します* /
if(g.spt==0)
{
printf("\n Get Drive Geometry Function Fails....");
printf("\n Extensions Not Supported, Press any Key to
Exit...");
getch();
exit(1);
}
return *g.sectors; /* Return The Number of Sectors
on Drive */
}
//////メインの開始\\\\\\
void main()
{
unsigned long loop=0, Sectors_in_HDD1=0, Sectors_in_HDD2=0;
unsigned char buffer[61440]; /* Data buffer of 61440
Bytes to Read/Write 120 Sectors of 512 Bytes at a time to save time. */
char choice;
clrscr();
/ *合計がない場合。接続されているハードディスクの数は、2つ未満のエラーメッセージの表示と終了です。 * /
if(((char)peekb(0x0040, 0x0075))<2)
{
printf("\n\n You Must Have At least Two Hard Disks
Attached to your Computer To Run This");
printf("\n Program. Press any Key to Exit... ");
getch();
exit(1);
}
///最初のハードディスク(0x80)のパラメータを取得\\\
Sectors_in_HDD1 = getdrivegeometry (0x80);
printf(" Total Sectors in First Hard Disk = %lu\n\n",
Sectors_in_HDD1);
/// 2番目のHsrdディスク(0x81)のパラメーターを取得\\\
Sectors_in_HDD2 = getdrivegeometry (0x81);
printf(" Total Sectors in Second Hard Disk = %lu\n\n",
Sectors_in_HDD2);
///最初に確認してから、\\\に進みます
printf("\n All The Data in Second Hard Disk will be
lost !!!");
printf("\n Press \'Y\' to Continue, Else any key to
Exit... ");
choice = getche();
switch(choice)
{
case 'y':
case 'Y':
break;
default:
exit(0);
}
/ *宛先はソースより小さくすることはできません* /
if(Sectors_in_HDD2<Sectors_in_HDD1)
{
printf("\n\n Destination Disk should not be Smaller
than Source Disk");
printf("\n Press any Key to Exit...");
getch();
exit(0);
}
/ *すべて問題がない場合は、ソースディスクのすべてのセクターをデスティネーションハードディスクにコピーします* /
gotoxy(10,15);printf("Copying Absolute Sector: ");
for(loop=0;loop< =Sectors_in_HDD1;loop=loop+120)
{
readabsolutesectors ( 0x80, loop, 120, buffer );
writeabsolutesectors ( 0x81, loop, 120, buffer );
gotoxy(36,15); printf("%ld",loop);
if(kbhit())
{
exit(0);
}
}
////完了のメッセージを表示する\\\
printf("\n\n Disk Imaging is Now Completed, Press any Key
To Exit...");
getch();
}
//// End of main
コーディングに関するコメント:
前述のプログラムのコーディングでは、ディスクイメージングの場合、次のタスクを実行します。
- 構造、ジオメトリは、INT 13H拡張、関数番号0x48を使用するgetdrivegeometry関数によって使用されます。 INT 13H拡張機能の詳細については、この章を参照してください。 “大型ハードディスクの取り扱い”, この本の前半で説明しました。
ディスクのいくつかのパラメータを表すデータ型には、次の意味があります。
Data Type |
Size in Bytes |
Description |
unsigned int size |
2 Bytes |
Size of Buffer |
unsigned int flags |
2 Bytes |
Information Flags |
unsigned long cyl |
4 Bytes |
Number of Physical Cylinders on Drive |
unsigned long heads |
4 Bytes |
Number of Physical Heads on Drive |
unsigned long spt |
4 Bytes |
Number of Physical Sectors Per Track |
unsigned long sectors[2] |
8 Bytes |
Total Number of Sectors on Drive |
unsigned int bps |
2 Bytes |
Bytes Per Sector |
- 構造体diskaddrpacketは、関数readabsolutesectorsおよびwriteabsolutesectorsによって使用されます。ディスクアドレスパケットのフォーマットを次の表に示します。
Data Type |
Size in Bytes |
Description |
char packetsize |
1 Byte |
Size of Packet, generally 10H |
char reserved |
1 Byte |
Reserved (0) |
int blockcount |
2 Bytes |
Number of Blocks to Transfer |
char far *bufferaddress |
4 Bytes |
address to Transfer Buffer |
unsigned long blocknumber[2] |
4 Bytes |
Starting Absolute Block Number |
- getdrivegeometry関数は、指定されたドライブのパラメータを取得するために使用されます。関数getdrivegeometryは、INT13H拡張機能の関数番号0x48を使用します。
パラメータの意味は、次の表で説明されています。
Parameter |
What it means |
i.h.ah = 0x48 |
Function Number 0x48 of INT 13H Extensions |
i.h.dl = drive |
Drive Number |
i.x.si = FP_OFF ( (void far*)&g ) |
ds:si address to buffer for drive parameters as discussed earlier |
s.ds = FP_SEG ( (void far*)&g ) |
ds:si address to buffer for drive parameters as discussed earlier |
The int86x(0x13, &i, &o, &s) 関数は、セグメントレジスタ値を使用して割り込み13Hを呼び出します。 getdrivegeometry関数は、ドライブの総数を返します。
- main()関数で、(char)peekb(0x0040、0x0075); (関数peekbはDOS.Hで定義されています)は、システムに接続されているハードディスクの数を返します。
システムに接続されているハードディスクの数は、メモリ位置0040H:0075H(セグメント0040H:オフセット0075H)に格納されているバイトで表されます。システムに接続されているハードディスクの数が少ない場合、2つのプログラムがエラーメッセージを表示して終了します。
Sectors_in_HDD1 = getdrivegeometry(0x80);最初のハードディスク(0x80)のパラメーターを取得し、最初のハードディスクのセクターの総数を返します。
同様に、Sectors_in_HDD2 = getdrivegeometry(0x81); 2番目のハードディスク(0x81)のパラメーターを取得し、2番目のハードディスクのセクターの総数を返します。
ユーザーがイメージングを続行することを確認した後、最初に、ソースハードディスクのサイズがデスティネーションハードディスクのサイズを超えてはならないという条件を確認します。宛先が小さい場合は、エラーメッセージを表示して終了します。
すべてが順調に進んでいる場合は、ソースディスクのセクターを宛先ディスクにコピーします。ここでは、イメージングプロセスを高速化するために、一度に61440バイト(各512バイトで120セクター)の読み取りと書き込みを行っています。
64Kの制限を超えても、一度に多くのセクターを使用したい場合は、を使用してそれを行うことができます “巨大なポインター” 大容量メモリモデル。仕様例は次のとおりです。
char巨大配列[100000L];
- 関数、readabsolutesectors(0x80、ループ、120、バッファー);符号なし長整数ループで指定されたセクター番号から始めて、最初のハードディスク(0x80)の120セクターを読み取り、データをデータバッファーに格納します。
- 関数、writeabsolutesectors(0x81、ループ、120、バッファー);符号なし長整数ループで指定されたセクター番号から始めて、データバッファーのデータを2番目のハードディスク(0x81)の120セクターに書き込みます。
次に、関数 readabsolutesectors()およびwriteabsolutesectors()のコーディングを示します。
////絶対セクターを読み取る関数\\\\
int readabsolutesectors ( int drive,
unsigned long sectornumber,
int numofsectors,
void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* packet size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ; /* Number of sectors
to read */
/ *データバッファ用* /
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ; /* Sector number
to read */
pp.blocknumber[1] = 0 ; /* Block number */
i.h.ah = 0x42 ; /* Function Number*/
i.h.dl = drive ; /* Physical Drive Number */
i.x.si = FP_OFF ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
/ *セグメントレジスタ値を使用してINT13Hの指定された関数を呼び出します */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /*failure */
else
return 1 ; /* success */
}
////絶対セクターを書き込む関数\\\\
int writeabsolutesectors ( int drive,
unsigned long sectornumber,
int numofsectors,
void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* Packet Size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ; /* Number of Sectors
to be written */
/ *データバッファ用 */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ;/* Sector number
to be written */
pp.blocknumber[1] = 0 ; /* Block number = 0 */
i.h.ah = 0x43 ; /* Function Number */
i.h.al = 0x00 ; /* Write Flags, see
comments */
i.h.dl = drive ; /* Physical Drive number*/
/* ds:si for buffer Parameters */
i.x.si = FP_OFF ( (void far*)&pp ) ;
/* ds:si for buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ;
/ *セグメントレジスタ値を使用してINT13Hの指定された関数を呼び出します */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /* failure */
else
return 1 ; /* success */
}
コーディングに関するコメント:
両方の関数で使用されるパラメーターには、次の意味があります。
Parameter |
Size in Bytes |
Description |
pp.packetsize = 16 ; |
1 Byte |
Size of packet = 10H |
pp.reserved = 0 ; |
1 Byte |
Reserved = 0 |
pp.blockcount = numofsectors ; |
2 Bytes |
Number of sectors to read |
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer)); |
----- |
for Data buffer or Transfer Buffer |
pp.blocknumber[0] = sectornumber ; |
4 Bytes |
Sector number to read/write (generally, we need only this). Only alone This can support up to 2.1 Terabytes. |
pp.blocknumber[1] = 0 ; |
4 Bytes |
Block number. Use this, If accessing the disk of greater then 2.1 Terabytes in size. |
i.h.ah = 0x42 ; or i.h.ah = 0x43 ; |
2 Bytes |
Function Number of INT 13H Extensions |
i.h.al = 0x00 ; |
1 Byte |
Write Flags used in write function only,00H, 01H are used for Write Without Verify and 02H is used for write with verify |
i.h.dl = drive ; |
2 Bytes |
Physical Drive Number |
i.x.si = FP_OFF ( (void far*)&pp ) ; |
------ |
ds:si for buffer Parameters |
s.ds = FP_SEG ( (void far*)&pp ) ; |
------ |
ds:si for buffer Parameters |
int86x ( 0x13, &i, &o, &s ) ; |
------ |
Invoke the specified Function of INT 13H with segment register values |