[PATCH 3/3] ntdll: Don't require full-page reads in NtReadFileScatter
Andrew Eikum
aeikum at codeweavers.com
Wed Nov 29 12:52:54 CST 2017
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
dlls/kernel32/tests/file.c | 19 +++++++++++++++++++
dlls/ntdll/file.c | 5 ++---
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index e1cf268817..a3d6e8f71e 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -4429,6 +4429,25 @@ static void test_WriteFileGather(void)
ok( memcmp( rbuf2, rbuf1, si.dwPageSize ) == 0,
"data should not have been read into buffer\n" );
+ /* partial page read */
+ memset( &ovl, 0, sizeof(ovl) );
+ memset( fse, 0, sizeof(fse) );
+ fse[0].Buffer = rbuf1;
+ memset( rbuf1, 0, si.dwPageSize );
+ br = ReadFileScatter( hfile, fse, si.dwPageSize / 2, NULL, &ovl );
+ ok( br == FALSE, "ReadFileScatter should be asynchronous\n" );
+ ok( GetLastError() == ERROR_IO_PENDING, "ReadFileScatter failed err %u\n", GetLastError() );
+
+ ret = GetQueuedCompletionStatus( hiocp2, &size, &key, &povl, 1000 );
+ ok( ret, "GetQueuedCompletionStatus failed err %u\n", GetLastError() );
+ ok( povl == &ovl, "wrong ovl %p\n", povl );
+
+ ok( memcmp( rbuf1, wbuf, si.dwPageSize / 2 ) == 0,
+ "invalid data was read into buffer\n" );
+ memset( rbuf2, 0, si.dwPageSize );
+ ok( memcmp( rbuf1 + si.dwPageSize / 2, rbuf2, si.dwPageSize - si.dwPageSize / 2 ) == 0,
+ "invalid data was read into buffer\n" );
+
CloseHandle( hfile );
CloseHandle( hiocp1 );
CloseHandle( hiocp2 );
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index f7db24cc8b..152ad7498c 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1041,7 +1041,6 @@ NTSTATUS WINAPI NtReadFileScatter( HANDLE file, HANDLE event, PIO_APC_ROUTINE ap
TRACE( "(%p,%p,%p,%p,%p,%p,0x%08x,%p,%p),partial stub!\n",
file, event, apc, apc_user, io_status, segments, length, offset, key);
- if (length % page_size) return STATUS_INVALID_PARAMETER;
if (!io_status) return STATUS_ACCESS_VIOLATION;
status = server_get_unix_fd( file, FILE_READ_DATA, &unix_handle,
@@ -1060,9 +1059,9 @@ NTSTATUS WINAPI NtReadFileScatter( HANDLE file, HANDLE event, PIO_APC_ROUTINE ap
{
if (offset && offset->QuadPart != FILE_USE_FILE_POINTER_POSITION)
result = pread( unix_handle, (char *)segments->Buffer + pos,
- page_size - pos, offset->QuadPart + total );
+ min( length - pos, page_size - pos ), offset->QuadPart + total );
else
- result = read( unix_handle, (char *)segments->Buffer + pos, page_size - pos );
+ result = read( unix_handle, (char *)segments->Buffer + pos, min( length - pos, page_size - pos ) );
if (result == -1)
{
--
2.15.0
More information about the wine-devel
mailing list