[PATCH 5/5] kernel32/tests: Add some HGLOBAL/HLOCAL entry layout tests.

Rémi Bernon rbernon at codeweavers.com
Mon Mar 28 04:00:16 CDT 2022


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/kernel32/tests/heap.c | 161 +++++++++++++++++++++++++++++++++++--
 1 file changed, 154 insertions(+), 7 deletions(-)

diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c
index 9921eaaf090..07d4409a5cd 100644
--- a/dlls/kernel32/tests/heap.c
+++ b/dlls/kernel32/tests/heap.c
@@ -240,6 +240,17 @@ static void test_HeapCreate(void)
 }
 
 
+struct mem_entry
+{
+    UINT_PTR flags;
+    void *ptr;
+};
+
+static struct mem_entry *mem_entry_from_HANDLE( HLOCAL handle )
+{
+    return CONTAINING_RECORD( handle, struct mem_entry, ptr );
+}
+
 static void test_GlobalAlloc(void)
 {
     static const UINT flags_tests[] =
@@ -257,11 +268,12 @@ static void test_GlobalAlloc(void)
     static const SIZE_T buffer_size = ARRAY_SIZE(zero_buffer);
     const HGLOBAL invalid_mem = LongToHandle( 0xdeadbee0 + sizeof(void *) );
     void *const invalid_ptr = LongToHandle( 0xdeadbee0 );
+    struct mem_entry *entry;
     HGLOBAL globals[0x10000];
+    SIZE_T size, alloc_size;
     HGLOBAL mem, tmp_mem;
     BYTE *ptr, *tmp_ptr;
     UINT i, flags;
-    SIZE_T size;
     BOOL ret;
 
     mem = GlobalFree( 0 );
@@ -319,6 +331,135 @@ static void test_GlobalAlloc(void)
     size = GlobalSize( mem );
     ok( size == 0, "GlobalSize returned %Iu\n", size );
 
+    mem = GlobalAlloc( GMEM_MOVEABLE | GMEM_DISCARDABLE, 0 );
+    ok( !!mem, "GlobalAlloc failed, error %lu\n", GetLastError() );
+    entry = mem_entry_from_HANDLE( mem );
+    size = GlobalSize( mem );
+    ok( size == 0, "GlobalSize returned %Iu\n", size );
+    ret = HeapValidate( GetProcessHeap(), 0, entry );
+    ok( !ret, "HeapValidate succeeded\n" );
+    todo_wine
+    ok( entry->flags == 0xf, "got unexpected flags %#Ix\n", entry->flags );
+    ok( !entry->ptr, "got unexpected ptr %p\n", entry->ptr );
+    mem = GlobalFree( mem );
+    ok( !mem, "GlobalFree failed, error %lu\n", GetLastError() );
+
+    mem = GlobalAlloc( GMEM_MOVEABLE, 0 );
+    ok( !!mem, "GlobalAlloc failed, error %lu\n", GetLastError() );
+    entry = mem_entry_from_HANDLE( mem );
+    size = GlobalSize( mem );
+    ok( size == 0, "GlobalSize returned %Iu\n", size );
+    ret = HeapValidate( GetProcessHeap(), 0, entry );
+    ok( !ret, "HeapValidate succeeded\n" );
+    todo_wine
+    ok( entry->flags == 0xb, "got unexpected flags %#Ix\n", entry->flags );
+    ok( !entry->ptr, "got unexpected ptr %p\n", entry->ptr );
+    mem = GlobalFree( mem );
+    ok( !mem, "GlobalFree failed, error %lu\n", GetLastError() );
+
+    for (alloc_size = 1; alloc_size < 0x10000000; alloc_size <<= 1)
+    {
+        winetest_push_context( "size %#Ix", alloc_size );
+
+        mem = GlobalAlloc( GMEM_FIXED, alloc_size );
+        ok( !!mem, "GlobalAlloc failed, error %lu\n", GetLastError() );
+        ok( !((UINT_PTR)mem & sizeof(void *)), "got unexpected ptr align\n" );
+        ok( !((UINT_PTR)mem & (sizeof(void *) - 1)), "got unexpected ptr align\n" );
+        ret = HeapValidate( GetProcessHeap(), 0, mem );
+        ok( ret, "HeapValidate failed, error %lu\n", GetLastError() );
+        tmp_mem = GlobalFree( mem );
+        ok( !tmp_mem, "GlobalFree failed, error %lu\n", GetLastError() );
+
+        mem = GlobalAlloc( GMEM_MOVEABLE, alloc_size );
+        ok( !!mem, "GlobalAlloc failed, error %lu\n", GetLastError() );
+        todo_wine
+        ok( ((UINT_PTR)mem & sizeof(void *)), "got unexpected entry align\n" );
+        todo_wine
+        ok( !((UINT_PTR)mem & (sizeof(void *) - 1)), "got unexpected entry align\n" );
+
+        entry = mem_entry_from_HANDLE( mem );
+        ret = HeapValidate( GetProcessHeap(), 0, entry );
+        ok( !ret, "HeapValidate succeeded\n" );
+        ret = HeapValidate( GetProcessHeap(), 0, entry->ptr );
+        todo_wine
+        ok( ret, "HeapValidate failed, error %lu\n", GetLastError() );
+        size = HeapSize( GetProcessHeap(), 0, entry->ptr );
+        todo_wine
+        ok( size == alloc_size, "HeapSize returned %Iu\n", size );
+
+        ptr = GlobalLock( mem );
+        ok( !!ptr, "GlobalLock failed, error %lu\n", GetLastError() );
+        ok( ptr != mem, "got unexpected ptr %p\n", ptr );
+        ok( ptr == entry->ptr, "got unexpected ptr %p\n", ptr );
+        ok( !((UINT_PTR)ptr & sizeof(void *)), "got unexpected ptr align\n" );
+        ok( !((UINT_PTR)ptr & (sizeof(void *) - 1)), "got unexpected ptr align\n" );
+        for (i = 1; i < 0xff; ++i)
+        {
+            todo_wine
+            ok( entry->flags == ((i<<16)|3), "got unexpected flags %#Ix\n", entry->flags );
+            ptr = GlobalLock( mem );
+            ok( !!ptr, "GlobalLock failed, error %lu\n", GetLastError() );
+        }
+        ptr = GlobalLock( mem );
+        ok( !!ptr, "GlobalLock failed, error %lu\n", GetLastError() );
+        todo_wine
+        ok( entry->flags == 0xff0003, "got unexpected flags %#Ix\n", entry->flags );
+        for (i = 1; i < 0xff; ++i)
+        {
+            ret = GlobalUnlock( mem );
+            ok( ret, "GlobalUnlock failed, error %lu\n", GetLastError() );
+        }
+        ret = GlobalUnlock( mem );
+        ok( !ret, "GlobalUnlock succeeded, error %lu\n", GetLastError() );
+        todo_wine
+        ok( entry->flags == 0x3, "got unexpected flags %#Ix\n", entry->flags );
+
+        tmp_mem = GlobalFree( mem );
+        ok( !tmp_mem, "GlobalFree failed, error %lu\n", GetLastError() );
+        ok( !!entry->flags, "got unexpected flags %#Ix\n", entry->flags );
+        todo_wine_if(sizeof(void *) == 4)
+        ok( !((UINT_PTR)entry->flags & sizeof(void *)), "got unexpected ptr align\n" );
+        todo_wine_if(sizeof(void *) == 4)
+        ok( !((UINT_PTR)entry->flags & (sizeof(void *) - 1)), "got unexpected ptr align\n" );
+        todo_wine
+        ok( !entry->ptr, "got unexpected ptr %p\n", entry->ptr );
+
+        mem = GlobalAlloc( GMEM_MOVEABLE | GMEM_DISCARDABLE, 0 );
+        ok( !!mem, "GlobalAlloc failed, error %lu\n", GetLastError() );
+        entry = mem_entry_from_HANDLE( mem );
+        todo_wine
+        ok( entry->flags == 0xf, "got unexpected flags %#Ix\n", entry->flags );
+        ok( !entry->ptr, "got unexpected ptr %p\n", entry->ptr );
+        flags = GlobalFlags( mem );
+        ok( flags == (GMEM_DISCARDED | GMEM_DISCARDABLE), "GlobalFlags returned %#x, error %lu\n", flags, GetLastError() );
+        mem = GlobalFree( mem );
+        ok( !mem, "GlobalFree failed, error %lu\n", GetLastError() );
+
+        mem = GlobalAlloc( GMEM_MOVEABLE | GMEM_DISCARDABLE, 1 );
+        ok( !!mem, "GlobalAlloc failed, error %lu\n", GetLastError() );
+        entry = mem_entry_from_HANDLE( mem );
+        todo_wine
+        ok( entry->flags == 0x7, "got unexpected flags %#Ix\n", entry->flags );
+        ok( !!entry->ptr, "got unexpected ptr %p\n", entry->ptr );
+        flags = GlobalFlags( mem );
+        ok( flags == GMEM_DISCARDABLE, "GlobalFlags returned %#x, error %lu\n", flags, GetLastError() );
+        mem = GlobalFree( mem );
+        ok( !mem, "GlobalFree failed, error %lu\n", GetLastError() );
+
+        mem = GlobalAlloc( GMEM_MOVEABLE | GMEM_DISCARDABLE | GMEM_DDESHARE, 1 );
+        ok( !!mem, "GlobalAlloc failed, error %lu\n", GetLastError() );
+        entry = mem_entry_from_HANDLE( mem );
+        todo_wine
+        ok( entry->flags == 0x8007, "got unexpected flags %#Ix\n", entry->flags );
+        ok( !!entry->ptr, "got unexpected ptr %p\n", entry->ptr );
+        flags = GlobalFlags( mem );
+        ok( flags == (GMEM_DISCARDABLE | GMEM_DDESHARE), "GlobalFlags returned %#x, error %lu\n", flags, GetLastError() );
+        mem = GlobalFree( mem );
+        ok( !mem, "GlobalFree failed, error %lu\n", GetLastError() );
+
+        winetest_pop_context();
+    }
+
     mem = GlobalAlloc( GMEM_MOVEABLE, 256 );
     ok( !!mem, "GlobalAlloc failed, error %lu\n", GetLastError() );
     ptr = GlobalLock( mem );
@@ -477,9 +618,11 @@ static void test_GlobalAlloc(void)
     SetLastError( 0xdeadbeef );
     tmp_mem = GlobalReAlloc( mem, 10, 0 );
     todo_wine
-    ok( !tmp_mem, "GlobalReAlloc succeeded\n" );
+    ok( !tmp_mem || broken( tmp_mem == mem ) /* w1064v1507 / w1064v1607 */,
+        "GlobalReAlloc succeeded\n" );
     todo_wine
-    ok( GetLastError() == ERROR_NOT_ENOUGH_MEMORY, "got error %lu\n", GetLastError() );
+    ok( GetLastError() == ERROR_NOT_ENOUGH_MEMORY || broken( GetLastError() == 0xdeadbeef ) /* w1064v1507 / w1064v1607 */,
+        "got error %lu\n", GetLastError() );
     if (tmp_mem) mem = tmp_mem;
     tmp_mem = GlobalReAlloc( mem, 1024 * 1024, GMEM_MODIFY );
     todo_wine
@@ -497,7 +640,8 @@ static void test_GlobalAlloc(void)
     tmp_mem = GlobalReAlloc( mem, 11, GMEM_MOVEABLE );
     ok( !!tmp_mem, "GlobalReAlloc failed, error %lu\n", GetLastError() );
     todo_wine
-    ok( tmp_mem != mem, "GlobalReAlloc didn't relocate memory\n" );
+    ok( tmp_mem != mem || broken( tmp_mem == mem ) /* w1064v1507 / w1064v1607 */,
+        "GlobalReAlloc didn't relocate memory\n" );
     ptr = GlobalLock( tmp_mem );
     ok( !!ptr, "GlobalLock failed, error %lu\n", GetLastError() );
     ok( ptr == tmp_mem, "got ptr %p, expected %p\n", ptr, tmp_mem );
@@ -821,9 +965,11 @@ static void test_LocalAlloc(void)
     SetLastError( 0xdeadbeef );
     tmp_mem = LocalReAlloc( mem, 10, 0 );
     todo_wine
-    ok( !tmp_mem, "LocalReAlloc succeeded\n" );
+    ok( !tmp_mem || broken( tmp_mem == mem ) /* w1064v1507 / w1064v1607 */,
+        "LocalReAlloc succeeded\n" );
     todo_wine
-    ok( GetLastError() == ERROR_NOT_ENOUGH_MEMORY, "got error %lu\n", GetLastError() );
+    ok( GetLastError() == ERROR_NOT_ENOUGH_MEMORY || broken( GetLastError() == 0xdeadbeef ) /* w1064v1507 / w1064v1607 */,
+        "got error %lu\n", GetLastError() );
     if (tmp_mem) mem = tmp_mem;
     tmp_mem = LocalReAlloc( mem, 1024 * 1024, LMEM_MODIFY );
     todo_wine
@@ -841,7 +987,8 @@ static void test_LocalAlloc(void)
     tmp_mem = LocalReAlloc( mem, 11, LMEM_MOVEABLE );
     ok( !!tmp_mem, "LocalReAlloc failed, error %lu\n", GetLastError() );
     todo_wine
-    ok( tmp_mem != mem, "LocalReAlloc didn't relocate memory\n" );
+    ok( tmp_mem != mem || broken( tmp_mem == mem ) /* w1064v1507 / w1064v1607 */,
+        "LocalReAlloc didn't relocate memory\n" );
     ptr = LocalLock( tmp_mem );
     ok( !!ptr, "LocalLock failed, error %lu\n", GetLastError() );
     ok( ptr == tmp_mem, "got ptr %p, expected %p\n", ptr, tmp_mem );
-- 
2.35.1




More information about the wine-devel mailing list