Index: src/libchcore/TLocalFilesystem.cpp
===================================================================
diff -u -N -rea7d62521e78371cff90579749d136cb928c9e88 -r3c343f2e7aa0d489706136e78f2f56cdd5d417a9
--- src/libchcore/TLocalFilesystem.cpp	(.../TLocalFilesystem.cpp)	(revision ea7d62521e78371cff90579749d136cb928c9e88)
+++ src/libchcore/TLocalFilesystem.cpp	(.../TLocalFilesystem.cpp)	(revision 3c343f2e7aa0d489706136e78f2f56cdd5d417a9)
@@ -390,7 +390,7 @@
 
 DWORD TLocalFilesystemFile::GetFlagsAndAttributes(bool bNoBuffering) const
 {
-	return FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0);
+	return FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING /*| FILE_FLAG_WRITE_THROUGH*/ : 0);
 }
 
 bool TLocalFilesystemFile::OpenExistingForReading(const TSmartPath& pathFile, bool bNoBuffering)
@@ -469,7 +469,8 @@
 		case ERROR_HANDLE_EOF:
 			{
 				rBuffer.SetBytesTransferred(0);
-				rBuffer.SetStatusCode(ERROR_SUCCESS);
+				rBuffer.SetStatusCode(0);
+				rBuffer.SetErrorCode(ERROR_SUCCESS);
 				rBuffer.SetLastPart(true);
 
 				rBuffer.RequeueAsFull();	// basically the same as OverlappedReadCompleted
@@ -489,30 +490,45 @@
 		THROW_CORE_EXCEPTION(eErr_InternalProblem);
 
 	DWORD dwToWrite = boost::numeric_cast<DWORD>(rBuffer.GetBytesTransferred());
-	unsigned long long ullNewFileSize = 0;
 
 	if (m_bNoBuffering && rBuffer.IsLastPart())
-	{
 		dwToWrite = RoundUp<DWORD>(dwToWrite, MaxSectorSize);
-		if(dwToWrite != boost::numeric_cast<DWORD>(rBuffer.GetBytesTransferred()))
-			ullNewFileSize = rBuffer.GetFilePosition() + dwToWrite;	// new size
-	}
 
 	if (!::WriteFileEx(m_hFile, rBuffer.GetBufferPtr(), dwToWrite, &rBuffer, OverlappedWriteCompleted))
+	{
+		if (GetLastError() == ERROR_IO_PENDING)
+			return true;
 		return false;
+	}
 
-	if(ullNewFileSize != 0)
+	return true;
+}
+
+bool TLocalFilesystemFile::FinalizeFile(TOverlappedDataBuffer& rBuffer)
+{
+	if (!IsOpen())
+		THROW_CORE_EXCEPTION(eErr_InternalProblem);
+
+	if (m_bNoBuffering && rBuffer.IsLastPart())
 	{
-		if(!OpenExistingForWriting(m_pathFile, false))
-			return false;
+		DWORD dwToWrite = boost::numeric_cast<DWORD>(rBuffer.GetBytesTransferred());
+		DWORD dwReallyWritten = RoundUp<DWORD>(dwToWrite, MaxSectorSize);
 
-		//seek
-		if(!SetFilePointer(ullNewFileSize, FILE_BEGIN))
-			return false;
+		if (dwToWrite != dwReallyWritten)
+		{
+			unsigned long long ullNewFileSize = rBuffer.GetFilePosition() + dwToWrite;	// new size
 
-		//set eof
-		if(!SetEndOfFile())
-			return false;
+			if (!OpenExistingForWriting(m_pathFile, false))
+				return false;
+
+			//seek
+			if (!SetFilePointer(ullNewFileSize, FILE_BEGIN))
+				return false;
+
+			//set eof
+			if (!SetEndOfFile())
+				return false;
+		}
 	}
 
 	return true;