Alexandre Julliard : wow64: Add thunks for the file async I/O syscalls.
Alexandre Julliard
julliard at winehq.org
Wed Jul 28 15:37:41 CDT 2021
Module: wine
Branch: master
Commit: 011ce0b2ada2cededa1cab410347836ae3b7cab3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=011ce0b2ada2cededa1cab410347836ae3b7cab3
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jul 28 18:09:20 2021 +0200
wow64: Add thunks for the file async I/O syscalls.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wow64/file.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++
dlls/wow64/struct32.h | 7 +++
dlls/wow64/syscall.h | 5 +++
3 files changed, 127 insertions(+)
diff --git a/dlls/wow64/file.c b/dlls/wow64/file.c
index bf11ee4b2e2..5fb0fe97699 100644
--- a/dlls/wow64/file.c
+++ b/dlls/wow64/file.c
@@ -32,6 +32,41 @@
WINE_DEFAULT_DEBUG_CHANNEL(wow);
+/**********************************************************************
+ * wow64_NtCancelIoFile
+ */
+NTSTATUS WINAPI wow64_NtCancelIoFile( UINT *args )
+{
+ HANDLE handle = get_handle( &args );
+ IO_STATUS_BLOCK32 *io32 = get_ptr( &args );
+
+ IO_STATUS_BLOCK io;
+ NTSTATUS status;
+
+ status = NtCancelIoFile( handle, iosb_32to64( &io, io32 ));
+ put_iosb( io32, &io );
+ return status;
+}
+
+
+/**********************************************************************
+ * wow64_NtCancelIoFileEx
+ */
+NTSTATUS WINAPI wow64_NtCancelIoFileEx( UINT *args )
+{
+ HANDLE handle = get_handle( &args );
+ IO_STATUS_BLOCK32 *io_ptr = get_ptr( &args );
+ IO_STATUS_BLOCK32 *io32 = get_ptr( &args );
+
+ IO_STATUS_BLOCK io;
+ NTSTATUS status;
+
+ status = NtCancelIoFileEx( handle, (IO_STATUS_BLOCK *)io_ptr, iosb_32to64( &io, io32 ));
+ put_iosb( io32, &io );
+ return status;
+}
+
+
/**********************************************************************
* wow64_NtCreateFile
*/
@@ -120,6 +155,32 @@ NTSTATUS WINAPI wow64_NtLockFile( UINT *args )
}
+/**********************************************************************
+ * wow64_NtNotifyChangeDirectoryFile
+ */
+NTSTATUS WINAPI wow64_NtNotifyChangeDirectoryFile( UINT *args )
+{
+ HANDLE handle = get_handle( &args );
+ HANDLE event = get_handle( &args );
+ ULONG apc = get_ulong( &args );
+ ULONG apc_param = get_ulong( &args );
+ IO_STATUS_BLOCK32 *io32 = get_ptr( &args );
+ void *buffer = get_ptr( &args );
+ ULONG len = get_ulong( &args );
+ ULONG filter = get_ulong( &args );
+ BOOLEAN subtree = get_ulong( &args );
+
+ IO_STATUS_BLOCK io;
+ NTSTATUS status;
+
+ status = NtNotifyChangeDirectoryFile( handle, event, apc_32to64( apc ),
+ apc_param_32to64( apc, apc_param ), iosb_32to64( &io, io32 ),
+ buffer, len, filter, subtree );
+ put_iosb( io32, &io );
+ return status;
+}
+
+
/**********************************************************************
* wow64_NtOpenFile
*/
@@ -318,6 +379,60 @@ NTSTATUS WINAPI wow64_NtReadFileScatter( UINT *args )
}
+/**********************************************************************
+ * wow64_NtRemoveIoCompletion
+ */
+NTSTATUS WINAPI wow64_NtRemoveIoCompletion( UINT *args )
+{
+ HANDLE handle = get_handle( &args );
+ ULONG *key_ptr = get_ptr( &args );
+ ULONG *value_ptr = get_ptr( &args );
+ IO_STATUS_BLOCK32 *io32 = get_ptr( &args );
+ LARGE_INTEGER *timeout = get_ptr( &args );
+
+ IO_STATUS_BLOCK io;
+ ULONG_PTR key, value;
+ NTSTATUS status;
+
+ status = NtRemoveIoCompletion( handle, &key, &value, iosb_32to64( &io, io32 ), timeout );
+ if (!status)
+ {
+ *key_ptr = key;
+ *value_ptr = value;
+ }
+ put_iosb( io32, &io );
+ return status;
+}
+
+
+/**********************************************************************
+ * wow64_NtRemoveIoCompletionEx
+ */
+NTSTATUS WINAPI wow64_NtRemoveIoCompletionEx( UINT *args )
+{
+ HANDLE handle = get_handle( &args );
+ FILE_IO_COMPLETION_INFORMATION32 *info32 = get_ptr( &args );
+ ULONG count = get_ulong( &args );
+ ULONG *written = get_ptr( &args );
+ LARGE_INTEGER *timeout = get_ptr( &args );
+ BOOLEAN alertable = get_ulong( &args );
+
+ NTSTATUS status;
+ ULONG i;
+ FILE_IO_COMPLETION_INFORMATION *info = Wow64AllocateTemp( count * sizeof(*info) );
+
+ status = NtRemoveIoCompletionEx( handle, info, count, written, timeout, alertable );
+ for (i = 0; i < *written; i++)
+ {
+ info32[i].CompletionKey = info[i].CompletionKey;
+ info32[i].CompletionValue = info[i].CompletionValue;
+ info32[i].IoStatusBlock.Status = info[i].IoStatusBlock.Status;
+ info32[i].IoStatusBlock.Information = info[i].IoStatusBlock.Information;
+ }
+ return status;
+}
+
+
/**********************************************************************
* wow64_NtSetEaFile
*/
diff --git a/dlls/wow64/struct32.h b/dlls/wow64/struct32.h
index 168519b18da..258fa9f74c1 100644
--- a/dlls/wow64/struct32.h
+++ b/dlls/wow64/struct32.h
@@ -85,6 +85,13 @@ typedef struct
ULONG CompletionKey;
} FILE_COMPLETION_INFORMATION32;
+typedef struct
+{
+ ULONG CompletionKey;
+ ULONG CompletionValue;
+ IO_STATUS_BLOCK32 IoStatusBlock;
+} FILE_IO_COMPLETION_INFORMATION32;
+
typedef struct
{
BOOLEAN ReplaceIfExists;
diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h
index 38eca6b744e..1990dc335f3 100644
--- a/dlls/wow64/syscall.h
+++ b/dlls/wow64/syscall.h
@@ -29,6 +29,8 @@
SYSCALL_ENTRY( NtAllocateVirtualMemory ) \
SYSCALL_ENTRY( NtAllocateVirtualMemoryEx ) \
SYSCALL_ENTRY( NtAreMappedFilesTheSame ) \
+ SYSCALL_ENTRY( NtCancelIoFile ) \
+ SYSCALL_ENTRY( NtCancelIoFileEx ) \
SYSCALL_ENTRY( NtCancelTimer ) \
SYSCALL_ENTRY( NtClearEvent ) \
SYSCALL_ENTRY( NtClearPowerRequest ) \
@@ -75,6 +77,7 @@
SYSCALL_ENTRY( NtLockVirtualMemory ) \
SYSCALL_ENTRY( NtMakeTemporaryObject ) \
SYSCALL_ENTRY( NtMapViewOfSection ) \
+ SYSCALL_ENTRY( NtNotifyChangeDirectoryFile ) \
SYSCALL_ENTRY( NtOpenDirectoryObject ) \
SYSCALL_ENTRY( NtOpenEvent ) \
SYSCALL_ENTRY( NtOpenFile ) \
@@ -123,6 +126,8 @@
SYSCALL_ENTRY( NtReleaseKeyedEvent ) \
SYSCALL_ENTRY( NtReleaseMutant ) \
SYSCALL_ENTRY( NtReleaseSemaphore ) \
+ SYSCALL_ENTRY( NtRemoveIoCompletion ) \
+ SYSCALL_ENTRY( NtRemoveIoCompletionEx ) \
SYSCALL_ENTRY( NtRenameKey ) \
SYSCALL_ENTRY( NtReplaceKey ) \
SYSCALL_ENTRY( NtReplyWaitReceivePort ) \
More information about the wine-cvs
mailing list