リアル モード プログラミングに詳しい友人は、BIOS の INT 13 割り込みを使用してディスクの絶対読み取りおよび書き込みを実行できることを知っていますが、NT 環境では、INT 13 割り込みを使用してハードディスクを直接読み取りおよび書き込みすることはできません。ここでは、CreateFile を使用してパス名を「//./X:」に設定し、論理ディスクを開いて読み取りと書き込みを実行します。X はドライブ文字です。
CreateFile 関数のプロトタイプは次のとおりです。
HANDLE CreateFile(LPCTSTR lpFileName, DWord dwDesiredaccess, DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
lpFileName: 開くファイルの名前
dwDesiredAccess: GENERIC_READ の場合はデバイスへの読み取りアクセスが許可されることを意味し、GENERIC_WRITE の場合はデバイスへの書き込みアクセスが許可されることを意味します (組み合わせて使用できます)。 1つのデバイスに関する情報を取得できます。
dwShareMode: 0 は共有なしを意味し、FILE_SHARE_READ および/または FILE_SHARE_WRITE はファイルへの共有アクセスを許可することを意味します。
lpSecurityAttributes: ファイルのセキュリティ属性を定義する SECURITY_ATTRIBUTES 構造体へのポインタ
dwCreationDistribution: 作成メソッド
dwFlagsAndAttributes: その他の属性
hTemplateFile: 0 以外の場合、ファイル ハンドルを指定します。新しいファイルは、このファイルから拡張属性をコピーします。
次の例は、Windows XP でコンパイルされ、渡されます。実装される機能は、C ドライブのブート セクターを読み取り、読み取られたデータを表示することです。
プログラムReadDisk;
用途
システムユーティリティ、
ウィンドウズ。
変数
Buf: バイトの配列 [0..511] // データ バッファー
ShowText、TmpStr: 文字列;
ファイルハンドル: THandle;
ReadCount、i: 基数。
始める
//ディスクをオープンする
FileHandle := CreateFile('//./C:'、GENERIC_READ、FILE_SHARE_READ または FILE_SHARE_WRITE、
nil、OPEN_EXISTING、0、0);
ファイルハンドル = INVALID_HANDLE_VALUE の場合、
始める
MessageBox(GetDesktopWindow, 'ディスクを開けませんでした', 'エラー', MB_OK);
終了プロセス(0);
終わり;
//ブートセクタデータを読み取る
if ReadFile(FileHandle, Buf, 512, ReadCount, nil) then
始める
SetLength(ShowText, Length(Buf) * 3);
//データを文字列に変換します
for i := Low(Buf) から High(Buf) にします
始める
TmpStr := Format('%2.2x ', [Buf[i]]);
CopyMemory(@ShowText[i*3+1], @TmpStr[1], 3);
終わり;
終わり;
MessageBox(GetDesktopWindow, PChar(ShowText), 'ブート セクター', MB_OK);
CloseHandle(ファイルハンドル);
終了プロセス(0);
終わり。