Alexandre Julliard : wow64: Add thunks for the process/thread set information syscalls.
Alexandre Julliard
julliard at winehq.org
Thu Jul 29 16:37:52 CDT 2021
Module: wine
Branch: master
Commit: ba74c5c6984bb19aade5ae0dfaa71b0f77d5786e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ba74c5c6984bb19aade5ae0dfaa71b0f77d5786e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jul 29 15:32:14 2021 +0200
wow64: Add thunks for the process/thread set information syscalls.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wow64/process.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++
dlls/wow64/struct32.h | 23 ++++++++
dlls/wow64/syscall.h | 2 +
3 files changed, 175 insertions(+)
diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c
index 61e3ca1e91b..44380535d9c 100644
--- a/dlls/wow64/process.c
+++ b/dlls/wow64/process.c
@@ -816,6 +816,156 @@ NTSTATUS WINAPI wow64_NtSetContextThread( UINT *args )
}
+/**********************************************************************
+ * wow64_NtSetInformationProcess
+ */
+NTSTATUS WINAPI wow64_NtSetInformationProcess( UINT *args )
+{
+ HANDLE handle = get_handle( &args );
+ PROCESSINFOCLASS class = get_ulong( &args );
+ void *ptr = get_ptr( &args );
+ ULONG len = get_ulong( &args );
+
+ NTSTATUS status;
+
+ switch (class)
+ {
+ case ProcessDefaultHardErrorMode: /* ULONG */
+ case ProcessPriorityClass: /* PROCESS_PRIORITY_CLASS */
+ return NtSetInformationProcess( handle, class, ptr, len );
+
+ case ProcessAffinityMask: /* ULONG_PTR */
+ if (len == sizeof(ULONG))
+ {
+ ULONG_PTR mask = *(ULONG *)ptr;
+ return NtSetInformationProcess( handle, class, &mask, sizeof(mask) );
+ }
+ else return STATUS_INVALID_PARAMETER;
+
+ case ProcessExecuteFlags: /* ULONG */
+ return STATUS_ACCESS_DENIED;
+
+ case ProcessInstrumentationCallback: /* PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION */
+ if (len == sizeof(PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION32))
+ {
+ FIXME( "ProcessInstrumentationCallback stub\n" );
+ return STATUS_SUCCESS;
+ }
+ else return STATUS_INFO_LENGTH_MISMATCH;
+
+ case ProcessThreadStackAllocation: /* PROCESS_STACK_ALLOCATION_INFORMATION(_EX) */
+ if (len == sizeof(PROCESS_STACK_ALLOCATION_INFORMATION_EX32))
+ {
+ PROCESS_STACK_ALLOCATION_INFORMATION_EX32 *stack = ptr;
+ PROCESS_STACK_ALLOCATION_INFORMATION_EX info;
+
+ info.PreferredNode = stack->PreferredNode;
+ info.Reserved0 = stack->Reserved0;
+ info.Reserved1 = stack->Reserved1;
+ info.Reserved2 = stack->Reserved2;
+ info.AllocInfo.ReserveSize = stack->AllocInfo.ReserveSize;
+ info.AllocInfo.ZeroBits = get_zero_bits( stack->AllocInfo.ZeroBits );
+ if (!(status = NtSetInformationProcess( handle, class, &info, sizeof(info) )))
+ stack->AllocInfo.StackBase = PtrToUlong( info.AllocInfo.StackBase );
+ return status;
+ }
+ else if (len == sizeof(PROCESS_STACK_ALLOCATION_INFORMATION32))
+ {
+ PROCESS_STACK_ALLOCATION_INFORMATION32 *stack = ptr;
+ PROCESS_STACK_ALLOCATION_INFORMATION info;
+
+ info.ReserveSize = stack->ReserveSize;
+ info.ZeroBits = stack->ZeroBits ? stack->ZeroBits : 0x7fffffff;
+ if (!(status = NtSetInformationProcess( handle, class, &info, sizeof(info) )))
+ stack->StackBase = PtrToUlong( info.StackBase );
+ return status;
+ }
+ else return STATUS_INFO_LENGTH_MISMATCH;
+
+ case ProcessWineMakeProcessSystem: /* HANDLE* */
+ if (len == sizeof(ULONG))
+ {
+ HANDLE event = 0;
+ status = NtSetInformationProcess( handle, class, &event, sizeof(HANDLE *) );
+ put_handle( ptr, event );
+ return status;
+ }
+ else return STATUS_INFO_LENGTH_MISMATCH;
+
+ default:
+ FIXME( "unsupported class %u\n", class );
+ return STATUS_INVALID_INFO_CLASS;
+ }
+}
+
+
+/**********************************************************************
+ * wow64_NtSetInformationThread
+ */
+NTSTATUS WINAPI wow64_NtSetInformationThread( UINT *args )
+{
+ HANDLE handle = get_handle( &args );
+ THREADINFOCLASS class = get_ulong( &args );
+ void *ptr = get_ptr( &args );
+ ULONG len = get_ulong( &args );
+
+ switch (class)
+ {
+ case ThreadZeroTlsCell: /* ULONG */
+ case ThreadBasePriority: /* ULONG */
+ case ThreadHideFromDebugger: /* void */
+ case ThreadEnableAlignmentFaultFixup: /* BOOLEAN */
+ return NtSetInformationThread( handle, class, ptr, len );
+
+ case ThreadImpersonationToken: /* HANDLE */
+ if (len == sizeof(ULONG))
+ {
+ HANDLE token = LongToHandle( *(ULONG *)ptr );
+ return NtSetInformationThread( handle, class, &token, sizeof(token) );
+ }
+ else return STATUS_INVALID_PARAMETER;
+
+ case ThreadAffinityMask: /* ULONG_PTR */
+ case ThreadQuerySetWin32StartAddress: /* PRTL_THREAD_START_ROUTINE */
+ if (len == sizeof(ULONG))
+ {
+ ULONG_PTR mask = *(ULONG *)ptr;
+ return NtSetInformationThread( handle, class, &mask, sizeof(mask) );
+ }
+ else return STATUS_INVALID_PARAMETER;
+
+ case ThreadWow64Context: /* WOW64_CONTEXT* */
+ return STATUS_INVALID_INFO_CLASS;
+
+ case ThreadGroupInformation: /* GROUP_AFFINITY */
+ if (len == sizeof(GROUP_AFFINITY32))
+ {
+ GROUP_AFFINITY32 *info32 = ptr;
+ GROUP_AFFINITY info = { info32->Mask, info32->Group };
+
+ return NtSetInformationThread( handle, class, &info, sizeof(info) );
+ }
+ else return STATUS_INVALID_PARAMETER;
+
+ case ThreadDescription: /* THREAD_DESCRIPTION_INFORMATION */
+ if (len == sizeof(THREAD_DESCRIPTION_INFORMATION32))
+ {
+ THREAD_DESCRIPTION_INFORMATION32 *info32 = ptr;
+ THREAD_DESCRIPTION_INFORMATION info;
+
+ if (!unicode_str_32to64( &info.Description, &info32->Description ))
+ return STATUS_ACCESS_VIOLATION;
+ return NtSetInformationThread( handle, class, &info, sizeof(info) );
+ }
+ else return STATUS_INFO_LENGTH_MISMATCH;
+
+ default:
+ FIXME( "unsupported class %u\n", class );
+ return STATUS_INVALID_INFO_CLASS;
+ }
+}
+
+
/**********************************************************************
* wow64_NtSetThreadExecutionState
*/
diff --git a/dlls/wow64/struct32.h b/dlls/wow64/struct32.h
index 1955b6e16e5..6d5fa86af2b 100644
--- a/dlls/wow64/struct32.h
+++ b/dlls/wow64/struct32.h
@@ -153,6 +153,29 @@ typedef struct
ULONG InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION32;
+typedef struct
+{
+ ULONG Version;
+ ULONG Reserved;
+ ULONG Callback;
+} PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION32;
+
+typedef struct
+{
+ ULONG ReserveSize;
+ ULONG ZeroBits;
+ ULONG StackBase;
+} PROCESS_STACK_ALLOCATION_INFORMATION32;
+
+typedef struct
+{
+ ULONG PreferredNode;
+ ULONG Reserved0;
+ ULONG Reserved1;
+ ULONG Reserved2;
+ PROCESS_STACK_ALLOCATION_INFORMATION32 AllocInfo;
+} PROCESS_STACK_ALLOCATION_INFORMATION_EX32;
+
typedef struct
{
ULONG Size;
diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h
index 20f70bddda1..77b380cac8d 100644
--- a/dlls/wow64/syscall.h
+++ b/dlls/wow64/syscall.h
@@ -168,6 +168,8 @@
SYSCALL_ENTRY( NtSetInformationFile ) \
SYSCALL_ENTRY( NtSetInformationKey ) \
SYSCALL_ENTRY( NtSetInformationObject ) \
+ SYSCALL_ENTRY( NtSetInformationProcess ) \
+ SYSCALL_ENTRY( NtSetInformationThread ) \
SYSCALL_ENTRY( NtSetIoCompletion ) \
SYSCALL_ENTRY( NtSetPowerRequest ) \
SYSCALL_ENTRY( NtSetThreadExecutionState ) \
More information about the wine-cvs
mailing list