Module: wine Branch: master Commit: 5073beaefe73de6cae50c97c3c3ec91d3d26b27f URL: http://source.winehq.org/git/wine.git/?a=commit;h=5073beaefe73de6cae50c97c3c...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Sep 8 15:37:12 2017 +0200
ntdll: Store the SEC_* section flags directly in the view protection.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/virtual.c | 45 +++++++++++++++++++----------------------- include/wine/server_protocol.h | 6 ++---- server/protocol.def | 6 ++---- 3 files changed, 24 insertions(+), 33 deletions(-)
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index 8fb11e8..8cf09bd 100644 --- a/dlls/ntdll/virtual.c +++ b/dlls/ntdll/virtual.c @@ -72,7 +72,7 @@ struct file_view size_t size; /* size in bytes */ HANDLE mapping; /* handle to the file mapping */ unsigned int map_protect; /* mapping protection */ - unsigned int protect; /* protection for all pages at allocation time */ + unsigned int protect; /* protection for all pages at allocation time and SEC_* flags */ };
@@ -727,11 +727,11 @@ static NTSTATUS create_view( struct file_view **view_ret, void *base, size_t siz * * Convert page protections to Win32 flags. */ -static DWORD VIRTUAL_GetWin32Prot( BYTE vprot ) +static DWORD VIRTUAL_GetWin32Prot( BYTE vprot, unsigned int map_prot ) { DWORD ret = VIRTUAL_Win32Flags[vprot & 0x0f]; - if (vprot & VPROT_NOCACHE) ret |= PAGE_NOCACHE; if (vprot & VPROT_GUARD) ret |= PAGE_GUARD; + if (map_prot & SEC_NOCACHE) ret |= PAGE_NOCACHE; return ret; }
@@ -785,7 +785,6 @@ static NTSTATUS get_vprot_flags( DWORD protect, unsigned int *vprot, BOOL image return STATUS_INVALID_PAGE_PROTECTION; } if (protect & PAGE_GUARD) *vprot |= VPROT_GUARD; - if (protect & PAGE_NOCACHE) *vprot |= VPROT_NOCACHE; return STATUS_SUCCESS; }
@@ -1148,7 +1147,7 @@ static SIZE_T get_committed_size( struct file_view *view, void *base, BYTE *vpro start = ((char *)base - (char *)view->base) >> page_shift; *vprot = get_page_vprot( base );
- if (view->mapping && !(view->protect & VPROT_COMMITTED)) + if (view->protect & SEC_RESERVE) { SIZE_T ret = 0; SERVER_START_REQ( get_mapping_committed_range ) @@ -1295,12 +1294,12 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz server_enter_uninterrupted_section( &csVirtual, &sigset );
if (base >= (char *)address_space_start) /* make sure the DOS area remains free */ - status = map_view( &view, base, total_size, mask, FALSE, - VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY | VPROT_IMAGE ); + status = map_view( &view, base, total_size, mask, FALSE, SEC_IMAGE | SEC_FILE | + VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY );
if (status != STATUS_SUCCESS) - status = map_view( &view, NULL, total_size, mask, FALSE, - VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY | VPROT_IMAGE ); + status = map_view( &view, NULL, total_size, mask, FALSE, SEC_IMAGE | SEC_FILE | + VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY );
if (status != STATUS_SUCCESS) goto error;
@@ -1633,7 +1632,7 @@ NTSTATUS virtual_create_builtin_view( void *module ) size = ROUND_SIZE( module, size ); base = ROUND_ADDR( module, page_mask ); server_enter_uninterrupted_section( &csVirtual, &sigset ); - status = create_view( &view, base, size, VPROT_SYSTEM | VPROT_IMAGE | + status = create_view( &view, base, size, SEC_IMAGE | SEC_FILE | VPROT_SYSTEM | VPROT_COMMITTED | VPROT_READ | VPROT_WRITECOPY | VPROT_EXEC ); if (!status) TRACE( "created %p-%p\n", base, (char *)base + size ); server_leave_uninterrupted_section( &csVirtual, &sigset ); @@ -2103,6 +2102,7 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_ if (vprot & VPROT_WRITECOPY) return STATUS_INVALID_PAGE_PROTECTION; vprot |= VPROT_VALLOC; if (type & MEM_COMMIT) vprot |= VPROT_COMMITTED; + if (protect & PAGE_NOCACHE) vprot |= SEC_NOCACHE;
if (*ret) { @@ -2165,9 +2165,9 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_ else /* commit the pages */ { if (!(view = VIRTUAL_FindView( base, size ))) status = STATUS_NOT_MAPPED_VIEW; - else if (view->mapping && (view->protect & VPROT_COMMITTED)) status = STATUS_ALREADY_COMMITTED; + else if (view->mapping && !(view->protect & SEC_RESERVE)) status = STATUS_ALREADY_COMMITTED; else if (!VIRTUAL_SetProt( view, base, size, vprot )) status = STATUS_ACCESS_DENIED; - else if (view->mapping && !(view->protect & VPROT_COMMITTED)) + else if (view->protect & SEC_RESERVE) { SERVER_START_REQ( add_mapping_committed_range ) { @@ -2358,7 +2358,7 @@ NTSTATUS WINAPI NtProtectVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T /* Make sure all the pages are committed */ if (get_committed_size( view, base, &vprot ) >= size && (vprot & VPROT_COMMITTED)) { - if (!(status = get_vprot_flags( new_prot, &new_vprot, view->protect & VPROT_IMAGE ))) + if (!(status = get_vprot_flags( new_prot, &new_vprot, view->protect & SEC_IMAGE ))) { if ((new_vprot & VPROT_WRITECOPY) && (view->protect & VPROT_VALLOC)) status = STATUS_INVALID_PAGE_PROTECTION; @@ -2367,9 +2367,7 @@ NTSTATUS WINAPI NtProtectVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T if (!view->mapping || is_compatible_protection( view, new_vprot )) { new_vprot |= VPROT_COMMITTED; - if (view->protect & VPROT_NOCACHE) new_vprot |= VPROT_NOCACHE; - else new_vprot &= ~VPROT_NOCACHE; - if (old_prot) *old_prot = VIRTUAL_GetWin32Prot( vprot ); + if (old_prot) *old_prot = VIRTUAL_GetWin32Prot( vprot, view->protect ); if (!VIRTUAL_SetProt( view, base, size, new_vprot )) status = STATUS_ACCESS_DENIED; } else status = STATUS_INVALID_PAGE_PROTECTION; @@ -2556,9 +2554,9 @@ NTSTATUS WINAPI NtQueryVirtualMemory( HANDLE process, LPCVOID addr, SIZE_T range_size = get_committed_size( view, base, &vprot );
info->State = (vprot & VPROT_COMMITTED) ? MEM_COMMIT : MEM_RESERVE; - info->Protect = (vprot & VPROT_COMMITTED) ? VIRTUAL_GetWin32Prot( vprot ) : 0; - info->AllocationProtect = VIRTUAL_GetWin32Prot( view->protect ); - if (view->protect & VPROT_IMAGE) info->Type = MEM_IMAGE; + info->Protect = (vprot & VPROT_COMMITTED) ? VIRTUAL_GetWin32Prot( vprot, view->protect ) : 0; + info->AllocationProtect = VIRTUAL_GetWin32Prot( view->protect, view->protect ); + if (view->protect & SEC_IMAGE) info->Type = MEM_IMAGE; else if (view->protect & VPROT_VALLOC) info->Type = MEM_PRIVATE; else info->Type = MEM_MAPPED; for (ptr = base; ptr < base + range_size; ptr += page_size) @@ -2807,10 +2805,6 @@ NTSTATUS WINAPI NtMapViewOfSection( HANDLE handle, HANDLE process, PVOID *addr_p SERVER_END_REQ; if (res) return res;
- if (!(sec_flags & SEC_RESERVE)) map_vprot |= VPROT_COMMITTED; - if (sec_flags & SEC_NOCACHE) map_vprot |= VPROT_NOCACHE; - if (sec_flags & SEC_IMAGE) map_vprot |= VPROT_IMAGE; - if ((res = server_get_unix_fd( handle, 0, &unix_handle, &needs_close, NULL, NULL ))) goto done;
if (sec_flags & SEC_IMAGE) @@ -2875,7 +2869,8 @@ NTSTATUS WINAPI NtMapViewOfSection( HANDLE handle, HANDLE process, PVOID *addr_p server_enter_uninterrupted_section( &csVirtual, &sigset );
get_vprot_flags( protect, &vprot, sec_flags & SEC_IMAGE ); - vprot |= (map_vprot & VPROT_COMMITTED); + vprot |= sec_flags; + if (!(sec_flags & SEC_RESERVE)) vprot |= VPROT_COMMITTED; res = map_view( &view, *addr_ptr, size, mask, FALSE, vprot ); if (res) { @@ -3225,7 +3220,7 @@ NTSTATUS WINAPI NtAreMappedFilesTheSame(PVOID addr1, PVOID addr2) status = STATUS_CONFLICTING_ADDRESSES; else if (view1 == view2) status = STATUS_SUCCESS; - else if (!(view1->protect & VPROT_IMAGE) || !(view2->protect & VPROT_IMAGE)) + else if (!(view1->protect & SEC_IMAGE) || !(view2->protect & SEC_IMAGE)) status = STATUS_NOT_SAME_DEVICE; else if (!stat_mapping_file( view1, &st1 ) && !stat_mapping_file( view2, &st2 ) && st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index f54cd1b..de4fd98 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -2192,11 +2192,9 @@ struct create_mapping_reply #define VPROT_EXEC 0x04 #define VPROT_WRITECOPY 0x08 #define VPROT_GUARD 0x10 -#define VPROT_NOCACHE 0x20 -#define VPROT_COMMITTED 0x40 -#define VPROT_WRITEWATCH 0x80 +#define VPROT_COMMITTED 0x20 +#define VPROT_WRITEWATCH 0x40
-#define VPROT_IMAGE 0x0100 #define VPROT_SYSTEM 0x0200 #define VPROT_VALLOC 0x0400
diff --git a/server/protocol.def b/server/protocol.def index e3d5d42..8f2509e 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1704,11 +1704,9 @@ enum char_info_mode #define VPROT_EXEC 0x04 #define VPROT_WRITECOPY 0x08 #define VPROT_GUARD 0x10 -#define VPROT_NOCACHE 0x20 -#define VPROT_COMMITTED 0x40 -#define VPROT_WRITEWATCH 0x80 +#define VPROT_COMMITTED 0x20 +#define VPROT_WRITEWATCH 0x40 /* per-mapping protection flags */ -#define VPROT_IMAGE 0x0100 /* mapping for an exe image */ #define VPROT_SYSTEM 0x0200 /* system view (underlying mmap not under our control) */ #define VPROT_VALLOC 0x0400 /* allocated by VirtualAlloc */