Alexandre Julliard : wow64: Add thunks for the file set information syscalls.

Alexandre Julliard julliard at winehq.org
Wed Jul 28 15:37:41 CDT 2021


Module: wine
Branch: master
Commit: c12abcc2d82538eeec66617c3986672f9a61db63
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c12abcc2d82538eeec66617c3986672f9a61db63

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jul 28 17:25:59 2021 +0200

wow64: Add thunks for the file set information syscalls.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wow64/file.c     | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/wow64/struct32.h |  14 +++++++
 dlls/wow64/syscall.h  |   3 ++
 3 files changed, 129 insertions(+)

diff --git a/dlls/wow64/file.c b/dlls/wow64/file.c
index 18c65de05d0..bf11ee4b2e2 100644
--- a/dlls/wow64/file.c
+++ b/dlls/wow64/file.c
@@ -27,6 +27,9 @@
 #include "winnt.h"
 #include "winternl.h"
 #include "wow64_private.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wow);
 
 
 /**********************************************************************
@@ -315,6 +318,115 @@ NTSTATUS WINAPI wow64_NtReadFileScatter( UINT *args )
 }
 
 
+/**********************************************************************
+ *           wow64_NtSetEaFile
+ */
+NTSTATUS WINAPI wow64_NtSetEaFile( UINT *args )
+{
+    HANDLE handle = get_handle( &args );
+    IO_STATUS_BLOCK32 *io32 = get_ptr( &args );
+    void *ptr = get_ptr( &args );
+    ULONG len = get_ulong( &args );
+
+    IO_STATUS_BLOCK io;
+    NTSTATUS status;
+
+    status = NtSetEaFile( handle, iosb_32to64( &io, io32 ), ptr, len );
+    put_iosb( io32, &io );
+    return status;
+}
+
+
+/**********************************************************************
+ *           wow64_NtSetInformationFile
+ */
+NTSTATUS WINAPI wow64_NtSetInformationFile( UINT *args )
+{
+    HANDLE handle = get_handle( &args );
+    IO_STATUS_BLOCK32 *io32 = get_ptr( &args );
+    void *ptr = get_ptr( &args );
+    ULONG len = get_ulong( &args );
+    FILE_INFORMATION_CLASS class = get_ulong( &args );
+
+    IO_STATUS_BLOCK io;
+    NTSTATUS status;
+
+    switch (class)
+    {
+    case FileBasicInformation:   /* FILE_BASIC_INFORMATION */
+    case FilePositionInformation:   /* FILE_POSITION_INFORMATION */
+    case FileEndOfFileInformation:   /* FILE_END_OF_FILE_INFORMATION */
+    case FilePipeInformation:   /* FILE_PIPE_INFORMATION */
+    case FileMailslotSetInformation:   /* FILE_MAILSLOT_SET_INFORMATION */
+    case FileIoCompletionNotificationInformation:   /* FILE_IO_COMPLETION_NOTIFICATION_INFORMATION */
+    case FileIoPriorityHintInformation:   /* FILE_IO_PRIORITY_HINT_INFO */
+    case FileValidDataLengthInformation:   /* FILE_VALID_DATA_LENGTH_INFORMATION */
+    case FileDispositionInformation:   /* FILE_DISPOSITION_INFORMATION */
+        status = NtSetInformationFile( handle, iosb_32to64( &io, io32 ), ptr, len, class );
+        break;
+
+    case FileRenameInformation:   /* FILE_RENAME_INFORMATION */
+    case FileLinkInformation:   /* FILE_LINK_INFORMATION */
+        if (len >= sizeof(FILE_RENAME_INFORMATION32))
+        {
+            FILE_RENAME_INFORMATION32 *info32 = ptr;
+            FILE_RENAME_INFORMATION *info;
+            ULONG size;
+
+            size = offsetof( FILE_RENAME_INFORMATION, FileName[info32->FileNameLength/sizeof(WCHAR)] );
+            info = Wow64AllocateTemp( size );
+            info->ReplaceIfExists = info32->ReplaceIfExists;
+            info->RootDirectory   = LongToHandle( info32->RootDirectory );
+            info->FileNameLength  = info32->FileNameLength;
+            memcpy( info->FileName, info32->FileName, info->FileNameLength );
+            status = NtSetInformationFile( handle, iosb_32to64( &io, io32 ), info, size, class );
+        }
+        else status = io.Status = STATUS_INVALID_PARAMETER_3;
+        break;
+
+    case FileCompletionInformation:   /* FILE_COMPLETION_INFORMATION */
+        if (len >= sizeof(FILE_COMPLETION_INFORMATION32))
+        {
+            FILE_COMPLETION_INFORMATION32 *info32 = ptr;
+            FILE_COMPLETION_INFORMATION info;
+
+            info.CompletionPort = LongToHandle( info32->CompletionPort );
+            info.CompletionKey  = info32->CompletionKey;
+            status = NtSetInformationFile( handle, iosb_32to64( &io, io32 ), &info, sizeof(info), class );
+        }
+        else status = io.Status = STATUS_INVALID_PARAMETER_3;
+        break;
+
+    default:
+        FIXME( "unsupported class %u\n", class );
+        status = io.Status = STATUS_INVALID_INFO_CLASS;
+        break;
+    }
+    put_iosb( io32, &io );
+    return status;
+}
+
+
+/**********************************************************************
+ *           wow64_NtSetVolumeInformationFile
+ */
+NTSTATUS WINAPI wow64_NtSetVolumeInformationFile( UINT *args )
+{
+    HANDLE handle = get_handle( &args );
+    IO_STATUS_BLOCK32 *io32 = get_ptr( &args );
+    void *ptr = get_ptr( &args );
+    ULONG len = get_ulong( &args );
+    FS_INFORMATION_CLASS class = get_ulong( &args );
+
+    IO_STATUS_BLOCK io;
+    NTSTATUS status;
+
+    status = NtSetVolumeInformationFile( handle, iosb_32to64( &io, io32 ), ptr, len, class );
+    put_iosb( io32, &io );
+    return status;
+}
+
+
 /**********************************************************************
  *           wow64_NtUnlockFile
  */
