Module: wine Branch: master Commit: 5a96399b66224a31d426084b3a57c121c1611382 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a96399b66224a31d426084b3a...
Author: Michael Müller michael@fds-team.de Date: Fri Apr 28 17:59:41 2017 +0200
ntdll: Implement LdrEnumerateLoadedModules.
Signed-off-by: Michael Müller michael@fds-team.de Signed-off-by: Sebastian Lackner sebastian@fds-team.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 cf75850..518a99f 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 */ @@ -1394,6 +1395,34 @@ NTSTATUS WINAPI LdrFindEntryForAddress(const void* addr, PLDR_MODULE* pmod) }
/****************************************************************** + * 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.@) * * Note: some flags are not implemented. diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 66618fc..07944ed 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 92b7213..7176e44 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; }