[PATCH 3/4] ntdll: Implement LdrGetDllFullName.

Paul Gofman pgofman at codeweavers.com
Mon Sep 27 18:58:47 CDT 2021


From: Alex Henrie <alexhenrie24 at gmail.com>

Changes from the original patch:
    - Access module data inside loader lock.
    - Add function prototype to winternl.h.

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/kernel32/tests/module.c |  2 +-
 dlls/ntdll/loader.c          | 26 ++++++++++++++++++++++++++
 dlls/ntdll/ntdll.spec        |  1 +
 include/winternl.h           |  1 +
 4 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c
index eac4f478293..2487b9d65ab 100644
--- a/dlls/kernel32/tests/module.c
+++ b/dlls/kernel32/tests/module.c
@@ -1278,7 +1278,7 @@ static void test_LdrGetDllFullName(void)
 
     if (!pLdrGetDllFullName)
     {
-        skip( "LdrGetDllFullName not available.\n" );
+        win_skip( "LdrGetDllFullName not available.\n" );
         return;
     }
 
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 3e3f991eba2..66886ad349a 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -2995,6 +2995,32 @@ NTSTATUS WINAPI DECLSPEC_HOTPATCH LdrLoadDll(LPCWSTR path_name, DWORD flags,
 }
 
 
+/******************************************************************
+ *		LdrGetDllFullName (NTDLL.@)
+ */
+NTSTATUS WINAPI LdrGetDllFullName( HMODULE module, UNICODE_STRING *name )
+{
+    WINE_MODREF *wm;
+    NTSTATUS status;
+
+    TRACE( "module %p, name %p.\n", module, name );
+
+    if (!module) module = NtCurrentTeb()->Peb->ImageBaseAddress;
+
+    RtlEnterCriticalSection( &loader_section );
+    wm = get_modref( module );
+    if (wm)
+    {
+        RtlCopyUnicodeString( name, &wm->ldr.FullDllName );
+        if (name->MaximumLength < wm->ldr.FullDllName.Length + sizeof(WCHAR)) status = STATUS_BUFFER_TOO_SMALL;
+        else                                                                  status = STATUS_SUCCESS;
+    } else status = STATUS_DLL_NOT_FOUND;
+    RtlLeaveCriticalSection( &loader_section );
+
+    return status;
+}
+
+
 /******************************************************************
  *		LdrGetDllHandleEx (NTDLL.@)
  */
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index e7ac08e94ba..13e65f65139 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -87,6 +87,7 @@
 @ stdcall LdrFindResource_U(long ptr long ptr)
 @ stub LdrFlushAlternateResourceModules
 @ stdcall LdrGetDllDirectory(ptr)
+@ stdcall LdrGetDllFullName(long ptr)
 @ stdcall LdrGetDllHandle(wstr long ptr ptr)
 @ stdcall LdrGetDllHandleEx(long ptr ptr ptr ptr)
 # @ stub LdrGetDllHandleEx
diff --git a/include/winternl.h b/include/winternl.h
index 94d781ea412..b6f93c116d8 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -3791,6 +3791,7 @@ NTSYSAPI NTSTATUS  WINAPI LdrGetDllDirectory(UNICODE_STRING*);
 NTSYSAPI NTSTATUS  WINAPI LdrGetDllHandle(LPCWSTR, ULONG, const UNICODE_STRING*, HMODULE*);
 NTSYSAPI NTSTATUS  WINAPI LdrGetDllHandleEx(ULONG, LPCWSTR, ULONG *, const UNICODE_STRING*, HMODULE*);
 NTSYSAPI NTSTATUS  WINAPI LdrGetDllPath(PCWSTR,ULONG,PWSTR*,PWSTR*);
+NTSYSAPI NTSTATUS  WINAPI LdrGetDllFullName(HMODULE, UNICODE_STRING*);
 NTSYSAPI NTSTATUS  WINAPI LdrGetProcedureAddress(HMODULE, const ANSI_STRING*, ULONG, void**);
 NTSYSAPI NTSTATUS  WINAPI LdrLoadDll(LPCWSTR, DWORD, const UNICODE_STRING*, HMODULE*);
 NTSYSAPI NTSTATUS  WINAPI LdrLockLoaderLock(ULONG,ULONG*,ULONG_PTR*);
-- 
2.31.1




More information about the wine-devel mailing list