Alexandre Julliard : wow64: Add thunks for the section object syscalls.
Alexandre Julliard
julliard at winehq.org
Mon Jul 26 15:30:28 CDT 2021
Module: wine
Branch: master
Commit: 9dfebb52506d33e5e8b011f3666c296be5a1f398
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9dfebb52506d33e5e8b011f3666c296be5a1f398
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Jul 26 12:22:36 2021 +0200
wow64: Add thunks for the section object syscalls.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wow64/struct32.h | 28 ++++++++++
dlls/wow64/sync.c | 128 +++++++++++++++++++++++++++++++++++++++++++++
dlls/wow64/syscall.h | 3 ++
dlls/wow64/wow64_private.h | 8 +++
4 files changed, 167 insertions(+)
diff --git a/dlls/wow64/struct32.h b/dlls/wow64/struct32.h
index 776b1d4df35..03a57fc2c27 100644
--- a/dlls/wow64/struct32.h
+++ b/dlls/wow64/struct32.h
@@ -37,6 +37,34 @@ typedef struct
UNICODE_STRING32 ObjectTypeName;
} DIRECTORY_BASIC_INFORMATION32;
+typedef struct
+{
+ ULONG BaseAddress;
+ ULONG Attributes;
+ LARGE_INTEGER Size;
+} SECTION_BASIC_INFORMATION32;
+
+typedef struct
+{
+ ULONG TransferAddress;
+ ULONG ZeroBits;
+ ULONG MaximumStackSize;
+ ULONG CommittedStackSize;
+ ULONG SubSystemType;
+ USHORT MinorSubsystemVersion;
+ USHORT MajorSubsystemVersion;
+ USHORT MajorOperatingSystemVersion;
+ USHORT MinorOperatingSystemVersion;
+ USHORT ImageCharacteristics;
+ USHORT DllCharacteristics;
+ USHORT Machine;
+ BOOLEAN ImageContainsCode;
+ UCHAR ImageFlags;
+ ULONG LoaderFlags;
+ ULONG ImageFileSize;
+ ULONG CheckSum;
+} SECTION_IMAGE_INFORMATION32;
+
typedef struct
{
DBG_STATE NewState;
diff --git a/dlls/wow64/sync.c b/dlls/wow64/sync.c
index c748668620a..0332f85e3ff 100644
--- a/dlls/wow64/sync.c
+++ b/dlls/wow64/sync.c
@@ -32,6 +32,37 @@
WINE_DEFAULT_DEBUG_CHANNEL(wow);
+void put_section_image_info( SECTION_IMAGE_INFORMATION32 *info32, const SECTION_IMAGE_INFORMATION *info )
+{
+ if (info->Machine == IMAGE_FILE_MACHINE_AMD64 || info->Machine == IMAGE_FILE_MACHINE_ARM64)
+ {
+ info32->TransferAddress = 0x81231234; /* sic */
+ info32->MaximumStackSize = 0x100000;
+ info32->CommittedStackSize = 0x10000;
+ }
+ else
+ {
+ info32->TransferAddress = PtrToUlong( info->TransferAddress );
+ info32->MaximumStackSize = info->MaximumStackSize;
+ info32->CommittedStackSize = info->CommittedStackSize;
+ }
+ info32->ZeroBits = info->ZeroBits;
+ info32->SubSystemType = info->SubSystemType;
+ info32->MinorSubsystemVersion = info->MinorSubsystemVersion;
+ info32->MajorSubsystemVersion = info->MajorSubsystemVersion;
+ info32->MajorOperatingSystemVersion = info->MajorOperatingSystemVersion;
+ info32->MinorOperatingSystemVersion = info->MinorOperatingSystemVersion;
+ info32->ImageCharacteristics = info->ImageCharacteristics;
+ info32->DllCharacteristics = info->DllCharacteristics;
+ info32->Machine = info->Machine;
+ info32->ImageContainsCode = info->ImageContainsCode;
+ info32->ImageFlags = info->ImageFlags;
+ info32->LoaderFlags = info->LoaderFlags;
+ info32->ImageFileSize = info->ImageFileSize;
+ info32->CheckSum = info->CheckSum;
+}
+
+
/**********************************************************************
* wow64_NtCancelTimer
*/
@@ -201,6 +232,30 @@ NTSTATUS WINAPI wow64_NtCreateMutant( UINT *args )
}
+/**********************************************************************
+ * wow64_NtCreateSection
+ */
+NTSTATUS WINAPI wow64_NtCreateSection( UINT *args )
+{
+ ULONG *handle_ptr = get_ptr( &args );
+ ACCESS_MASK access = get_ulong( &args );
+ OBJECT_ATTRIBUTES32 *attr32 = get_ptr( &args );
+ const LARGE_INTEGER *size = get_ptr( &args );
+ ULONG protect = get_ulong( &args );
+ ULONG flags = get_ulong( &args );
+ HANDLE file = get_handle( &args );
+
+ struct object_attr64 attr;
+ HANDLE handle = 0;
+ NTSTATUS status;
+
+ *handle_ptr = 0;
+ status = NtCreateSection( &handle, access, objattr_32to64( &attr, attr32 ), size, protect, flags, file );
+ put_handle( handle_ptr, handle );
+ return status;
+}
+
+
/**********************************************************************
* wow64_NtCreateSemaphore
*/
@@ -414,6 +469,26 @@ NTSTATUS WINAPI wow64_NtOpenMutant( UINT *args )
}
+/**********************************************************************
+ * wow64_NtOpenSection
+ */
+NTSTATUS WINAPI wow64_NtOpenSection( UINT *args )
+{
+ ULONG *handle_ptr = get_ptr( &args );
+ ACCESS_MASK access = get_ulong( &args );
+ OBJECT_ATTRIBUTES32 *attr32 = get_ptr( &args );
+
+ struct object_attr64 attr;
+ HANDLE handle = 0;
+ NTSTATUS status;
+
+ *handle_ptr = 0;
+ status = NtOpenSection( &handle, access, objattr_32to64( &attr, attr32 ));
+ put_handle( handle_ptr, handle );
+ return status;
+}
+
+
/**********************************************************************
* wow64_NtOpenSemaphore
*/
@@ -580,6 +655,59 @@ NTSTATUS WINAPI wow64_NtQueryPerformanceCounter( UINT *args )
}
+/**********************************************************************
+ * wow64_NtQuerySection
+ */
+NTSTATUS WINAPI wow64_NtQuerySection( UINT *args )
+{
+ HANDLE handle = get_handle( &args );
+ SECTION_INFORMATION_CLASS class = get_ulong( &args );
+ void *ptr = get_ptr( &args );
+ SIZE_T size = get_ulong( &args );
+ ULONG *ret_ptr = get_ptr( &args );
+
+ NTSTATUS status;
+ SIZE_T ret_size = 0;
+
+ switch (class)
+ {
+ case SectionBasicInformation:
+ {
+ SECTION_BASIC_INFORMATION info;
+ SECTION_BASIC_INFORMATION32 *info32 = ptr;
+
+ if (size < sizeof(*info32)) return STATUS_INFO_LENGTH_MISMATCH;
+ if (!(status = NtQuerySection( handle, class, &info, sizeof(info), &ret_size )))
+ {
+ info32->BaseAddress = PtrToUlong( info.BaseAddress );
+ info32->Attributes = info.Attributes;
+ info32->Size = info.Size;
+ ret_size = sizeof(*info32);
+ }
+ break;
+ }
+ case SectionImageInformation:
+ {
+ SECTION_IMAGE_INFORMATION info;
+ SECTION_IMAGE_INFORMATION32 *info32 = ptr;
+
+ if (size < sizeof(*info32)) return STATUS_INFO_LENGTH_MISMATCH;
+ if (!(status = NtQuerySection( handle, class, &info, sizeof(info), &ret_size )))
+ {
+ put_section_image_info( info32, &info );
+ ret_size = sizeof(*info32);
+ }
+ break;
+ }
+ default:
+ FIXME( "class %u not implemented\n", class );
+ return STATUS_NOT_IMPLEMENTED;
+ }
+ put_size( ret_ptr, ret_size );
+ return status;
+}
+
+
/**********************************************************************
* wow64_NtQuerySemaphore
*/
diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h
index 91552953088..3d57b6c3a15 100644
--- a/dlls/wow64/syscall.h
+++ b/dlls/wow64/syscall.h
@@ -35,6 +35,7 @@
SYSCALL_ENTRY( NtCreateJobObject ) \
SYSCALL_ENTRY( NtCreateKeyedEvent ) \
SYSCALL_ENTRY( NtCreateMutant ) \
+ SYSCALL_ENTRY( NtCreateSection ) \
SYSCALL_ENTRY( NtCreateSemaphore ) \
SYSCALL_ENTRY( NtCreateSymbolicLinkObject ) \
SYSCALL_ENTRY( NtCreateTimer ) \
@@ -49,6 +50,7 @@
SYSCALL_ENTRY( NtOpenJobObject ) \
SYSCALL_ENTRY( NtOpenKeyedEvent ) \
SYSCALL_ENTRY( NtOpenMutant ) \
+ SYSCALL_ENTRY( NtOpenSection ) \
SYSCALL_ENTRY( NtOpenSemaphore ) \
SYSCALL_ENTRY( NtOpenSymbolicLinkObject ) \
SYSCALL_ENTRY( NtOpenTimer ) \
@@ -62,6 +64,7 @@
SYSCALL_ENTRY( NtQueryIoCompletion ) \
SYSCALL_ENTRY( NtQueryMutant ) \
SYSCALL_ENTRY( NtQueryPerformanceCounter ) \
+ SYSCALL_ENTRY( NtQuerySection ) \
SYSCALL_ENTRY( NtQuerySemaphore ) \
SYSCALL_ENTRY( NtQuerySymbolicLinkObject ) \
SYSCALL_ENTRY( NtQueryTimer ) \
diff --git a/dlls/wow64/wow64_private.h b/dlls/wow64/wow64_private.h
index 9e3fd914045..c456c0d9352 100644
--- a/dlls/wow64/wow64_private.h
+++ b/dlls/wow64/wow64_private.h
@@ -137,4 +137,12 @@ static inline void put_handle( ULONG *handle32, HANDLE handle )
*handle32 = HandleToULong( handle );
}
+static inline void put_size( ULONG *size32, SIZE_T size )
+{
+ if (size32) *size32 = min( size, MAXDWORD );
+}
+
+extern void put_section_image_info( SECTION_IMAGE_INFORMATION32 *info32,
+ const SECTION_IMAGE_INFORMATION *info ) DECLSPEC_HIDDEN;
+
#endif /* __WOW64_PRIVATE_H */
More information about the wine-cvs
mailing list