[PATCH 1/2] ntdll: Restore stack guard and prevent stack from shrinking

Alexandre Julliard julliard at winehq.org
Thu Apr 7 03:24:57 CDT 2011


Piotr Caban <piotr at 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 at winehq.org



More information about the wine-devel mailing list