From 5a96399b66224a31d426084b3a57c121c1611382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Fri, 28 Apr 2017 17:59:41 +0200 Subject: [PATCH] ntdll: Implement LdrEnumerateLoadedModules. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michael Müller Signed-off-by: Sebastian Lackner Signed-off-by: Alexandre Julliard --- dlls/ntdll/loader.c | 29 +++++++++++++++++++++++++++++ dlls/ntdll/ntdll.spec | 2 +- dlls/ntdll/tests/rtl.c | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index cf758505a4c..518a99f5900 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -62,6 +62,7 @@ WINE_DECLARE_DEBUG_CHANNEL(pid); #define ISOLATIONAWARE_MANIFEST_RESOURCE_ID ((ULONG_PTR)2) typedef DWORD (CALLBACK *DLLENTRYPROC)(HMODULE,DWORD,LPVOID); +typedef void (CALLBACK *LDRENUMPROC)(LDR_MODULE *, void *, BOOLEAN *); static BOOL process_detaching = FALSE; /* set on process detach to avoid deadlocks with thread detach */ static int free_lib_count; /* recursion depth of LdrUnloadDll calls */ @@ -1393,6 +1394,34 @@ NTSTATUS WINAPI LdrFindEntryForAddress(const void* addr, PLDR_MODULE* pmod) return STATUS_NO_MORE_ENTRIES; } +/****************************************************************** + * LdrEnumerateLoadedModules (NTDLL.@) + */ +NTSTATUS WINAPI LdrEnumerateLoadedModules( void *unknown, LDRENUMPROC callback, void *context ) +{ + LIST_ENTRY *mark, *entry; + LDR_MODULE *mod; + BOOLEAN stop = FALSE; + + TRACE( "(%p, %p, %p)\n", unknown, callback, context ); + + if (unknown || !callback) + return STATUS_INVALID_PARAMETER; + + RtlEnterCriticalSection( &loader_section ); + + mark = &NtCurrentTeb()->Peb->LdrData->InMemoryOrderModuleList; + for (entry = mark->Flink; entry != mark; entry = entry->Flink) + { + mod = CONTAINING_RECORD( entry, LDR_MODULE, InMemoryOrderModuleList ); + callback( mod, context, &stop ); + if (stop) break; + } + + RtlLeaveCriticalSection( &loader_section ); + return STATUS_SUCCESS; +} + /****************************************************************** * LdrLockLoaderLock (NTDLL.@) * diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 66618fc111e..07944ed0fb9 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -62,7 +62,7 @@ # @ stub LdrDestroyOutOfProcessImage @ stdcall LdrDisableThreadCalloutsForDll(long) @ stub LdrEnumResources -# @ stub LdrEnumerateLoadedModules +@ stdcall LdrEnumerateLoadedModules(ptr ptr ptr) # @ stub LdrFindCreateProcessManifest @ stdcall LdrFindEntryForAddress(ptr ptr) @ stdcall LdrFindResourceDirectory_U(long ptr long ptr) diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c index 92b72138e43..7176e448ef8 100644 --- a/dlls/ntdll/tests/rtl.c +++ b/dlls/ntdll/tests/rtl.c @@ -2181,7 +2181,7 @@ static void test_LdrEnumerateLoadedModules(void) if (!pLdrEnumerateLoadedModules) { - skip("LdrEnumerateLoadedModules not available\n"); + win_skip("LdrEnumerateLoadedModules not available\n"); return; }