diff --git a/dlls/wow64/struct32.h b/dlls/wow64/struct32.h
index 76055115b08..168519b18da 100644
--- a/dlls/wow64/struct32.h
+++ b/dlls/wow64/struct32.h
@@ -79,6 +79,20 @@ typedef struct
     UNICODE_STRING32 ObjectTypeName;
 } DIRECTORY_BASIC_INFORMATION32;
 
+typedef struct
+{
+    ULONG CompletionPort;
+    ULONG CompletionKey;
+} FILE_COMPLETION_INFORMATION32;
+
+typedef struct
+{
+    BOOLEAN ReplaceIfExists;
+    ULONG   RootDirectory;
+    ULONG   FileNameLength;
+    WCHAR   FileName[1];
+} FILE_RENAME_INFORMATION32;
+
 typedef struct
 {
     ULONG    BaseAddress;
diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h
index d147014c3be..38eca6b744e 100644
--- a/dlls/wow64/syscall.h
+++ b/dlls/wow64/syscall.h
@@ -134,8 +134,10 @@
     SYSCALL_ENTRY( NtSecureConnectPort ) \
     SYSCALL_ENTRY( NtSetDefaultLocale ) \
     SYSCALL_ENTRY( NtSetDefaultUILanguage ) \
+    SYSCALL_ENTRY( NtSetEaFile ) \
     SYSCALL_ENTRY( NtSetEvent ) \
     SYSCALL_ENTRY( NtSetInformationDebugObject ) \
+    SYSCALL_ENTRY( NtSetInformationFile ) \
     SYSCALL_ENTRY( NtSetInformationKey ) \
     SYSCALL_ENTRY( NtSetInformationObject ) \
     SYSCALL_ENTRY( NtSetIoCompletion ) \
@@ -143,6 +145,7 @@
     SYSCALL_ENTRY( NtSetTimer ) \
     SYSCALL_ENTRY( NtSetTimerResolution ) \
     SYSCALL_ENTRY( NtSetValueKey ) \
+    SYSCALL_ENTRY( NtSetVolumeInformationFile ) \
     SYSCALL_ENTRY( NtSignalAndWaitForSingleObject ) \
     SYSCALL_ENTRY( NtTerminateJobObject ) \
     SYSCALL_ENTRY( NtUnloadKey ) \




More information about the wine-cvs mailing list