【发布时间】:2020-09-25 10:52:01
【问题描述】:
我的应用程序需要以下代码来写入外部 USB 驱动器的磁盘扇区。它适用于大多数 Win10 电脑,但它在几台电脑上返回错误 5,因为权限被拒绝。我为 Windows Defender 和 Malwarebytes 创建了排除项。事件查看器中没有与失败相关的任何内容。读取功能正常工作。
我尝试添加对 FSCTL_LOCK_VOLUME 和 FSCTL_DISMOUNT_VOLUME 的调用,但这无济于事。可能不需要,因为我在清理物理磁盘后访问它,而不是任何卷。
知道是什么原因造成的,或者如何解决?
如果有其他读写磁盘扇区的方法,我会很高兴。
BOOL Partitioner::BlockWrite(wchar_t* devIdentifier, unsigned __int64 lngStartbyte, DWORD bytesToRead, BYTE* buf)
{
BOOL ret = FALSE;
HANDLE devHan = CreateFile(devIdentifier, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (devHan != INVALID_HANDLE_VALUE)
{
// Seek to the starting block to write
LARGE_INTEGER startByte;
startByte.QuadPart = lngStartbyte;
SetFilePointer(devHan, startByte.LowPart, (long*)&startByte.HighPart, FILE_BEGIN);
// Write the data (this is where error 5 is returned)
DWORD bytesWritten = 0;
ret = WriteFile(devHan, buf, bytesToRead, &bytesWritten, NULL);
FlushFileBuffers(devHan);
CloseHandle(devHan);
}
else
{
ret = GetLastError();
wchar_t msg[PATH_BUFFER_SIZE] = {0};
swprintf_s(msg, WCSIZE_FULL(msg), L"Error= %d, byte= %llu", ret, lngStartbyte);
mLog->LogError(msg);
}
return ret;
}
【问题讨论】:
-
我可以确认是
CreateFile还是WriteFile导致ERROR_ACCESS_DENIED。如果在大部分PC上都能正常运行,有少数被拒绝,那我觉得你需要比较不同PC的权限差异,否则我们很难重现问题。 -
@朱松,WriteFile 失败。读取文件没问题。我不确定需要比较哪些权限。
标签: c++ winapi windows-10-desktop