From 82b4b6423c111d704c0860a404c6282879cc7349 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Tue, 19 May 2009 15:55:51 +0100 Subject: [PATCH] ole32/tests: Exercise the HGLOBAL marshaller over a range of block sizes. --- dlls/ole32/tests/usrmarshal.c | 81 ++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/dlls/ole32/tests/usrmarshal.c b/dlls/ole32/tests/usrmarshal.c index 5c83ddc9e1e..ed18ac58531 100644 --- a/dlls/ole32/tests/usrmarshal.c +++ b/dlls/ole32/tests/usrmarshal.c @@ -162,7 +162,7 @@ static void test_marshal_HGLOBAL(void) MIDL_STUB_MESSAGE stub_msg; RPC_MESSAGE rpc_msg; unsigned char *buffer; - ULONG size; + ULONG size, block_size; HGLOBAL hglobal; HGLOBAL hglobal2; unsigned char *wirehglobal; @@ -188,39 +188,52 @@ static void test_marshal_HGLOBAL(void) init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); HGLOBAL_UserFree(&umcb.Flags, &hglobal2); - hglobal = GlobalAlloc(0, 4); - buffer = GlobalLock(hglobal); - for (i = 0; i < 4; i++) - buffer[i] = i; - GlobalUnlock(hglobal); - init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); - size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal); - /* native is poorly programmed and allocates 4/8 bytes more than it needs to - * here - Wine doesn't have to emulate that */ - ok((size == 24) || broken(size == 28) || broken(size == 32), "Size should be 24, instead of %d\n", size); - buffer = HeapAlloc(GetProcessHeap(), 0, size); - init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); - HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal); - wirehglobal = buffer; - ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal); - wirehglobal += sizeof(ULONG); - ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0x4 should be HGLOBAL\n"); - wirehglobal += sizeof(ULONG); - ok(*(ULONG *)wirehglobal == 4, "buffer+0x8 should be size of HGLOBAL instead of %d\n", *(ULONG *)wirehglobal); - wirehglobal += sizeof(ULONG); - ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0xc should be HGLOBAL\n"); - wirehglobal += sizeof(ULONG); - ok(*(ULONG *)wirehglobal == 4, "buffer+0x10 should be size of HGLOBAL instead of %d\n", *(ULONG *)wirehglobal); - wirehglobal += sizeof(ULONG); - for (i = 0; i < 4; i++) - ok(wirehglobal[i] == i, "buffer+0x%x should be %d\n", 0x10 + i, i); - init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); - HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2); - ok(hglobal2 != NULL, "Didn't unmarshal properly\n"); - HeapFree(GetProcessHeap(), 0, buffer); - init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); - HGLOBAL_UserFree(&umcb.Flags, &hglobal2); - GlobalFree(hglobal); + + for(block_size = 0; block_size <= 17; block_size++) + { + ULONG actual_size, expected_size; + + hglobal = GlobalAlloc(0, block_size); + buffer = GlobalLock(hglobal); + for (i = 0; i < block_size; i++) + buffer[i] = i; + GlobalUnlock(hglobal); + actual_size = GlobalSize(hglobal); + expected_size = actual_size + 5 * sizeof(DWORD); + trace("%d: actual size %d\n", block_size, actual_size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal); + /* native is poorly programmed and allocates 4/8 bytes more than it needs to + * here - Wine doesn't have to emulate that */ + ok(size == expected_size || + broken(size == expected_size + 4) || + broken(size == expected_size + 8), + "%d: got size %d\n", block_size, size); + buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal); + wirehglobal = buffer; + ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal); + wirehglobal += sizeof(ULONG); + ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0x4 should be HGLOBAL\n"); + wirehglobal += sizeof(ULONG); + ok(*(ULONG *)wirehglobal == actual_size, "%d: buffer+0x8 %08x\n", block_size, *(ULONG *)wirehglobal); + wirehglobal += sizeof(ULONG); + ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0xc should be HGLOBAL\n"); + wirehglobal += sizeof(ULONG); + ok(*(ULONG *)wirehglobal == actual_size, "%d: buffer+0x10 %08x\n", block_size, *(ULONG *)wirehglobal); + wirehglobal += sizeof(ULONG); + for (i = 0; i < block_size; i++) + ok(wirehglobal[i] == i, "buffer+0x%x should be %d\n", 0x10 + i, i); + + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2); + ok(hglobal2 != NULL, "Didn't unmarshal properly\n"); + HeapFree(GetProcessHeap(), 0, buffer); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + HGLOBAL_UserFree(&umcb.Flags, &hglobal2); + GlobalFree(hglobal); + } } static HENHMETAFILE create_emf(void)