Index: src/libchcore/TOverlappedDataBuffer.cpp =================================================================== diff -u -N -r11b0a299be97bc3afaa633d6522c17b214ba3b79 -r3c343f2e7aa0d489706136e78f2f56cdd5d417a9 --- src/libchcore/TOverlappedDataBuffer.cpp (.../TOverlappedDataBuffer.cpp) (revision 11b0a299be97bc3afaa633d6522c17b214ba3b79) +++ src/libchcore/TOverlappedDataBuffer.cpp (.../TOverlappedDataBuffer.cpp) (revision 3c343f2e7aa0d489706136e78f2f56cdd5d417a9) @@ -27,24 +27,38 @@ #include "ErrorCodes.h" #include "IOverlappedDataBufferQueue.h" #include "RoundingFunctions.h" +#include +#define STATUS_END_OF_FILE 0xc0000011 + BEGIN_CHCORE_NAMESPACE /////////////////////////////////////////////////////////////////////////////////// // class TOverlappedDataBuffer VOID CALLBACK OverlappedReadCompleted(DWORD dwErrorCode, DWORD /*dwNumberOfBytesTransfered*/, LPOVERLAPPED lpOverlapped) { TOverlappedDataBuffer* pBuffer = (TOverlappedDataBuffer*) lpOverlapped; + bool bEof = (dwErrorCode == ERROR_HANDLE_EOF || + pBuffer->GetStatusCode() == STATUS_END_OF_FILE || (dwErrorCode == ERROR_SUCCESS && pBuffer->GetBytesTransferred() != pBuffer->GetRequestedDataSize())); + if (pBuffer->GetStatusCode() == STATUS_END_OF_FILE) + pBuffer->SetStatusCode(0); + pBuffer->SetErrorCode(dwErrorCode == ERROR_HANDLE_EOF ? ERROR_SUCCESS : dwErrorCode); + + if (dwErrorCode != ERROR_SUCCESS) + ATLTRACE(_T("OverlappedReadCompleted error: %lu, status code: %I64u\n"), dwErrorCode, pBuffer->GetStatusCode()); + pBuffer->SetLastPart(bEof); pBuffer->RequeueAsFull(); } -VOID CALLBACK OverlappedWriteCompleted(DWORD /*dwErrorCode*/, DWORD /*dwNumberOfBytesTransfered*/, LPOVERLAPPED lpOverlapped) +VOID CALLBACK OverlappedWriteCompleted(DWORD dwErrorCode, DWORD /*dwNumberOfBytesTransfered*/, LPOVERLAPPED lpOverlapped) { TOverlappedDataBuffer* pBuffer = (TOverlappedDataBuffer*) lpOverlapped; + if (dwErrorCode != ERROR_SUCCESS) + ATLTRACE(_T("OverlappedWriteCompleted error: %lu, status code: %I64u\n"), dwErrorCode, pBuffer->GetStatusCode()); pBuffer->RequeueAsFinished(); }