1

現在、Cでバイナリデータのストリームとして物理ハードディスクにアクセスしようとしています。イメージ(.img)をマウントし、OS(Win 7)から読み取ることができます。

私のCプログラムは、物理ドライブを読み取り専用バイナリモードで開こうとし、ドライブからデータを読み取ろうとします。

ただし、どこも検索せずにストリームからデータを読み取るだけで、すべてがうまくいき、ドライブに格納されているデータが返されます。ストリームのオフセット0にいるので、MBRを読み取ることができます。ディスク上。

fseekただし、原点(ゼロ)からオフセットしようとすると、 fseek-1を返し、それができなかったことを示します。

これは、物理ディスクへのアクセスに関するアクセス許可/リング3 /ユーザーレベルの問題である可能性があると推測しています。これを行うには、カーネルレベルのアクセスを取得するためにドライバーを作成する必要があります。なぜできるのか、混乱しています。最初のセクターからいくつかのデータをうまく読み取りますが、他のオフセットを探すことはできません。以下に書いたCプログラムの一部を含めました。

FILE *disk = fopen("\\\\.\\PhysicalDrive1, "rb+");
if (disk == NULL) {
    **error handle
 }
else { //Opened the drive sucessfully
fread(buffer, 1, 100, disk);
printf("Reading the first byte from buffer, it's:%d\n", buffer[0]);
//This works fine and I can read any byte within the initial buffer
int test = fseek(disk, 100, SEEK_SET);
printf("The value of fseek is:%d\n", test);
//This always returns -1, indicating the seek failed  
fclose(disk);
}
4

1 に答える 1

1

msdnからの引用:

成功した場合fseekは0を返します。それ以外の場合は、ゼロ以外の値を返します。シークできないデバイスでは、戻り値は未定義です。streamがnullポインターである場合、またはoriginが以下で説明する許可された値のいずれでもない場合はfseek、パラメーターの検証で説明されているように、無効なパラメーターハンドラーを呼び出します。実行の続行が許可されている場合、これらの関数は-1に設定さerrnoEINVAL、-1を返します。

C標準[ISO/IEC 9899:2011]のセクション7.21.9.2は、バイナリモードでバイナリファイルを開くときのfseek()の次の動作を指定しています。

バイナリストリームは、whence値がSEEK_ENDのfseek呼び出しを意味のある形でサポートする必要はありません。

さらに、セクション7.21.3の脚注268には、次のように書かれています。

fseek(file、0、SEEK_END)の場合のように、ファイル位置インジケーターをファイルの終わりに設定すると、バイナリストリーム(末尾のヌル文字の可能性があるため)または状態に依存しないエンコーディングのストリームに対して未定義の動作が発生します。確実に初期シフト状態で終了します。

セクターの配置、ファイルシステムなど、多くの低レベルのものが重要です。ドライブをナビゲートするのに役立つ特定のドライバプログラムが必要なものも考慮する必要があります。

お役に立てれば。

于 2013-01-24T18:31:16.810 に答える