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>
oldstable
Michael Müller 2017-04-28 17:59:41 +02:00 committed by Alexandre Julliard
parent e5ad8ae123
commit 5a96399b66
3 changed files with 31 additions and 2 deletions

View File

@ -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.@)
*

View File

@ -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)

View File

@ -2181,7 +2181,7 @@ static void test_LdrEnumerateLoadedModules(void)
if (!pLdrEnumerateLoadedModules)
{
skip("LdrEnumerateLoadedModules not available\n");
win_skip("LdrEnumerateLoadedModules not available\n");
return;
}