アドレス 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 領域はファイル システム内にある可能性がありますが、記事によると、ドライブをロックすると書き込みができるはずです。ここで何が起こっているのか分かりますか?ありがとう!