Module: wine Branch: master Commit: c12abcc2d82538eeec66617c3986672f9a61db63 URL: https://source.winehq.org/git/wine.git/?a=commit;h=c12abcc2d82538eeec66617c3...
Author: Alexandre Julliard julliard@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@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 ) \