Alexandre Julliard : gdi32/tests: Add a test case for calling WriteFile with the DIB section bits as buffer.

Alexandre Julliard julliard at winehq.org
Thu Jan 15 08:50:57 CST 2009


Module: wine
Branch: master
Commit: d2b217e90a3222506605037263fd57222c639543
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d2b217e90a3222506605037263fd57222c639543

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jan 14 20:19:42 2009 +0100

gdi32/tests: Add a test case for calling WriteFile with the DIB section bits as buffer.

---

 dlls/gdi32/tests/bitmap.c |   58 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index 3f8a674..b4dc09e 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -396,6 +396,62 @@ static void test_dib_info(HBITMAP hbm, const void *bits, const BITMAPINFOHEADER
     test_color_todo(c, exp, GetPixel, todo_getp); \
 }
 
+static void test_dib_bits_access( HBITMAP hdib, void *bits )
+{
+    MEMORY_BASIC_INFORMATION info;
+    char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
+    DWORD data[256];
+    BITMAPINFO *pbmi = (BITMAPINFO *)bmibuf;
+    HDC hdc = GetDC(0);
+    char filename[MAX_PATH];
+    HANDLE file;
+    DWORD written;
+    INT ret;
+
+    ok(VirtualQuery(bits, &info, sizeof(info)) == sizeof(info),
+        "VirtualQuery failed\n");
+    ok(info.BaseAddress == bits, "%p != %p\n", info.BaseAddress, bits);
+    ok(info.AllocationBase == bits, "%p != %p\n", info.AllocationBase, bits);
+    ok(info.AllocationProtect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.AllocationProtect);
+    ok(info.State == MEM_COMMIT, "%x != MEM_COMMIT\n", info.State);
+    ok(info.Protect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.Protect);
+    ok(info.Type == MEM_PRIVATE, "%x != MEM_PRIVATE\n", info.Type);
+
+    memset( pbmi, 0, sizeof(bmibuf) );
+    memset( data, 0xcc, sizeof(data) );
+    pbmi->bmiHeader.biSize = sizeof(pbmi->bmiHeader);
+    pbmi->bmiHeader.biHeight = 16;
+    pbmi->bmiHeader.biWidth = 16;
+    pbmi->bmiHeader.biBitCount = 32;
+    pbmi->bmiHeader.biPlanes = 1;
+    pbmi->bmiHeader.biCompression = BI_RGB;
+
+    ret = SetDIBits( hdc, hdib, 0, 16, data, pbmi, DIB_RGB_COLORS );
+    ok( ret == 16, "SetDIBits failed\n" );
+
+    ok(VirtualQuery(bits, &info, sizeof(info)) == sizeof(info),
+        "VirtualQuery failed\n");
+    ok(info.BaseAddress == bits, "%p != %p\n", info.BaseAddress, bits);
+    ok(info.AllocationBase == bits, "%p != %p\n", info.AllocationBase, bits);
+    ok(info.AllocationProtect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.AllocationProtect);
+    ok(info.State == MEM_COMMIT, "%x != MEM_COMMIT\n", info.State);
+    ok(info.Type == MEM_PRIVATE, "%x != MEM_PRIVATE\n", info.Type);
+    /* it has been protected now */
+    todo_wine ok(info.Protect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.Protect);
+
+    /* try writing protected bits to a file */
+
+    GetTempFileNameA( ".", "dib", 0, filename );
+    file = CreateFileA( filename, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
+                        CREATE_ALWAYS, 0, 0 );
+    ok( file != INVALID_HANDLE_VALUE, "failed to open %s error %u\n", filename, GetLastError() );
+    ret = WriteFile( file, bits, 8192, &written, NULL );
+    ok( ret, "WriteFile failed error %u\n", GetLastError() );
+    if (ret) ok( written == 8192, "only wrote %u bytes\n", written );
+    CloseHandle( file );
+    DeleteFileA( filename );
+}
+
 static void test_dibsections(void)
 {
     HDC hdc, hdcmem, hdcmem2;
@@ -455,6 +511,8 @@ static void test_dibsections(void)
     ok(info.Protect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.Protect);
     ok(info.Type == MEM_PRIVATE, "%x != MEM_PRIVATE\n", info.Type);
 
+    test_dib_bits_access( hdib, bits );
+
     test_dib_info(hdib, bits, &pbmi->bmiHeader);
     DeleteObject(hdib);
 




More information about the wine-cvs mailing list