gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:16:28 25 4
gpt4 key购买 nike

我有一小段代码,我试图用它来将大约 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:\ 来调试它,并且操作成功启动,所以我最好的猜测是问题出在驱动器的磁盘句柄上 我:\

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

最佳答案

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

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

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

关于c++ - 在 Windows 中将原始数据写入磁盘失败,错误代码为 83(参数无效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10770790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com