Module: wine Branch: master Commit: 5c5b997dc2294496739c26603256dabc7c1abd42 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5c5b997dc2294496739c266032...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Mar 14 20:32:53 2008 +0100
kernel32: Implemented ReadFileScatter and WriteFileGather.
---
dlls/kernel32/file.c | 48 +++++++++++++++++++++++++++++++++++++++++++ dlls/kernel32/kernel32.spec | 4 +- include/winbase.h | 2 + 3 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c index 0498dc7..e6e5210 100644 --- a/dlls/kernel32/file.c +++ b/dlls/kernel32/file.c @@ -390,6 +390,30 @@ BOOL WINAPI ReadFileEx(HANDLE hFile, LPVOID buffer, DWORD bytesToRead,
/*********************************************************************** + * ReadFileScatter (KERNEL32.@) + */ +BOOL WINAPI ReadFileScatter( HANDLE file, FILE_SEGMENT_ELEMENT *segments, DWORD count, + LPDWORD reserved, LPOVERLAPPED overlapped ) +{ + PIO_STATUS_BLOCK io_status; + LARGE_INTEGER offset; + NTSTATUS status; + + TRACE( "(%p %p %u %p)\n", file, segments, count, overlapped ); + + offset.u.LowPart = overlapped->u.s.Offset; + offset.u.HighPart = overlapped->u.s.OffsetHigh; + io_status = (PIO_STATUS_BLOCK)overlapped; + io_status->u.Status = STATUS_PENDING; + io_status->Information = 0; + + status = NtReadFileScatter( file, NULL, NULL, NULL, io_status, segments, count, &offset, NULL ); + if (status) SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + + +/*********************************************************************** * ReadFile (KERNEL32.@) */ BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead, @@ -478,6 +502,30 @@ BOOL WINAPI WriteFileEx(HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite,
/*********************************************************************** + * WriteFileGather (KERNEL32.@) + */ +BOOL WINAPI WriteFileGather( HANDLE file, FILE_SEGMENT_ELEMENT *segments, DWORD count, + LPDWORD reserved, LPOVERLAPPED overlapped ) +{ + PIO_STATUS_BLOCK io_status; + LARGE_INTEGER offset; + NTSTATUS status; + + TRACE( "%p %p %u %p\n", file, segments, count, overlapped ); + + offset.u.LowPart = overlapped->u.s.Offset; + offset.u.HighPart = overlapped->u.s.OffsetHigh; + io_status = (PIO_STATUS_BLOCK)overlapped; + io_status->u.Status = STATUS_PENDING; + io_status->Information = 0; + + status = NtWriteFileGather( file, NULL, NULL, NULL, io_status, segments, count, &offset, NULL ); + if (status) SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + + +/*********************************************************************** * WriteFile (KERNEL32.@) */ BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 112efbf..2f591c2 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -880,7 +880,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) @ stdcall RegisterApplicationRestart(wstr long) @ stub RegisterConsoleIME @@ -1143,7 +1143,7 @@ @ stdcall WriteConsoleW(long ptr long ptr ptr) @ stdcall WriteFile(long ptr long ptr ptr) @ stdcall WriteFileEx(long ptr long ptr ptr) -@ stub WriteFileGather +@ stdcall WriteFileGather(long ptr long ptr ptr) @ stdcall WritePrivateProfileSectionA(str str str) @ stdcall WritePrivateProfileSectionW(wstr wstr wstr) @ stdcall WritePrivateProfileStringA(str str str str) diff --git a/include/winbase.h b/include/winbase.h index f3130a0..7a0cce0 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1936,6 +1936,7 @@ WINADVAPI BOOL WINAPI ReadEventLogW(HANDLE,DWORD,DWORD,LPVOID,DWORD,DWOR WINBASEAPI BOOL WINAPI ReadDirectoryChangesW(HANDLE,LPVOID,DWORD,BOOL,DWORD,LPDWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); WINBASEAPI BOOL WINAPI ReadFile(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED); WINBASEAPI BOOL WINAPI ReadFileEx(HANDLE,LPVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); +WINBASEAPI BOOL WINAPI ReadFileScatter(HANDLE,FILE_SEGMENT_ELEMENT*,DWORD,LPDWORD,LPOVERLAPPED); WINBASEAPI BOOL WINAPI ReadProcessMemory(HANDLE,LPCVOID,LPVOID,SIZE_T,SIZE_T*); WINADVAPI HANDLE WINAPI RegisterEventSourceA(LPCSTR,LPCSTR); WINADVAPI HANDLE WINAPI RegisterEventSourceW(LPCWSTR,LPCWSTR); @@ -2098,6 +2099,7 @@ WINBASEAPI BOOL WINAPI WaitNamedPipeW(LPCWSTR,DWORD); WINBASEAPI UINT WINAPI WinExec(LPCSTR,UINT); WINBASEAPI BOOL WINAPI WriteFile(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED); WINBASEAPI BOOL WINAPI WriteFileEx(HANDLE,LPCVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); +WINBASEAPI BOOL WINAPI WriteFileGather(HANDLE,FILE_SEGMENT_ELEMENT*,DWORD,LPDWORD,LPOVERLAPPED); WINBASEAPI BOOL WINAPI WritePrivateProfileSectionA(LPCSTR,LPCSTR,LPCSTR); WINBASEAPI BOOL WINAPI WritePrivateProfileSectionW(LPCWSTR,LPCWSTR,LPCWSTR); #define WritePrivateProfileSection WINELIB_NAME_AW(WritePrivateProfileSection)