Alexandre Julliard : kernel32: Implemented ReadFileScatter and WriteFileGather.
Alexandre Julliard
julliard at winehq.org
Sat Mar 15 05:53:46 CDT 2008
Module: wine
Branch: master
Commit: 5c5b997dc2294496739c26603256dabc7c1abd42
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5c5b997dc2294496739c26603256dabc7c1abd42
Author: Alexandre Julliard <julliard at 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)
More information about the wine-cvs
mailing list