繁体   English   中英

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

[英]Writing raw data to a disk in windows fails with error code 83 (invalid parameter)

我有一些代码片段,试图将大约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:\\的磁盘句柄上。

我阅读MSDN的文章位于这里 ,解释该原始磁盘I / O获取如果不锁定/先卸载驱动器堵塞。 我对为什么这会是一个问题感到困惑,因为在我执行任何其他操作之前,我用FSCTL_LOCK_VOLUME调用DeviceIoControl来锁定设备。 该磁盘具有活动的文件系统(FAT32 / FAT16),并且0x600区域可能位于文件系统内,但是根据本文所述,如果我锁定了驱动器,则应该可以对其进行写入。 知道这里发生了什么吗? 谢谢!

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

您要打开系统磁盘的磁盘吗? (它是否包含OS文件?)如果这样,则锁定IOCTL将失败。

如果磁盘上有页面文件,则您尝试锁定Lock IOCTL的操作将失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM