Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
b8f0e32b
Commit
b8f0e32b
authored
Apr 01, 2020
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Avoid using the LDT definitions from libwine.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
b644034a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
41 additions
and
13 deletions
+41
-13
signal_i386.c
dlls/ntdll/signal_i386.c
+41
-13
No files found.
dlls/ntdll/signal_i386.c
View file @
b8f0e32b
...
...
@@ -2301,6 +2301,11 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
#define LDT_SIZE 8192
#define LDT_FLAGS_DATA 0x13
/* Data segment */
#define LDT_FLAGS_CODE 0x1b
/* Code segment */
#define LDT_FLAGS_32BIT 0x40
/* Segment is 32-bit (code or stack) */
#define LDT_FLAGS_ALLOCATED 0x80
/* Segment is allocated */
static
WORD
gdt_fs_sel
;
static
RTL_CRITICAL_SECTION
ldt_section
;
...
...
@@ -2335,13 +2340,36 @@ static void ldt_unlock(void)
else
RtlLeaveCriticalSection
(
&
ldt_section
);
}
static
inline
void
*
ldt_get_base
(
LDT_ENTRY
ent
)
{
return
(
void
*
)(
ent
.
BaseLow
|
(
ULONG_PTR
)
ent
.
HighWord
.
Bits
.
BaseMid
<<
16
|
(
ULONG_PTR
)
ent
.
HighWord
.
Bits
.
BaseHi
<<
24
);
}
static
inline
unsigned
int
ldt_get_limit
(
LDT_ENTRY
ent
)
{
unsigned
int
limit
=
ent
.
LimitLow
|
(
ent
.
HighWord
.
Bits
.
LimitHi
<<
16
);
if
(
ent
.
HighWord
.
Bits
.
Granularity
)
limit
=
(
limit
<<
12
)
|
0xfff
;
return
limit
;
}
static
LDT_ENTRY
ldt_make_entry
(
void
*
base
,
unsigned
int
limit
,
unsigned
char
flags
)
{
LDT_ENTRY
entry
;
wine_ldt_set_base
(
&
entry
,
base
);
wine_ldt_set_limit
(
&
entry
,
limit
);
wine_ldt_set_flags
(
&
entry
,
flags
);
entry
.
BaseLow
=
(
WORD
)(
ULONG_PTR
)
base
;
entry
.
HighWord
.
Bits
.
BaseMid
=
(
BYTE
)((
ULONG_PTR
)
base
>>
16
);
entry
.
HighWord
.
Bits
.
BaseHi
=
(
BYTE
)((
ULONG_PTR
)
base
>>
24
);
if
((
entry
.
HighWord
.
Bits
.
Granularity
=
(
limit
>=
0x100000
)))
limit
>>=
12
;
entry
.
LimitLow
=
(
WORD
)
limit
;
entry
.
HighWord
.
Bits
.
LimitHi
=
limit
>>
16
;
entry
.
HighWord
.
Bits
.
Dpl
=
3
;
entry
.
HighWord
.
Bits
.
Pres
=
1
;
entry
.
HighWord
.
Bits
.
Type
=
flags
;
entry
.
HighWord
.
Bits
.
Sys
=
0
;
entry
.
HighWord
.
Bits
.
Reserved_0
=
0
;
entry
.
HighWord
.
Bits
.
Default_Big
=
(
flags
&
LDT_FLAGS_32BIT
)
!=
0
;
return
entry
;
}
...
...
@@ -2352,7 +2380,7 @@ static void ldt_set_entry( WORD sel, LDT_ENTRY entry )
#ifdef linux
struct
modify_ldt_s
ldt_info
=
{
index
};
ldt_info
.
base_addr
=
wine_ldt_get_base
(
&
entry
);
ldt_info
.
base_addr
=
ldt_get_base
(
entry
);
ldt_info
.
limit
=
entry
.
LimitLow
|
(
entry
.
HighWord
.
Bits
.
LimitHi
<<
16
);
ldt_info
.
seg_32bit
=
entry
.
HighWord
.
Bits
.
Default_Big
;
ldt_info
.
contents
=
(
entry
.
HighWord
.
Bits
.
Type
>>
2
)
&
3
;
...
...
@@ -2374,7 +2402,7 @@ static void ldt_set_entry( WORD sel, LDT_ENTRY entry )
struct
ssd
ldt_mod
;
ldt_mod
.
sel
=
sel
;
ldt_mod
.
bo
=
(
unsigned
long
)
wine_ldt_get_base
(
&
entry
);
ldt_mod
.
bo
=
(
unsigned
long
)
ldt_get_base
(
entry
);
ldt_mod
.
ls
=
entry
.
LimitLow
|
(
entry
.
HighWord
.
Bits
.
LimitHi
<<
16
);
ldt_mod
.
acc1
=
entry
.
HighWord
.
Bytes
.
Flags1
;
ldt_mod
.
acc2
=
entry
.
HighWord
.
Bytes
.
Flags2
>>
4
;
...
...
@@ -2389,11 +2417,11 @@ static void ldt_set_entry( WORD sel, LDT_ENTRY entry )
exit
(
1
);
#endif
wine_ldt_copy
.
base
[
index
]
=
wine_ldt_get_base
(
&
entry
);
wine_ldt_copy
.
limit
[
index
]
=
wine_ldt_get_limit
(
&
entry
);
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
?
WINE_
LDT_FLAGS_32BIT
:
0
)
|
WINE_
LDT_FLAGS_ALLOCATED
);
(
entry
.
HighWord
.
Bits
.
Default_Big
?
LDT_FLAGS_32BIT
:
0
)
|
LDT_FLAGS_ALLOCATED
);
}
static
void
ldt_init
(
void
)
...
...
@@ -2422,7 +2450,7 @@ WORD ldt_alloc_fs( TEB *teb, int first_thread )
if
(
gdt_fs_sel
)
return
gdt_fs_sel
;
entry
=
ldt_make_entry
(
teb
,
teb_size
-
1
,
WINE_LDT_FLAGS_DATA
|
WINE_
LDT_FLAGS_32BIT
);
entry
=
ldt_make_entry
(
teb
,
teb_size
-
1
,
LDT_FLAGS_DATA
|
LDT_FLAGS_32BIT
);
if
(
first_thread
)
/* no locking for first thread */
{
...
...
@@ -2490,11 +2518,11 @@ NTSTATUS get_thread_ldt_entry( HANDLE handle, void *data, ULONG len, ULONG *ret_
if
(
!
(
info
->
Selector
&
~
3
))
info
->
Entry
=
null_entry
;
else
if
((
info
->
Selector
|
3
)
==
wine_get_cs
())
info
->
Entry
=
ldt_make_entry
(
0
,
~
0u
,
WINE_LDT_FLAGS_CODE
|
WINE_
LDT_FLAGS_32BIT
);
info
->
Entry
=
ldt_make_entry
(
0
,
~
0u
,
LDT_FLAGS_CODE
|
LDT_FLAGS_32BIT
);
else
if
((
info
->
Selector
|
3
)
==
wine_get_ds
())
info
->
Entry
=
ldt_make_entry
(
0
,
~
0u
,
WINE_LDT_FLAGS_DATA
|
WINE_
LDT_FLAGS_32BIT
);
info
->
Entry
=
ldt_make_entry
(
0
,
~
0u
,
LDT_FLAGS_DATA
|
LDT_FLAGS_32BIT
);
else
if
((
info
->
Selector
|
3
)
==
wine_get_fs
())
info
->
Entry
=
ldt_make_entry
(
NtCurrentTeb
(),
0xfff
,
WINE_LDT_FLAGS_DATA
|
WINE_
LDT_FLAGS_32BIT
);
info
->
Entry
=
ldt_make_entry
(
NtCurrentTeb
(),
0xfff
,
LDT_FLAGS_DATA
|
LDT_FLAGS_32BIT
);
else
return
STATUS_UNSUCCESSFUL
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment