在Windows中将原始数据写入磁盘失败,错误代码为83(参数无效)

时间:2012-05-27 00:29:50

标签: c++ disk

我有一小段代码,我试图用它来写一个大约100字节长的字符串到地址为0x600的磁盘。

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:\的磁盘句柄。

我阅读了位于here的MSDN的一篇文章,该文章解释了如果您没有先锁定/卸载驱动器,原始磁盘I / O会被阻止。我很困惑为什么那会是一个问题,因为在我的代码中我用DeviceIoControl调用FSCTL_LOCK_VOLUME来锁定设备,然后再执行其他操作。磁盘有一个活动文件系统(FAT32 / FAT16),0x600区域可能位于文件系统中,但根据文章,如果我锁定驱动器,我应该能够写入它。知道这里发生了什么吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您是否在检查DeviceIoControlSetFilePointer是否有错误指示? 您是否有权进行您正在尝试的操作?原始磁盘写入IIRC需要管理员帐户。

您尝试打开系统磁盘的磁盘? (它是否包含操作系统文件?)如果是这样,锁定IOCTL将失败。

如果磁盘上有一个页面文件,你试图锁定锁定IOCTL将会失败。