"Dimitrie O. Paun" <[EMAIL PROTECTED]> writes:
> + EnterCriticalSection(&dibs_cs);
> + LIST_FOR_EACH( ptr, &dibs_list )
> + {
> + physBitmap = LIST_ENTRY( ptr, X_PHYSBITMAP, entry );
> + if (physBitmap->base > addr) break;
If you want to short-circuit the search this way you need to sort the
list by addresses.
> + state = X11DRV_DIB_Lock( physBitmap, DIB_Status_None, FALSE );
> + if (state != DIB_Status_InSync) {
> + /* no way to tell whether app needs read or write yet, try read
> first */
Actually we can tell now that we have the full exception information.
> + EnterCriticalSection( &dibs_cs );
> + list_add_head( &dibs_list, &physBitmap->entry );
> + if (!dibs_handler)
> + dibs_handler = AddVectoredExceptionHandler( TRUE,
> X11DRV_DIB_FaultHandler );
> + LeaveCriticalSection( &dibs_cs );
You can't hold the critsection when adding the handler since this will
grab the vectored_handlers critsection, and thus acquire the sections
in the reverse order of what happens when the handler is called.
--
Alexandre Julliard
[EMAIL PROTECTED]