ntdll: Relax checks for valid affinity mask in NtSetInformationThread().
Signed-off-by: Roger Zoellner <zoellner.roger@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3b0d064283
commit
575c1c9066
|
@ -2049,6 +2049,27 @@ static void test_affinity(void)
|
|||
ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status);
|
||||
ok( tbi.AffinityMask == 1, "Unexpected thread affinity\n" );
|
||||
|
||||
/* NOTE: Pre-Vista does not allow bits to be set that are higher than the highest set bit in process affinity mask */
|
||||
thread_affinity = (pbi.AffinityMask << 1) | pbi.AffinityMask;
|
||||
status = pNtSetInformationThread( GetCurrentThread(), ThreadAffinityMask, &thread_affinity, sizeof(thread_affinity) );
|
||||
ok( broken(status == STATUS_INVALID_PARAMETER) || (status == STATUS_SUCCESS), "Expected STATUS_SUCCESS, got %08x\n", status );
|
||||
if (status == STATUS_SUCCESS)
|
||||
{
|
||||
status = pNtQueryInformationThread( GetCurrentThread(), ThreadBasicInformation, &tbi, sizeof(tbi), NULL );
|
||||
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status );
|
||||
ok( tbi.AffinityMask == pbi.AffinityMask, "Unexpected thread affinity. Expected %lx, got %lx\n", pbi.AffinityMask, tbi.AffinityMask );
|
||||
}
|
||||
|
||||
thread_affinity = ~(DWORD_PTR)0 - 1;
|
||||
status = pNtSetInformationThread( GetCurrentThread(), ThreadAffinityMask, &thread_affinity, sizeof(thread_affinity) );
|
||||
ok( broken(status == STATUS_INVALID_PARAMETER) || (status == STATUS_SUCCESS), "Expected STATUS_SUCCESS, got %08x\n", status );
|
||||
if (status == STATUS_SUCCESS)
|
||||
{
|
||||
status = pNtQueryInformationThread( GetCurrentThread(), ThreadBasicInformation, &tbi, sizeof(tbi), NULL );
|
||||
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status );
|
||||
ok( tbi.AffinityMask == (pbi.AffinityMask & (~(DWORD_PTR)0 - 1)), "Unexpected thread affinity. Expected %lx, got %lx\n", pbi.AffinityMask & (~(DWORD_PTR)0 - 1), tbi.AffinityMask );
|
||||
}
|
||||
|
||||
/* NOTE: Pre-Vista does not recognize the "all processors" flag (all bits set) */
|
||||
thread_affinity = ~(DWORD_PTR)0;
|
||||
status = pNtSetInformationThread( GetCurrentThread(), ThreadAffinityMask, &thread_affinity, sizeof(thread_affinity) );
|
||||
|
|
|
@ -1288,10 +1288,9 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class,
|
|||
ULONG_PTR req_aff;
|
||||
|
||||
if (length != sizeof(ULONG_PTR)) return STATUS_INVALID_PARAMETER;
|
||||
req_aff = *(const ULONG_PTR *)data;
|
||||
if ((ULONG)req_aff == ~0u) req_aff = affinity_mask;
|
||||
else if (req_aff & ~affinity_mask) return STATUS_INVALID_PARAMETER;
|
||||
else if (!req_aff) return STATUS_INVALID_PARAMETER;
|
||||
req_aff = *(const ULONG_PTR *)data & affinity_mask;
|
||||
if (!req_aff) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
SERVER_START_REQ( set_thread_info )
|
||||
{
|
||||
req->handle = wine_server_obj_handle( handle );
|
||||
|
|
Loading…
Reference in New Issue