From 26fbff05a1e39a3c910ff778e2229c674a0569c5 Mon Sep 17 00:00:00 2001 From: Paul Gofman Date: Fri, 29 May 2020 10:53:10 +0300 Subject: [PATCH] ntoskrnl.exe: Implement image load notify routines registration. Signed-off-by: Paul Gofman Signed-off-by: Alexandre Julliard --- dlls/ntoskrnl.exe/ntoskrnl.c | 28 ++++++++++++++++++++++++---- include/ddk/ntddk.h | 1 + 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index e9c35cf7e31..94733ec60a0 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -85,6 +85,9 @@ static DWORD client_tid; static HANDLE ntoskrnl_heap; +static PLOAD_IMAGE_NOTIFY_ROUTINE load_image_notify_routines[8]; +static unsigned int load_image_notify_routine_count; + struct wine_driver { DRIVER_OBJECT driver_obj; @@ -3001,10 +3004,21 @@ NTSTATUS WINAPI PsRemoveCreateThreadNotifyRoutine( PCREATE_THREAD_NOTIFY_ROUTINE /*********************************************************************** * PsRemoveLoadImageNotifyRoutine (NTOSKRNL.EXE.@) */ - NTSTATUS WINAPI PsRemoveLoadImageNotifyRoutine(PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine) +NTSTATUS WINAPI PsRemoveLoadImageNotifyRoutine(PLOAD_IMAGE_NOTIFY_ROUTINE routine) { - FIXME( "stub: %p\n", NotifyRoutine ); - return STATUS_SUCCESS; + unsigned int i; + + TRACE("routine %p.\n", routine); + + for (i = 0; i < load_image_notify_routine_count; ++i) + if (load_image_notify_routines[i] == routine) + { + --load_image_notify_routine_count; + memmove(&load_image_notify_routines[i], &load_image_notify_routines[i + 1], + sizeof(*load_image_notify_routines) * (load_image_notify_routine_count - i)); + return STATUS_SUCCESS; + } + return STATUS_PROCEDURE_NOT_FOUND; } @@ -3160,7 +3174,13 @@ NTSTATUS WINAPI IoWMIOpenBlock(LPCGUID guid, ULONG desired_access, PVOID *data_b */ NTSTATUS WINAPI PsSetLoadImageNotifyRoutine(PLOAD_IMAGE_NOTIFY_ROUTINE routine) { - FIXME("(%p) stub\n", routine); + FIXME("routine %p, semi-stub.\n", routine); + + if (load_image_notify_routine_count == ARRAY_SIZE(load_image_notify_routines)) + return STATUS_INSUFFICIENT_RESOURCES; + + load_image_notify_routines[load_image_notify_routine_count++] = routine; + return STATUS_SUCCESS; } diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h index e3c91240231..2b05fda7118 100644 --- a/include/ddk/ntddk.h +++ b/include/ddk/ntddk.h @@ -231,6 +231,7 @@ BOOLEAN WINAPI MmIsAddressValid(void *); HANDLE WINAPI PsGetProcessId(PEPROCESS); HANDLE WINAPI PsGetThreadId(PETHREAD); HANDLE WINAPI PsGetThreadProcessId(PETHREAD); +NTSTATUS WINAPI PsRemoveLoadImageNotifyRoutine(PLOAD_IMAGE_NOTIFY_ROUTINE); NTSTATUS WINAPI PsSetCreateProcessNotifyRoutine(PCREATE_PROCESS_NOTIFY_ROUTINE,BOOLEAN); NTSTATUS WINAPI PsSetCreateProcessNotifyRoutineEx(PCREATE_PROCESS_NOTIFY_ROUTINE_EX,BOOLEAN); NTSTATUS WINAPI PsSetCreateThreadNotifyRoutine(PCREATE_THREAD_NOTIFY_ROUTINE);