Alexandre Julliard : ntdll: Fixes in virtual memory protection flags.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Dec 14 05:23:32 CST 2005
Module: wine
Branch: refs/heads/master
Commit: 354e7700b300421779d489847c7b900cc30ca0bb
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=354e7700b300421779d489847c7b900cc30ca0bb
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Dec 14 12:17:59 2005 +0100
ntdll: Fixes in virtual memory protection flags.
Tweak reporting of virtual protection flags and address space limit to
yield results closer to what Windows does.
---
dlls/ntdll/virtual.c | 34 +++++++++++++---------------------
1 files changed, 13 insertions(+), 21 deletions(-)
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 7d2d445..3cd9fff 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -118,7 +118,7 @@ static RTL_CRITICAL_SECTION csVirtual =
# define page_size 0x1000
/* Note: these are Windows limits, you cannot change them. */
# define ADDRESS_SPACE_LIMIT ((void *)0xc0000000) /* top of the total available address space */
-# define USER_SPACE_LIMIT ((void *)0x80000000) /* top of the user address space */
+# define USER_SPACE_LIMIT ((void *)0x7fff0000) /* top of the user address space */
#else
static UINT page_shift;
static UINT page_size;
@@ -379,7 +379,7 @@ static NTSTATUS create_view( struct file
view->flags = 0;
view->mapping = 0;
view->protect = vprot;
- memset( view->prot, vprot, size >> page_shift );
+ memset( view->prot, vprot & ~VPROT_IMAGE, size >> page_shift );
/* Insert it in the linked list */
@@ -448,22 +448,13 @@ static int VIRTUAL_GetUnixProt( BYTE vpr
* VIRTUAL_GetWin32Prot
*
* Convert page protections to Win32 flags.
- *
- * RETURNS
- * None
*/
-static void VIRTUAL_GetWin32Prot(
- BYTE vprot, /* [in] Page protection flags */
- DWORD *protect, /* [out] Location to store Win32 protection flags */
- DWORD *state ) /* [out] Location to store mem state flag */
+static DWORD VIRTUAL_GetWin32Prot( BYTE vprot )
{
- if (protect) {
- *protect = VIRTUAL_Win32Flags[vprot & 0x0f];
- if (vprot & VPROT_NOCACHE) *protect |= PAGE_NOCACHE;
- if (vprot & VPROT_GUARD) *protect = PAGE_NOACCESS | PAGE_GUARD;
- }
-
- if (state) *state = (vprot & VPROT_COMMITTED) ? MEM_COMMIT : MEM_RESERVE;
+ DWORD ret = VIRTUAL_Win32Flags[vprot & 0x0f];
+ if (vprot & VPROT_NOCACHE) ret |= PAGE_NOCACHE;
+ if (vprot & VPROT_GUARD) ret |= PAGE_GUARD;
+ return ret;
}
@@ -1461,7 +1452,7 @@ NTSTATUS WINAPI NtProtectVirtualMemory(
/* Make sure all the pages are committed */
p = view->prot + ((base - (char *)view->base) >> page_shift);
- VIRTUAL_GetWin32Prot( *p, &prot, NULL );
+ prot = VIRTUAL_GetWin32Prot( *p );
for (i = size >> page_shift; i; i--, p++)
{
if (!(*p & VPROT_COMMITTED))
@@ -1583,13 +1574,14 @@ NTSTATUS WINAPI NtQueryVirtualMemory( HA
else
{
BYTE vprot = view->prot[(base - alloc_base) >> page_shift];
- VIRTUAL_GetWin32Prot( vprot, &info->Protect, &info->State );
- for (size = base - alloc_base; size < view->size; size += page_mask+1)
- if (view->prot[size >> page_shift] != vprot) break;
- VIRTUAL_GetWin32Prot( view->protect, &info->AllocationProtect, NULL );
+ info->State = (vprot & VPROT_COMMITTED) ? MEM_COMMIT : MEM_RESERVE;
+ info->Protect = VIRTUAL_GetWin32Prot( vprot );
+ info->AllocationProtect = VIRTUAL_GetWin32Prot( view->protect );
if (view->protect & VPROT_IMAGE) info->Type = MEM_IMAGE;
else if (view->flags & VFLAG_VALLOC) info->Type = MEM_PRIVATE;
else info->Type = MEM_MAPPED;
+ for (size = base - alloc_base; size < view->size; size += page_mask+1)
+ if (view->prot[size >> page_shift] != vprot) break;
}
RtlLeaveCriticalSection(&csVirtual);
More information about the wine-cvs
mailing list