From: "Rémi Bernon" Subject: [PATCH] ntdll: Stub ThreadEnableAlignmentFaultFixup info class. Message-Id: <20201119085102.83503-1-rbernon@codeweavers.com> Date: Thu, 19 Nov 2020 09:51:02 +0100 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46216 Signed-off-by: Rémi Bernon --- These games DRMs are just calling this function with an invalid length. It seems harmless as it doesn't prevent them from running, but we can stub it a bit more. dlls/ntdll/tests/info.c | 32 ++++++++++++++++++++++++++++++++ dlls/ntdll/unix/thread.c | 11 +++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index 70ea7d5146b..afc6149277d 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -2505,6 +2505,36 @@ static void test_NtGetCurrentProcessorNumber(void) ok(status == STATUS_SUCCESS, "got 0x%x (expected STATUS_SUCCESS)\n", status); } +static void test_ThreadEnableAlignmentFaultFixup(void) +{ + NTSTATUS status; + HANDLE thread, stop_event; + ULONG dummy; + + dummy = 0; + status = NtQueryInformationThread( GetCurrentThread(), ThreadEnableAlignmentFaultFixup, &dummy, sizeof(ULONG), NULL ); + ok( status == STATUS_INVALID_INFO_CLASS || broken(STATUS_NOT_IMPLEMENTED), "Expected STATUS_INVALID_INFO_CLASS, got %08x\n", status ); + + dummy = 1; + status = pNtSetInformationThread( GetCurrentThread(), ThreadEnableAlignmentFaultFixup, &dummy, sizeof(ULONG) ); + ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status ); + status = pNtSetInformationThread( (HANDLE)0xdeadbeef, ThreadEnableAlignmentFaultFixup, NULL, 0 ); + ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status ); + status = pNtSetInformationThread( (HANDLE)0xdeadbeef, ThreadEnableAlignmentFaultFixup, NULL, 1 ); + ok( status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got %08x\n", status ); + status = pNtSetInformationThread( (HANDLE)0xdeadbeef, ThreadEnableAlignmentFaultFixup, &dummy, 1 ); + todo_wine ok( status == STATUS_INVALID_HANDLE, "Expected STATUS_INVALID_HANDLE, got %08x\n", status ); + status = pNtSetInformationThread( GetCurrentProcess(), ThreadEnableAlignmentFaultFixup, &dummy, 1 ); + todo_wine ok( status == STATUS_OBJECT_TYPE_MISMATCH, "Expected STATUS_OBJECT_TYPE_MISMATCH, got %08x\n", status ); + dummy = 1; + status = pNtSetInformationThread( GetCurrentThread(), ThreadEnableAlignmentFaultFixup, &dummy, 1 ); + ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status ); + + dummy = 0; + status = pNtSetInformationThread( GetCurrentProcess(), ThreadEnableAlignmentFaultFixup, &dummy, 8 ); + ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status ); +} + static DWORD WINAPI start_address_thread(void *arg) { PRTL_THREAD_START_ROUTINE entry; @@ -2774,4 +2804,6 @@ START_TEST(info) test_readvirtualmemory(); test_queryvirtualmemory(); test_NtGetCurrentProcessorNumber(); + + test_ThreadEnableAlignmentFaultFixup(); } diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c index a161c5d1c90..6c056497ab7 100644 --- a/dlls/ntdll/unix/thread.c +++ b/dlls/ntdll/unix/thread.c @@ -1093,10 +1093,12 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class, if (ret_len) *ret_len = sizeof(BOOLEAN); return STATUS_SUCCESS; + case ThreadEnableAlignmentFaultFixup: + return STATUS_INVALID_INFO_CLASS; + case ThreadPriority: case ThreadBasePriority: case ThreadImpersonationToken: - case ThreadEnableAlignmentFaultFixup: case ThreadEventPair_Reusable: case ThreadZeroTlsCell: case ThreadPerformanceCount: @@ -1272,11 +1274,16 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class, #endif } + case ThreadEnableAlignmentFaultFixup: + if (length != sizeof(BOOLEAN)) return STATUS_INFO_LENGTH_MISMATCH; + if (!data) return STATUS_ACCESS_VIOLATION; + FIXME( "ThreadEnableAlignmentFaultFixup stub!\n" ); + return STATUS_SUCCESS; + case ThreadBasicInformation: case ThreadTimes: case ThreadPriority: case ThreadDescriptorTableEntry: - case ThreadEnableAlignmentFaultFixup: case ThreadEventPair_Reusable: case ThreadPerformanceCount: case ThreadAmILastThread: -- 2.29.2