Readfile() 偶尔 returns 998 / ERROR_NOACCESS

Readfile() occasionally returns 998 / ERROR_NOACCESS

我正尝试在 Windows 下实现快速 IO,并逐步实现 Overlapped IO。在我的研究中,无缓冲 IO 需要页面对齐的缓冲区。我试图在下面的代码中实现这一点。但是,我偶尔会遇到 Readfiles 最后一个错误报告无法访问(错误 998,ERROR_NOACCESS)——在完成读取之前,以及在对页对齐缓冲区进行几次读取之后。有时 16。有时 4,等等

我一辈子都弄不明白为什么我偶尔会抛出错误。任何见解都会有所帮助。

ci::BufferRef CinderSequenceRendererApp::CreateFileLoadWinNoBufferSequential(fs::path path) {
HANDLE file = CreateFile(path.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN, 0);

if (file == INVALID_HANDLE_VALUE)
{
    console() << "Could not open file for reading" << std::endl;
}

ci::BufferRef latestAvailableBufferRef = nullptr;

LARGE_INTEGER nLargeInteger = { 0 };

GetFileSizeEx(file, &nLargeInteger);

// how many reads do we need to fill our buffer with a buffer size of x and a read size of y
// Our buffer needs to hold 'n' sector sizes that wil fit the size of the file

SYSTEM_INFO si;
GetSystemInfo(&si);
long readAmount = si.dwPageSize;

int numReads = 0;
ULONG bufferSize = 0;

// calculate sector aligned buffer size that holds our file size
while (bufferSize < nLargeInteger.QuadPart)
{
    numReads++;
    bufferSize = (numReads) * readAmount;
}

// need one page extra for null if we need it
latestAvailableBufferRef = ci::Buffer::create(bufferSize + readAmount);

if (latestAvailableBufferRef != nullptr)
{
    DWORD outputBytes = 1;

    // output bytes = 0 when OEF
    void* address = latestAvailableBufferRef->getData();
    DWORD bytesRead = 0;
    while (outputBytes != 0)
    {
        bool result = ReadFile(file, address, readAmount, &outputBytes, 0);
        if (!result )//&& (outputBytes == 0))
        {
            getLastReadError();
        }

        address = (void*)((long)address + readAmount);
        bytesRead += outputBytes;

    }
}

CloseHandle(file);  

// resize our buffer to expected file size?
latestAvailableBufferRef->resize(nLargeInteger.QuadPart);

return latestAvailableBufferRef;
}

转换为 long long - 我正在截断我的指针地址。呃。感谢@jonathan-potter