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; }