From 4f58d8144c5c1d3b86e988f925de7eb02c848e6f Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 9 Dec 2021 10:43:56 +0100 Subject: [PATCH] ntdll: Remove __wine_init_unix_lib() and the old Unix library interface. Signed-off-by: Alexandre Julliard --- dlls/ntdll/loader.c | 24 --------- dlls/ntdll/ntdll.spec | 1 - dlls/ntdll/unix/loader.c | 98 +--------------------------------- dlls/ntdll/unix/unix_private.h | 4 +- dlls/ntdll/unix/virtual.c | 62 ++------------------- dlls/ntdll/unixlib.h | 3 +- dlls/winecrt0/unix_lib.c | 12 ----- include/winternl.h | 2 +- 8 files changed, 9 insertions(+), 197 deletions(-) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index c33acd71759..d11f3f0f79d 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -3041,24 +3041,6 @@ done: } -/*********************************************************************** - * __wine_init_unix_lib - */ -NTSTATUS __cdecl __wine_init_unix_lib( HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out ) -{ - WINE_MODREF *wm; - NTSTATUS ret; - - RtlEnterCriticalSection( &loader_section ); - - if ((wm = get_modref( module ))) ret = unix_funcs->init_unix_lib( module, reason, ptr_in, ptr_out ); - else ret = STATUS_INVALID_HANDLE; - - RtlLeaveCriticalSection( &loader_section ); - return ret; -} - - /*********************************************************************** * __wine_ctrl_routine */ @@ -4450,11 +4432,6 @@ static void CDECL init_builtin_dll_fallback( void *module ) { } -static NTSTATUS CDECL init_unix_lib_fallback( void *module, DWORD reason, const void *ptr_in, void *ptr_out ) -{ - return STATUS_DLL_NOT_FOUND; -} - static NTSTATUS CDECL unwind_builtin_dll_fallback( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, CONTEXT *context ) { @@ -4472,7 +4449,6 @@ static const struct unix_funcs unix_fallbacks = { load_so_dll_fallback, init_builtin_dll_fallback, - init_unix_lib_fallback, unwind_builtin_dll_fallback, RtlGetSystemTimePrecise_fallback, }; diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 85bc32a1a15..4f6ed7683bd 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1633,7 +1633,6 @@ @ stdcall -syscall __wine_unix_call(int64 long ptr) @ stdcall -syscall __wine_unix_spawnvp(long ptr) @ cdecl __wine_set_unix_funcs(long ptr) -@ cdecl __wine_init_unix_lib(long long ptr ptr) @ stdcall __wine_ctrl_routine(ptr) @ extern __wine_syscall_dispatcher @ extern -arch=i386 __wine_ldt_copy diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 82d099de3be..ba56b5e20d5 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -1019,21 +1019,6 @@ static ULONG_PTR find_named_export( HMODULE module, const IMAGE_EXPORT_DIRECTORY return 0; } -static ULONG_PTR find_pe_export( HMODULE module, const IMAGE_EXPORT_DIRECTORY *exports, - const IMAGE_IMPORT_BY_NAME *name ) -{ - const WORD *ordinals = (const WORD *)((BYTE *)module + exports->AddressOfNameOrdinals); - const DWORD *names = (const DWORD *)((BYTE *)module + exports->AddressOfNames); - - if (name->Hint < exports->NumberOfNames) - { - char *ename = (char *)module + names[name->Hint]; - if (!strcmp( ename, (char *)name->Name )) - return find_ordinal_export( module, exports, ordinals[name->Hint] ); - } - return find_named_export( module, exports, (char *)name->Name ); -} - static inline void *get_rva( void *module, ULONG_PTR addr ) { return (BYTE *)module + addr; @@ -1055,49 +1040,6 @@ static const void *get_module_data_dir( HMODULE module, ULONG dir, ULONG *size ) return get_rva( module, data->VirtualAddress ); } -static NTSTATUS fixup_ntdll_imports( const char *name, HMODULE module ) -{ - const IMAGE_IMPORT_DESCRIPTOR *descr; - const IMAGE_THUNK_DATA *import_list; - IMAGE_THUNK_DATA *thunk_list; - - if (!(descr = get_module_data_dir( module, IMAGE_FILE_IMPORT_DIRECTORY, NULL ))) return STATUS_SUCCESS; - for (; descr->Name && descr->FirstThunk; descr++) - { - thunk_list = get_rva( module, descr->FirstThunk ); - - /* ntdll must be the only import */ - if (strcmp( get_rva( module, descr->Name ), "ntdll.dll" )) - { - ERR( "module %s is importing %s\n", debugstr_a(name), (char *)get_rva( module, descr->Name )); - return STATUS_PROCEDURE_NOT_FOUND; - } - if (descr->u.OriginalFirstThunk) - import_list = get_rva( module, descr->u.OriginalFirstThunk ); - else - import_list = thunk_list; - - while (import_list->u1.Ordinal) - { - if (IMAGE_SNAP_BY_ORDINAL( import_list->u1.Ordinal )) - { - int ordinal = IMAGE_ORDINAL( import_list->u1.Ordinal ) - ntdll_exports->Base; - thunk_list->u1.Function = find_ordinal_export( ntdll_module, ntdll_exports, ordinal ); - if (!thunk_list->u1.Function) ERR( "%s: ntdll.%u not found\n", debugstr_a(name), ordinal ); - } - else /* import by name */ - { - IMAGE_IMPORT_BY_NAME *pe_name = get_rva( module, import_list->u1.AddressOfData ); - thunk_list->u1.Function = find_pe_export( ntdll_module, ntdll_exports, pe_name ); - if (!thunk_list->u1.Function) ERR( "%s: ntdll.%s not found\n", debugstr_a(name), pe_name->Name ); - } - import_list++; - thunk_list++; - } - } - return STATUS_SUCCESS; -} - static void load_ntdll_functions( HMODULE module ) { ntdll_exports = get_module_data_dir( module, IMAGE_FILE_EXPORT_DIRECTORY, NULL ); @@ -1384,38 +1326,6 @@ already_loaded: } -/*********************************************************************** - * init_unix_lib - */ -static NTSTATUS CDECL init_unix_lib( void *module, DWORD reason, const void *ptr_in, void *ptr_out ) -{ - NTSTATUS (CDECL *init_func)( HMODULE, DWORD, const void *, void * ); - const IMAGE_NT_HEADERS *nt; - const char *name; - void *handle, *entry, *unix_module; - NTSTATUS status; - - if ((status = get_builtin_unix_info( module, &name, &handle, &entry ))) return status; - - if (!entry) - { - if (!name || !handle) return STATUS_DLL_NOT_FOUND; - - if (!(nt = dlsym( handle, "__wine_spec_nt_header" )) || - !(entry = dlsym( handle, "__wine_init_unix_lib" ))) - return STATUS_INVALID_IMAGE_FORMAT; - - TRACE( "loaded %s for %p\n", debugstr_a(name), module ); - unix_module = (void *)((nt->OptionalHeader.ImageBase + 0xffff) & ~0xffff); - map_so_dll( nt, unix_module ); - fixup_ntdll_imports( name, unix_module ); - set_builtin_unix_entry( module, entry ); - } - init_func = entry; - return init_func( module, reason, ptr_in, ptr_out ); -} - - /*********************************************************************** * ntdll_init_syscalls */ @@ -1716,13 +1626,8 @@ static NTSTATUS find_builtin_dll( UNICODE_STRING *nt_name, void **module, SIZE_T done: if (status >= 0 && ext) { - void *handle; - strcpy( ext, ".so" ); - if ((handle = dlopen( ptr, RTLD_NOW ))) - { - if (set_builtin_unix_handle( *module, ptr, handle )) dlclose( handle ); - } + load_builtin_unixlib( *module, ptr ); } free( file ); return status; @@ -2158,7 +2063,6 @@ static struct unix_funcs unix_funcs = { load_so_dll, init_builtin_dll, - init_unix_lib, unwind_builtin_dll, RtlGetSystemTimePrecise, #ifdef __aarch64__ diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 0dcb09ad641..9b79b712b1e 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -220,9 +220,7 @@ extern void virtual_fill_image_information( const pe_image_info_t *pe_info, SECTION_IMAGE_INFORMATION *info ) DECLSPEC_HIDDEN; extern void release_builtin_module( void *module ) DECLSPEC_HIDDEN; extern void *get_builtin_so_handle( void *module ) DECLSPEC_HIDDEN; -extern NTSTATUS get_builtin_unix_info( void *module, const char **name, void **handle, void **entry ) DECLSPEC_HIDDEN; -extern NTSTATUS set_builtin_unix_handle( void *module, const char *name, void *handle ) DECLSPEC_HIDDEN; -extern NTSTATUS set_builtin_unix_entry( void *module, void *entry ) DECLSPEC_HIDDEN; +extern NTSTATUS load_builtin_unixlib( void *module, const char *name ) DECLSPEC_HIDDEN; extern NTSTATUS get_thread_ldt_entry( HANDLE handle, void *data, ULONG len, ULONG *ret_len ) DECLSPEC_HIDDEN; extern void *get_native_context( CONTEXT *context ) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index e496c604aa7..dea16623de7 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -102,9 +102,7 @@ struct builtin_module unsigned int refcount; void *handle; void *module; - char *unix_name; void *unix_handle; - void *unix_entry; }; static struct list builtin_modules = LIST_INIT( builtin_modules ); @@ -589,9 +587,7 @@ static void add_builtin_module( void *module, void *handle ) builtin->handle = handle; builtin->module = module; builtin->refcount = 1; - builtin->unix_name = NULL; builtin->unix_handle = NULL; - builtin->unix_entry = NULL; list_add_tail( &builtin_modules, &builtin->entry ); } @@ -611,7 +607,6 @@ void release_builtin_module( void *module ) list_remove( &builtin->entry ); if (builtin->handle) dlclose( builtin->handle ); if (builtin->unix_handle) dlclose( builtin->unix_handle ); - free( builtin->unix_name ); free( builtin ); } break; @@ -668,45 +663,22 @@ static NTSTATUS get_builtin_unix_funcs( void *module, BOOL wow, void **funcs ) /*********************************************************************** - * get_builtin_unix_info + * load_builtin_unixlib */ -NTSTATUS get_builtin_unix_info( void *module, const char **name, void **handle, void **entry ) -{ - sigset_t sigset; - NTSTATUS status = STATUS_DLL_NOT_FOUND; - struct builtin_module *builtin; - - server_enter_uninterrupted_section( &virtual_mutex, &sigset ); - LIST_FOR_EACH_ENTRY( builtin, &builtin_modules, struct builtin_module, entry ) - { - if (builtin->module != module) continue; - *name = builtin->unix_name; - *handle = builtin->unix_handle; - *entry = builtin->unix_entry; - status = STATUS_SUCCESS; - break; - } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); - return status; -} - - -/*********************************************************************** - * set_builtin_unix_handle - */ -NTSTATUS set_builtin_unix_handle( void *module, const char *name, void *handle ) +NTSTATUS load_builtin_unixlib( void *module, const char *name ) { + void *handle; sigset_t sigset; NTSTATUS status = STATUS_DLL_NOT_FOUND; struct builtin_module *builtin; + if (!(handle = dlopen( name, RTLD_NOW ))) return status; server_enter_uninterrupted_section( &virtual_mutex, &sigset ); LIST_FOR_EACH_ENTRY( builtin, &builtin_modules, struct builtin_module, entry ) { if (builtin->module != module) continue; if (!builtin->unix_handle) { - builtin->unix_name = strdup( name ); builtin->unix_handle = handle; status = STATUS_SUCCESS; } @@ -714,31 +686,7 @@ NTSTATUS set_builtin_unix_handle( void *module, const char *name, void *handle ) break; } server_leave_uninterrupted_section( &virtual_mutex, &sigset ); - return status; -} - - -/*********************************************************************** - * set_builtin_unix_entry - */ -NTSTATUS set_builtin_unix_entry( void *module, void *entry ) -{ - sigset_t sigset; - NTSTATUS status = STATUS_DLL_NOT_FOUND; - struct builtin_module *builtin; - - server_enter_uninterrupted_section( &virtual_mutex, &sigset ); - LIST_FOR_EACH_ENTRY( builtin, &builtin_modules, struct builtin_module, entry ) - { - if (builtin->module != module) continue; - if (builtin->unix_handle) - { - builtin->unix_entry = entry; - status = STATUS_SUCCESS; - } - break; - } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + if (status) dlclose( handle ); return status; } diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h index d60f8cc50e4..cb184431f82 100644 --- a/dlls/ntdll/unixlib.h +++ b/dlls/ntdll/unixlib.h @@ -26,14 +26,13 @@ struct _DISPATCHER_CONTEXT; /* increment this when you change the function table */ -#define NTDLL_UNIXLIB_VERSION 133 +#define NTDLL_UNIXLIB_VERSION 134 struct unix_funcs { /* loader functions */ NTSTATUS (CDECL *load_so_dll)( UNICODE_STRING *nt_name, void **module ); void (CDECL *init_builtin_dll)( void *module ); - NTSTATUS (CDECL *init_unix_lib)( void *module, DWORD reason, const void *ptr_in, void *ptr_out ); NTSTATUS (CDECL *unwind_builtin_dll)( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, CONTEXT *context ); /* other Win32 API functions */ diff --git a/dlls/winecrt0/unix_lib.c b/dlls/winecrt0/unix_lib.c index 5239148e3aa..2e9b521a1e7 100644 --- a/dlls/winecrt0/unix_lib.c +++ b/dlls/winecrt0/unix_lib.c @@ -29,7 +29,6 @@ #include "winternl.h" #include "wine/unixlib.h" -static NTSTATUS (__cdecl *p__wine_init_unix_lib)( HMODULE, DWORD, const void *, void * ); static NTSTATUS (WINAPI *p__wine_unix_call)( unixlib_handle_t, unsigned int, void * ); static void load_func( void **func, const char *name, void *def ) @@ -43,22 +42,11 @@ static void load_func( void **func, const char *name, void *def ) } #define LOAD_FUNC(name) load_func( (void **)&p ## name, #name, fallback ## name ) -static NTSTATUS __cdecl fallback__wine_init_unix_lib( HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out ) -{ - return STATUS_DLL_NOT_FOUND; -} - static NTSTATUS __cdecl fallback__wine_unix_call( unixlib_handle_t handle, unsigned int code, void *args ) { return STATUS_DLL_NOT_FOUND; } -NTSTATUS __cdecl __wine_init_unix_lib( HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out ) -{ - LOAD_FUNC( __wine_init_unix_lib ); - return p__wine_init_unix_lib( module, reason, ptr_in, ptr_out ); -} - NTSTATUS WINAPI __wine_unix_call( unixlib_handle_t handle, unsigned int code, void *args ) { LOAD_FUNC( __wine_unix_call ); diff --git a/include/winternl.h b/include/winternl.h index f8cbcdcbf97..29ab0a7ae24 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -4680,7 +4680,7 @@ static inline PLIST_ENTRY RemoveTailList(PLIST_ENTRY le) #ifdef __WINESRC__ /* Wine internal functions */ -extern NTSTATUS CDECL __wine_init_unix_lib( HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out ); + extern NTSTATUS WINAPI __wine_unix_spawnvp( char * const argv[], int wait ); /* The thread information for 16-bit threads */