1

アドレス 0x600 のディスクに約 100 バイトの長さの文字列を書き込むために使用しようとしている小さなコード スニペットがあります。

UCHAR szStr[0x4C] = {0};
memcpy(szStr, "Example string", 8);
DWORD bytes, cb;
HANDLE hDisk = CreateFile("\\\\.\\I:", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDisk == INVALID_HANDLE_VALUE)
{
    cout << "CreateFile error"<< endl << GetLastError();
}
if (!DeviceIoControl(hDisk, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &cb, NULL))
{
    cout << "IO Error"<< endl << GetLastError();
}
if (SetFilePointer(hDisk, 0x600, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
{
    cout << "Pointer error"<< endl << GetLastError();
}
if (!WriteFile(hDisk, szStr, 0x4C, &bytes, 0))
{
    cout << "Write error" << endl << GetLastError();    //Only one that triggers (err code 87)
}
CloseHandle(hDisk);

何らかの理由WriteFile()で、失敗する呼び出しを行うまではすべて問題ありません。GetLastError()を意味する 83 のコードを返しますINVALID_PARAMETER。ドライブの代わりにデスクトップ上の通常のファイルを指定してデバッグを試みたところI:\、操作が正常に開始されたので、ドライブへのディスクハンドルに問題があると推測されますI:\

ここにあるMSDN の記事を読みました。最初にドライブをロック/マウント解除しないと raw ディスク I/O がブロックされることを説明しています。他のことを実行する前にデバイスをロックするためDeviceIoControlに呼び出すコードのように、なぜそれが問題になるのか混乱しています。FSCTL_LOCK_VOLUMEディスクにはアクティブなファイル システム (FAT32/FAT16) があり、0x600 領域はファイル システム内にある可能性がありますが、記事によると、ドライブをロックすると書き込みができるはずです。ここで何が起こっているのか分かりますか?ありがとう!

4

1 に答える 1

0

エラー表示をチェックDeviceIoControlしていますか?SetFilePointerあなたはあなたが試みている操作をする権利を持っていますか?Rawディスク書き込みIIRCには管理者アカウントが必要です。

システムディスクを開こうとしているディスクはありますか?(OSファイルが含まれていますか?)含まれている場合、ロックIOCTLは失敗します。

ロックしようとしているディスクにページファイルがある場合、ロックIOCTLは失敗します。

于 2012-05-27T05:00:57.587 に答える