[PATCH 07/10] ntdll: Maintain list of loaded data modules.

Mark Harmstone mark at harmstone.com
Sat Mar 27 14:47:34 CDT 2021


Signed-off-by: Mark Harmstone <mark at harmstone.com>
---
 dlls/ntdll/mui.c | 66 +++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 62 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/mui.c b/dlls/ntdll/mui.c
index 36b1af72591..132525967bb 100644
--- a/dlls/ntdll/mui.c
+++ b/dlls/ntdll/mui.c
@@ -24,9 +24,30 @@
 #define WIN32_NO_STATUS
 #include "winternl.h"
 #include "wine/debug.h"
+#include "wine/list.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mui);
 
+static RTL_CRITICAL_SECTION data_modules_section;
+static RTL_CRITICAL_SECTION_DEBUG data_modules_critsect_debug =
+{
+    0, 0, &data_modules_section,
+    { &data_modules_critsect_debug.ProcessLocksList, &data_modules_critsect_debug.ProcessLocksList },
+    0, 0, { (DWORD_PTR)(__FILE__ ": data_modules_section") }
+};
+static RTL_CRITICAL_SECTION data_modules_section = { &data_modules_critsect_debug, -1, 0, 0, 0, 0 };
+
+typedef struct
+{
+    struct list entry;
+    HMODULE module;
+    SIZE_T size;
+    HANDLE handle;
+    WCHAR path[1];
+} data_module;
+
+static struct list data_modules = LIST_INIT(data_modules);
+
 /***********************************************************************
  *           RtlLCIDToCultureName (NTDLL.@)
  *
@@ -520,9 +541,30 @@ BOOLEAN WINAPI RtlLCIDToCultureName( LCID lcid, PUNICODE_STRING string )
  */
 NTSTATUS NTAPI LdrAddLoadAsDataTable( PVOID module, PWSTR file_path, SIZE_T size, HANDLE handle )
 {
-    FIXME("(%p, %s, %lx, %p)\n", module, debugstr_w(file_path), size, handle);
+    data_module *dm;
+    size_t path_len = wcslen( file_path );
+
+    TRACE("(%p, %s, %lx, %p)\n", module, debugstr_w(file_path), size, handle);
+
+    dm = RtlAllocateHeap( GetProcessHeap(), 0, offsetof(data_module, path) + ((path_len + 1) * sizeof(WCHAR)) );
+    if (!dm)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    dm->module = module;
+
+    if (file_path)
+        memcpy(dm->path, file_path, (path_len + 1) * sizeof(WCHAR));
+    else
+        dm->path[0] = 0;
+
+    dm->size = size;
+    dm->handle = handle;
 
-    return STATUS_NOT_IMPLEMENTED;
+    RtlEnterCriticalSection( &data_modules_section );
+    list_add_tail( &data_modules, &dm->entry );
+    RtlLeaveCriticalSection( &data_modules_section );
+
+    return STATUS_SUCCESS;
 }
 
 /***********************************************************************
@@ -534,7 +576,23 @@ NTSTATUS NTAPI LdrAddLoadAsDataTable( PVOID module, PWSTR file_path, SIZE_T size
 NTSTATUS NTAPI LdrRemoveLoadAsDataTable( PVOID init_module, PVOID *base_module, PSIZE_T size,
                                          ULONG flags )
 {
-    FIXME("(%p, %p, %p, %x)\n", init_module, base_module, size, flags);
+    data_module *dm;
+
+    TRACE("(%p, %p, %p, %x)\n", init_module, base_module, size, flags);
+
+    RtlEnterCriticalSection( &data_modules_section );
+
+    LIST_FOR_EACH_ENTRY( dm, &data_modules, data_module, entry )
+    {
+        if (dm->module == init_module)
+        {
+            list_remove( &dm->entry );
+            RtlFreeHeap( GetProcessHeap(), 0, dm );
+            break;
+        }
+    }
+
+    RtlLeaveCriticalSection( &data_modules_section );
 
-    return STATUS_NOT_IMPLEMENTED;
+    return STATUS_SUCCESS;
 }
-- 
2.26.3




More information about the wine-devel mailing list