写入USB磁盘扇区会导致权限错误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,NULL,OPEN_EXISTING,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的病毒威胁保护设置中关闭实时保护会导致错误5s消失。要解决此问题而不禁用实时保护,您需要为每个已安装的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();