ntdll: Implement ThreadGroupInformation class.
Signed-off-by: Michael Müller <michael@fds-team.de> Signed-off-by: Sebastian Lackner <sebastian@fds-team.de>
This commit is contained in:
parent
86b1e74f5c
commit
55ae09068b
|
@ -1103,6 +1103,29 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class,
|
||||||
SERVER_END_REQ;
|
SERVER_END_REQ;
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
case ThreadGroupInformation:
|
||||||
|
{
|
||||||
|
const ULONG_PTR affinity_mask = get_system_affinity_mask();
|
||||||
|
GROUP_AFFINITY affinity;
|
||||||
|
|
||||||
|
memset(&affinity, 0, sizeof(affinity));
|
||||||
|
affinity.Group = 0; /* Wine only supports max 64 processors */
|
||||||
|
|
||||||
|
SERVER_START_REQ( get_thread_info )
|
||||||
|
{
|
||||||
|
req->handle = wine_server_obj_handle( handle );
|
||||||
|
req->tid_in = 0;
|
||||||
|
if (!(status = wine_server_call( req )))
|
||||||
|
affinity.Mask = reply->affinity & affinity_mask;
|
||||||
|
}
|
||||||
|
SERVER_END_REQ;
|
||||||
|
if (status == STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
if (data) memcpy( data, &affinity, min( length, sizeof(affinity) ));
|
||||||
|
if (ret_len) *ret_len = min( length, sizeof(affinity) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status;
|
||||||
case ThreadPriority:
|
case ThreadPriority:
|
||||||
case ThreadBasePriority:
|
case ThreadBasePriority:
|
||||||
case ThreadImpersonationToken:
|
case ThreadImpersonationToken:
|
||||||
|
@ -1233,6 +1256,33 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class,
|
||||||
SERVER_END_REQ;
|
SERVER_END_REQ;
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
|
case ThreadGroupInformation:
|
||||||
|
{
|
||||||
|
const ULONG_PTR affinity_mask = get_system_affinity_mask();
|
||||||
|
const GROUP_AFFINITY *req_aff;
|
||||||
|
|
||||||
|
if (length != sizeof(*req_aff)) return STATUS_INVALID_PARAMETER;
|
||||||
|
if (!data) return STATUS_ACCESS_VIOLATION;
|
||||||
|
req_aff = data;
|
||||||
|
|
||||||
|
/* On Windows the request fails if the reserved fields are set */
|
||||||
|
if (req_aff->Reserved[0] || req_aff->Reserved[1] || req_aff->Reserved[2])
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* Wine only supports max 64 processors */
|
||||||
|
if (req_aff->Group) return STATUS_INVALID_PARAMETER;
|
||||||
|
if (req_aff->Mask & ~affinity_mask) return STATUS_INVALID_PARAMETER;
|
||||||
|
if (!req_aff->Mask) return STATUS_INVALID_PARAMETER;
|
||||||
|
SERVER_START_REQ( set_thread_info )
|
||||||
|
{
|
||||||
|
req->handle = wine_server_obj_handle( handle );
|
||||||
|
req->affinity = req_aff->Mask;
|
||||||
|
req->mask = SET_THREAD_INFO_AFFINITY;
|
||||||
|
status = wine_server_call( req );
|
||||||
|
}
|
||||||
|
SERVER_END_REQ;
|
||||||
|
}
|
||||||
|
return status;
|
||||||
case ThreadBasicInformation:
|
case ThreadBasicInformation:
|
||||||
case ThreadTimes:
|
case ThreadTimes:
|
||||||
case ThreadPriority:
|
case ThreadPriority:
|
||||||
|
|
|
@ -859,6 +859,22 @@ typedef enum _THREADINFOCLASS {
|
||||||
ThreadSetTlsArrayAddress,
|
ThreadSetTlsArrayAddress,
|
||||||
ThreadIsIoPending,
|
ThreadIsIoPending,
|
||||||
ThreadHideFromDebugger,
|
ThreadHideFromDebugger,
|
||||||
|
ThreadBreakOnTermination,
|
||||||
|
ThreadSwitchLegacyState,
|
||||||
|
ThreadIsTerminated,
|
||||||
|
ThreadLastSystemCall,
|
||||||
|
ThreadIoPriority,
|
||||||
|
ThreadCycleTime,
|
||||||
|
ThreadPagePriority,
|
||||||
|
ThreadActualBasePriority,
|
||||||
|
ThreadTebInformation,
|
||||||
|
ThreadCSwitchMon,
|
||||||
|
ThreadCSwitchPmu,
|
||||||
|
ThreadWow64Context,
|
||||||
|
ThreadGroupInformation,
|
||||||
|
ThreadUmsInformation,
|
||||||
|
ThreadCounterProfiling,
|
||||||
|
ThreadIdealProcessorEx,
|
||||||
MaxThreadInfoClass
|
MaxThreadInfoClass
|
||||||
} THREADINFOCLASS;
|
} THREADINFOCLASS;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue