* dcrt0.cc (dll_crt0_0): Remove call to wincap.init.
* init.cc (dll_entry): Rename is_wow64_proc to wow64_test_stack_marker. Call wincap.init here before doing anything else. Use wincap.is_wow64 to determine if we're running in a WOW64 emulator. * mmap.cc (MapViewNT): Don't use AT_ROUND_TO_PAGE in WOW64, it's apparently not supported. (mmap64): Don't create mappings beyond EOF, which would need to use AT_ROUND_TO_PAGE, on WOW64. * wincap.cc (wincap): Throw into the .cygwin_dll_common section. (wincapc::init): Determine if running in WOW64 and set wow_64 flag. * wincap.h (class wincapc): Add wow64 member. (wincapc::is_wow64): New method.
This commit is contained in:
@ -143,7 +143,7 @@ HMODULE NO_COPY cygwin_hmodule;
|
||||
extern "C" BOOL WINAPI
|
||||
dll_entry (HANDLE h, DWORD reason, void *static_load)
|
||||
{
|
||||
BOOL is_wow64_proc = FALSE;
|
||||
BOOL wow64_test_stack_marker;
|
||||
// _STRACE_ON;
|
||||
|
||||
switch (reason)
|
||||
@ -152,15 +152,16 @@ dll_entry (HANDLE h, DWORD reason, void *static_load)
|
||||
cygwin_hmodule = (HMODULE) h;
|
||||
dynamically_loaded = (static_load == NULL);
|
||||
|
||||
wincap.init ();
|
||||
|
||||
/* Is the stack at an unusual address? This is, an address which
|
||||
is in the usual space occupied by the process image, but below
|
||||
the auto load address of DLLs?
|
||||
Check if we're running in WOW64 on a 64 bit machine *and* are
|
||||
spawned by a genuine 64 bit process. If so, respawn. */
|
||||
if (&is_wow64_proc >= (PBOOL) 0x400000
|
||||
&& &is_wow64_proc <= (PBOOL) 0x10000000
|
||||
&& IsWow64Process (GetCurrentProcess (), &is_wow64_proc)
|
||||
&& is_wow64_proc)
|
||||
if (wincap.is_wow64 ()
|
||||
&& &wow64_test_stack_marker >= (PBOOL) 0x400000
|
||||
&& &wow64_test_stack_marker <= (PBOOL) 0x10000000)
|
||||
respawn_wow64_process ();
|
||||
|
||||
dll_crt0_0 ();
|
||||
|
Reference in New Issue
Block a user