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