diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c index 4e05c28..5cd40b4 100644 --- a/dlls/kernel32/file.c +++ b/dlls/kernel32/file.c @@ -2283,3 +2283,56 @@ error: /* We get here if there was an error opening the file */ WARN("(%s): return = HFILE_ERROR error= %d\n", name,ofs->nErrCode ); return HFILE_ERROR; } + + +/*********************************************************************** + * ReadFileScatter (KERNEL32.@) + */ +BOOL WINAPI ReadFileScatter( HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[], + DWORD nNumberOfBytesToRead, LPDWORD lpReserved, + LPOVERLAPPED lpOverlapped) +{ + DWORD dwBytesRead; + int numSegments, i; + SIZE_T pagesize = getpagesize(); + + TRACE("%p %p %d %p %p\n", hFile, aSegmentArray, nNumberOfBytesToRead, + lpReserved, lpOverlapped); + + if( lpReserved || !lpOverlapped || nNumberOfBytesToRead % pagesize) + { + SetLastError( ERROR_INVALID_PARAMETER); + return FALSE; + } + + numSegments = nNumberOfBytesToRead / pagesize; + + /* scattered buffers must be page aligned and write accessible */ + for( i=0; ihEvent, INFINITE) != WAIT_OBJECT_0)) + { + return FALSE; + } + } + + lpOverlapped->u.s.Offset += dwBytesRead; + } + + return TRUE; +} + diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 7bc5db3..cb221fd 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -876,7 +876,7 @@ @ stdcall ReadDirectoryChangesW(long ptr long long long ptr ptr ptr) @ stdcall ReadFile(long ptr long ptr ptr) @ stdcall ReadFileEx(long ptr long ptr ptr) -@ stub ReadFileScatter +@ stdcall ReadFileScatter(long ptr long ptr ptr) @ stdcall ReadProcessMemory(long ptr ptr long ptr) @ stub RegisterConsoleIME @ stub RegisterConsoleOS2