Validate access even if wrap past address 0 for IsBadStringPtr[A|W]
and IsBad[Read|Write]Ptr.

diff --git a/memory/virtual.c b/memory/virtual.c
index 97e5db6..2ebc117 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -85,9 +85,11 @@
 /* These are always the same on an i386, and it will be faster this way */
 # define page_mask  0xfff
 # define page_shift 12
+# define page_size  0x1000
 #else
 static UINT page_shift;
 static UINT page_mask;
+static UINT page_size;
 #endif  /* __i386__ */
 #define granularity_mask 0xffff  /* Allocation granularity (usually 64k) */
 
@@ -578,8 +580,6 @@
 #ifndef page_mask
 DECL_GLOBAL_CONSTRUCTOR(VIRTUAL_Init)
 {
-    DWORD page_size;
-
 # ifdef HAVE_GETPAGESIZE
     page_size = getpagesize();
 # else
@@ -1163,18 +1163,21 @@
               LPCVOID ptr, /* Address of memory block */
               UINT size )  /* Size of block */
 {
+    if (!size) return FALSE;  /* handle 0 size case w/o reference */
     __TRY
     {
         volatile const char *p = ptr;
-        volatile const char *end = p + size - 1;
         char dummy;
+        UINT count = size;
 
-        while (p < end)
+        while (count > page_size)
         {
             dummy = *p;
-            p += page_mask + 1;
+            p += page_size;
+            count -= page_size;
         }
-        dummy = *end;
+        dummy = p[0];
+        dummy = p[count - 1];
     }
     __EXCEPT(page_fault) { return TRUE; }
     __ENDTRY
@@ -1193,17 +1196,20 @@
               LPVOID ptr, /* [in] Address of memory block */
               UINT size ) /* [in] Size of block in bytes */
 {
+    if (!size) return FALSE;  /* handle 0 size case w/o reference */
     __TRY
     {
         volatile char *p = ptr;
-        volatile char *end = p + size - 1;
+        UINT count = size;
 
-        while (p < end)
+        while (count > page_size)
         {
             *p |= 0;
-            p += page_mask + 1;
+            p += page_size;
+            count -= page_size;
         }
-        *end |= 0;
+        p[0] |= 0;
+        p[count - 1] |= 0;
     }
     __EXCEPT(page_fault) { return TRUE; }
     __ENDTRY
@@ -1266,7 +1272,7 @@
     __TRY
     {
         volatile const char *p = str;
-        while (p < str + max) if (!*p++) break;
+        while (p != str + max) if (!*p++) break;
     }
     __EXCEPT(page_fault) { return TRUE; }
     __ENDTRY
@@ -1283,7 +1289,7 @@
     __TRY
     {
         volatile const WCHAR *p = str;
-        while (p < str + max) if (!*p++) break;
+        while (p != str + max) if (!*p++) break;
     }
     __EXCEPT(page_fault) { return TRUE; }
     __ENDTRY
@@ -1301,7 +1307,7 @@
  *	NULL: Failure
  */
 HANDLE WINAPI CreateFileMappingA(
-                HFILE hFile,   /* [in] Handle of file to map */
+                HANDLE hFile,   /* [in] Handle of file to map */
                 SECURITY_ATTRIBUTES *sa, /* [in] Optional security attributes*/
                 DWORD protect,   /* [in] Protection for mapping object */
                 DWORD size_high, /* [in] High-order 32 bits of object size */
@@ -1361,7 +1367,7 @@
  *             CreateFileMappingW   (KERNEL32.47)
  * See CreateFileMappingA
  */
-HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES sa, 
+HANDLE WINAPI CreateFileMappingW( HANDLE hFile, LPSECURITY_ATTRIBUTES sa, 
                                   DWORD protect, DWORD size_high,  
                                   DWORD size_low, LPCWSTR name )
 {