diff --git a/include/wine/library.h b/include/wine/library.h index c593bd28e67..cbaa0263c52 100644 --- a/include/wine/library.h +++ b/include/wine/library.h @@ -75,6 +75,8 @@ extern void *wine_anon_mmap( void *start, size_t size, int prot, int flags ); extern void wine_mmap_add_reserved_area( void *addr, size_t size ); extern void wine_mmap_remove_reserved_area( void *addr, size_t size, int unmap ); extern int wine_mmap_is_in_reserved_area( void *addr, size_t size ); +extern int wine_mmap_enum_reserved_areas( int (*enum_func)(void *base, size_t size, void *arg), + void *arg, int top_down ); /* LDT management */ diff --git a/libs/wine/mmap.c b/libs/wine/mmap.c index 16bf3029d7e..a8654dc50e0 100644 --- a/libs/wine/mmap.c +++ b/libs/wine/mmap.c @@ -539,3 +539,38 @@ int wine_mmap_is_in_reserved_area( void *addr, size_t size ) } return 0; } + + +/*********************************************************************** + * wine_mmap_enum_reserved_areas + * + * Enumerate the list of reserved areas, sorted by addresses. + * If enum_func returns a non-zero value, enumeration is stopped and the value is returned. + * + * Note: the reserved areas functions are not reentrant, caller is + * responsible for proper locking. + */ +int wine_mmap_enum_reserved_areas( int (*enum_func)(void *base, size_t size, void *arg), void *arg, + int top_down ) +{ + int ret = 0; + struct list *ptr; + + if (top_down) + { + for (ptr = reserved_areas.prev; ptr != &reserved_areas; ptr = ptr->prev) + { + struct reserved_area *area = LIST_ENTRY( ptr, struct reserved_area, entry ); + if ((ret = enum_func( area->base, area->size, arg ))) break; + } + } + else + { + for (ptr = reserved_areas.next; ptr != &reserved_areas; ptr = ptr->next) + { + struct reserved_area *area = LIST_ENTRY( ptr, struct reserved_area, entry ); + if ((ret = enum_func( area->base, area->size, arg ))) break; + } + } + return ret; +} diff --git a/libs/wine/wine.def b/libs/wine/wine.def index 6fe8ade9eee..462a6191278 100644 --- a/libs/wine/wine.def +++ b/libs/wine/wine.def @@ -103,6 +103,7 @@ EXPORTS wine_ldt_realloc_entries wine_ldt_set_entry wine_mmap_add_reserved_area + wine_mmap_enum_reserved_areas wine_mmap_is_in_reserved_area wine_mmap_remove_reserved_area wine_pthread_get_functions diff --git a/libs/wine/wine.map b/libs/wine/wine.map index 84e4e5d5355..47e58ced824 100644 --- a/libs/wine/wine.map +++ b/libs/wine/wine.map @@ -103,6 +103,7 @@ WINE_1.0 wine_ldt_realloc_entries; wine_ldt_set_entry; wine_mmap_add_reserved_area; + wine_mmap_enum_reserved_areas; wine_mmap_is_in_reserved_area; wine_mmap_remove_reserved_area; wine_pthread_get_functions;