Piotr Caban <piotr(a)codeweavers.com> writes:
@@ -1617,9 +1617,18 @@ BOOL virtual_handle_stack_fault( void *addr ) BYTE vprot = view->prot[((const char *)page - (const char *)view->base) >> page_shift]; if (vprot & VPROT_GUARD) { + struct _TEB *teb = NtCurrentTeb(); VIRTUAL_SetProt( view, page, page_size, vprot & ~VPROT_GUARD ); - if ((char *)page + page_size == NtCurrentTeb()->Tib.StackLimit) - NtCurrentTeb()->Tib.StackLimit = page; + if ((char *)page - page_size == teb->DeallocationStack) + teb->Tib.StackLimit = page; + else if ((char*)addr > (char*)teb->Tib.StackLimit + page_size && + teb->Tib.StackLimit == (char*)teb->DeallocationStack + page_size && + (view = VIRTUAL_FindView( (char*)teb->Tib.StackLimit, 0))) + { + vprot = view->prot[((char*)teb->Tib.StackLimit - (char*)view->base) >> page_shift]; + VIRTUAL_SetProt( view, teb->Tib.StackLimit, page_size, vprot | VPROT_GUARD); + teb->Tib.StackLimit = (char*)teb->Tib.StackLimit + page_size; + }
Why do you want to lookup the view again? -- Alexandre Julliard julliard(a)winehq.org