ntdll: Allocate the PEB with NtAllocateVirtualMemory too.
This commit is contained in:
parent
cc297050f9
commit
6c9ade0529
|
@ -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);
|
||||
|
|
|
@ -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 = ¶ms;
|
||||
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 = ¶ms;
|
||||
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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue