From eb1146a50056b7b4b4f1f44be0e71e97f8ba2c80 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 29 Apr 2019 16:01:34 +0200 Subject: [PATCH] ntoskrnl.exe: Implement PsGetProcessId. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/ntoskrnl.exe/ntoskrnl.c | 20 ++++++++++---------- dlls/ntoskrnl.exe/ntoskrnl_private.h | 4 +++- dlls/ntoskrnl.exe/tests/driver.c | 2 ++ include/ddk/ntddk.h | 1 + 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 48e9656a156..9d78fa7796a 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -2462,6 +2462,7 @@ static void *create_process_object( HANDLE handle ) process->header.Type = 3; process->header.WaitListHead.Blink = INVALID_HANDLE_VALUE; /* mark as kernel object */ + NtQueryInformationProcess( handle, ProcessBasicInformation, &process->info, sizeof(process->info), NULL ); return process; } @@ -2503,6 +2504,15 @@ NTSTATUS WINAPI PsLookupProcessByProcessId( HANDLE processid, PEPROCESS *process return status; } +/********************************************************************* + * PsGetProcessId (NTOSKRNL.@) + */ +HANDLE WINAPI PsGetProcessId(PEPROCESS process) +{ + TRACE( "%p -> %lx\n", process, process->info.UniqueProcessId ); + return (HANDLE)process->info.UniqueProcessId; +} + static void *create_thread_object( HANDLE handle ) { @@ -4239,16 +4249,6 @@ void WINAPI ExfUnblockPushLock( EX_PUSH_LOCK *lock, PEX_PUSH_LOCK_WAIT_BLOCK blo FIXME( "stub: %p, %p\n", lock, block ); } -/********************************************************************* - * PsGetProcessId (NTOSKRNL.@) - */ -HANDLE WINAPI PsGetProcessId(PEPROCESS process) -{ - FIXME("stub: %p\n", process); - - return 0; -} - /********************************************************************* * FsRtlRegisterFileSystemFilterCallbacks (NTOSKRNL.@) */ diff --git a/dlls/ntoskrnl.exe/ntoskrnl_private.h b/dlls/ntoskrnl.exe/ntoskrnl_private.h index 126505694bd..295ff7397c1 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl_private.h +++ b/dlls/ntoskrnl.exe/ntoskrnl_private.h @@ -28,8 +28,10 @@ struct _OBJECT_TYPE void (*release)(void*); /* called when the last reference is released */ }; -struct _EPROCESS { +struct _EPROCESS +{ DISPATCHER_HEADER header; + PROCESS_BASIC_INFORMATION info; }; struct _KTHREAD diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 66fdcafa4a8..0fe7ad3280b 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -334,6 +334,8 @@ static void test_currentprocess(void) ret = wait_single(current, 0); ok(ret == STATUS_TIMEOUT, "got %#x\n", ret); + ok(PsGetProcessId(current) == PsGetCurrentProcessId(), "process IDs don't match\n"); + thread = PsGetCurrentThread(); ret = wait_single( thread, 0 ); ok(ret == STATUS_TIMEOUT, "got %#x\n", ret); diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h index 719ba67c6a4..68599bf7d2a 100644 --- a/include/ddk/ntddk.h +++ b/include/ddk/ntddk.h @@ -216,6 +216,7 @@ NTSTATUS WINAPI IoRegisterShutdownNotification(PDEVICE_OBJECT); NTSTATUS WINAPI KeExpandKernelStackAndCallout(PEXPAND_STACK_CALLOUT,void*,SIZE_T); void WINAPI KeSetTargetProcessorDpc(PRKDPC,CCHAR); BOOLEAN WINAPI MmIsAddressValid(void *); +HANDLE WINAPI PsGetProcessId(PEPROCESS); NTSTATUS WINAPI PsSetLoadImageNotifyRoutine(PLOAD_IMAGE_NOTIFY_ROUTINE); void WINAPI RtlInitializeGenericTableAvl(PRTL_AVL_TABLE,PRTL_AVL_COMPARE_ROUTINE,PRTL_AVL_ALLOCATE_ROUTINE, PRTL_AVL_FREE_ROUTINE,void *); void WINAPI RtlInsertElementGenericTableAvl(PRTL_AVL_TABLE,void *,ULONG,BOOL*);