From cdce50f5bee8a388df51fb10d76994373449af6b Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 5 Nov 2008 12:24:05 +0100 Subject: [PATCH] ntdll: Store the per-page committed status in the server for anonymous file mappings. --- dlls/ntdll/virtual.c | 78 ++++++++++++---- include/wine/server_protocol.h | 37 +++++++- server/mapping.c | 139 +++++++++++++++++++++++++++- server/protocol.def | 18 ++++ server/request.h | 4 + server/trace.c | 161 ++++++++++++++++++++------------- 6 files changed, 351 insertions(+), 86 deletions(-) diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index 596d8ee87d8..17fe7114db3 100644 --- a/dlls/ntdll/virtual.c +++ b/dlls/ntdll/virtual.c @@ -862,6 +862,45 @@ done: } +/*********************************************************************** + * get_committed_size + * + * Get the size of the committed range starting at base. + * Also return the protections for the first page. + */ +static SIZE_T get_committed_size( struct file_view *view, void *base, BYTE *vprot ) +{ + SIZE_T i, start; + + start = ((char *)base - (char *)view->base) >> page_shift; + *vprot = view->prot[start]; + + if (view->mapping && !(view->protect & VPROT_COMMITTED)) + { + SIZE_T ret = 0; + SERVER_START_REQ( get_mapping_committed_range ) + { + req->handle = view->mapping; + req->offset = start << page_shift; + if (!wine_server_call( req )) + { + ret = reply->size; + if (reply->committed) + { + *vprot |= VPROT_COMMITTED; + for (i = 0; i < ret >> page_shift; i++) view->prot[start+i] |= VPROT_COMMITTED; + } + } + } + SERVER_END_REQ; + return ret; + } + for (i = start + 1; i < view->size >> page_shift; i++) + if ((*vprot ^ view->prot[i]) & VPROT_COMMITTED) break; + return (i - start) << page_shift; +} + + /*********************************************************************** * decommit_view * @@ -1541,6 +1580,17 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_ if (!(view = VIRTUAL_FindView( base )) || ((char *)base + size > (char *)view->base + view->size)) status = STATUS_NOT_MAPPED_VIEW; else if (!VIRTUAL_SetProt( view, base, size, vprot )) status = STATUS_ACCESS_DENIED; + else if (view->mapping && !(view->protect & VPROT_COMMITTED)) + { + SERVER_START_REQ( add_mapping_committed_range ) + { + req->handle = view->mapping; + req->offset = (char *)base - (char *)view->base; + req->size = size; + wine_server_call( req ); + } + SERVER_END_REQ; + } } if (use_locks) server_leave_uninterrupted_section( &csVirtual, &sigset ); @@ -1659,9 +1709,7 @@ NTSTATUS WINAPI NtProtectVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T sigset_t sigset; NTSTATUS status = STATUS_SUCCESS; char *base; - UINT i; - BYTE vprot, *p; - ULONG prot; + BYTE vprot; SIZE_T size = *size_ptr; LPVOID addr = *addr_ptr; @@ -1704,23 +1752,13 @@ NTSTATUS WINAPI NtProtectVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T else { /* Make sure all the pages are committed */ - - p = view->prot + ((base - (char *)view->base) >> page_shift); - prot = VIRTUAL_GetWin32Prot( *p ); - for (i = size >> page_shift; i; i--, p++) + if (get_committed_size( view, base, &vprot ) >= size && (vprot & VPROT_COMMITTED)) { - if (!(*p & VPROT_COMMITTED)) - { - status = STATUS_NOT_COMMITTED; - break; - } - } - if (!i) - { - if (old_prot) *old_prot = prot; + if (old_prot) *old_prot = VIRTUAL_GetWin32Prot( vprot ); vprot = VIRTUAL_GetProt( new_prot ) | VPROT_COMMITTED; if (!VIRTUAL_SetProt( view, base, size, vprot )) status = STATUS_ACCESS_DENIED; } + else status = STATUS_NOT_COMMITTED; } server_leave_uninterrupted_section( &csVirtual, &sigset ); @@ -1850,15 +1888,17 @@ NTSTATUS WINAPI NtQueryVirtualMemory( HANDLE process, LPCVOID addr, } else { - BYTE vprot = view->prot[(base - alloc_base) >> page_shift]; + BYTE vprot; + SIZE_T range_size = get_committed_size( view, base, &vprot ); + info->State = (vprot & VPROT_COMMITTED) ? MEM_COMMIT : MEM_RESERVE; - info->Protect = VIRTUAL_GetWin32Prot( vprot ); + info->Protect = (vprot & VPROT_COMMITTED) ? VIRTUAL_GetWin32Prot( vprot ) : 0; info->AllocationBase = alloc_base; info->AllocationProtect = VIRTUAL_GetWin32Prot( view->protect ); if (view->protect & VPROT_IMAGE) info->Type = MEM_IMAGE; else if (view->protect & VPROT_VALLOC) info->Type = MEM_PRIVATE; else info->Type = MEM_MAPPED; - for (size = base - alloc_base; size < view->size; size += page_size) + for (size = base - alloc_base; size < base + range_size - alloc_base; size += page_size) if (view->prot[size >> page_shift] != vprot) break; } server_leave_uninterrupted_section( &csVirtual, &sigset ); diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 431fef6ced2..dbca959bd35 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -1729,6 +1729,35 @@ struct get_mapping_info_reply }; + +struct get_mapping_committed_range_request +{ + struct request_header __header; + obj_handle_t handle; + file_pos_t offset; +}; +struct get_mapping_committed_range_reply +{ + struct reply_header __header; + file_pos_t size; + int committed; +}; + + + +struct add_mapping_committed_range_request +{ + struct request_header __header; + obj_handle_t handle; + file_pos_t offset; + file_pos_t size; +}; +struct add_mapping_committed_range_reply +{ + struct reply_header __header; +}; + + #define SNAP_HEAPLIST 0x00000001 #define SNAP_PROCESS 0x00000002 #define SNAP_THREAD 0x00000004 @@ -4389,6 +4418,8 @@ enum request REQ_create_mapping, REQ_open_mapping, REQ_get_mapping_info, + REQ_get_mapping_committed_range, + REQ_add_mapping_committed_range, REQ_create_snapshot, REQ_next_process, REQ_next_thread, @@ -4631,6 +4662,8 @@ union generic_request struct create_mapping_request create_mapping_request; struct open_mapping_request open_mapping_request; struct get_mapping_info_request get_mapping_info_request; + struct get_mapping_committed_range_request get_mapping_committed_range_request; + struct add_mapping_committed_range_request add_mapping_committed_range_request; struct create_snapshot_request create_snapshot_request; struct next_process_request next_process_request; struct next_thread_request next_thread_request; @@ -4871,6 +4904,8 @@ union generic_reply struct create_mapping_reply create_mapping_reply; struct open_mapping_reply open_mapping_reply; struct get_mapping_info_reply get_mapping_info_reply; + struct get_mapping_committed_range_reply get_mapping_committed_range_reply; + struct add_mapping_committed_range_reply add_mapping_committed_range_reply; struct create_snapshot_reply create_snapshot_reply; struct next_process_reply next_process_reply; struct next_thread_reply next_thread_reply; @@ -5035,6 +5070,6 @@ union generic_reply struct set_window_layered_info_reply set_window_layered_info_reply; }; -#define SERVER_PROTOCOL_VERSION 344 +#define SERVER_PROTOCOL_VERSION 345 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/mapping.c b/server/mapping.c index 02b73b19715..34fc6ced096 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -39,6 +39,18 @@ #include "request.h" #include "security.h" +/* list of memory ranges, used to store committed info */ +struct ranges +{ + unsigned int count; + unsigned int max; + struct range + { + file_pos_t start; + file_pos_t end; + } ranges[1]; +}; + struct mapping { struct object obj; /* object header */ @@ -47,6 +59,7 @@ struct mapping struct file *file; /* file mapped */ int header_size; /* size of headers (for PE image mapping) */ void *base; /* default base addr (for PE image mapping) */ + struct ranges *committed; /* list of committed ranges in this mapping */ struct file *shared_file; /* temp file for shared PE mapping */ struct list shared_entry; /* entry in global shared PE mappings list */ }; @@ -138,6 +151,81 @@ static inline void get_section_sizes( const IMAGE_SECTION_HEADER *sec, size_t *m if (*file_size > *map_size) *file_size = *map_size; } +/* add a range to the committed list */ +static void add_committed_range( struct mapping *mapping, file_pos_t start, file_pos_t end ) +{ + unsigned int i, j; + struct range *ranges; + + if (!mapping->committed) return; /* everything committed already */ + + for (i = 0, ranges = mapping->committed->ranges; i < mapping->committed->count; i++) + { + if (ranges[i].start > end) break; + if (ranges[i].end < start) continue; + if (ranges[i].start > start) ranges[i].start = start; /* extend downwards */ + if (ranges[i].end < end) /* extend upwards and maybe merge with next */ + { + for (j = i + 1; j < mapping->committed->count; j++) + { + if (ranges[j].start > end) break; + if (ranges[j].end > end) end = ranges[j].end; + } + if (j > i + 1) + { + memmove( &ranges[i + 1], &ranges[j], (mapping->committed->count - j) * sizeof(*ranges) ); + mapping->committed->count -= j - (i + 1); + } + ranges[i].end = end; + } + return; + } + + /* now add a new range */ + + if (mapping->committed->count == mapping->committed->max) + { + unsigned int new_size = mapping->committed->max * 2; + struct ranges *new_ptr = realloc( mapping->committed, offsetof( struct ranges, ranges[new_size] )); + if (!new_ptr) return; + new_ptr->max = new_size; + ranges = new_ptr->ranges; + mapping->committed = new_ptr; + } + memmove( &ranges[i + 1], &ranges[i], (mapping->committed->count - i) * sizeof(*ranges) ); + ranges[i].start = start; + ranges[i].end = end; + mapping->committed->count++; +} + +/* find the range containing start and return whether it's committed */ +static int find_committed_range( struct mapping *mapping, file_pos_t start, file_pos_t *size ) +{ + unsigned int i; + struct range *ranges; + + if (!mapping->committed) /* everything is committed */ + { + *size = mapping->size - start; + return 1; + } + for (i = 0, ranges = mapping->committed->ranges; i < mapping->committed->count; i++) + { + if (ranges[i].start > start) + { + *size = ranges[i].start - start; + return 0; + } + if (ranges[i].end > start) + { + *size = ranges[i].end - start; + return 1; + } + } + *size = mapping->size - start; + return 0; +} + /* allocate and fill the temp file for a shared PE image mapping */ static int build_shared_mapping( struct mapping *mapping, int fd, IMAGE_SECTION_HEADER *sec, unsigned int nb_sec ) @@ -302,13 +390,20 @@ static struct object *create_mapping( struct directory *root, const struct unico SACL_SECURITY_INFORMATION ); mapping->header_size = 0; mapping->base = NULL; + mapping->file = NULL; mapping->shared_file = NULL; + mapping->committed = NULL; if (protect & VPROT_READ) access |= FILE_READ_DATA; if (protect & VPROT_WRITE) access |= FILE_WRITE_DATA; if (handle) { + if (!(protect & VPROT_COMMITTED)) + { + set_error( STATUS_INVALID_PARAMETER ); + goto error; + } if (!(mapping->file = get_file_obj( current->process, handle, access ))) goto error; if (protect & VPROT_IMAGE) { @@ -334,9 +429,14 @@ static struct object *create_mapping( struct directory *root, const struct unico if (!size || (protect & VPROT_IMAGE)) { set_error( STATUS_INVALID_PARAMETER ); - mapping->file = NULL; goto error; } + if (!(protect & VPROT_COMMITTED)) + { + if (!(mapping->committed = mem_alloc( offsetof(struct ranges, ranges[8]) ))) goto error; + mapping->committed->count = 0; + mapping->committed->max = 8; + } if (!(mapping->file = create_temp_file( access ))) goto error; if (!grow_file( mapping->file, size )) goto error; } @@ -394,6 +494,7 @@ static void mapping_destroy( struct object *obj ) release_object( mapping->shared_file ); list_remove( &mapping->shared_entry ); } + free( mapping->committed ); } int get_page_size(void) @@ -485,3 +586,39 @@ DECL_HANDLER(get_mapping_info) release_object( mapping ); } } + +/* get a range of committed pages in a file mapping */ +DECL_HANDLER(get_mapping_committed_range) +{ + struct mapping *mapping; + + if ((mapping = (struct mapping *)get_handle_obj( current->process, req->handle, 0, &mapping_ops ))) + { + if (!(req->offset & page_mask) && req->offset < mapping->size) + reply->committed = find_committed_range( mapping, req->offset, &reply->size ); + else + set_error( STATUS_INVALID_PARAMETER ); + + release_object( mapping ); + } +} + +/* add a range to the committed pages in a file mapping */ +DECL_HANDLER(add_mapping_committed_range) +{ + struct mapping *mapping; + + if ((mapping = (struct mapping *)get_handle_obj( current->process, req->handle, 0, &mapping_ops ))) + { + if (!(req->size & page_mask) && + !(req->offset & page_mask) && + req->offset < mapping->size && + req->size > 0 && + req->size <= mapping->size - req->offset) + add_committed_range( mapping, req->offset, req->offset + req->size ); + else + set_error( STATUS_INVALID_PARAMETER ); + + release_object( mapping ); + } +} diff --git a/server/protocol.def b/server/protocol.def index 92f931dede2..0969330f773 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1361,6 +1361,24 @@ enum char_info_mode @END +/* Get a range of committed pages in a file mapping */ +@REQ(get_mapping_committed_range) + obj_handle_t handle; /* handle to the mapping */ + file_pos_t offset; /* starting offset (page-aligned, in bytes) */ +@REPLY + file_pos_t size; /* size of range starting at offset (page-aligned, in bytes) */ + int committed; /* whether it is a committed range */ +@END + + +/* Add a range to the committed pages in a file mapping */ +@REQ(add_mapping_committed_range) + obj_handle_t handle; /* handle to the mapping */ + file_pos_t offset; /* starting offset (page-aligned, in bytes) */ + file_pos_t size; /* size to set (page-aligned, in bytes) or 0 if only retrieving */ +@END + + #define SNAP_HEAPLIST 0x00000001 #define SNAP_PROCESS 0x00000002 #define SNAP_THREAD 0x00000004 diff --git a/server/request.h b/server/request.h index 5fc5236004a..9fc5f25029a 100644 --- a/server/request.h +++ b/server/request.h @@ -184,6 +184,8 @@ DECL_HANDLER(read_change); DECL_HANDLER(create_mapping); DECL_HANDLER(open_mapping); DECL_HANDLER(get_mapping_info); +DECL_HANDLER(get_mapping_committed_range); +DECL_HANDLER(add_mapping_committed_range); DECL_HANDLER(create_snapshot); DECL_HANDLER(next_process); DECL_HANDLER(next_thread); @@ -425,6 +427,8 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = (req_handler)req_create_mapping, (req_handler)req_open_mapping, (req_handler)req_get_mapping_info, + (req_handler)req_get_mapping_committed_range, + (req_handler)req_add_mapping_committed_range, (req_handler)req_create_snapshot, (req_handler)req_next_process, (req_handler)req_next_thread, diff --git a/server/trace.c b/server/trace.c index 39fda8c6c87..38cabcbe01d 100644 --- a/server/trace.c +++ b/server/trace.c @@ -1784,6 +1784,31 @@ static void dump_get_mapping_info_reply( const struct get_mapping_info_reply *re fprintf( stderr, " shared_file=%p", req->shared_file ); } +static void dump_get_mapping_committed_range_request( const struct get_mapping_committed_range_request *req ) +{ + fprintf( stderr, " handle=%p,", req->handle ); + fprintf( stderr, " offset=" ); + dump_file_pos( &req->offset ); +} + +static void dump_get_mapping_committed_range_reply( const struct get_mapping_committed_range_reply *req ) +{ + fprintf( stderr, " size=" ); + dump_file_pos( &req->size ); + fprintf( stderr, "," ); + fprintf( stderr, " committed=%d", req->committed ); +} + +static void dump_add_mapping_committed_range_request( const struct add_mapping_committed_range_request *req ) +{ + fprintf( stderr, " handle=%p,", req->handle ); + fprintf( stderr, " offset=" ); + dump_file_pos( &req->offset ); + fprintf( stderr, "," ); + fprintf( stderr, " size=" ); + dump_file_pos( &req->size ); +} + static void dump_create_snapshot_request( const struct create_snapshot_request *req ) { fprintf( stderr, " attributes=%08x,", req->attributes ); @@ -3872,6 +3897,8 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_create_mapping_request, (dump_func)dump_open_mapping_request, (dump_func)dump_get_mapping_info_request, + (dump_func)dump_get_mapping_committed_range_request, + (dump_func)dump_add_mapping_committed_range_request, (dump_func)dump_create_snapshot_request, (dump_func)dump_next_process_request, (dump_func)dump_next_thread_request, @@ -4041,29 +4068,29 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_get_new_process_info_reply, (dump_func)dump_new_thread_reply, (dump_func)dump_get_startup_info_reply, - (dump_func)0, + NULL, (dump_func)dump_init_thread_reply, (dump_func)dump_terminate_process_reply, (dump_func)dump_terminate_thread_reply, (dump_func)dump_get_process_info_reply, - (dump_func)0, + NULL, (dump_func)dump_get_thread_info_reply, - (dump_func)0, + NULL, (dump_func)dump_get_dll_info_reply, (dump_func)dump_suspend_thread_reply, (dump_func)dump_resume_thread_reply, - (dump_func)0, - (dump_func)0, + NULL, + NULL, (dump_func)dump_queue_apc_reply, (dump_func)dump_get_apc_result_reply, - (dump_func)0, + NULL, (dump_func)dump_set_handle_info_reply, (dump_func)dump_dup_handle_reply, (dump_func)dump_open_process_reply, (dump_func)dump_open_thread_reply, (dump_func)dump_select_reply, (dump_func)dump_create_event_reply, - (dump_func)0, + NULL, (dump_func)dump_open_event_reply, (dump_func)dump_create_mutex_reply, (dump_func)dump_release_mutex_reply, @@ -4077,39 +4104,41 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_get_handle_fd_reply, (dump_func)dump_flush_file_reply, (dump_func)dump_lock_file_reply, - (dump_func)0, + NULL, (dump_func)dump_create_socket_reply, (dump_func)dump_accept_socket_reply, - (dump_func)0, + NULL, (dump_func)dump_get_socket_event_reply, - (dump_func)0, - (dump_func)0, + NULL, + NULL, (dump_func)dump_alloc_console_reply, - (dump_func)0, + NULL, (dump_func)dump_get_console_renderer_events_reply, (dump_func)dump_open_console_reply, (dump_func)dump_get_console_wait_event_reply, (dump_func)dump_get_console_mode_reply, - (dump_func)0, - (dump_func)0, + NULL, + NULL, (dump_func)dump_get_console_input_info_reply, - (dump_func)0, + NULL, (dump_func)dump_get_console_input_history_reply, (dump_func)dump_create_console_output_reply, - (dump_func)0, + NULL, (dump_func)dump_get_console_output_info_reply, (dump_func)dump_write_console_input_reply, (dump_func)dump_read_console_input_reply, (dump_func)dump_write_console_output_reply, (dump_func)dump_fill_console_output_reply, (dump_func)dump_read_console_output_reply, - (dump_func)0, - (dump_func)0, - (dump_func)0, + NULL, + NULL, + NULL, (dump_func)dump_read_change_reply, (dump_func)dump_create_mapping_reply, (dump_func)dump_open_mapping_reply, (dump_func)dump_get_mapping_info_reply, + (dump_func)dump_get_mapping_committed_range_reply, + NULL, (dump_func)dump_create_snapshot_reply, (dump_func)dump_next_process_reply, (dump_func)dump_next_thread_reply, @@ -4117,26 +4146,26 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_wait_debug_event_reply, (dump_func)dump_queue_exception_event_reply, (dump_func)dump_get_exception_status_reply, - (dump_func)0, - (dump_func)0, - (dump_func)0, + NULL, + NULL, + NULL, (dump_func)dump_debug_break_reply, - (dump_func)0, + NULL, (dump_func)dump_read_process_memory_reply, - (dump_func)0, + NULL, (dump_func)dump_create_key_reply, (dump_func)dump_open_key_reply, - (dump_func)0, - (dump_func)0, + NULL, + NULL, (dump_func)dump_enum_key_reply, - (dump_func)0, + NULL, (dump_func)dump_get_key_value_reply, (dump_func)dump_enum_key_value_reply, - (dump_func)0, - (dump_func)0, - (dump_func)0, - (dump_func)0, - (dump_func)0, + NULL, + NULL, + NULL, + NULL, + NULL, (dump_func)dump_create_timer_reply, (dump_func)dump_open_timer_reply, (dump_func)dump_set_timer_reply, @@ -4146,37 +4175,37 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_set_thread_context_reply, (dump_func)dump_get_selector_entry_reply, (dump_func)dump_add_atom_reply, - (dump_func)0, + NULL, (dump_func)dump_find_atom_reply, (dump_func)dump_get_atom_information_reply, - (dump_func)0, - (dump_func)0, + NULL, + NULL, (dump_func)dump_init_atom_table_reply, (dump_func)dump_get_msg_queue_reply, - (dump_func)0, + NULL, (dump_func)dump_set_queue_mask_reply, (dump_func)dump_get_queue_status_reply, (dump_func)dump_get_process_idle_event_reply, - (dump_func)0, - (dump_func)0, - (dump_func)0, + NULL, + NULL, + NULL, (dump_func)dump_get_message_reply, - (dump_func)0, - (dump_func)0, + NULL, + NULL, (dump_func)dump_get_message_reply_reply, (dump_func)dump_set_win_timer_reply, - (dump_func)0, + NULL, (dump_func)dump_is_window_hung_reply, (dump_func)dump_get_serial_info_reply, - (dump_func)0, - (dump_func)0, - (dump_func)0, + NULL, + NULL, + NULL, (dump_func)dump_ioctl_reply, (dump_func)dump_get_ioctl_result_reply, (dump_func)dump_create_named_pipe_reply, (dump_func)dump_get_named_pipe_info_reply, (dump_func)dump_create_window_reply, - (dump_func)0, + NULL, (dump_func)dump_get_desktop_window_reply, (dump_func)dump_set_window_owner_reply, (dump_func)dump_get_window_info_reply, @@ -4189,36 +4218,36 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_set_window_pos_reply, (dump_func)dump_get_window_rectangles_reply, (dump_func)dump_get_window_text_reply, - (dump_func)0, + NULL, (dump_func)dump_get_windows_offset_reply, (dump_func)dump_get_visible_region_reply, (dump_func)dump_get_window_region_reply, - (dump_func)0, + NULL, (dump_func)dump_get_update_region_reply, - (dump_func)0, - (dump_func)0, - (dump_func)0, + NULL, + NULL, + NULL, (dump_func)dump_remove_window_property_reply, (dump_func)dump_get_window_property_reply, (dump_func)dump_get_window_properties_reply, (dump_func)dump_create_winstation_reply, (dump_func)dump_open_winstation_reply, - (dump_func)0, + NULL, (dump_func)dump_get_process_winstation_reply, - (dump_func)0, + NULL, (dump_func)dump_enum_winstation_reply, (dump_func)dump_create_desktop_reply, (dump_func)dump_open_desktop_reply, - (dump_func)0, + NULL, (dump_func)dump_get_thread_desktop_reply, - (dump_func)0, + NULL, (dump_func)dump_enum_desktop_reply, (dump_func)dump_set_user_object_info_reply, - (dump_func)0, + NULL, (dump_func)dump_get_thread_input_reply, (dump_func)dump_get_last_input_time_reply, (dump_func)dump_get_key_state_reply, - (dump_func)0, + NULL, (dump_func)dump_set_foreground_window_reply, (dump_func)dump_set_focus_window_reply, (dump_func)dump_set_active_window_reply, @@ -4228,7 +4257,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_set_hook_reply, (dump_func)dump_remove_hook_reply, (dump_func)dump_start_hook_chain_reply, - (dump_func)0, + NULL, (dump_func)dump_get_hook_info_reply, (dump_func)dump_create_class_reply, (dump_func)dump_destroy_class_reply, @@ -4243,7 +4272,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_access_check_reply, (dump_func)dump_get_token_user_reply, (dump_func)dump_get_token_groups_reply, - (dump_func)0, + NULL, (dump_func)dump_get_security_object_reply, (dump_func)dump_create_mailslot_reply, (dump_func)dump_set_mailslot_info_reply, @@ -4254,24 +4283,24 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_open_symlink_reply, (dump_func)dump_query_symlink_reply, (dump_func)dump_get_object_info_reply, - (dump_func)0, + NULL, (dump_func)dump_get_token_impersonation_level_reply, (dump_func)dump_allocate_locally_unique_id_reply, (dump_func)dump_create_device_manager_reply, (dump_func)dump_create_device_reply, - (dump_func)0, + NULL, (dump_func)dump_get_next_device_request_reply, (dump_func)dump_make_process_system_reply, (dump_func)dump_get_token_statistics_reply, (dump_func)dump_create_completion_reply, (dump_func)dump_open_completion_reply, - (dump_func)0, + NULL, (dump_func)dump_remove_completion_reply, (dump_func)dump_query_completion_reply, - (dump_func)0, - (dump_func)0, + NULL, + NULL, (dump_func)dump_get_window_layered_info_reply, - (dump_func)0, + NULL, }; static const char * const req_names[REQ_NB_REQUESTS] = { @@ -4348,6 +4377,8 @@ static const char * const req_names[REQ_NB_REQUESTS] = { "create_mapping", "open_mapping", "get_mapping_info", + "get_mapping_committed_range", + "add_mapping_committed_range", "create_snapshot", "next_process", "next_thread",