写入U盘扇区导致权限错误5
Writing USB Disk Sectors Results in Permission Error 5
我的应用程序需要以下代码来写入外部 USB 驱动器的磁盘扇区。它适用于大多数 Win10 PC,但在几台 PC 上返回错误 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;
}
我在意想不到的地方找到了答案。我认为这必须与文件句柄的打开方式有关。相反,在 Windows 10 的病毒威胁防护设置中关闭 Real-time 防护会导致错误 5s 消失。要在不禁用 real-time 保护的情况下解决问题,您需要为每个已安装的 EXE 添加允许的应用程序排除项。
您可以通过编写 PowerShell 脚本在代码中执行此操作:
string script = "powershell -Command \"Add-MpPreference -ControlledFolderAccessAllowedApplications '" + GetAppPath() + "\AppServer.exe" + "'";
Process.Start(new ProcessStartInfo() { FileName = "cmd.exe", Arguments = "/c " + script, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }).WaitForExit();
我的应用程序需要以下代码来写入外部 USB 驱动器的磁盘扇区。它适用于大多数 Win10 PC,但在几台 PC 上返回错误 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;
}
我在意想不到的地方找到了答案。我认为这必须与文件句柄的打开方式有关。相反,在 Windows 10 的病毒威胁防护设置中关闭 Real-time 防护会导致错误 5s 消失。要在不禁用 real-time 保护的情况下解决问题,您需要为每个已安装的 EXE 添加允许的应用程序排除项。
您可以通过编写 PowerShell 脚本在代码中执行此操作:
string script = "powershell -Command \"Add-MpPreference -ControlledFolderAccessAllowedApplications '" + GetAppPath() + "\AppServer.exe" + "'";
Process.Start(new ProcessStartInfo() { FileName = "cmd.exe", Arguments = "/c " + script, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }).WaitForExit();