* cygtls.cc (_cygtls::init_exception_handler): Revert patch
from 2005-12-02. * exceptions.cc (stack_info::walk): Add workaround for NT 5.2 64 bit OSes. * wincap.h (wincaps::has_restricted_stack_args): New element. * wincap.cc: Implement above element throughout. (wincapc::init): Reset has_restricted_stack_args if not running under WOW64.
This commit is contained in:
@ -245,9 +245,20 @@ stack_info::walk ()
|
||||
sf.AddrReturn.Offset = (DWORD) *++ebp;
|
||||
|
||||
if (needargs)
|
||||
/* The arguments follow the return address */
|
||||
for (unsigned i = 0; i < NPARAMS; i++)
|
||||
sf.Params[i] = (DWORD) *++ebp;
|
||||
{
|
||||
unsigned nparams = NPARAMS;
|
||||
|
||||
/* The arguments follow the return address */
|
||||
sf.Params[0] = (DWORD) *++ebp;
|
||||
/* Hack for XP/2K3 WOW64. If the first stack param points to the
|
||||
application entry point, we can only fetch one additional
|
||||
parameter. Accessing anything beyond this address results in
|
||||
a SEGV. This is fixed in Vista/2K8 WOW64. */
|
||||
if (wincap.has_restricted_stack_args () && sf.Params[0] == 0x401000)
|
||||
nparams = 2;
|
||||
for (unsigned i = 0; i < nparams; i++)
|
||||
sf.Params[i] = (DWORD) *++ebp;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user