Use GlobalPageLock for GetVDMPointer32W16 Pointers
Uwe Bonnes
bon at elektron.ikp.physik.tu-darmstadt.de
Sat Dec 15 12:17:51 CST 2001
dlls/kernel/wowthunk.c: GetVDMPointer32W16
Use GlobalPageLock for GetVDMPointer32W16 Pointers
memory/global.c: GlobalReAlloc16
If heap has GlobalPageLock set, try only with
HEAP_REALLOC_IN_PLACE_ONLY flag set
Remarks: This makes the MS Encarta 99 Installer work. The installer is
a mixture of 16 and 32 bit code.
Bye
Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Free Software: If you contribute nothing, expect nothing
--
Index: wine/memory/global.c
===================================================================
RCS file: /home/wine/wine/memory/global.c,v
retrieving revision 1.59
diff -u -r1.59 global.c
--- wine/memory/global.c 20 Nov 2001 20:26:35 -0000 1.59
+++ wine/memory/global.c 15 Dec 2001 18:15:26 -0000
@@ -318,17 +318,24 @@
ptr = (void *)pArena->base;
oldsize = pArena->size;
- TRACE("oldsize %08lx\n",oldsize);
+ TRACE("oldbase %p oldsize %08lx newsize %08lx\n", ptr,oldsize,size);
if (ptr && (size == oldsize)) return handle; /* Nothing to do */
if (pArena->flags & GA_DOSMEM)
ptr = DOSMEM_ResizeBlock(ptr, size, NULL);
else
- ptr = HeapReAlloc( GetProcessHeap(), 0, ptr, size );
+ /* if more then one reader (e.g. some pointer has been given out by GetVDMPointer32W16),
+ only try to realloc in place */
+ ptr = HeapReAlloc( GetProcessHeap(),
+ (pArena->pageLockCount > 0)?HEAP_REALLOC_IN_PLACE_ONLY:0, ptr, size );
if (!ptr)
{
- SELECTOR_FreeBlock( sel );
- memset( pArena, 0, sizeof(GLOBALARENA) );
+ FIXME("Realloc failed lock %d\n",pArena->pageLockCount);
+ if (pArena->pageLockCount <1)
+ {
+ SELECTOR_FreeBlock( sel );
+ memset( pArena, 0, sizeof(GLOBALARENA) );
+ }
return 0;
}
@@ -350,9 +357,10 @@
return 0;
}
- /* Fill the new arena block */
+ /* Fill the new arena block
+ As we may have used HEAP_REALLOC_IN_PLACE_ONLY, areas may overlap*/
- if (pNewArena != pArena) memcpy( pNewArena, pArena, sizeof(GLOBALARENA) );
+ if (pNewArena != pArena) memmove( pNewArena, pArena, sizeof(GLOBALARENA) );
pNewArena->base = (DWORD)ptr;
pNewArena->size = GetSelectorLimit16(sel) + 1;
pNewArena->selCount = selcount;
Index: wine/dlls/kernel/wowthunk.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/wowthunk.c,v
retrieving revision 1.16
diff -u -r1.16 wowthunk.c
--- wine/dlls/kernel/wowthunk.c 25 Jul 2001 00:43:30 -0000 1.16
+++ wine/dlls/kernel/wowthunk.c 15 Dec 2001 18:15:26 -0000
@@ -294,6 +294,7 @@
*/
DWORD WINAPI GetVDMPointer32W16( SEGPTR vp, UINT16 fMode )
{
+ GlobalPageLock16(GlobalHandle16(SELECTOROF(vp)));
return (DWORD)K32WOWGetVDMPointer( vp, 0, (DWORD)fMode );
}
More information about the wine-patches
mailing list