Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
wine
Manage
Activity
Members
Labels
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Package registry
Container Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Alexey Alyaev
wine
Commits
6c9ade05
Commit
6c9ade05
authored
18 years ago
by
Alexandre Julliard
Browse files
Options
Downloads
Patches
Plain Diff
ntdll: Allocate the PEB with NtAllocateVirtualMemory too.
parent
cc297050
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
dlls/ntdll/ntdll_misc.h
+2
-1
2 additions, 1 deletion
dlls/ntdll/ntdll_misc.h
dlls/ntdll/thread.c
+39
-14
39 additions, 14 deletions
dlls/ntdll/thread.c
dlls/ntdll/virtual.c
+7
-21
7 additions, 21 deletions
dlls/ntdll/virtual.c
with
48 additions
and
36 deletions
dlls/ntdll/ntdll_misc.h
+
2
−
1
View file @
6c9ade05
...
...
@@ -50,6 +50,8 @@ extern size_t get_signal_stack_total_size(void);
extern
void
version_init
(
const
WCHAR
*
appname
);
extern
void
debug_init
(
void
);
extern
HANDLE
thread_init
(
void
);
extern
void
virtual_init
(
void
);
extern
void
virtual_init_threading
(
void
);
/* server support */
extern
time_t
server_start_time
;
...
...
@@ -106,7 +108,6 @@ extern NTSTATUS DIR_unmount_device( HANDLE handle );
extern
NTSTATUS
DIR_get_unix_cwd
(
char
**
cwd
);
/* virtual memory */
extern
NTSTATUS
VIRTUAL_alloc_teb
(
void
**
ret
,
size_t
size
);
extern
NTSTATUS
VIRTUAL_HandleFault
(
LPCVOID
addr
);
extern
BOOL
VIRTUAL_HasMapping
(
LPCVOID
addr
);
extern
void
VIRTUAL_UseLargeAddressSpace
(
void
);
...
...
This diff is collapsed.
Click to expand it.
dlls/ntdll/thread.c
+
39
−
14
View file @
6c9ade05
...
...
@@ -52,7 +52,6 @@ struct startup_info
void
*
entry_arg
;
};
static
PEB
peb
;
static
PEB_LDR_DATA
ldr
;
static
RTL_USER_PROCESS_PARAMETERS
params
;
/* default parameters if no parent */
static
WCHAR
current_dir
[
MAX_NT_PATH_LENGTH
];
...
...
@@ -75,7 +74,6 @@ static inline NTSTATUS init_teb( TEB *teb )
teb
->
Tib
.
ExceptionList
=
(
void
*
)
~
0UL
;
teb
->
Tib
.
StackBase
=
(
void
*
)
~
0UL
;
teb
->
Tib
.
Self
=
&
teb
->
Tib
;
teb
->
Peb
=
&
peb
;
teb
->
StaticUnicodeString
.
Buffer
=
teb
->
StaticUnicodeBuffer
;
teb
->
StaticUnicodeString
.
MaximumLength
=
sizeof
(
teb
->
StaticUnicodeBuffer
);
...
...
@@ -148,7 +146,7 @@ static NTSTATUS init_user_process_params( SIZE_T info_size, HANDLE *exe_file )
if
(
status
!=
STATUS_SUCCESS
)
return
status
;
params
->
AllocationSize
=
info_size
;
peb
.
ProcessParameters
=
params
;
NtCurrentTeb
()
->
Peb
->
ProcessParameters
=
params
;
SERVER_START_REQ
(
get_startup_info
)
{
...
...
@@ -201,37 +199,62 @@ static NTSTATUS init_user_process_params( SIZE_T info_size, HANDLE *exe_file )
*/
HANDLE
thread_init
(
void
)
{
PEB
*
peb
;
TEB
*
teb
;
void
*
addr
;
SIZE_T
info_size
;
SIZE_T
size
,
info_size
;
HANDLE
exe_file
=
0
;
struct
ntdll_thread_data
*
thread_data
;
struct
ntdll_thread_regs
*
thread_regs
;
struct
wine_pthread_thread_info
thread_info
;
static
struct
debug_info
debug_info
;
/* debug info for initial thread */
peb
.
NumberOfProcessors
=
1
;
peb
.
ProcessParameters
=
&
params
;
peb
.
TlsBitmap
=
&
tls_bitmap
;
peb
.
TlsExpansionBitmap
=
&
tls_expansion_bitmap
;
peb
.
LdrData
=
&
ldr
;
virtual_init
();
/* reserve space for shared user data */
addr
=
(
void
*
)
0x7ffe0000
;
size
=
0x10000
;
NtAllocateVirtualMemory
(
NtCurrentProcess
(),
&
addr
,
0
,
&
size
,
MEM_RESERVE
,
PAGE_READONLY
);
/* allocate and initialize the PEB */
addr
=
NULL
;
size
=
sizeof
(
*
peb
);
NtAllocateVirtualMemory
(
NtCurrentProcess
(),
&
addr
,
1
,
&
size
,
MEM_COMMIT
|
MEM_TOP_DOWN
,
PAGE_READWRITE
);
peb
=
addr
;
peb
->
NumberOfProcessors
=
1
;
peb
->
ProcessParameters
=
&
params
;
peb
->
TlsBitmap
=
&
tls_bitmap
;
peb
->
TlsExpansionBitmap
=
&
tls_expansion_bitmap
;
peb
->
LdrData
=
&
ldr
;
params
.
CurrentDirectory
.
DosPath
.
Buffer
=
current_dir
;
params
.
CurrentDirectory
.
DosPath
.
MaximumLength
=
sizeof
(
current_dir
);
params
.
wShowWindow
=
1
;
/* SW_SHOWNORMAL */
RtlInitializeBitMap
(
&
tls_bitmap
,
peb
.
TlsBitmapBits
,
sizeof
(
peb
.
TlsBitmapBits
)
*
8
);
RtlInitializeBitMap
(
&
tls_expansion_bitmap
,
peb
.
TlsExpansionBitmapBits
,
sizeof
(
peb
.
TlsExpansionBitmapBits
)
*
8
);
RtlInitializeBitMap
(
&
tls_bitmap
,
peb
->
TlsBitmapBits
,
sizeof
(
peb
->
TlsBitmapBits
)
*
8
);
RtlInitializeBitMap
(
&
tls_expansion_bitmap
,
peb
->
TlsExpansionBitmapBits
,
sizeof
(
peb
->
TlsExpansionBitmapBits
)
*
8
);
InitializeListHead
(
&
ldr
.
InLoadOrderModuleList
);
InitializeListHead
(
&
ldr
.
InMemoryOrderModuleList
);
InitializeListHead
(
&
ldr
.
InInitializationOrderModuleList
);
InitializeListHead
(
&
tls_links
);
/* allocate and initialize the initial TEB */
sigstack_total_size
=
get_signal_stack_total_size
();
while
(
1
<<
sigstack_zero_bits
<
sigstack_total_size
)
sigstack_zero_bits
++
;
assert
(
1
<<
sigstack_zero_bits
==
sigstack_total_size
);
/* must be a power of 2 */
thread_info
.
teb_size
=
sigstack_total_size
;
VIRTUAL_alloc_teb
(
&
addr
,
thread_info
.
teb_size
);
addr
=
NULL
;
size
=
sigstack_total_size
;
NtAllocateVirtualMemory
(
NtCurrentProcess
(),
&
addr
,
sigstack_zero_bits
,
&
size
,
MEM_COMMIT
|
MEM_TOP_DOWN
,
PAGE_READWRITE
);
teb
=
addr
;
teb
->
Peb
=
peb
;
thread_info
.
teb_size
=
size
;
init_teb
(
teb
);
thread_data
=
(
struct
ntdll_thread_data
*
)
teb
->
SystemReserved2
;
thread_regs
=
(
struct
ntdll_thread_regs
*
)
teb
->
SpareBytes1
;
...
...
@@ -245,6 +268,7 @@ HANDLE thread_init(void)
wine_pthread_get_functions
(
&
pthread_functions
,
sizeof
(
pthread_functions
)
);
pthread_functions
.
init_current_teb
(
&
thread_info
);
pthread_functions
.
init_thread
(
&
thread_info
);
virtual_init_threading
();
debug_info
.
str_pos
=
debug_info
.
strings
;
debug_info
.
out_pos
=
debug_info
.
output
;
...
...
@@ -255,7 +279,7 @@ HANDLE thread_init(void)
info_size
=
server_init_thread
(
thread_info
.
pid
,
thread_info
.
tid
,
NULL
);
/* create the process heap */
if
(
!
(
peb
.
ProcessHeap
=
RtlCreateHeap
(
HEAP_GROWABLE
,
NULL
,
0
,
0
,
NULL
,
NULL
)))
if
(
!
(
peb
->
ProcessHeap
=
RtlCreateHeap
(
HEAP_GROWABLE
,
NULL
,
0
,
0
,
NULL
,
NULL
)))
{
MESSAGE
(
"wine: failed to create the process heap
\n
"
);
exit
(
1
);
...
...
@@ -421,6 +445,7 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *
&
size
,
MEM_COMMIT
|
MEM_TOP_DOWN
,
PAGE_READWRITE
)))
goto
error
;
teb
=
addr
;
teb
->
Peb
=
NtCurrentTeb
()
->
Peb
;
info
->
pthread_info
.
teb_size
=
size
;
if
((
status
=
init_teb
(
teb
)))
goto
error
;
...
...
This diff is collapsed.
Click to expand it.
dlls/ntdll/virtual.c
+
7
−
21
View file @
6c9ade05
...
...
@@ -142,6 +142,7 @@ static UINT_PTR page_mask;
static
void
*
user_space_limit
=
USER_SPACE_LIMIT
;
static
void
*
preload_reserve_start
;
static
void
*
preload_reserve_end
;
static
int
use_locks
;
/***********************************************************************
...
...
@@ -1205,7 +1206,7 @@ BOOL is_current_process( HANDLE handle )
/***********************************************************************
* virtual_init
*/
static
inline
void
virtual_init
(
void
)
void
virtual_init
(
void
)
{
const
char
*
preload
;
#ifndef page_mask
...
...
@@ -1229,26 +1230,11 @@ static inline void virtual_init(void)
/***********************************************************************
* VIRTUAL_alloc_teb
*
* Allocate a memory view for a new TEB, properly aligned to a multiple of the size.
* virtual_init_threading
*/
NTSTATUS
VIRTUAL_alloc_teb
(
void
**
ret
,
size_t
size
)
void
virtual_init_threading
(
void
)
{
NTSTATUS
status
;
struct
file_view
*
view
;
virtual_init
();
*
ret
=
NULL
;
status
=
map_view
(
&
view
,
NULL
,
size
,
size
-
1
,
TRUE
,
VPROT_READ
|
VPROT_WRITE
|
VPROT_COMMITTED
);
if
(
status
==
STATUS_SUCCESS
)
{
view
->
flags
|=
VFLAG_VALLOC
;
*
ret
=
view
->
base
;
}
return
status
;
use_locks
=
1
;
}
...
...
@@ -1369,7 +1355,7 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_
/* Reserve the memory */
RtlEnterCriticalSection
(
&
csVirtual
);
if
(
use_locks
)
RtlEnterCriticalSection
(
&
csVirtual
);
if
(
type
&
MEM_SYSTEM
)
{
...
...
@@ -1397,7 +1383,7 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_
else
if
(
!
VIRTUAL_SetProt
(
view
,
base
,
size
,
vprot
))
status
=
STATUS_ACCESS_DENIED
;
}
RtlLeaveCriticalSection
(
&
csVirtual
);
if
(
use_locks
)
RtlLeaveCriticalSection
(
&
csVirtual
);
if
(
status
==
STATUS_SUCCESS
)
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment