In CreateDIBSection, the offset into the file mapping does not have to be a multiple of the memory allocation granularity.
diff --git a/graphics/x11drv/dib.c b/graphics/x11drv/dib.c index 13b998a..1dda259 100644 --- a/graphics/x11drv/dib.c +++ b/graphics/x11drv/dib.c
@@ -3793,6 +3793,7 @@ BITMAPINFOHEADER *bi = &bmi->bmiHeader; INT effHeight, totalSize; BITMAP bm; + LPVOID mapBits = NULL; TRACE("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n", bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount, @@ -3814,8 +3815,21 @@ ? bi->biSizeImage : bm.bmWidthBytes * effHeight; if (section) - bm.bmBits = MapViewOfFile(section, FILE_MAP_ALL_ACCESS, - 0L, offset, totalSize); + { + SYSTEM_INFO SystemInfo; + DWORD mapOffset; + INT mapSize; + + GetSystemInfo( &SystemInfo ); + mapOffset = offset - (offset % SystemInfo.dwAllocationGranularity); + mapSize = totalSize + (offset - mapOffset); + mapBits = MapViewOfFile( section, + FILE_MAP_ALL_ACCESS, + 0L, + mapOffset, + mapSize ); + bm.bmBits = (char *)mapBits + (offset - mapOffset); + } else if (ovr_pitch && offset) bm.bmBits = (LPVOID) offset; else { @@ -3916,7 +3930,7 @@ if (bm.bmBits) { if (section) - UnmapViewOfFile(bm.bmBits), bm.bmBits = NULL; + UnmapViewOfFile(mapBits), bm.bmBits = NULL; else if (!offset) VirtualFree(bm.bmBits, 0L, MEM_RELEASE), bm.bmBits = NULL; }
diff --git a/objects/dib.c b/objects/dib.c index 29f8090..5dfb6c9 100644 --- a/objects/dib.c +++ b/objects/dib.c
@@ -930,7 +930,12 @@ if (dib->dsBm.bmBits) { if (dib->dshSection) - UnmapViewOfFile(dib->dsBm.bmBits); + { + SYSTEM_INFO SystemInfo; + GetSystemInfo( &SystemInfo ); + UnmapViewOfFile( (char *)dib->dsBm.bmBits - + (dib->dsOffset % SystemInfo.dwAllocationGranularity) ); + } else if (!dib->dsOffset) VirtualFree(dib->dsBm.bmBits, 0L, MEM_RELEASE ); }