[2/2] ntdll: Implement LdrEnumerateLoadedModules.
Sebastian Lackner
sebastian at fds-team.de
Fri Apr 28 10:59:41 CDT 2017
From: Michael Müller <michael at fds-team.de>
Signed-off-by: Michael Müller <michael at fds-team.de>
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
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 cf758505a4..518a99f590 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 66618fc111..07944ed0fb 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 92b72138e4..7176e448ef 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;
}
--
2.12.2
More information about the wine-patches
mailing list