Alexandre Julliard : ntdll: Export the LDT copy from ntdll instead of libwine.
Alexandre Julliard
julliard at winehq.org
Thu Apr 2 14:27:35 CDT 2020
Module: wine
Branch: master
Commit: 9d588819febfa6483a90900bf570b0e2cc09a4d3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9d588819febfa6483a90900bf570b0e2cc09a4d3
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Apr 1 22:57:51 2020 +0200
ntdll: Export the LDT copy from ntdll instead of libwine.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/krnl386.exe16/selector.c | 2 +-
dlls/ntdll/ntdll.spec | 1 +
dlls/ntdll/server.c | 5 ++++-
dlls/ntdll/signal_i386.c | 21 ++++++++++++++-------
4 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/dlls/krnl386.exe16/selector.c b/dlls/krnl386.exe16/selector.c
index 5702b25999..73284cf073 100644
--- a/dlls/krnl386.exe16/selector.c
+++ b/dlls/krnl386.exe16/selector.c
@@ -75,7 +75,7 @@ void init_selectors(void)
if (!is_gdt_sel( wine_get_gs() )) first_ldt_entry += 512;
if (!is_gdt_sel( wine_get_fs() )) first_ldt_entry += 512;
RtlSetBits( &ldt_bitmap, 0, first_ldt_entry );
- ldt_copy = (struct ldt_copy *)&wine_ldt_copy;
+ ldt_copy = (void *)GetProcAddress( GetModuleHandleA("ntdll.dll"), "__wine_ldt_copy" );
}
/***********************************************************************
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 13b0317744..873eef55d0 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1558,6 +1558,7 @@
@ cdecl wine_server_release_fd(long long)
@ cdecl wine_server_send_fd(long)
@ cdecl __wine_make_process_system()
+@ extern -arch=i386 __wine_ldt_copy
# Debugging
@ cdecl -norelay __wine_dbg_get_channel_flags(ptr)
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
index 4facdc08a7..df847d09a2 100644
--- a/dlls/ntdll/server.c
+++ b/dlls/ntdll/server.c
@@ -1448,6 +1448,9 @@ void server_init_process(void)
*/
void server_init_process_done(void)
{
+#ifdef __i386__
+ extern struct ldt_copy __wine_ldt_copy;
+#endif
PEB *peb = NtCurrentTeb()->Peb;
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( peb->ImageBaseAddress );
void *entry = (char *)peb->ImageBaseAddress + nt->OptionalHeader.AddressOfEntryPoint;
@@ -1471,7 +1474,7 @@ void server_init_process_done(void)
{
req->module = wine_server_client_ptr( peb->ImageBaseAddress );
#ifdef __i386__
- req->ldt_copy = wine_server_client_ptr( &wine_ldt_copy );
+ req->ldt_copy = wine_server_client_ptr( &__wine_ldt_copy );
#endif
req->entry = wine_server_client_ptr( entry );
req->gui = (nt->OptionalHeader.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CUI);
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index e812f634ff..0e033d53ba 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -2306,6 +2306,13 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
#define LDT_FLAGS_32BIT 0x40 /* Segment is 32-bit (code or stack) */
#define LDT_FLAGS_ALLOCATED 0x80 /* Segment is allocated */
+struct ldt_copy
+{
+ void *base[LDT_SIZE];
+ unsigned int limit[LDT_SIZE];
+ unsigned char flags[LDT_SIZE];
+} __wine_ldt_copy;
+
static WORD gdt_fs_sel;
static RTL_CRITICAL_SECTION ldt_section;
@@ -2417,11 +2424,11 @@ static void ldt_set_entry( WORD sel, LDT_ENTRY entry )
exit(1);
#endif
- wine_ldt_copy.base[index] = ldt_get_base( entry );
- wine_ldt_copy.limit[index] = ldt_get_limit( entry );
- wine_ldt_copy.flags[index] = (entry.HighWord.Bits.Type |
- (entry.HighWord.Bits.Default_Big ? LDT_FLAGS_32BIT : 0) |
- LDT_FLAGS_ALLOCATED);
+ __wine_ldt_copy.base[index] = ldt_get_base( entry );
+ __wine_ldt_copy.limit[index] = ldt_get_limit( entry );
+ __wine_ldt_copy.flags[index] = (entry.HighWord.Bits.Type |
+ (entry.HighWord.Bits.Default_Big ? LDT_FLAGS_32BIT : 0) |
+ LDT_FLAGS_ALLOCATED);
}
static void ldt_init(void)
@@ -2464,7 +2471,7 @@ WORD ldt_alloc_fs( TEB *teb, int first_thread )
ldt_lock();
for (idx = first_ldt_entry; idx < LDT_SIZE; idx++)
{
- if (wine_ldt_copy.flags[idx]) continue;
+ if (__wine_ldt_copy.flags[idx]) continue;
ldt_set_entry( (idx << 3) | 7, entry );
break;
}
@@ -2479,7 +2486,7 @@ static void ldt_free_fs( WORD sel )
if (sel == gdt_fs_sel) return;
ldt_lock();
- wine_ldt_copy.flags[sel >> 3] = 0;
+ __wine_ldt_copy.flags[sel >> 3] = 0;
ldt_unlock();
}
More information about the wine-cvs
mailing list