[PATCH v2] ntdll: Implement JobObjectBasicProcessIdList for NtQueryInformationJobObject.
Huw Davies
huw at codeweavers.com
Tue Sep 14 01:55:45 CDT 2021
On Mon, Sep 13, 2021 at 06:32:25PM +0300, Gabriel Ivăncescu wrote:
> Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
> ---
> dlls/kernel32/tests/process.c | 9 ---------
> dlls/ntdll/unix/sync.c | 35 ++++++++++++++++++++++++++++++++---
> server/process.c | 25 +++++++++++++++++++++++++
> server/protocol.def | 1 +
> 4 files changed, 58 insertions(+), 12 deletions(-)
>
> diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c
> index a13e53a..28f7083 100644
> --- a/dlls/ntdll/unix/sync.c
> +++ b/dlls/ntdll/unix/sync.c
> @@ -791,11 +791,40 @@ NTSTATUS WINAPI NtQueryInformationJobObject( HANDLE handle, JOBOBJECTINFOCLASS c
> case JobObjectBasicProcessIdList:
> {
> JOBOBJECT_BASIC_PROCESS_ID_LIST *process = info;
> + DWORD count, i;
>
> if (len < sizeof(*process)) return STATUS_INFO_LENGTH_MISMATCH;
> - memset( process, 0, sizeof(*process) );
> - if (ret_len) *ret_len = sizeof(*process);
> - return STATUS_SUCCESS;
> +
> + count = len - FIELD_OFFSET(JOBOBJECT_BASIC_PROCESS_ID_LIST, ProcessIdList);
> + count /= sizeof(process->ProcessIdList[0]);
> +
> + SERVER_START_REQ( get_job_info )
> + {
> + req->handle = wine_server_user_handle(handle);
> + wine_server_set_reply(req, process->ProcessIdList, count * sizeof(process_id_t));
> + if (!(ret = wine_server_call(req)))
> + {
> + process->NumberOfAssignedProcesses = reply->active_processes;
> + process->NumberOfProcessIdsInList = min(count, reply->active_processes);
> + }
> + }
> + SERVER_END_REQ;
> +
> + if (ret != STATUS_SUCCESS) return ret;
> +
> + if (sizeof(process_id_t) < sizeof(process->ProcessIdList[0]))
> + {
> + /* start from the end to not overwrite */
> + for (i = process->NumberOfProcessIdsInList; i--;)
> + {
> + ULONG_PTR id = ((process_id_t *)(process->ProcessIdList))[i];
> + process->ProcessIdList[i] = id;
> + }
> + }
> +
> + if (ret_len)
> + *ret_len = (char*)(&process->ProcessIdList[process->NumberOfProcessIdsInList]) - (char*)process;
I missed this last time, but I'd use FIELD_OFFSET() here to match the
"count" calculation above.
Otherwise, this looks good to me.
Huw.
More information about the wine-devel
mailing list