写入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();