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