diff --git a/rostests/winetests/advapi32/crypt.c b/rostests/winetests/advapi32/crypt.c index 2a5993c00d5..6cfbbbf8254 100644 --- a/rostests/winetests/advapi32/crypt.c +++ b/rostests/winetests/advapi32/crypt.c @@ -64,7 +64,7 @@ static BOOL (WINAPI *pCryptSetHashParam)(HCRYPTKEY, DWORD, BYTE*, DWORD); static BOOL (WINAPI *pCryptSetKeyParam)(HCRYPTKEY, DWORD, BYTE*, DWORD); static BOOL (WINAPI *pCryptSetProvParam)(HCRYPTPROV, DWORD, BYTE*, DWORD); static BOOL (WINAPI *pCryptVerifySignatureW)(HCRYPTHASH, BYTE*, DWORD, HCRYPTKEY, LPCWSTR, DWORD); -static BOOL (WINAPI *pSystemFunction036)(PVOID, ULONG); +static BOOLEAN (WINAPI *pSystemFunction036)(PVOID, ULONG); static void init_function_pointers(void) { @@ -856,6 +856,8 @@ static void test_set_provider_ex(void) { DWORD result; DWORD notNull = 5; + LPSTR curProvName = NULL; + DWORD curlen; /* results */ LPSTR pszProvName = NULL; @@ -867,6 +869,13 @@ static void test_set_provider_ex(void) return; } + /* store the current one */ + pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, NULL, &curlen); + if (!(curProvName = LocalAlloc(LMEM_ZEROINIT, curlen))) + return; + result = pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, curProvName, &curlen); + ok(result, "%d\n", GetLastError()); + /* check pdwReserved for NULL */ result = pCryptSetProviderExA(MS_DEF_PROV, PROV_RSA_FULL, ¬Null, CRYPT_MACHINE_DEFAULT); ok(!result && GetLastError()==ERROR_INVALID_PARAMETER, "expected %i, got %d\n", @@ -880,6 +889,7 @@ static void test_set_provider_ex(void) ok( GetLastError() == ERROR_ACCESS_DENIED || broken(GetLastError() == ERROR_INVALID_PARAMETER), "wrong error %u\n", GetLastError() ); skip("Not enough rights to remove the default provider\n"); + LocalFree(curProvName); return; } @@ -889,13 +899,19 @@ static void test_set_provider_ex(void) /* call CryptGetDefaultProvider to see if they match */ result = pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, NULL, &cbProvName); if (!(pszProvName = LocalAlloc(LMEM_ZEROINIT, cbProvName))) - return; + goto reset; result = pCryptGetDefaultProviderA(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, pszProvName, &cbProvName); ok(result && !strcmp(MS_DEF_PROV, pszProvName), "expected %s, got %s\n", MS_DEF_PROV, pszProvName); ok(result && cbProvName==(strlen(MS_DEF_PROV) + 1), "expected %i, got %d\n", (lstrlenA(MS_DEF_PROV) + 1), cbProvName); LocalFree(pszProvName); + +reset: + /* Set the provider back to it's original */ + result = pCryptSetProviderExA(curProvName, PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT); + ok(result, "%d\n", GetLastError()); + LocalFree(curProvName); } static void test_machine_guid(void) diff --git a/rostests/winetests/advapi32/registry.c b/rostests/winetests/advapi32/registry.c index 3a6533979c4..30dda7e827e 100644 --- a/rostests/winetests/advapi32/registry.c +++ b/rostests/winetests/advapi32/registry.c @@ -1862,7 +1862,9 @@ static void test_redirection(void) ok( err == ERROR_SUCCESS, "RegCreateKeyExA failed: %u\n", err ); check_key_value( key, "Winetest", 0, ptr_size ); check_key_value( key, "Winetest", KEY_WOW64_64KEY, is_vista ? 64 : ptr_size ); - check_key_value( key, "Winetest", KEY_WOW64_32KEY, 32 ); + dw = get_key_value( key, "Winetest", KEY_WOW64_32KEY ); + if (ptr_size == 32) ok( dw == 32, "wrong value %u\n", dw ); + else todo_wine ok( dw == 32, "wrong value %u\n", dw ); RegCloseKey( key ); if (ptr_size == 32) @@ -1910,6 +1912,79 @@ static void test_redirection(void) RegCloseKey( root64 ); } +static void test_deleted_key(void) +{ + HKEY hkey, hkey2; + char value[20]; + DWORD val_count, type; + LONG res; + + /* Open the test key, then delete it while it's open */ + RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\Test", &hkey ); + + delete_key( hkey_main ); + + val_count = sizeof(value); + type = 0; + res = RegEnumValueA( hkey, 0, value, &val_count, NULL, &type, 0, 0 ); + ok(res == ERROR_KEY_DELETED, "expect ERROR_KEY_DELETED, got %i\n", res); + + res = RegEnumKeyA( hkey, 0, value, sizeof(value) ); + ok(res == ERROR_KEY_DELETED, "expect ERROR_KEY_DELETED, got %i\n", res); + + val_count = sizeof(value); + type = 0; + res = RegQueryValueExA( hkey, "test", NULL, &type, (BYTE *)value, &val_count ); + ok(res == ERROR_KEY_DELETED, "expect ERROR_KEY_DELETED, got %i\n", res); + + res = RegSetValueExA( hkey, "test", 0, REG_SZ, (const BYTE*)"value", 6); + ok(res == ERROR_KEY_DELETED, "expect ERROR_KEY_DELETED, got %i\n", res); + + res = RegOpenKeyA( hkey, "test", &hkey2 ); + ok(res == ERROR_KEY_DELETED, "expect ERROR_KEY_DELETED, got %i\n", res); + if (res == 0) + RegCloseKey( hkey2 ); + + res = RegCreateKeyA( hkey, "test", &hkey2 ); + ok(res == ERROR_KEY_DELETED, "expect ERROR_KEY_DELETED, got %i\n", res); + if (res == 0) + RegCloseKey( hkey2 ); + + res = RegFlushKey( hkey ); + ok(res == ERROR_KEY_DELETED, "expect ERROR_KEY_DELETED, got %i\n", res); + + RegCloseKey( hkey ); + + setup_main_key(); +} + +static void test_delete_value(void) +{ + LONG res; + char longname[401]; + + res = RegSetValueExA( hkey_main, "test", 0, REG_SZ, (const BYTE*)"value", 6 ); + ok(res == ERROR_SUCCESS, "expect ERROR_SUCCESS, got %i\n", res); + + res = RegQueryValueExA( hkey_main, "test", NULL, NULL, NULL, NULL); + ok(res == ERROR_SUCCESS, "expect ERROR_SUCCESS, got %i\n", res); + + res = RegDeleteValueA( hkey_main, "test" ); + ok(res == ERROR_SUCCESS, "expect ERROR_SUCCESS, got %i\n", res); + + res = RegQueryValueExA( hkey_main, "test", NULL, NULL, NULL, NULL); + ok(res == ERROR_FILE_NOT_FOUND, "expect ERROR_FILE_NOT_FOUND, got %i\n", res); + + res = RegDeleteValueA( hkey_main, "test" ); + ok(res == ERROR_FILE_NOT_FOUND, "expect ERROR_FILE_NOT_FOUND, got %i\n", res); + + memset(longname, 'a', 400); + longname[400] = 0; + res = RegDeleteValueA( hkey_main, longname ); + ok(res == ERROR_FILE_NOT_FOUND || broken(res == ERROR_MORE_DATA), /* nt4, win2k */ + "expect ERROR_FILE_NOT_FOUND, got %i\n", res); +} + START_TEST(registry) { /* Load pointers for functions that are not available in all Windows versions */ @@ -1944,6 +2019,8 @@ START_TEST(registry) test_reg_delete_tree(); test_rw_order(); + test_deleted_key(); + test_delete_value(); /* cleanup */ delete_key( hkey_main ); diff --git a/rostests/winetests/advapi32/security.c b/rostests/winetests/advapi32/security.c index 029568c50a0..1f1b69704a3 100644 --- a/rostests/winetests/advapi32/security.c +++ b/rostests/winetests/advapi32/security.c @@ -656,7 +656,7 @@ static void test_lookupPrivilegeValue(void) { "SeCreateGlobalPrivilege", SE_CREATE_GLOBAL_PRIVILEGE }, }; BOOL (WINAPI *pLookupPrivilegeValueA)(LPCSTR, LPCSTR, PLUID); - int i; + unsigned int i; LUID luid; BOOL ret; @@ -913,13 +913,13 @@ static void test_AccessCheck(void) /* SD without owner/group */ SetLastError(0xdeadbeef); - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = AccessCheck(SecurityDescriptor, Token, KEY_QUERY_VALUE, &Mapping, PrivSet, &PrivSetLen, &Access, &AccessStatus); err = GetLastError(); ok(!ret && err == ERROR_INVALID_SECURITY_DESCR, "AccessCheck should have " "failed with ERROR_INVALID_SECURITY_DESCR, instead of %d\n", err); - ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed, "Access and/or AccessStatus were changed!\n"); /* Set owner and group */ @@ -930,50 +930,50 @@ static void test_AccessCheck(void) /* Generic access mask */ SetLastError(0xdeadbeef); - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, PrivSet, &PrivSetLen, &Access, &AccessStatus); err = GetLastError(); ok(!ret && err == ERROR_GENERIC_NOT_MAPPED, "AccessCheck should have failed " "with ERROR_GENERIC_NOT_MAPPED, instead of %d\n", err); - ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed, "Access and/or AccessStatus were changed!\n"); /* Generic access mask - no privilegeset buffer */ SetLastError(0xdeadbeef); - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, NULL, &PrivSetLen, &Access, &AccessStatus); err = GetLastError(); ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed " "with ERROR_NOACCESS, instead of %d\n", err); - ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed, "Access and/or AccessStatus were changed!\n"); /* Generic access mask - no returnlength */ SetLastError(0xdeadbeef); - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, PrivSet, NULL, &Access, &AccessStatus); err = GetLastError(); ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed " "with ERROR_NOACCESS, instead of %d\n", err); - ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed, "Access and/or AccessStatus were changed!\n"); /* Generic access mask - no privilegeset buffer, no returnlength */ SetLastError(0xdeadbeef); - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, NULL, NULL, &Access, &AccessStatus); err = GetLastError(); ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed " "with ERROR_NOACCESS, instead of %d\n", err); - ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed, "Access and/or AccessStatus were changed!\n"); /* sd with no dacl present */ - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = SetSecurityDescriptorDacl(SecurityDescriptor, FALSE, NULL, FALSE); ok(ret, "SetSecurityDescriptorDacl failed with error %d\n", GetLastError()); ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping, @@ -985,20 +985,20 @@ static void test_AccessCheck(void) /* sd with no dacl present - no privilegeset buffer */ SetLastError(0xdeadbeef); - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, NULL, &PrivSetLen, &Access, &AccessStatus); err = GetLastError(); ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed " "with ERROR_NOACCESS, instead of %d\n", err); - ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed, "Access and/or AccessStatus were changed!\n"); if(pNtAccessCheck) { /* Generic access mask - no privilegeset buffer */ SetLastError(0xdeadbeef); - Access = ntAccessStatus = 0xdeadbeef; + Access = ntAccessStatus = 0x1abe11ed; ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, NULL, &PrivSetLen, &Access, &ntAccessStatus); err = GetLastError(); @@ -1006,12 +1006,12 @@ static void test_AccessCheck(void) "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %x\n", ntret); ok(err == 0xdeadbeef, "NtAccessCheck shouldn't set last error, got %d\n", err); - ok(Access == 0xdeadbeef && ntAccessStatus == 0xdeadbeef, + ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed, "Access and/or AccessStatus were changed!\n"); /* Generic access mask - no returnlength */ SetLastError(0xdeadbeef); - Access = ntAccessStatus = 0xdeadbeef; + Access = ntAccessStatus = 0x1abe11ed; ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, PrivSet, NULL, &Access, &ntAccessStatus); err = GetLastError(); @@ -1019,12 +1019,12 @@ static void test_AccessCheck(void) "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %x\n", ntret); ok(err == 0xdeadbeef, "NtAccessCheck shouldn't set last error, got %d\n", err); - ok(Access == 0xdeadbeef && ntAccessStatus == 0xdeadbeef, + ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed, "Access and/or AccessStatus were changed!\n"); /* Generic access mask - no privilegeset buffer, no returnlength */ SetLastError(0xdeadbeef); - Access = ntAccessStatus = 0xdeadbeef; + Access = ntAccessStatus = 0x1abe11ed; ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, NULL, NULL, &Access, &ntAccessStatus); err = GetLastError(); @@ -1032,14 +1032,14 @@ static void test_AccessCheck(void) "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %x\n", ntret); ok(err == 0xdeadbeef, "NtAccessCheck shouldn't set last error, got %d\n", err); - ok(Access == 0xdeadbeef && ntAccessStatus == 0xdeadbeef, + ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed, "Access and/or AccessStatus were changed!\n"); } else win_skip("NtAccessCheck unavailable. Skipping.\n"); /* sd with NULL dacl */ - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = SetSecurityDescriptorDacl(SecurityDescriptor, TRUE, NULL, FALSE); ok(ret, "SetSecurityDescriptorDacl failed with error %d\n", GetLastError()); ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping, @@ -1067,7 +1067,7 @@ static void test_AccessCheck(void) ok(res, "AddAccessDeniedAce failed with error %d\n", GetLastError()); /* sd with dacl */ - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping, PrivSet, &PrivSetLen, &Access, &AccessStatus); ok(ret, "AccessCheck failed with error %d\n", GetLastError()); @@ -1085,7 +1085,7 @@ static void test_AccessCheck(void) /* Access denied by SD */ SetLastError(0xdeadbeef); - Access = AccessStatus = 0xdeadbeef; + Access = AccessStatus = 0x1abe11ed; ret = AccessCheck(SecurityDescriptor, Token, KEY_WRITE, &Mapping, PrivSet, &PrivSetLen, &Access, &AccessStatus); ok(ret, "AccessCheck failed with error %d\n", GetLastError()); @@ -1420,7 +1420,7 @@ static void test_CreateWellKnownSid(void) PSID domainsid, sid; DWORD size, error; BOOL ret; - int i; + unsigned int i; if (!pCreateWellKnownSid) { @@ -1466,13 +1466,13 @@ static void test_CreateWellKnownSid(void) cb = sizeof(sid_buffer); if (!pCreateWellKnownSid(i, domainsid, sid_buffer, &cb)) { - skip("Well known SIDs starting from %d are not implemented\n", i); + skip("Well known SIDs starting from %u are not implemented\n", i); break; } } cb = sizeof(sid_buffer); - ok(pCreateWellKnownSid(i, value->without_domain ? NULL : domainsid, sid_buffer, &cb), "Couldn't create well known sid %d\n", i); + ok(pCreateWellKnownSid(i, value->without_domain ? NULL : domainsid, sid_buffer, &cb), "Couldn't create well known sid %u\n", i); expect_eq(GetSidLengthRequired(*GetSidSubAuthorityCount(sid_buffer)), cb, DWORD, "%d"); ok(IsValidSid(sid_buffer), "The sid is not valid\n"); ok(pConvertSidToStringSidA(sid_buffer, &str), "Couldn't convert SID to string\n"); @@ -1484,9 +1484,9 @@ static void test_CreateWellKnownSid(void) { char buf2[SECURITY_MAX_SID_SIZE]; cb = sizeof(buf2); - ok(pCreateWellKnownSid(i, domainsid, buf2, &cb), "Couldn't create well known sid %d with optional domain\n", i); + ok(pCreateWellKnownSid(i, domainsid, buf2, &cb), "Couldn't create well known sid %u with optional domain\n", i); expect_eq(GetSidLengthRequired(*GetSidSubAuthorityCount(sid_buffer)), cb, DWORD, "%d"); - ok(memcmp(buf2, sid_buffer, cb) == 0, "SID create with domain is different than without (%d)\n", i); + ok(memcmp(buf2, sid_buffer, cb) == 0, "SID create with domain is different than without (%u)\n", i); } } @@ -2674,7 +2674,7 @@ static void test_ConvertStringSecurityDescriptor(void) BOOL ret; PSECURITY_DESCRIPTOR pSD; static const WCHAR Blank[] = { 0 }; - int i; + unsigned int i; static const struct { const char *sidstring; @@ -2733,11 +2733,11 @@ static void test_ConvertStringSecurityDescriptor(void) ret = pConvertStringSecurityDescriptorToSecurityDescriptorA( cssd[i].sidstring, cssd[i].revision, &pSD, NULL); GLE = GetLastError(); - ok(ret == cssd[i].ret, "(%02d) Expected %s (%d)\n", i, cssd[i].ret ? "success" : "failure", GLE); + ok(ret == cssd[i].ret, "(%02u) Expected %s (%d)\n", i, cssd[i].ret ? "success" : "failure", GLE); if (!cssd[i].ret) ok(GLE == cssd[i].GLE || (cssd[i].altGLE && GLE == cssd[i].altGLE), - "(%02d) Unexpected last error %d\n", i, GLE); + "(%02u) Unexpected last error %d\n", i, GLE); if (ret) LocalFree(pSD); } @@ -2807,12 +2807,12 @@ static void test_ConvertSecurityDescriptorToString(void) * don't replicate this feature so we only test len >= strlen+1. */ #define CHECK_RESULT_AND_FREE(exp_str) \ ok(strcmp(string, (exp_str)) == 0, "String mismatch (expected \"%s\", got \"%s\")\n", (exp_str), string); \ - ok(len >= (lstrlen(exp_str) + 1), "Length mismatch (expected %d, got %d)\n", lstrlen(exp_str) + 1, len); \ + ok(len >= (strlen(exp_str) + 1), "Length mismatch (expected %d, got %d)\n", lstrlen(exp_str) + 1, len); \ LocalFree(string); #define CHECK_ONE_OF_AND_FREE(exp_str1, exp_str2) \ ok(strcmp(string, (exp_str1)) == 0 || strcmp(string, (exp_str2)) == 0, "String mismatch (expected\n\"%s\" or\n\"%s\", got\n\"%s\")\n", (exp_str1), (exp_str2), string); \ - ok(len >= (strlen(string) + 1), "Length mismatch (expected %d, got %d)\n", lstrlen(string) + 1, len); \ + ok(len >= (strlen(exp_str1) + 1) || len >= (strlen(exp_str2) + 1), "Length mismatch (expected %d or %d, got %d)\n", lstrlen(exp_str1) + 1, lstrlen(exp_str2) + 1, len); \ LocalFree(string); InitializeSecurityDescriptor(&desc, SECURITY_DESCRIPTOR_REVISION); diff --git a/rostests/winetests/comctl32/imagelist.c b/rostests/winetests/comctl32/imagelist.c index cf749c82732..5398201d708 100644 --- a/rostests/winetests/comctl32/imagelist.c +++ b/rostests/winetests/comctl32/imagelist.c @@ -126,6 +126,7 @@ static HIMAGELIST createImageList(int cx, int cy) HIMAGELIST himl = ImageList_Create(cx, cy, ILC_COLOR, 1, 1); HBITMAP hbm = CreateBitmap(48, 48, 1, 1, bitmap_bits); ImageList_Add(himl, hbm, NULL); + DeleteObject(hbm); return himl; } @@ -831,7 +832,7 @@ static void check_bitmap_data(const char *bm_data, ULONG bm_data_size, #endif } -static void check_ilhead_data(const char *ilh_data, INT cx, INT cy, INT cur, INT max) +static void check_ilhead_data(const char *ilh_data, INT cx, INT cy, INT cur, INT max, INT grow) { const ILHEAD *ilh = (const ILHEAD *)ilh_data; @@ -839,7 +840,7 @@ static void check_ilhead_data(const char *ilh_data, INT cx, INT cy, INT cur, INT ok(ilh->usVersion == 0x101, "wrong usVersion %x (expected 0x101)\n", ilh->usVersion); ok(ilh->cCurImage == cur, "wrong cCurImage %d (expected %d)\n", ilh->cCurImage, cur); ok(ilh->cMaxImage == max, "wrong cMaxImage %d (expected %d)\n", ilh->cMaxImage, max); - ok(ilh->cGrow == 4, "wrong cGrow %d (expected 4)\n", ilh->cGrow); + ok(ilh->cGrow == grow, "wrong cGrow %d (expected %d)\n", ilh->cGrow, grow); ok(ilh->cx == cx, "wrong cx %d (expected %d)\n", ilh->cx, cx); ok(ilh->cy == cy, "wrong cy %d (expected %d)\n", ilh->cy, cy); ok(ilh->bkcolor == CLR_NONE, "wrong bkcolor %x\n", ilh->bkcolor); @@ -892,38 +893,20 @@ static HBITMAP create_bitmap(INT cx, INT cy, COLORREF color, const char *comment return hbmp; } -static void image_list_init(HIMAGELIST himl) -{ - HBITMAP hbm; - char comment[16]; - INT n = 1; - -#define add_bitmap(grey) \ - sprintf(comment, "%d", n++); \ - hbm = create_bitmap(BMP_CX, BMP_CX, RGB((grey),(grey),(grey)), comment); \ - ImageList_Add(himl, hbm, NULL); - - add_bitmap(255); add_bitmap(170); add_bitmap(85); add_bitmap(0); - add_bitmap(0); add_bitmap(85); add_bitmap(170); add_bitmap(255); - add_bitmap(255); add_bitmap(170); add_bitmap(85); add_bitmap(0); - add_bitmap(0); add_bitmap(85); add_bitmap(170); add_bitmap(255); - add_bitmap(255); add_bitmap(170); add_bitmap(85); add_bitmap(0); - add_bitmap(0); add_bitmap(85); add_bitmap(170); add_bitmap(255); -#undef add_bitmap -} - #define iml_clear_stream_data() \ HeapFree(GetProcessHeap(), 0, Test_Stream.iml_data); \ Test_Stream.iml_data = NULL; \ Test_Stream.iml_data_size = 0; -static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, +static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, INT grow, INT width, INT height, INT bpp, const char *comment) { INT ret, cxx, cyy; + trace("%s\n", comment); + ret = ImageList_GetImageCount(himl); - ok(ret == cur, "expected cur %d got %d\n", cur, ret); + ok(ret == cur, "expected image count %d got %d\n", cur, ret); ret = ImageList_GetIconSize(himl, &cxx, &cyy); ok(ret, "ImageList_GetIconSize failed\n"); @@ -937,57 +920,191 @@ static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, ok(Test_Stream.iml_data != 0, "ImageList_Write didn't write any data\n"); ok(Test_Stream.iml_data_size > sizeof(ILHEAD), "ImageList_Write wrote not enough data\n"); - check_ilhead_data(Test_Stream.iml_data, cx, cy, cur, max); + check_ilhead_data(Test_Stream.iml_data, cx, cy, cur, max, grow); check_bitmap_data(Test_Stream.iml_data + sizeof(ILHEAD), Test_Stream.iml_data_size - sizeof(ILHEAD), width, height, bpp, comment); } +static void image_list_init(HIMAGELIST himl) +{ + HBITMAP hbm; + char comment[16]; + INT n = 1, i; + static const struct test_data + { + BYTE grey; + INT cx, cy, cur, max, grow, width, height, bpp; + const char *comment; + } td[] = + { + { 255, BMP_CX, BMP_CX, 1, 2, 4, BMP_CX * 4, BMP_CX * 1, 24, "total 1" }, + { 170, BMP_CX, BMP_CX, 2, 7, 4, BMP_CX * 4, BMP_CX * 2, 24, "total 2" }, + { 85, BMP_CX, BMP_CX, 3, 7, 4, BMP_CX * 4, BMP_CX * 2, 24, "total 3" }, + { 0, BMP_CX, BMP_CX, 4, 7, 4, BMP_CX * 4, BMP_CX * 2, 24, "total 4" }, + { 0, BMP_CX, BMP_CX, 5, 7, 4, BMP_CX * 4, BMP_CX * 2, 24, "total 5" }, + { 85, BMP_CX, BMP_CX, 6, 7, 4, BMP_CX * 4, BMP_CX * 2, 24, "total 6" }, + { 170, BMP_CX, BMP_CX, 7, 12, 4, BMP_CX * 4, BMP_CX * 3, 24, "total 7" }, + { 255, BMP_CX, BMP_CX, 8, 12, 4, BMP_CX * 4, BMP_CX * 3, 24, "total 8" }, + { 255, BMP_CX, BMP_CX, 9, 12, 4, BMP_CX * 4, BMP_CX * 3, 24, "total 9" }, + { 170, BMP_CX, BMP_CX, 10, 12, 4, BMP_CX * 4, BMP_CX * 3, 24, "total 10" }, + { 85, BMP_CX, BMP_CX, 11, 12, 4, BMP_CX * 4, BMP_CX * 3, 24, "total 11" }, + { 0, BMP_CX, BMP_CX, 12, 17, 4, BMP_CX * 4, BMP_CX * 5, 24, "total 12" }, + { 0, BMP_CX, BMP_CX, 13, 17, 4, BMP_CX * 4, BMP_CX * 5, 24, "total 13" }, + { 85, BMP_CX, BMP_CX, 14, 17, 4, BMP_CX * 4, BMP_CX * 5, 24, "total 14" }, + { 170, BMP_CX, BMP_CX, 15, 17, 4, BMP_CX * 4, BMP_CX * 5, 24, "total 15" }, + { 255, BMP_CX, BMP_CX, 16, 17, 4, BMP_CX * 4, BMP_CX * 5, 24, "total 16" }, + { 255, BMP_CX, BMP_CX, 17, 22, 4, BMP_CX * 4, BMP_CX * 6, 24, "total 17" }, + { 170, BMP_CX, BMP_CX, 18, 22, 4, BMP_CX * 4, BMP_CX * 6, 24, "total 18" }, + { 85, BMP_CX, BMP_CX, 19, 22, 4, BMP_CX * 4, BMP_CX * 6, 24, "total 19" }, + { 0, BMP_CX, BMP_CX, 20, 22, 4, BMP_CX * 4, BMP_CX * 6, 24, "total 20" }, + { 0, BMP_CX, BMP_CX, 21, 22, 4, BMP_CX * 4, BMP_CX * 6, 24, "total 21" }, + { 85, BMP_CX, BMP_CX, 22, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "total 22" }, + { 170, BMP_CX, BMP_CX, 23, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "total 23" }, + { 255, BMP_CX, BMP_CX, 24, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "total 24" } + }; + + check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, 24, "total 0"); + +#define add_bitmap(grey) \ + sprintf(comment, "%d", n++); \ + hbm = create_bitmap(BMP_CX, BMP_CX, RGB((grey),(grey),(grey)), comment); \ + ImageList_Add(himl, hbm, NULL); \ + DeleteObject(hbm); + + for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) + { + add_bitmap(td[i].grey); + check_iml_data(himl, td[i].cx, td[i].cy, td[i].cur, td[i].max, td[i].grow, + td[i].width, td[i].height, td[i].bpp, td[i].comment); + } +#undef add_bitmap +} + static void test_imagelist_storage(void) { HIMAGELIST himl; - BOOL ret; + HBITMAP hbm; + INT ret; himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 1, 1); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, BMP_CX * 4, BMP_CX * 1, 24, "empty"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, 24, "empty"); image_list_init(himl); - check_iml_data(himl, BMP_CX, BMP_CX, 24, 27, BMP_CX * 4, BMP_CX * 7, 24, "orig"); + check_iml_data(himl, BMP_CX, BMP_CX, 24, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "orig"); ret = ImageList_Remove(himl, 4); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 23, 27, BMP_CX * 4, BMP_CX * 7, 24, "1"); + check_iml_data(himl, BMP_CX, BMP_CX, 23, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "1"); ret = ImageList_Remove(himl, 5); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 22, 27, BMP_CX * 4, BMP_CX * 7, 24, "2"); + check_iml_data(himl, BMP_CX, BMP_CX, 22, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "2"); ret = ImageList_Remove(himl, 6); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 21, 27, BMP_CX * 4, BMP_CX * 7, 24, "3"); + check_iml_data(himl, BMP_CX, BMP_CX, 21, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "3"); ret = ImageList_Remove(himl, 7); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, BMP_CX * 4, BMP_CX * 7, 24, "4"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "4"); ret = ImageList_Remove(himl, -2); ok(!ret, "ImageList_Remove(-2) should fail\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, BMP_CX * 4, BMP_CX * 7, 24, "5"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "5"); ret = ImageList_Remove(himl, 20); ok(!ret, "ImageList_Remove(20) should fail\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, BMP_CX * 4, BMP_CX * 7, 24, "6"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "6"); ret = ImageList_Remove(himl, -1); ok(ret, "ImageList_Remove(-1) failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 4, BMP_CX * 4, BMP_CX * 1, 24, "7"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 4, 4, BMP_CX * 4, BMP_CX * 1, 24, "7"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); + + /* test ImageList_Create storage allocation */ + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 0, 32); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 1, 32, BMP_CX * 4, BMP_CX * 1, 24, "init 0 grow 32"); + hbm = create_bitmap(BMP_CX * 9, BMP_CX, 0, "9"); + ret = ImageList_Add(himl, hbm, NULL); + ok(ret == 0, "ImageList_Add returned %d, expected 0\n", ret); + check_iml_data(himl, BMP_CX, BMP_CX, 1, 34, 32, BMP_CX * 4, BMP_CX * 9, 24, "add 1 x 9"); + DeleteObject(hbm); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 4, 4); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, 24, "init 4 grow 4"); + hbm = create_bitmap(BMP_CX, BMP_CX * 9, 0, "9"); + ret = ImageList_Add(himl, hbm, NULL); + ok(ret == 0, "ImageList_Add returned %d, expected 0\n", ret); + check_iml_data(himl, BMP_CX, BMP_CX, 9, 15, 4, BMP_CX * 4, BMP_CX * 4, 24, "add 9 x 1"); + ret = ImageList_Add(himl, hbm, NULL); + ok(ret == 9, "ImageList_Add returned %d, expected 9\n", ret); + check_iml_data(himl, BMP_CX, BMP_CX, 18, 25, 4, BMP_CX * 4, BMP_CX * 7, 24, "add 9 x 1"); + DeleteObject(hbm); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 207, 209); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 208, 212, BMP_CX * 4, BMP_CX * 52, 24, "init 207 grow 209"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 209, 207); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 210, 208, BMP_CX * 4, BMP_CX * 53, 24, "init 209 grow 207"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 14, 4); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 15, 4, BMP_CX * 4, BMP_CX * 4, 24, "init 14 grow 4"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 5, 9); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 6, 12, BMP_CX * 4, BMP_CX * 2, 24, "init 5 grow 9"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 9, 5); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 10, 8, BMP_CX * 4, BMP_CX * 3, 24, "init 9 grow 5"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 2, 4); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 4, BMP_CX * 4, BMP_CX * 1, 24, "init 2 grow 4"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, 24, "init 4 grow 2"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); } static void test_shell_imagelist(void) diff --git a/rostests/winetests/comctl32/propsheet.c b/rostests/winetests/comctl32/propsheet.c index bf40db4f6ec..bfbaaa0e7bd 100644 --- a/rostests/winetests/comctl32/propsheet.c +++ b/rostests/winetests/comctl32/propsheet.c @@ -371,6 +371,7 @@ static void test_wiznavigation(void) DestroyWindow(hdlg); } + static void test_buttons(void) { HPROPSHEETPAGE hpsp[1]; @@ -436,6 +437,94 @@ static void test_buttons(void) DestroyWindow(hdlg); } +static BOOL add_button_has_been_pressed; + +static INT_PTR CALLBACK +page_with_custom_default_button_dlg_proc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_COMMAND: + switch(LOWORD(wparam)) + { + case IDC_PS_PUSHBUTTON1: + switch(HIWORD(wparam)) + { + case BN_CLICKED: + add_button_has_been_pressed = TRUE; + return TRUE; + } + break; + } + break; + } + return FALSE; +} + +static void test_custom_default_button(void) +{ + HWND hdlg; + PROPSHEETPAGEA psp[1]; + PROPSHEETHEADERA psh; + MSG msg; + LRESULT result; + + psp[0].dwSize = sizeof (PROPSHEETPAGEA); + psp[0].dwFlags = PSP_USETITLE; + psp[0].hInstance = GetModuleHandleA(NULL); + U(psp[0]).pszTemplate = MAKEINTRESOURCE(IDD_PROP_PAGE_WITH_CUSTOM_DEFAULT_BUTTON); + U2(psp[0]).pszIcon = NULL; + psp[0].pfnDlgProc = page_with_custom_default_button_dlg_proc; + psp[0].pszTitle = "Page1"; + psp[0].lParam = 0; + + psh.dwSize = sizeof (PROPSHEETHEADERA); + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_MODELESS; + psh.hwndParent = GetDesktopWindow(); + psh.hInstance = GetModuleHandleA(NULL); + U(psh).pszIcon = NULL; + psh.pszCaption = "PropertySheet1"; + psh.nPages = 1; + U3(psh).ppsp = psp; + U2(psh).nStartPage = 0; + + /* The goal of the test is to make sure that the Add button is pressed + * when the ENTER key is pressed and a different control, a combobox, + * has the keyboard focus. */ + add_button_has_been_pressed = FALSE; + + /* Create the modeless property sheet. */ + hdlg = (HWND)PropertySheetA(&psh); + ok(hdlg != INVALID_HANDLE_VALUE, "Cannot create the property sheet\n"); + + /* Set the Add button as the default button. */ + SendMessage(hdlg, DM_SETDEFID, (WPARAM)IDC_PS_PUSHBUTTON1, 0); + + /* Make sure the default button is the Add button. */ + result = SendMessage(hdlg, DM_GETDEFID, 0, 0); + ok(DC_HASDEFID == HIWORD(result), "The property sheet does not have a default button\n"); + ok(IDC_PS_PUSHBUTTON1 == LOWORD(result), "The default button is not the Add button\n"); + + /* At this point, the combobox should have keyboard focus, so we press ENTER. + * Pull the lever, Kronk! */ + keybd_event(VK_RETURN, 0, 0, 0); + + /* Process all the messages in the queue for this thread. */ + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + if (!PropSheet_IsDialogMessage(hdlg, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + todo_wine + ok(add_button_has_been_pressed, "The Add button has not been pressed!\n"); + + DestroyWindow(hdlg); +} + START_TEST(propsheet) { test_title(); @@ -443,4 +532,5 @@ START_TEST(propsheet) test_disableowner(); test_wiznavigation(); test_buttons(); + test_custom_default_button(); } diff --git a/rostests/winetests/comctl32/rebar.c b/rostests/winetests/comctl32/rebar.c index a75a0647f95..d5f27b926a4 100644 --- a/rostests/winetests/comctl32/rebar.c +++ b/rostests/winetests/comctl32/rebar.c @@ -925,6 +925,36 @@ static HWND create_parent_window(void) return hwnd; } +static void test_showband(void) +{ + HWND hRebar; + REBARBANDINFOA rbi; + BOOL ret; + + hRebar = create_rebar_control(); + + /* no bands */ + ret = SendMessageA(hRebar, RB_SHOWBAND, 0, TRUE); + ok(ret == FALSE, "got %d\n", ret); + + rbi.cbSize = REBARBANDINFOA_V6_SIZE; + rbi.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_CHILD; + rbi.cx = 200; + rbi.cxMinChild = 100; + rbi.cyMinChild = 30; + rbi.hwndChild = NULL; + SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi); + + /* index out of range */ + ret = SendMessageA(hRebar, RB_SHOWBAND, 1, TRUE); + ok(ret == FALSE, "got %d\n", ret); + + ret = SendMessageA(hRebar, RB_SHOWBAND, 0, TRUE); + ok(ret == TRUE, "got %d\n", ret); + + DestroyWindow(hRebar); +} + START_TEST(rebar) { HMODULE hComctl32; @@ -948,6 +978,7 @@ START_TEST(rebar) test_bandinfo(); test_colors(); + test_showband(); if(!is_font_installed("System") || !is_font_installed("Tahoma")) { diff --git a/rostests/winetests/comctl32/resources.h b/rostests/winetests/comctl32/resources.h index 8459fc81c16..beabce5bcee 100644 --- a/rostests/winetests/comctl32/resources.h +++ b/rostests/winetests/comctl32/resources.h @@ -36,9 +36,14 @@ #define IDD_PROP_PAGE_RADIO 32 #define IDD_PROP_PAGE_EXIT 33 +#define IDD_PROP_PAGE_WITH_CUSTOM_DEFAULT_BUTTON 34 + #define IDC_PS_EDIT1 1000 #define IDC_PS_EDIT2 1001 #define IDC_PS_RADIO1 1010 #define IDC_PS_RADIO2 1011 +#define IDC_PS_COMBO1 1020 +#define IDC_PS_PUSHBUTTON1 1021 + #endif /* __WINE_COMCTL32_TEST_RESOURCES_H */ diff --git a/rostests/winetests/comctl32/rsrc.rc b/rostests/winetests/comctl32/rsrc.rc index 06e382e3c4a..c817acd9f58 100644 --- a/rostests/winetests/comctl32/rsrc.rc +++ b/rostests/winetests/comctl32/rsrc.rc @@ -79,3 +79,11 @@ IDB_BITMAP_128x15 BITMAP bmp128x15.bmp /* @makedep: bmp80x15.bmp */ IDB_BITMAP_80x15 BITMAP bmp80x15.bmp + +IDD_PROP_PAGE_WITH_CUSTOM_DEFAULT_BUTTON DIALOG DISCARDABLE 5, 43, 227, 215 +STYLE WS_CHILD | WS_DISABLED +FONT 8, "MS Shell Dlg" +{ + COMBOBOX IDC_PS_COMBO1, 16, 68, 140, 14, CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Add", IDC_PS_PUSHBUTTON1, 164, 68, 40, 13 +} diff --git a/rostests/winetests/comctl32/treeview.c b/rostests/winetests/comctl32/treeview.c index 848d4ca1d8e..320deba0e0e 100644 --- a/rostests/winetests/comctl32/treeview.c +++ b/rostests/winetests/comctl32/treeview.c @@ -34,12 +34,13 @@ const char *TEST_CALLBACK_TEXT = "callback_text"; -#define NUM_MSG_SEQUENCES 1 +#define NUM_MSG_SEQUENCES 2 #define TREEVIEW_SEQ_INDEX 0 +#define PARENT_SEQ_INDEX 1 #define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got) -static struct msg_sequence *MsgSequences[NUM_MSG_SEQUENCES]; +static struct msg_sequence *sequences[NUM_MSG_SEQUENCES]; static const struct message FillRootSeq[] = { { TVM_INSERTITEM, sent }, @@ -184,6 +185,16 @@ static const struct message test_get_set_unicodeformat_seq[] = { { 0 } }; +static const struct message parent_expand_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDING }, + { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDED }, + { 0 } +}; + +static const struct message empty_seq[] = { + { 0 } +}; + static HWND hMainWnd; static HTREEITEM hRoot, hChild; @@ -233,7 +244,7 @@ static LRESULT WINAPI TreeviewWndProc(HWND hwnd, UINT message, WPARAM wParam, LP if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; - add_message(MsgSequences, TREEVIEW_SEQ_INDEX, &msg); + add_message(sequences, TREEVIEW_SEQ_INDEX, &msg); defwndproc_counter++; ret = CallWindowProcA(lpOldProc, hwnd, message, wParam, lParam); @@ -286,7 +297,7 @@ static void test_fillroot(void) hTree = create_treeview_control(); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); fill_tree(hTree); @@ -296,7 +307,7 @@ static void test_fillroot(void) AddItem('B'); assert(hChild); AddItem('.'); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, FillRootSeq, "FillRoot", FALSE); + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, FillRootSeq, "FillRoot", FALSE); ok(!strcmp(sequence, "AB."), "Item creation\n"); /* UMLPad 1.15 depends on this being not -1 (I_IMAGECALLBACK) */ @@ -386,7 +397,7 @@ static void test_select(void) fill_tree(hTree); /* root-none select tests */ - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); r = TreeView_SelectItem(hTree, NULL); expect(TRUE, r); Clear(); @@ -407,11 +418,11 @@ static void test_select(void) expect(TRUE, r); AddItem('.'); ok(!strcmp(sequence, "1(nR)nR23(Rn)Rn45(nR)nR."), "root-none select test\n"); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, rootnone_select_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, rootnone_select_seq, "root-none select seq", FALSE); /* root-child select tests */ - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); r = TreeView_SelectItem(hTree, NULL); expect(TRUE, r); @@ -433,7 +444,7 @@ static void test_select(void) expect(TRUE, r); AddItem('.'); ok(!strcmp(sequence, "1(nR)nR23(RC)RC45(CR)CR."), "root-child select test\n"); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, rootchild_select_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, rootchild_select_seq, "root-child select seq", FALSE); DestroyWindow(hTree); @@ -452,7 +463,7 @@ static void test_getitemtext(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); /* add an item without TVIF_TEXT mask and pszText == NULL */ ins.hParent = hRoot; @@ -472,7 +483,7 @@ static void test_getitemtext(void) SendMessageA( hTree, TVM_GETITEM, 0, (LPARAM)&tvi ); ok(!strcmp(szBuffer, ""), "szBuffer=\"%s\", expected \"\"\n", szBuffer); ok(SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)hChild), "DeleteItem failed\n"); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, getitemtext_seq, "get item text seq", FALSE); + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, getitemtext_seq, "get item text seq", FALSE); DestroyWindow(hTree); } @@ -489,7 +500,7 @@ static void test_focus(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); /* This test verifies that when a label is being edited, scrolling * the treeview does not cause the label to lose focus. To test @@ -513,7 +524,7 @@ static void test_focus(void) hEdit = TreeView_EditLabel(hTree, hChild); ScrollWindowEx(hTree, -10, 0, NULL, NULL, NULL, NULL, SW_SCROLLCHILDREN); ok(GetFocus() == hEdit, "Edit control should have focus\n"); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, focus_seq, "focus test", TRUE); + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, focus_seq, "focus test", TRUE); DestroyWindow(hTree); } @@ -526,7 +537,7 @@ static void test_get_set_bkcolor(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); /* If the value is -1, the control is using the system color for the background color. */ crColor = (COLORREF)SendMessage( hTree, TVM_GETBKCOLOR, 0, 0 ); @@ -545,7 +556,7 @@ static void test_get_set_bkcolor(void) /* Reset the default background */ SendMessage( hTree, TVM_SETBKCOLOR, 0, -1 ); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_bkcolor_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_bkcolor_seq, "test get set bkcolor", FALSE); DestroyWindow(hTree); @@ -559,7 +570,7 @@ static void test_get_set_imagelist(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); /* Test a NULL HIMAGELIST */ SendMessage( hTree, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)hImageList ); @@ -568,7 +579,7 @@ static void test_get_set_imagelist(void) /* TODO: Test an actual image list */ - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_imagelist_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_imagelist_seq, "test get imagelist", FALSE); DestroyWindow(hTree); @@ -584,7 +595,7 @@ static void test_get_set_indent(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); /* Finding the minimum indent */ SendMessage( hTree, TVM_SETINDENT, 0, 0 ); @@ -596,7 +607,7 @@ static void test_get_set_indent(void) ulIndent = (DWORD)SendMessage( hTree, TVM_GETINDENT, 0, 0 ); ok(ulIndent == ulMoreThanTwiceMin, "Indent reported as %d, expected %d\n", ulIndent, ulMoreThanTwiceMin); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_indent_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_indent_seq, "test get set indent", FALSE); DestroyWindow(hTree); @@ -610,13 +621,13 @@ static void test_get_set_insertmark(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); SendMessage( hTree, TVM_SETINSERTMARKCOLOR, 0, crColor ); crColor = (COLORREF)SendMessage( hTree, TVM_GETINSERTMARKCOLOR, 0, 0 ); ok(crColor == RGB(0,0,0), "Insert mark color reported as 0x%.8x, expected 0x00000000\n", crColor); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_insertmarkcolor_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_insertmarkcolor_seq, "test get set insertmark color", FALSE); DestroyWindow(hTree); @@ -632,7 +643,7 @@ static void test_get_set_item(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); /* Test the root item */ tviRoot.hItem = hRoot; @@ -654,7 +665,7 @@ static void test_get_set_item(void) strncpy(szBuffer, "Root", nBufferSize); SendMessage( hTree, TVM_SETITEM, 0, (LPARAM)&tviRoot ); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_item_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_item_seq, "test get set item", FALSE); DestroyWindow(hTree); @@ -669,7 +680,7 @@ static void test_get_set_itemheight(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); /* Assuming default height to begin with */ ulOldHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); @@ -689,7 +700,7 @@ static void test_get_set_itemheight(void) ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); ok(ulNewHeight == 8, "Uneven height not set properly, reported %d, expected %d\n", ulNewHeight, 8); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_itemheight_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_itemheight_seq, "test get set item height", FALSE); DestroyWindow(hTree); @@ -704,13 +715,13 @@ static void test_get_set_scrolltime(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); SendMessage( hTree, TVM_SETSCROLLTIME, ulExpectedTime, 0 ); ulTime = (int)SendMessage( hTree, TVM_GETSCROLLTIME, 0, 0 ); ok(ulTime == ulExpectedTime, "Scroll time reported as %d, expected %d\n", ulTime, ulExpectedTime); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_scrolltime_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_scrolltime_seq, "test get set scroll time", FALSE); DestroyWindow(hTree); @@ -725,7 +736,7 @@ static void test_get_set_textcolor(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); crColor = (COLORREF)SendMessage( hTree, TVM_GETTEXTCOLOR, 0, 0 ); ok(crColor == -1, "Default text color reported as 0x%.8x\n", crColor); @@ -743,7 +754,7 @@ static void test_get_set_textcolor(void) /* Reset the default text color */ SendMessage( hTree, TVM_SETTEXTCOLOR, 0, CLR_NONE ); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_textcolor_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_textcolor_seq, "test get set text color", FALSE); DestroyWindow(hTree); @@ -758,7 +769,7 @@ static void test_get_set_tooltips(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); /* show even WS_POPUP treeview don't send NM_TOOLTIPSCREATED */ hPopupTreeView = CreateWindow(WC_TREEVIEW, NULL, WS_POPUP|WS_VISIBLE, 0, 0, 100, 100, hMainWnd, NULL, NULL, NULL); @@ -769,7 +780,7 @@ static void test_get_set_tooltips(void) hwndLastToolTip = (HWND)SendMessage( hTree, TVM_GETTOOLTIPS, 0, 0 ); ok(hwndLastToolTip == NULL, "NULL tool tip, reported as 0x%p, expected 0.\n", hwndLastToolTip); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_tooltips_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_tooltips_seq, "test get set tooltips", TRUE); /* TODO: Add a test of an actual tooltip */ @@ -785,7 +796,7 @@ static void test_get_set_unicodeformat(void) hTree = create_treeview_control(); fill_tree(hTree); - flush_sequences(MsgSequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); /* Set to Unicode */ bPreviousSetting = (BOOL)SendMessage( hTree, TVM_SETUNICODEFORMAT, 1, 0 ); @@ -800,54 +811,131 @@ static void test_get_set_unicodeformat(void) /* Revert to original setting */ SendMessage( hTree, TVM_SETUNICODEFORMAT, bPreviousSetting, 0 ); - ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_unicodeformat_seq, + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_unicodeformat_seq, "test get set unicode format", FALSE); DestroyWindow(hTree); } -static LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +static TVITEMA g_item_expanding, g_item_expanded; +static BOOL g_get_from_expand; +static BOOL g_get_rect_in_expand; + +static LRESULT CALLBACK parent_wnd_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - switch(msg) { + static LONG defwndproc_counter = 0; + struct message msg; + LRESULT ret; + RECT rect; + HTREEITEM visibleItem; + + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + if (message == WM_NOTIFY && lParam) msg.id = ((NMHDR*)lParam)->code; + + /* log system messages, except for painting */ + if (message < WM_USER && + message != WM_PAINT && + message != WM_ERASEBKGND && + message != WM_NCPAINT && + message != WM_NCHITTEST && + message != WM_GETTEXT && + message != WM_GETICON && + message != WM_DEVICECHANGE) + { + trace("parent: %p, %04x, %08lx, %08lx\n", hWnd, message, wParam, lParam); + add_message(sequences, PARENT_SEQ_INDEX, &msg); + } + + switch(message) { case WM_NOTIFY: { NMHDR *pHdr = (NMHDR *)lParam; - ok(pHdr->code != NM_FIRST - 19, "Treeview should not send NM_TOOLTIPSCREATED\n"); - if (pHdr->idFrom == 100) { + ok(pHdr->code != NM_TOOLTIPSCREATED, "Treeview should not send NM_TOOLTIPSCREATED\n"); + if (pHdr->idFrom == 100) + { NMTREEVIEWA *pTreeView = (LPNMTREEVIEWA) lParam; - switch(pHdr->code) { + switch(pHdr->code) + { case TVN_SELCHANGINGA: AddItem('('); IdentifyItem(pTreeView->itemOld.hItem); IdentifyItem(pTreeView->itemNew.hItem); - return 0; + break; case TVN_SELCHANGEDA: AddItem(')'); IdentifyItem(pTreeView->itemOld.hItem); IdentifyItem(pTreeView->itemNew.hItem); - return 0; + break; case TVN_GETDISPINFOA: { NMTVDISPINFOA *disp = (NMTVDISPINFOA *)lParam; if (disp->item.mask & TVIF_TEXT) { lstrcpyn(disp->item.pszText, TEST_CALLBACK_TEXT, disp->item.cchTextMax); } - return 0; + break; } case TVN_ENDLABELEDIT: return TRUE; + case TVN_ITEMEXPANDING: + ok(pTreeView->itemNew.mask == + (TVIF_HANDLE | TVIF_SELECTEDIMAGE | TVIF_IMAGE | TVIF_PARAM | TVIF_STATE), + "got wrong mask %x\n", pTreeView->itemNew.mask); + ok((pTreeView->itemNew.state & TVIS_EXPANDED) == 0, + "got wrong state %x\n", pTreeView->itemNew.state); + ok(pTreeView->itemOld.mask == 0, + "got wrong mask %x\n", pTreeView->itemOld.mask); + + if (g_get_from_expand) + { + g_item_expanding.mask = TVIF_STATE; + g_item_expanding.hItem = hRoot; + ret = SendMessageA(pHdr->hwndFrom, TVM_GETITEMA, 0, (LPARAM)&g_item_expanding); + ok(ret == TRUE, "got %lu\n", ret); + } + break; + case TVN_ITEMEXPANDED: + ok(pTreeView->itemNew.mask & TVIF_STATE, "got wrong mask %x\n", pTreeView->itemNew.mask); + ok(pTreeView->itemNew.state & (TVIS_EXPANDED|TVIS_EXPANDEDONCE), + "got wrong mask %x\n", pTreeView->itemNew.mask); + ok(pTreeView->itemOld.mask == 0, + "got wrong mask %x\n", pTreeView->itemOld.mask); + + if (g_get_from_expand) + { + g_item_expanded.mask = TVIF_STATE; + g_item_expanded.hItem = hRoot; + ret = SendMessageA(pHdr->hwndFrom, TVM_GETITEMA, 0, (LPARAM)&g_item_expanded); + ok(ret == TRUE, "got %lu\n", ret); + } + if (g_get_rect_in_expand) { + visibleItem = TreeView_GetNextItem(pHdr->hwndFrom, NULL, TVGN_FIRSTVISIBLE); + ok(pTreeView->itemNew.hItem == visibleItem, "expanded item == first visible item\n"); + *(HTREEITEM*)&rect = visibleItem; + ok(SendMessage(pHdr->hwndFrom, TVM_GETITEMRECT, TRUE, (LPARAM)&rect), "Failed to get rect for first visible item.\n"); + visibleItem = TreeView_GetNextItem(pHdr->hwndFrom, visibleItem, TVGN_NEXTVISIBLE); + *(HTREEITEM*)&rect = visibleItem; + ok(visibleItem != NULL, "There must be a visible item after the first visisble item.\n"); + todo_wine + ok(SendMessage(pHdr->hwndFrom, TVM_GETITEMRECT, TRUE, (LPARAM)&rect), "Failed to get rect for second visible item.\n"); + } + break; } } - return 0; } - + case WM_DESTROY: PostQuitMessage(0); break; - - default: - return DefWindowProcA(hWnd, msg, wParam, lParam); } - return 0L; + + defwndproc_counter++; + ret = DefWindowProcA(hWnd, message, wParam, lParam); + defwndproc_counter--; + + return ret; } static void test_expandinvisible(void) @@ -1037,6 +1125,73 @@ static void test_get_insertmarkcolor(void) DestroyWindow(hTree); } +static void test_expandnotify(void) +{ + HWND hTree; + BOOL ret; + TVITEMA item; + + hTree = create_treeview_control(); + fill_tree(hTree); + + item.hItem = hRoot; + item.mask = TVIF_STATE; + + item.state = TVIS_EXPANDED; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + ok(ret == TRUE, "got %d\n", ret); + ok((item.state & TVIS_EXPANDED) == 0, "expected collapsed\n"); + + /* preselect root node here */ + ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hRoot); + ok(ret == TRUE, "got %d\n", ret); + + g_get_from_expand = TRUE; + /* expand */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + g_item_expanding.state = 0xdeadbeef; + g_item_expanded.state = 0xdeadbeef; + ret = SendMessageA(hTree, TVM_EXPAND, TVE_EXPAND, (LPARAM)hRoot); + ok(ret == TRUE, "got %d\n", ret); + ok(g_item_expanding.state == TVIS_SELECTED, "got state on TVN_ITEMEXPANDING 0x%08x\n", + g_item_expanding.state); + ok(g_item_expanded.state == (TVIS_SELECTED|TVIS_EXPANDED), "got state on TVN_ITEMEXPANDED 0x%08x\n", + g_item_expanded.state); + ok_sequence(sequences, PARENT_SEQ_INDEX, parent_expand_seq, "expand notifications", FALSE); + g_get_from_expand = FALSE; + + /* check that it's expanded */ + item.state = TVIS_EXPANDED; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + ok(ret == TRUE, "got %d\n", ret); + ok((item.state & TVIS_EXPANDED) == TVIS_EXPANDED, "expected expanded\n"); + + /* collapse */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + ret = SendMessageA(hTree, TVM_EXPAND, TVE_COLLAPSE, (LPARAM)hRoot); + ok(ret == TRUE, "got %d\n", ret); + item.state = TVIS_EXPANDED; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + ok(ret == TRUE, "got %d\n", ret); + ok((item.state & TVIS_EXPANDED) == 0, "expected collapsed\n"); + /* all next collapse/expand attempts won't produce any notifications, + the only way is to reset with all children removed */ + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "collapse after expand notifications", FALSE); + + DestroyWindow(hTree); +} + +static void test_rect_retrieval_after_expand_with_select(void) { + BOOL ret; + HWND hTree; + hTree = create_treeview_control(); + fill_tree(hTree); + g_get_rect_in_expand = TRUE; + ret = TreeView_Select(hTree, hChild, TVGN_CARET); + g_get_rect_in_expand = FALSE; + ok(ret,"TreeView_Select should return true\n"); +} + START_TEST(treeview) { HMODULE hComctl32; @@ -1056,7 +1211,7 @@ START_TEST(treeview) else InitCommonControls(); - init_msg_sequences(MsgSequences, NUM_MSG_SEQUENCES); + init_msg_sequences(sequences, NUM_MSG_SEQUENCES); wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; @@ -1067,7 +1222,7 @@ START_TEST(treeview) wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); wc.lpszMenuName = NULL; wc.lpszClassName = "MyTestWnd"; - wc.lpfnWndProc = MyWndProc; + wc.lpfnWndProc = parent_wnd_proc; RegisterClassA(&wc); hMainWnd = CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW, @@ -1096,6 +1251,8 @@ START_TEST(treeview) test_expandinvisible(); test_itemedit(); test_treeview_classinfo(); + test_expandnotify(); + test_rect_retrieval_after_expand_with_select(); PostMessageA(hMainWnd, WM_CLOSE, 0, 0); while(GetMessageA(&msg,0,0,0)) { diff --git a/rostests/winetests/crypt32/chain.c b/rostests/winetests/crypt32/chain.c index f9ccaed78b1..a59a95a0bb1 100644 --- a/rostests/winetests/crypt32/chain.c +++ b/rostests/winetests/crypt32/chain.c @@ -60,11 +60,25 @@ static BOOL (WINAPI *pCertVerifyCertificateChainPolicy)(LPCSTR,PCCERT_CHAIN_CONT #define IS_INTOID(x) (((ULONG_PTR)(x) >> 16) == 0) +typedef struct _CERT_CHAIN_ENGINE_CONFIG_NO_EXCLUSIVE_ROOT +{ + DWORD cbSize; + HCERTSTORE hRestrictedRoot; + HCERTSTORE hRestrictedTrust; + HCERTSTORE hRestrictedOther; + DWORD cAdditionalStore; + HCERTSTORE *rghAdditionalStore; + DWORD dwFlags; + DWORD dwUrlRetrievalTimeout; + DWORD MaximumCachedCertificates; + DWORD CycleDetectionModulus; +} CERT_CHAIN_ENGINE_CONFIG_NO_EXCLUSIVE_ROOT; static void testCreateCertChainEngine(void) { BOOL ret; - CERT_CHAIN_ENGINE_CONFIG config = { 0 }; + CERT_CHAIN_ENGINE_CONFIG_NO_EXCLUSIVE_ROOT config = { 0 }; + CERT_CHAIN_ENGINE_CONFIG *pConfig = (CERT_CHAIN_ENGINE_CONFIG *)&config; HCERTCHAINENGINE engine; HCERTSTORE store; @@ -77,21 +91,21 @@ static void testCreateCertChainEngine(void) /* Crash ret = pCertCreateCertificateChainEngine(NULL, NULL); ret = pCertCreateCertificateChainEngine(NULL, &engine); - ret = pCertCreateCertificateChainEngine(&config, NULL); + ret = pCertCreateCertificateChainEngine(pConfig, NULL); */ - ret = pCertCreateCertificateChainEngine(&config, &engine); + ret = pCertCreateCertificateChainEngine(pConfig, &engine); ok(!ret && GetLastError() == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", GetLastError()); /* Crashes config.cbSize = sizeof(config); - ret = pCertCreateCertificateChainEngine(&config, NULL); + ret = pCertCreateCertificateChainEngine(pConfig, NULL); */ config.cbSize = sizeof(config); - ret = pCertCreateCertificateChainEngine(&config, &engine); + ret = pCertCreateCertificateChainEngine(pConfig, &engine); ok(ret, "CertCreateCertificateChainEngine failed: %08x\n", GetLastError()); pCertFreeCertificateChainEngine(engine); config.dwFlags = 0xff000000; - ret = pCertCreateCertificateChainEngine(&config, &engine); + ret = pCertCreateCertificateChainEngine(pConfig, &engine); ok(ret, "CertCreateCertificateChainEngine failed: %08x\n", GetLastError()); pCertFreeCertificateChainEngine(engine); @@ -99,7 +113,7 @@ static void testCreateCertChainEngine(void) store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); config.hRestrictedRoot = store; - ret = pCertCreateCertificateChainEngine(&config, &engine); + ret = pCertCreateCertificateChainEngine(pConfig, &engine); ok(ret, "CertCreateCertificateChainEngine failed: %08x\n", GetLastError()); pCertFreeCertificateChainEngine(engine); @@ -108,7 +122,7 @@ static void testCreateCertChainEngine(void) */ CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, selfSignedCert, sizeof(selfSignedCert), CERT_STORE_ADD_ALWAYS, NULL); - ret = pCertCreateCertificateChainEngine(&config, &engine); + ret = pCertCreateCertificateChainEngine(pConfig, &engine); ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND, "Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); @@ -2458,6 +2472,37 @@ static const BYTE chain28_1[] = { 0x44,0x76,0x66,0x26,0xa7,0x05,0x3c,0x68,0x66,0x1c,0x07,0x4d,0xcf,0x54,0xaa, 0x5d,0xba,0x7a,0x8f,0x06,0xa7,0x1e,0x86,0xf1,0x5a,0x4b,0x50,0x16,0xad,0x9f, 0x89 }; +/* A chain whose end certificate is issued to *.winehq.org. */ +static const BYTE chain29_1[] = { +0x30,0x82,0x01,0xab,0x30,0x82,0x01,0x16,0xa0,0x03,0x02,0x01,0x02,0x02,0x01, +0x01,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x30, +0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43,0x65,0x72, +0x74,0x31,0x30,0x1e,0x17,0x0d,0x30,0x37,0x30,0x35,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x17,0x0d,0x30,0x37,0x31,0x30,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03, +0x13,0x05,0x43,0x65,0x72,0x74,0x32,0x30,0x81,0x9d,0x30,0x0b,0x06,0x09,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x03,0x81,0x8d,0x00,0x30,0x81,0x89, +0x02,0x81,0x81,0x00,0xb8,0x52,0xda,0xc5,0x4b,0x3f,0xe5,0x33,0x0e,0x67,0x5f, +0x48,0x21,0xdc,0x7e,0xef,0x37,0x33,0xba,0xff,0xb4,0xc6,0xdc,0xb6,0x17,0x8e, +0x20,0x55,0x07,0x12,0xd2,0x7b,0x3c,0xce,0x30,0xc5,0xa7,0x48,0x9f,0x6e,0xfe, +0xb8,0xbe,0xdb,0x9f,0x9b,0x17,0x60,0x16,0xde,0xc6,0x8b,0x47,0xd1,0x57,0x71, +0x3c,0x93,0xfc,0xbd,0xec,0x44,0x32,0x3b,0xb9,0xcf,0x6b,0x05,0x72,0xa7,0x87, +0x8e,0x7e,0xd4,0x9a,0x87,0x1c,0x2f,0xb7,0x82,0x40,0xfc,0x6a,0x80,0x83,0x68, +0x28,0xce,0x84,0xf4,0x0b,0x2e,0x44,0xcb,0x53,0xac,0x85,0x85,0xb5,0x46,0x36, +0x98,0x3c,0x10,0x02,0xaa,0x02,0xbc,0x8b,0xa2,0x23,0xb2,0xd3,0x51,0x9a,0x22, +0x4a,0xe3,0xaa,0x4e,0x7c,0xda,0x38,0xcf,0x49,0x98,0x72,0xa3,0x02,0x03,0x01, +0x00,0x01,0xa3,0x1b,0x30,0x19,0x30,0x17,0x06,0x03,0x55,0x1d,0x07,0x04,0x10, +0x30,0x0e,0x82,0x0c,0x2a,0x2e,0x77,0x69,0x6e,0x65,0x68,0x71,0x2e,0x6f,0x72, +0x67,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x03, +0x81,0x81,0x00,0x65,0xbf,0xfa,0xf7,0xc3,0x09,0x70,0x25,0x8a,0x46,0x69,0xf6, +0xdc,0x07,0x1e,0x30,0xc9,0xe4,0x58,0x89,0x65,0x3a,0xa8,0xda,0xbd,0x17,0xf8, +0x1d,0x0d,0x7d,0x47,0xb1,0xb2,0xda,0x17,0x9f,0xf6,0x47,0xe0,0xe4,0x4a,0xeb, +0x02,0xc9,0x2e,0x69,0x1c,0x57,0x2a,0x80,0xc9,0x01,0x77,0x7b,0x27,0xff,0x2f, +0xaf,0xdf,0xf3,0x65,0x12,0xd8,0x7d,0xc2,0xbf,0x1b,0x1d,0x18,0x96,0x5c,0xf6, +0xba,0x43,0xc5,0x43,0x57,0xc0,0xdd,0x97,0x95,0xfb,0x1c,0xad,0x64,0x0f,0x61, +0x3a,0xe9,0x27,0xa4,0x57,0x27,0x34,0xa7,0x42,0xde,0x78,0x1a,0x71,0x80,0x23, +0xd6,0xd7,0x22,0xf0,0x24,0x0d,0x71,0xf1,0x2b,0xd0,0xd8,0x76,0x3d,0xef,0x4c, +0xce,0x1c,0x3b,0x83,0x1b,0x63,0x10,0x6c,0x63,0xe5,0x69 }; typedef struct _CONST_DATA_BLOB { @@ -2482,9 +2527,9 @@ typedef struct _CONST_BLOB_ARRAY * certArray, where the last certificate in the chain is expected to be the * end certificate (the one from which the chain is built.) */ -static PCCERT_CHAIN_CONTEXT getChain(const CONST_BLOB_ARRAY *certArray, - DWORD flags, BOOL includeStore, LPSYSTEMTIME checkTime, DWORD todo, - DWORD testIndex) +static PCCERT_CHAIN_CONTEXT getChain(HCERTCHAINENGINE engine, + const CONST_BLOB_ARRAY *certArray, DWORD flags, BOOL includeStore, + LPSYSTEMTIME checkTime, DWORD todo, DWORD testIndex) { HCERTSTORE store; PCCERT_CHAIN_CONTEXT chain = NULL; @@ -2522,7 +2567,7 @@ static PCCERT_CHAIN_CONTEXT getChain(const CONST_BLOB_ARRAY *certArray, FILETIME fileTime; SystemTimeToFileTime(checkTime, &fileTime); - ret = pCertGetCertificateChain(NULL, endCert, &fileTime, + ret = pCertGetCertificateChain(engine, endCert, &fileTime, includeStore ? store : NULL, &chainPara, flags, NULL, &chain); if (todo & TODO_CHAIN) todo_wine ok(ret, "Chain %d: CertGetCertificateChain failed: %08x\n", @@ -3055,6 +3100,18 @@ static const CERT_TRUST_STATUS elementStatus28[] = { static const SimpleChainStatusCheck simpleStatus28[] = { { sizeof(elementStatus28) / sizeof(elementStatus28[0]), elementStatus28 }, }; +static CONST_DATA_BLOB chain29[] = { + { sizeof(chain0_0), chain0_0 }, + { sizeof(chain29_1), chain29_1 }, +}; +static const CERT_TRUST_STATUS elementStatus29[] = { + { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_NAME_MATCH_ISSUER }, + { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, + CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER }, +}; +static const SimpleChainStatusCheck simpleStatus29[] = { + { sizeof(elementStatus29) / sizeof(elementStatus29[0]), elementStatus29 }, +}; static CONST_DATA_BLOB selfSignedChain[] = { { sizeof(selfSignedCert), selfSignedCert } }; @@ -3340,6 +3397,7 @@ static ChainCheck chainCheck[] = { CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, 0 }, 1, simpleStatus28 }, 0 }, + /* chain29 is handled separately elsewhere */ { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain }, { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_IS_NOT_TIME_VALID | CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, @@ -3555,7 +3613,7 @@ static void testGetCertChain(void) for (i = 0; i < sizeof(chainCheck) / sizeof(chainCheck[0]); i++) { - chain = getChain(&chainCheck[i].certs, 0, TRUE, &oct2007, + chain = getChain(NULL, &chainCheck[i].certs, 0, TRUE, &oct2007, chainCheck[i].todo, i); if (chain) { @@ -3567,7 +3625,7 @@ static void testGetCertChain(void) for (i = 0; i < sizeof(chainCheckNoStore) / sizeof(chainCheckNoStore[0]); i++) { - chain = getChain(&chainCheckNoStore[i].certs, 0, FALSE, &oct2007, + chain = getChain(NULL, &chainCheckNoStore[i].certs, 0, FALSE, &oct2007, chainCheckNoStore[i].todo, i); if (chain) { @@ -3576,7 +3634,7 @@ static void testGetCertChain(void) pCertFreeCertificateChain(chain); } } - chain = getChain(&chainCheckEmbeddedNull.certs, 0, TRUE, &oct2007, + chain = getChain(NULL, &chainCheckEmbeddedNull.certs, 0, TRUE, &oct2007, chainCheckEmbeddedNull.todo, 0); if (chain) { @@ -3758,6 +3816,16 @@ static const ChainPolicyCheck opensslPolicyCheckWithoutMatchingName = { { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, NULL, 0 }; +static const ChainPolicyCheck winehqPolicyCheckWithMatchingName = { + { sizeof(chain29) / sizeof(chain29[0]), chain29 }, + { 0, 0, -1, -1, NULL}, NULL, 0 +}; + +static const ChainPolicyCheck winehqPolicyCheckWithoutMatchingName = { + { sizeof(chain29) / sizeof(chain29[0]), chain29 }, + { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, NULL, 0 +}; + static const ChainPolicyCheck stanfordPolicyCheckWithMatchingName = { { sizeof(stanfordChain) / sizeof(stanfordChain[0]), stanfordChain }, { 0, 0, -1, -1, NULL}, NULL, 0 @@ -3869,12 +3937,12 @@ static const char *num_to_str(WORD num) return buf; } -static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, - DWORD testIndex, SYSTEMTIME *sysTime, PCERT_CHAIN_POLICY_PARA para) - +static void checkChainPolicyStatus(LPCSTR policy, HCERTCHAINENGINE engine, + const ChainPolicyCheck *check, DWORD testIndex, SYSTEMTIME *sysTime, + PCERT_CHAIN_POLICY_PARA para) { - PCCERT_CHAIN_CONTEXT chain = getChain(&check->certs, 0, TRUE, sysTime, - check->todo, testIndex); + PCCERT_CHAIN_CONTEXT chain = getChain(engine, &check->certs, 0, TRUE, + sysTime, check->todo, testIndex); if (chain) { @@ -3986,37 +4054,44 @@ static void check_ssl_policy(void) 's','t','a','n','f','o','r','d','.','e','d','u',0 }; WCHAR a_dot_cs_dot_stanford_dot_edu[] = { 'a','.','c','s','.', 's','t','a','n','f','o','r','d','.','e','d','u',0 }; + WCHAR test_dot_winehq_dot_org[] = { 't','e','s','t','.', + 'w','i','n','e','h','q','.','o','r','g',0 }; + WCHAR a_dot_b_dot_winehq_dot_org[] = { 'a','.','b','.', + 'w','i','n','e','h','q','.','o','r','g',0 }; + HCERTSTORE testRoot; + CERT_CHAIN_ENGINE_CONFIG engineConfig = { sizeof(engineConfig), 0 }; + HCERTCHAINENGINE engine; /* Check ssl policy with no parameter */ for (i = 0; i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, &sslPolicyCheck[i], i, - &oct2007, NULL); + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], + i, &oct2007, NULL); /* Check again with a policy parameter that specifies nothing */ for (i = 0; i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, &sslPolicyCheck[i], i, - &oct2007, &policyPara); + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], + i, &oct2007, &policyPara); /* Check yet again, but specify an empty SSL_EXTRA_CERT_CHAIN_POLICY_PARA * argument. */ policyPara.pvExtraPolicyPara = &sslPolicyPara; for (i = 0; i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, &sslPolicyCheck[i], i, - &oct2007, &policyPara); + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], + i, &oct2007, &policyPara); /* And again, but specify the auth type as a client */ sslPolicyPara.dwAuthType = AUTHTYPE_CLIENT; for (i = 0; i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, &sslPolicyCheck[i], i, - &oct2007, &policyPara); + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], + i, &oct2007, &policyPara); /* And again, but specify the auth type as a server */ sslPolicyPara.dwAuthType = AUTHTYPE_SERVER; for (i = 0; i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, &sslPolicyCheck[i], i, - &oct2007, &policyPara); + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], + i, &oct2007, &policyPara); /* And again authenticating a client, but specify the size of the policy * parameter. */ @@ -4024,79 +4099,107 @@ static void check_ssl_policy(void) sslPolicyPara.dwAuthType = AUTHTYPE_CLIENT; for (i = 0; i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, &sslPolicyCheck[i], i, - &oct2007, &policyPara); + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], + i, &oct2007, &policyPara); /* One more time authenticating a client, but specify winehq.org as the * server name. */ sslPolicyPara.pwszServerName = winehq; for (i = 0; i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, &sslPolicyCheck[i], i, - &oct2007, &policyPara); + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], + i, &oct2007, &policyPara); /* And again authenticating a server, still specifying winehq.org as the * server name. */ sslPolicyPara.dwAuthType = AUTHTYPE_SERVER; for (i = 0; i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, &sslPolicyCheck[i], i, - &oct2007, &policyPara); + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], + i, &oct2007, &policyPara); /* And again authenticating a server, this time specifying the size of the * policy param. */ policyPara.cbSize = sizeof(policyPara); for (i = 0; i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, &sslPolicyCheck[i], i, - &oct2007, &policyPara); + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], + i, &oct2007, &policyPara); /* Yet again, but checking the iTunes chain, which contains a name * extension. */ - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &iTunesPolicyCheckWithoutMatchingName, 0, &oct2007, &policyPara); /* And again, but checking the Google chain at a bad date */ sslPolicyPara.pwszServerName = google_dot_com; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &googlePolicyCheckWithMatchingNameExpired, 0, &oct2007, &policyPara); /* And again, but checking the Google chain at a good date */ sslPolicyPara.pwszServerName = google_dot_com; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &googlePolicyCheckWithMatchingName, 0, &oct2009, &policyPara); /* Check again with the openssl cert, which has a wildcard in its name, * with various combinations of matching and non-matching names. * With "a.openssl.org": match */ sslPolicyPara.pwszServerName = a_dot_openssl_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &opensslPolicyCheckWithMatchingName, 0, &oct2009, &policyPara); /* With "openssl.org": no match */ sslPolicyPara.pwszServerName = openssl_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &opensslPolicyCheckWithoutMatchingName, 0, &oct2009, &policyPara); /* With "fopenssl.org": no match */ sslPolicyPara.pwszServerName = fopenssl_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &opensslPolicyCheckWithoutMatchingName, 0, &oct2009, &policyPara); /* with "a.b.openssl.org": no match */ sslPolicyPara.pwszServerName = a_dot_b_dot_openssl_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &opensslPolicyCheckWithoutMatchingName, 0, &oct2009, &policyPara); /* Check again with the cs.stanford.edu, which has both cs.stanford.edu * and www.cs.stanford.edu in its subject alternative name. * With "cs.stanford.edu": match */ sslPolicyPara.pwszServerName = cs_dot_stanford_dot_edu; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &stanfordPolicyCheckWithMatchingName, 0, &oct2009, &policyPara); /* With "www.cs.stanford.edu": match */ sslPolicyPara.pwszServerName = www_dot_cs_dot_stanford_dot_edu; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &stanfordPolicyCheckWithMatchingName, 0, &oct2009, &policyPara); /* With "a.cs.stanford.edu": no match */ sslPolicyPara.pwszServerName = a_dot_cs_dot_stanford_dot_edu; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &stanfordPolicyCheckWithoutMatchingName, 0, &oct2009, &policyPara); + /* Check chain29, which has a wildcard in its subject alternative name, + * but not in its distinguished name. + * Step 1: create a chain engine that trusts chain29's root. + */ + testRoot = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + CertAddEncodedCertificateToStore(testRoot, X509_ASN_ENCODING, chain0_0, + sizeof(chain0_0), CERT_STORE_ADD_ALWAYS, NULL); + engineConfig.hExclusiveRoot = testRoot; + if (!CertCreateCertificateChainEngine(&engineConfig, &engine)) + { + skip("Couldn't create chain engine\n"); + return; + } + /* With "winehq.org": no match */ + sslPolicyPara.pwszServerName = winehq; + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, engine, + &winehqPolicyCheckWithoutMatchingName, 0, &oct2007, &policyPara); + /* With "test.winehq.org": match */ + sslPolicyPara.pwszServerName = test_dot_winehq_dot_org; + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, engine, + &winehqPolicyCheckWithMatchingName, 0, &oct2007, &policyPara); + /* With "a.b.winehq.org": no match */ + sslPolicyPara.pwszServerName = a_dot_b_dot_winehq_dot_org; + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, engine, + &winehqPolicyCheckWithoutMatchingName, 0, &oct2007, &policyPara); + CertFreeCertificateChainEngine(engine); + CertCloseStore(testRoot, 0); } static void testVerifyCertChainPolicy(void) @@ -4163,8 +4266,8 @@ static void testVerifyCertChainPolicy(void) for (i = 0; i < sizeof(basePolicyCheck) / sizeof(basePolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_BASE, &basePolicyCheck[i], i, - &oct2007, NULL); + checkChainPolicyStatus(CERT_CHAIN_POLICY_BASE, NULL, + &basePolicyCheck[i], i, &oct2007, NULL); check_ssl_policy(); /* The authenticode policy doesn't seem to check anything beyond the base * policy. It might check for chains signed by the MS test cert, but none @@ -4172,12 +4275,12 @@ static void testVerifyCertChainPolicy(void) */ for (i = 0; i < sizeof(authenticodePolicyCheck) / sizeof(authenticodePolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_AUTHENTICODE, + checkChainPolicyStatus(CERT_CHAIN_POLICY_AUTHENTICODE, NULL, &authenticodePolicyCheck[i], i, &oct2007, NULL); for (i = 0; i < sizeof(basicConstraintsPolicyCheck) / sizeof(basicConstraintsPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_BASIC_CONSTRAINTS, + checkChainPolicyStatus(CERT_CHAIN_POLICY_BASIC_CONSTRAINTS, NULL, &basicConstraintsPolicyCheck[i], i, &oct2007, NULL); } diff --git a/rostests/winetests/crypt32/encode.c b/rostests/winetests/crypt32/encode.c index 0f8ae7f6989..cc59a59e6a5 100644 --- a/rostests/winetests/crypt32/encode.c +++ b/rostests/winetests/crypt32/encode.c @@ -4595,13 +4595,11 @@ static void test_decodeCRLToBeSigned(DWORD dwEncoding) if (buf) { CRL_INFO *info = (CRL_INFO *)buf; - CRL_ENTRY *entry; ok(size >= sizeof(CRL_INFO), "Wrong size %d\n", size); ok(info->cCRLEntry == 3, "Expected 3 CRL entries, got %d\n", info->cCRLEntry); ok(info->rgCRLEntry != NULL, "Expected a valid CRL entry array\n"); - entry = info->rgCRLEntry; ok(info->cExtension == 2, "Expected 2 extensions, got %d\n", info->cExtension); LocalFree(buf); @@ -7964,6 +7962,7 @@ static void testPortPublicKeyInfo(void) CRYPT_DELETEKEYSET); ret = CryptAcquireContextA(&csp, cspName, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET); + ok(ret,"CryptAcquireContextA failed\n"); testExportPublicKey(csp, &info); testImportPublicKey(csp, info); @@ -7972,6 +7971,7 @@ static void testPortPublicKeyInfo(void) CryptReleaseContext(csp, 0); ret = CryptAcquireContextA(&csp, cspName, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET); + ok(ret,"CryptAcquireContextA failed\n"); } START_TEST(encode) diff --git a/rostests/winetests/crypt32/store.c b/rostests/winetests/crypt32/store.c index ee91e73b77d..10a85a346fe 100644 --- a/rostests/winetests/crypt32/store.c +++ b/rostests/winetests/crypt32/store.c @@ -277,29 +277,35 @@ static void testMemStore(void) CertCloseStore(store1, 0); } -static void compareFile(LPCWSTR filename, const BYTE *pb, DWORD cb) +static void compareStore(HCERTSTORE store, LPCSTR name, const BYTE *pb, + DWORD cb, BOOL todo) { - HANDLE h; - BYTE buf[200]; BOOL ret; - DWORD cbRead = 0, totalRead = 0; + CRYPT_DATA_BLOB blob = { 0, NULL }; - h = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - if (h == INVALID_HANDLE_VALUE) - return; - do { - ret = ReadFile(h, buf, sizeof(buf), &cbRead, NULL); - if (ret && cbRead) - { - ok(totalRead + cbRead <= cb, "Expected total count %d, see %d\n", - cb, totalRead + cbRead); - ok(!memcmp(pb + totalRead, buf, cbRead), - "Unexpected data in file\n"); - totalRead += cbRead; - } - } while (ret && cbRead); - CloseHandle(h); + ret = CertSaveStore(store, X509_ASN_ENCODING, CERT_STORE_SAVE_AS_STORE, + CERT_STORE_SAVE_TO_MEMORY, &blob, 0); + ok(ret, "CertSaveStore failed: %08x\n", GetLastError()); + if (todo) + todo_wine + ok(blob.cbData == cb, "%s: expected size %d, got %d\n", name, cb, + blob.cbData); + else + ok(blob.cbData == cb, "%s: expected size %d, got %d\n", name, cb, + blob.cbData); + blob.pbData = HeapAlloc(GetProcessHeap(), 0, blob.cbData); + if (blob.pbData) + { + ret = CertSaveStore(store, X509_ASN_ENCODING, CERT_STORE_SAVE_AS_STORE, + CERT_STORE_SAVE_TO_MEMORY, &blob, 0); + ok(ret, "CertSaveStore failed: %08x\n", GetLastError()); + if (todo) + todo_wine + ok(!memcmp(pb, blob.pbData, cb), "%s: unexpected value\n", name); + else + ok(!memcmp(pb, blob.pbData, cb), "%s: unexpected value\n", name); + HeapFree(GetProcessHeap(), 0, blob.pbData); + } } static const BYTE serializedStoreWithCert[] = { @@ -689,11 +695,10 @@ static void testCollectionStore(void) GetLastError()); ret = pCertControlStore(collection, 0, CERT_STORE_CTRL_COMMIT, NULL); ok(ret, "CertControlStore failed: %d\n", ret); - + compareStore(collection, "serialized store with cert", + serializedStoreWithCert, sizeof(serializedStoreWithCert), FALSE); CertCloseStore(collection, 0); - compareFile(filename, serializedStoreWithCert, - sizeof(serializedStoreWithCert)); DeleteFileW(filename); } @@ -1294,8 +1299,8 @@ static void testFileStore(void) /* with commits enabled, commit is allowed */ ret = pCertControlStore(store, 0, CERT_STORE_CTRL_COMMIT, NULL); ok(ret, "CertControlStore failed: %d\n", ret); - compareFile(filename, serializedStoreWithCert, - sizeof(serializedStoreWithCert)); + compareStore(store, "serialized store with cert", + serializedStoreWithCert, sizeof(serializedStoreWithCert), FALSE); CertCloseStore(store, 0); } file = CreateFileW(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, @@ -1311,9 +1316,10 @@ static void testFileStore(void) ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL, sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL); ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); + compareStore(store, "serialized store with cert and CRL", + serializedStoreWithCertAndCRL, sizeof(serializedStoreWithCertAndCRL), + FALSE); CertCloseStore(store, 0); - compareFile(filename, serializedStoreWithCertAndCRL, - sizeof(serializedStoreWithCertAndCRL)); } DeleteFileW(filename); @@ -1517,9 +1523,9 @@ static void testFileNameStore(void) bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, NULL); ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); + compareStore(store, "serialized store with cert", + serializedStoreWithCert, sizeof(serializedStoreWithCert), FALSE); CertCloseStore(store, 0); - compareFile(filename, serializedStoreWithCert, - sizeof(serializedStoreWithCert)); } store = CertOpenStore(CERT_STORE_PROV_FILENAME_W, 0, 0, CERT_FILE_STORE_COMMIT_ENABLE_FLAG, filename); @@ -1529,9 +1535,10 @@ static void testFileNameStore(void) ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL, sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL); ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); + compareStore(store, "serialized store with cert and CRL", + serializedStoreWithCertAndCRL, sizeof(serializedStoreWithCertAndCRL), + FALSE); CertCloseStore(store, 0); - compareFile(filename, serializedStoreWithCertAndCRL, - sizeof(serializedStoreWithCertAndCRL)); } DeleteFileW(filename); @@ -1757,6 +1764,69 @@ static void testMessageStore(void) "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); } +static void testSerializedStore(void) +{ + HCERTSTORE store; + CRYPT_DATA_BLOB blob; + + if (0) + { + /* Crash */ + store = CertOpenStore(CERT_STORE_PROV_SERIALIZED, 0, 0, 0, NULL); + store = CertOpenStore(CERT_STORE_PROV_SERIALIZED, 0, 0, + CERT_STORE_DELETE_FLAG, NULL); + } + blob.cbData = sizeof(serializedStoreWithCert); + blob.pbData = (BYTE *)serializedStoreWithCert; + store = CertOpenStore(CERT_STORE_PROV_SERIALIZED, 0, 0, + CERT_STORE_DELETE_FLAG, &blob); + ok(!store && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, + "Expected ERROR_CALL_NOT_IMPLEMENTED, got %08x\n", GetLastError()); + store = CertOpenStore(CERT_STORE_PROV_SERIALIZED, 0, 0, 0, &blob); + ok(store != NULL, "CertOpenStore failed: %08x\n", GetLastError()); + if (store) + { + PCCERT_CONTEXT cert; + PCCRL_CONTEXT crl; + + cert = CertEnumCertificatesInStore(store, NULL); + ok(cert != NULL, "CertEnumCertificatesInStore failed: %08x\n", + GetLastError()); + cert = CertEnumCertificatesInStore(store, cert); + ok(!cert, "Expected only one cert\n"); + if (pCertEnumCRLsInStore) + { + crl = pCertEnumCRLsInStore(store, NULL); + ok(!crl, "Expected no CRLs\n"); + } + CertCloseStore(store, 0); + } + blob.cbData = sizeof(serializedStoreWithCertAndCRL); + blob.pbData = (BYTE *)serializedStoreWithCertAndCRL; + store = CertOpenStore(CERT_STORE_PROV_SERIALIZED, 0, 0, 0, &blob); + ok(store != NULL, "CertOpenStore failed: %08x\n", GetLastError()); + if (store) + { + PCCERT_CONTEXT cert; + PCCRL_CONTEXT crl; + + cert = CertEnumCertificatesInStore(store, NULL); + ok(cert != NULL, "CertEnumCertificatesInStore failed: %08x\n", + GetLastError()); + cert = CertEnumCertificatesInStore(store, cert); + ok(!cert, "Expected only one cert\n"); + if (pCertEnumCRLsInStore) + { + crl = pCertEnumCRLsInStore(store, NULL); + ok(crl != NULL, "CertEnumCRLsInStore failed: %08x\n", + GetLastError()); + crl = pCertEnumCRLsInStore(store, crl); + ok(!crl, "Expected only one CRL\n"); + } + CertCloseStore(store, 0); + } +} + static void testCertOpenSystemStore(void) { HCERTSTORE store; @@ -2063,6 +2133,334 @@ static void testAddSerialized(void) CertCloseStore(store, 0); } +static const BYTE serializedCertWithFriendlyName[] = { +0x0b,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x57,0x00,0x69, +0x00,0x6e,0x00,0x65,0x00,0x54,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x00,0x00, +0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x30,0x7a,0x02, +0x01,0x01,0x30,0x02,0x06,0x00,0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55, +0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x30, +0x22,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30, +0x30,0x30,0x5a,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30, +0x30,0x30,0x30,0x30,0x5a,0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04, +0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x30,0x07, +0x30,0x02,0x06,0x00,0x03,0x01,0x00,0xa3,0x16,0x30,0x14,0x30,0x12,0x06,0x03, +0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x08,0x30,0x06,0x01,0x01,0xff,0x02,0x01, +0x01 }; +static const BYTE serializedStoreWithCertWithFriendlyName[] = { +0x00,0x00,0x00,0x00,0x43,0x45,0x52,0x54,0x0b,0x00,0x00,0x00,0x01,0x00,0x00, +0x00,0x12,0x00,0x00,0x00,0x57,0x00,0x69,0x00,0x6e,0x00,0x65,0x00,0x54,0x00, +0x65,0x00,0x73,0x00,0x74,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00, +0x00,0x7c,0x00,0x00,0x00,0x30,0x7a,0x02,0x01,0x01,0x30,0x02,0x06,0x00,0x30, +0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61, +0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x30,0x22,0x18,0x0f,0x31,0x36,0x30,0x31, +0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x18,0x0f,0x31,0x36, +0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x15, +0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e, +0x20,0x4c,0x61,0x6e,0x67,0x00,0x30,0x07,0x30,0x02,0x06,0x00,0x03,0x01,0x00, +0xa3,0x16,0x30,0x14,0x30,0x12,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04, +0x08,0x30,0x06,0x01,0x01,0xff,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00 }; +static const BYTE serializedStoreWithCertAndHash[] = { +0x00,0x00,0x00,0x00,0x43,0x45,0x52,0x54,0x03,0x00,0x00,0x00,0x01,0x00,0x00, +0x00,0x14,0x00,0x00,0x00,0x6e,0x30,0x90,0x71,0x5f,0xd9,0x23,0x56,0xeb,0xae, +0x25,0x40,0xe6,0x22,0xda,0x19,0x26,0x02,0xa6,0x08,0x20,0x00,0x00,0x00,0x01, +0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x30,0x7a,0x02,0x01,0x01,0x30,0x02,0x06, +0x00,0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a, +0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x30,0x22,0x18,0x0f,0x31,0x36, +0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x18,0x0f, +0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a, +0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75, +0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x30,0x07,0x30,0x02,0x06,0x00,0x03, +0x01,0x00,0xa3,0x16,0x30,0x14,0x30,0x12,0x06,0x03,0x55,0x1d,0x13,0x01,0x01, +0xff,0x04,0x08,0x30,0x06,0x01,0x01,0xff,0x02,0x01,0x01,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; + +static void testAddCertificateLink(void) +{ + BOOL ret; + HCERTSTORE store1, store2; + PCCERT_CONTEXT source, linked; + DWORD size; + LPBYTE buf; + CERT_NAME_BLOB blob; + static const WCHAR szPrefix[] = { 'c','e','r',0 }; + static const WCHAR szDot[] = { '.',0 }; + static const WCHAR WineTestW[] = { 'W','i','n','e','T','e','s','t',0 }; + WCHAR filename1[MAX_PATH], filename2[MAX_PATH]; + HANDLE file; + + if (0) + { + /* Crashes, i.e. the store is dereferenced without checking. */ + ret = CertAddCertificateLinkToStore(NULL, NULL, 0, NULL); + } + + /* Adding a certificate link to a store requires a valid add disposition */ + store1 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + SetLastError(0xdeadbeef); + ret = CertAddCertificateLinkToStore(store1, NULL, 0, NULL); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + source = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, + sizeof(bigCert)); + SetLastError(0xdeadbeef); + ret = CertAddCertificateLinkToStore(store1, source, 0, NULL); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + ret = CertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS, + NULL); + ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); + if (0) + { + /* Crashes, i.e. the source certificate is dereferenced without + * checking when a valid add disposition is given. + */ + ret = CertAddCertificateLinkToStore(store1, NULL, CERT_STORE_ADD_ALWAYS, + NULL); + } + CertCloseStore(store1, 0); + + store1 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + ret = CertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS, + &linked); + ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); + if (ret) + { + ok(linked->hCertStore == store1, "unexpected store\n"); + ret = CertSerializeCertificateStoreElement(linked, 0, NULL, &size); + ok(ret, "CertSerializeCertificateStoreElement failed: %08x\n", + GetLastError()); + buf = HeapAlloc(GetProcessHeap(), 0, size); + if (buf) + { + ret = CertSerializeCertificateStoreElement(linked, 0, buf, &size); + /* The serialized linked certificate is identical to the serialized + * original certificate. + */ + ok(size == sizeof(serializedCert), "Wrong size %d\n", size); + ok(!memcmp(serializedCert, buf, size), + "Unexpected serialized cert\n"); + HeapFree(GetProcessHeap(), 0, buf); + } + /* Set a friendly name on the source certificate... */ + blob.pbData = (LPBYTE)WineTestW; + blob.cbData = sizeof(WineTestW); + ret = CertSetCertificateContextProperty(source, + CERT_FRIENDLY_NAME_PROP_ID, 0, &blob); + ok(ret, "CertSetCertificateContextProperty failed: %08x\n", + GetLastError()); + /* and the linked certificate has the same friendly name. */ + ret = CertGetCertificateContextProperty(linked, + CERT_FRIENDLY_NAME_PROP_ID, NULL, &size); + ok(ret, "CertGetCertificateContextProperty failed: %08x\n", + GetLastError()); + buf = HeapAlloc(GetProcessHeap(), 0, size); + if (buf) + { + ret = CertGetCertificateContextProperty(linked, + CERT_FRIENDLY_NAME_PROP_ID, buf, &size); + ok(!lstrcmpW((LPCWSTR)buf, WineTestW), + "unexpected friendly name\n"); + HeapFree(GetProcessHeap(), 0, buf); + } + CertFreeCertificateContext(linked); + } + CertFreeCertificateContext(source); + CertCloseStore(store1, 0); + + /* Test adding a cert to a file store, committing the change to the store, + * and creating a link to the resulting cert. + */ + if (!GetTempFileNameW(szDot, szPrefix, 0, filename1)) + return; + + DeleteFileW(filename1); + file = CreateFileW(filename1, GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (file == INVALID_HANDLE_VALUE) + return; + + store1 = CertOpenStore(CERT_STORE_PROV_FILE, 0, 0, + CERT_FILE_STORE_COMMIT_ENABLE_FLAG, file); + ok(store1 != NULL, "CertOpenStore failed: %08x\n", GetLastError()); + CloseHandle(file); + + ret = CertAddEncodedCertificateToStore(store1, X509_ASN_ENCODING, + bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, &source); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", + GetLastError()); + + /* Test adding a link to a memory store. */ + store2 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, + &linked); + ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); + if (ret) + { + ok(linked->hCertStore == store2, "unexpected store\n"); + ret = CertSerializeCertificateStoreElement(linked, 0, NULL, &size); + ok(ret, "CertSerializeCertificateStoreElement failed: %08x\n", + GetLastError()); + buf = HeapAlloc(GetProcessHeap(), 0, size); + if (buf) + { + ret = CertSerializeCertificateStoreElement(linked, 0, buf, &size); + /* The serialized linked certificate is identical to the serialized + * original certificate. + */ + ok(size == sizeof(serializedCert), "Wrong size %d\n", size); + ok(!memcmp(serializedCert, buf, size), + "Unexpected serialized cert\n"); + HeapFree(GetProcessHeap(), 0, buf); + } + /* Set a friendly name on the source certificate... */ + blob.pbData = (LPBYTE)WineTestW; + blob.cbData = sizeof(WineTestW); + ret = CertSetCertificateContextProperty(source, + CERT_FRIENDLY_NAME_PROP_ID, 0, &blob); + ok(ret, "CertSetCertificateContextProperty failed: %08x\n", + GetLastError()); + /* and the linked certificate has the same friendly name. */ + ret = CertGetCertificateContextProperty(linked, + CERT_FRIENDLY_NAME_PROP_ID, NULL, &size); + ok(ret, "CertGetCertificateContextProperty failed: %08x\n", + GetLastError()); + buf = HeapAlloc(GetProcessHeap(), 0, size); + if (buf) + { + ret = CertGetCertificateContextProperty(linked, + CERT_FRIENDLY_NAME_PROP_ID, buf, &size); + ok(!lstrcmpW((LPCWSTR)buf, WineTestW), + "unexpected friendly name\n"); + HeapFree(GetProcessHeap(), 0, buf); + } + CertFreeCertificateContext(linked); + } + CertCloseStore(store2, 0); + + if (!GetTempFileNameW(szDot, szPrefix, 0, filename2)) + return; + + DeleteFileW(filename2); + file = CreateFileW(filename2, GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (file == INVALID_HANDLE_VALUE) + return; + + store2 = CertOpenStore(CERT_STORE_PROV_FILE, 0, 0, + CERT_FILE_STORE_COMMIT_ENABLE_FLAG, file); + ok(store2 != NULL, "CertOpenStore failed: %08x\n", GetLastError()); + CloseHandle(file); + /* Test adding a link to a file store. */ + ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, + &linked); + ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); + if (ret) + { + ok(linked->hCertStore == store2, "unexpected store\n"); + ret = CertSerializeCertificateStoreElement(linked, 0, NULL, &size); + ok(ret, "CertSerializeCertificateStoreElement failed: %08x\n", + GetLastError()); + buf = HeapAlloc(GetProcessHeap(), 0, size); + if (buf) + { + ret = CertSerializeCertificateStoreElement(linked, 0, buf, &size); + ok(ret, "CertSerializeCertificateStoreElement failed: %08x\n", + GetLastError()); + /* The serialized linked certificate now contains the friendly + * name property. + */ + ok(size == sizeof(serializedCertWithFriendlyName), + "Wrong size %d\n", size); + ok(!memcmp(serializedCertWithFriendlyName, buf, size), + "Unexpected serialized cert\n"); + HeapFree(GetProcessHeap(), 0, buf); + } + CertFreeCertificateContext(linked); + compareStore(store2, "file store -> file store", + serializedStoreWithCertWithFriendlyName, + sizeof(serializedStoreWithCertWithFriendlyName), FALSE); + } + CertCloseStore(store2, 0); + DeleteFileW(filename2); + + CertFreeCertificateContext(source); + + CertCloseStore(store1, 0); + DeleteFileW(filename1); + + /* Test adding a link to a system store (which is a collection store.) */ + store1 = CertOpenSystemStoreA(0, "My"); + source = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, + sizeof(bigCert)); + SetLastError(0xdeadbeef); + ret = CertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS, + &linked); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + CertFreeCertificateContext(source); + + /* Test adding a link to a file store, where the linked certificate is + * in a system store. + */ + ret = CertAddEncodedCertificateToStore(store1, X509_ASN_ENCODING, + bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, &source); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", + GetLastError()); + if (!GetTempFileNameW(szDot, szPrefix, 0, filename1)) + return; + + DeleteFileW(filename1); + file = CreateFileW(filename1, GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (file == INVALID_HANDLE_VALUE) + return; + + store2 = CertOpenStore(CERT_STORE_PROV_FILE, 0, 0, + CERT_FILE_STORE_COMMIT_ENABLE_FLAG, file); + ok(store2 != NULL, "CertOpenStore failed: %08x\n", GetLastError()); + CloseHandle(file); + + ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, + &linked); + ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); + if (ret) + { + ok(linked->hCertStore == store2, "unexpected store\n"); + ret = pCertControlStore(store2, 0, CERT_STORE_CTRL_COMMIT, NULL); + ok(ret, "CertControlStore failed: %d\n", ret); + compareStore(store2, "file store -> system store", + serializedStoreWithCertAndHash, + sizeof(serializedStoreWithCertAndHash), TRUE); + CertFreeCertificateContext(linked); + } + + CertCloseStore(store2, 0); + DeleteFileW(filename1); + + /* Test adding a link to a registry store, where the linked certificate is + * in a system store. + */ + store2 = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY, 0, 0, + CERT_SYSTEM_STORE_CURRENT_USER, WineTestW); + ok(store2 != NULL, "CertOpenStore failed: %08x\n", GetLastError()); + ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, + &linked); + ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); + if (ret) + { + ok(linked->hCertStore == store2, "unexpected store\n"); + CertDeleteCertificateFromStore(linked); + } + CertCloseStore(store2, 0); + + CertFreeCertificateContext(source); + CertCloseStore(store1, 0); +} + static DWORD countCertsInStore(HCERTSTORE store) { PCCERT_CONTEXT cert = NULL; @@ -2185,12 +2583,14 @@ START_TEST(store) testFileStore(); testFileNameStore(); testMessageStore(); + testSerializedStore(); testCertOpenSystemStore(); testCertEnumSystemStore(); testStoreProperty(); testAddSerialized(); + testAddCertificateLink(); test_I_UpdateStore(); } diff --git a/rostests/winetests/cryptnet/cryptnet.c b/rostests/winetests/cryptnet/cryptnet.c index 618e494a878..1cdafa4811c 100644 --- a/rostests/winetests/cryptnet/cryptnet.c +++ b/rostests/winetests/cryptnet/cryptnet.c @@ -60,6 +60,29 @@ static const BYTE certWithCRLDistPoint[] = { 0x25,0x06,0x03,0x55,0x1d,0x1f,0x01,0x01,0xff,0x04,0x1b,0x30,0x19,0x30,0x17, 0xa0,0x15,0xa0,0x13,0x86,0x11,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x69, 0x6e,0x65,0x68,0x71,0x2e,0x6f,0x72,0x67, }; +static const BYTE certWithAIAWithCAIssuers[] = { +0x30,0x82,0x01,0x3c,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,0x30,0x0b,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x30,0x14,0x31,0x12,0x30, +0x10,0x06,0x03,0x55,0x04,0x03,0x13,0x09,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61, +0x6e,0x67,0x30,0x1e,0x17,0x0d,0x30,0x39,0x31,0x30,0x32,0x38,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x17,0x0d,0x32,0x30,0x31,0x31,0x32,0x37,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x30,0x14,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04,0x03, +0x13,0x09,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x30,0x81,0xa5,0x30, +0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x03,0x81,0x95, +0x00,0x06,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x52,0x53,0x41,0x31,0x00,0x04, +0x00,0x00,0x01,0x00,0x01,0x00,0x2f,0xb2,0x8c,0xff,0x6c,0xf1,0xb1,0x61,0x9c, +0x3a,0x8f,0x5e,0x35,0x2f,0x1f,0xd5,0xcf,0x2a,0xf6,0x9e,0x37,0xe8,0x89,0xa2, +0xb1,0x1c,0xc0,0x1c,0xb6,0x72,0x45,0x97,0xe5,0x88,0x3d,0xfe,0xa6,0x27,0xea, +0xd6,0x07,0x0f,0xcd,0xba,0x49,0x06,0x16,0xdb,0xad,0x06,0x76,0x39,0x4c,0x15, +0xdf,0xe2,0x07,0xc5,0x99,0x1b,0x98,0x4b,0xc3,0x8e,0x89,0x12,0x95,0x9e,0x3b, +0xb9,0x59,0xfe,0x91,0x33,0xc1,0x1f,0xce,0x8f,0xab,0x93,0x25,0x01,0x3e,0xde, +0xf1,0x58,0x3b,0xe7,0x7a,0x03,0x14,0x07,0x09,0x0a,0x21,0x2d,0x12,0x11,0x08, +0x78,0x07,0x9e,0x34,0xc3,0xc5,0xde,0xb2,0xd8,0xd7,0x86,0x0d,0x0d,0xcd,0x81, +0xa4,0x2d,0x7c,0x82,0x50,0xca,0x2a,0xc2,0x99,0xe5,0xf3,0xca,0x7e,0xad,0xa3, +0x31,0x30,0x2f,0x30,0x2d,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01, +0x04,0x21,0x30,0x1f,0x30,0x1d,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30, +0x02,0x86,0x11,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x69,0x6e,0x65,0x68, +0x71,0x2e,0x6f,0x72,0x67 }; static void compareUrlArray(const CRYPT_URL_ARRAY *expected, const CRYPT_URL_ARRAY *got) @@ -231,6 +254,45 @@ static void test_getObjectUrl(void) "Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); CertFreeCertificateContext(cert); } + cert = CertCreateCertificateContext(X509_ASN_ENCODING, + certWithAIAWithCAIssuers, sizeof(certWithAIAWithCAIssuers)); + if (cert) + { + PCRYPT_URL_ARRAY urlArray; + + /* This has an AIA extension with the CA Issuers set, so expect it + * to succeed: + */ + ret = CryptGetObjectUrl(URL_OID_CERTIFICATE_ISSUER, + (void *)cert, 0, NULL, &urlArraySize, NULL, NULL, NULL); + ok(ret, "CryptGetObjectUrl failed: %08x\n", GetLastError()); + if (ret) + { + urlArray = HeapAlloc(GetProcessHeap(), 0, urlArraySize); + if (urlArray) + { + ret = CryptGetObjectUrl(URL_OID_CERTIFICATE_ISSUER, + (void *)cert, CRYPT_GET_URL_FROM_EXTENSION, urlArray, + &urlArraySize, NULL, NULL, NULL); + ok(ret, "CryptGetObjectUrl failed: %08x\n", GetLastError()); + if (ret) + { + LPWSTR pUrl = url; + CRYPT_URL_ARRAY expectedUrl = { 1, &pUrl }; + + compareUrlArray(&expectedUrl, urlArray); + } + HeapFree(GetProcessHeap(), 0, urlArray); + } + } + /* It doesn't have a CRL dist points extension, so this should fail */ + SetLastError(0xdeadbeef); + ret = CryptGetObjectUrl(URL_OID_CERTIFICATE_CRL_DIST_POINT, + (void *)cert, 0, NULL, &urlArraySize, NULL, NULL, NULL); + ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND, + "expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); + CertFreeCertificateContext(cert); + } } static void make_tmp_file(LPSTR path) @@ -376,10 +438,13 @@ static void test_retrieveObjectByUrl(void) skip("no usable CertificateContext\n"); return; } + CertFreeCertificateContext(cert); aux.pLastSyncTime = &ft; ret = CryptRetrieveObjectByUrlA(url, CONTEXT_OID_CERTIFICATE, 0, 0, (void **)&cert, NULL, NULL, NULL, &aux); + ok(ret, "CryptRetrieveObjectByUrlA failed: %08x\n", GetLastError()); + CertFreeCertificateContext(cert); ok(ft.dwLowDateTime || ft.dwHighDateTime, "Expected last sync time to be set\n"); DeleteFileA(tmpfile); @@ -393,8 +458,234 @@ static void test_retrieveObjectByUrl(void) GetLastError()); } +static const BYTE rootWithKeySignAndCRLSign[] = { +0x30,0x82,0x01,0xdf,0x30,0x82,0x01,0x4c,0xa0,0x03,0x02,0x01,0x02,0x02,0x10, +0x5b,0xc7,0x0b,0x27,0x99,0xbb,0x2e,0x99,0x47,0x9d,0x45,0x4e,0x7c,0x1a,0xca, +0xe8,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1d,0x05,0x00,0x30,0x10,0x31, +0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43,0x65,0x72,0x74,0x31, +0x30,0x1e,0x17,0x0d,0x30,0x37,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30, +0x30,0x5a,0x17,0x0d,0x30,0x37,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35, +0x39,0x5a,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05, +0x43,0x65,0x72,0x74,0x31,0x30,0x81,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48, +0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d,0x00,0x30,0x81,0x89, +0x02,0x81,0x81,0x00,0xad,0x7e,0xca,0xf3,0xe5,0x99,0xc2,0x2a,0xca,0x50,0x82, +0x7c,0x2d,0xa4,0x81,0xcd,0x0d,0x0d,0x86,0xd7,0xd8,0xb2,0xde,0xc5,0xc3,0x34, +0x9e,0x07,0x78,0x08,0x11,0x12,0x2d,0x21,0x0a,0x09,0x07,0x14,0x03,0x7a,0xe7, +0x3b,0x58,0xf1,0xde,0x3e,0x01,0x25,0x93,0xab,0x8f,0xce,0x1f,0xc1,0x33,0x91, +0xfe,0x59,0xb9,0x3b,0x9e,0x95,0x12,0x89,0x8e,0xc3,0x4b,0x98,0x1b,0x99,0xc5, +0x07,0xe2,0xdf,0x15,0x4c,0x39,0x76,0x06,0xad,0xdb,0x16,0x06,0x49,0xba,0xcd, +0x0f,0x07,0xd6,0xea,0x27,0xa6,0xfe,0x3d,0x88,0xe5,0x97,0x45,0x72,0xb6,0x1c, +0xc0,0x1c,0xb1,0xa2,0x89,0xe8,0x37,0x9e,0xf6,0x2a,0xcf,0xd5,0x1f,0x2f,0x35, +0x5e,0x8f,0x3a,0x9c,0x61,0xb1,0xf1,0x6c,0xff,0x8c,0xb2,0x2f,0x02,0x03,0x01, +0x00,0x01,0xa3,0x42,0x30,0x40,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01, +0xff,0x04,0x04,0x03,0x02,0x00,0x06,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01, +0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03,0x55,0x1d, +0x0e,0x04,0x16,0x04,0x14,0x14,0x8c,0x16,0xbb,0xbe,0x70,0xa2,0x28,0x89,0xa0, +0x58,0xff,0x98,0xbd,0xa8,0x24,0x2b,0x8a,0xe9,0x9a,0x30,0x09,0x06,0x05,0x2b, +0x0e,0x03,0x02,0x1d,0x05,0x00,0x03,0x81,0x81,0x00,0x74,0xcb,0x21,0xfd,0x2d, +0x25,0xdc,0xa5,0xaa,0xa1,0x26,0xdc,0x8b,0x40,0x11,0x64,0xae,0x5c,0x71,0x3c, +0x28,0xbc,0xf9,0xb3,0xcb,0xa5,0x94,0xb2,0x8d,0x4c,0x23,0x2b,0x9b,0xde,0x2c, +0x4c,0x30,0x04,0xc6,0x88,0x10,0x2f,0x53,0xfd,0x6c,0x82,0xf1,0x13,0xfb,0xda, +0x27,0x75,0x25,0x48,0xe4,0x72,0x09,0x2a,0xee,0xb4,0x1e,0xc9,0x55,0xf5,0xf7, +0x82,0x91,0xd8,0x4b,0xe4,0x3a,0xfe,0x97,0x87,0xdf,0xfb,0x15,0x5a,0x12,0x3e, +0x12,0xe6,0xad,0x40,0x0b,0xcf,0xee,0x1a,0x44,0xe0,0x83,0xb2,0x67,0x94,0xd4, +0x2e,0x7c,0xf2,0x06,0x9d,0xb3,0x3b,0x7e,0x2f,0xda,0x25,0x66,0x7e,0xa7,0x1f, +0x45,0xd4,0xf5,0xe3,0xdf,0x2a,0xf1,0x18,0x28,0x20,0xb5,0xf8,0xf5,0x8d,0x7a, +0x2e,0x84,0xee }; +static const BYTE eeCert[] = { +0x30,0x82,0x01,0xb9,0x30,0x82,0x01,0x22,0xa0,0x03,0x02,0x01,0x02,0x02,0x01, +0x01,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05, +0x00,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43, +0x65,0x72,0x74,0x31,0x30,0x1e,0x17,0x0d,0x30,0x37,0x30,0x35,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x30,0x37,0x31,0x30,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55, +0x04,0x03,0x13,0x05,0x43,0x65,0x72,0x74,0x32,0x30,0x81,0x9f,0x30,0x0d,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d, +0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xb8,0x52,0xda,0xc5,0x4b,0x3f,0xe5, +0x33,0x0e,0x67,0x5f,0x48,0x21,0xdc,0x7e,0xef,0x37,0x33,0xba,0xff,0xb4,0xc6, +0xdc,0xb6,0x17,0x8e,0x20,0x55,0x07,0x12,0xd2,0x7b,0x3c,0xce,0x30,0xc5,0xa7, +0x48,0x9f,0x6e,0xfe,0xb8,0xbe,0xdb,0x9f,0x9b,0x17,0x60,0x16,0xde,0xc6,0x8b, +0x47,0xd1,0x57,0x71,0x3c,0x93,0xfc,0xbd,0xec,0x44,0x32,0x3b,0xb9,0xcf,0x6b, +0x05,0x72,0xa7,0x87,0x8e,0x7e,0xd4,0x9a,0x87,0x1c,0x2f,0xb7,0x82,0x40,0xfc, +0x6a,0x80,0x83,0x68,0x28,0xce,0x84,0xf4,0x0b,0x2e,0x44,0xcb,0x53,0xac,0x85, +0x85,0xb5,0x46,0x36,0x98,0x3c,0x10,0x02,0xaa,0x02,0xbc,0x8b,0xa2,0x23,0xb2, +0xd3,0x51,0x9a,0x22,0x4a,0xe3,0xaa,0x4e,0x7c,0xda,0x38,0xcf,0x49,0x98,0x72, +0xa3,0x02,0x03,0x01,0x00,0x01,0xa3,0x23,0x30,0x21,0x30,0x1f,0x06,0x03,0x55, +0x1d,0x23,0x04,0x18,0x30,0x18,0x80,0x14,0x14,0x8c,0x16,0xbb,0xbe,0x70,0xa2, +0x28,0x89,0xa0,0x58,0xff,0x98,0xbd,0xa8,0x24,0x2b,0x8a,0xe9,0x9a,0x30,0x0d, +0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x81, +0x81,0x00,0x8a,0x49,0xa9,0x86,0x5e,0xc9,0x33,0x7e,0xfd,0xab,0x64,0x1f,0x6d, +0x00,0xd7,0x9b,0xec,0xd1,0x5b,0x38,0xcc,0xd6,0xf3,0xf2,0xb4,0x75,0x70,0x00, +0x82,0x9d,0x37,0x58,0xe1,0xcd,0x2c,0x61,0xb3,0x28,0xe7,0x8a,0x00,0xbe,0x6e, +0xca,0xe8,0x55,0xd5,0xad,0x3a,0xea,0xaf,0x13,0x20,0x1c,0x44,0xfc,0xb4,0xf9, +0x29,0x2b,0xdc,0x8a,0x2d,0x1b,0x27,0x9e,0xb9,0x3b,0x4a,0x71,0x9d,0x47,0x7d, +0xf7,0x92,0x6b,0x21,0x7f,0xfa,0x88,0x79,0x94,0x33,0xf6,0xdd,0x92,0x04,0x92, +0xd6,0x5e,0x0a,0x74,0xf2,0x85,0xa6,0xd5,0x3c,0x28,0xc0,0x89,0x5d,0xda,0xf3, +0xa6,0x01,0xc2,0xe9,0xa3,0xc1,0xb7,0x21,0x08,0xba,0x18,0x07,0x45,0xeb,0x77, +0x7d,0xcd,0xc6,0xe7,0x2a,0x7b,0x46,0xd2,0x3d,0xb5 }; +static const BYTE rootSignedCRL[] = { +0x30,0x82,0x01,0x1f,0x30,0x81,0x89,0x02,0x01,0x01,0x30,0x0d,0x06,0x09,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x10,0x31,0x0e,0x30, +0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43,0x65,0x72,0x74,0x31,0x17,0x0d, +0x30,0x37,0x30,0x39,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d, +0x30,0x37,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x14, +0x30,0x12,0x02,0x01,0x01,0x17,0x0d,0x30,0x37,0x30,0x39,0x30,0x31,0x30,0x30, +0x30,0x30,0x30,0x30,0x5a,0xa0,0x2f,0x30,0x2d,0x30,0x0a,0x06,0x03,0x55,0x1d, +0x14,0x04,0x03,0x02,0x01,0x01,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18, +0x30,0x18,0x80,0x14,0x14,0x8c,0x16,0xbb,0xbe,0x70,0xa2,0x28,0x89,0xa0,0x58, +0xff,0x98,0xbd,0xa8,0x24,0x2b,0x8a,0xe9,0x9a,0x30,0x0d,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x81,0x81,0x00,0xa3,0xcf, +0x17,0x5d,0x7a,0x08,0xab,0x11,0x1a,0xbd,0x5c,0xde,0x9a,0x22,0x92,0x38,0xe6, +0x96,0xcc,0xb1,0xc5,0x42,0x86,0xa6,0xae,0xad,0xa3,0x1a,0x2b,0xa0,0xb0,0x65, +0xaa,0x9c,0xd7,0x2d,0x44,0x8c,0xae,0x61,0xc7,0x30,0x17,0x89,0x84,0x3b,0x4a, +0x8f,0x17,0x08,0x06,0x37,0x1c,0xf7,0x2d,0x4e,0x47,0x07,0x61,0x50,0xd9,0x06, +0xd1,0x46,0xed,0x0a,0xbb,0xc3,0x9b,0x36,0x0b,0xa7,0x27,0x2f,0x2b,0x55,0xce, +0x2a,0xa5,0x60,0xc6,0x53,0x28,0xe8,0xee,0xad,0x0e,0x2b,0xe8,0xd7,0x5f,0xc9, +0xa5,0xed,0xf9,0x77,0xb0,0x3c,0x81,0xcf,0xcc,0x49,0xb2,0x1a,0xc3,0xfd,0x34, +0xd5,0xbc,0xb0,0xd5,0xa5,0x9c,0x1b,0x72,0xc3,0x0f,0xa3,0xe3,0x3c,0xf0,0xc3, +0x91,0xe8,0x93,0x4f,0xd4,0x2f }; + +BOOL (WINAPI *pCertVerifyRevocation)(DWORD, DWORD, DWORD, void **, DWORD, + PCERT_REVOCATION_PARA, PCERT_REVOCATION_STATUS); + +/* Wednesday, Oct 1, 2007 */ +static SYSTEMTIME oct2007 = { 2007, 10, 1, 1, 0, 0, 0, 0 }; + +static void test_verifyRevocation(void) +{ + HMODULE hCryptNet = GetModuleHandleA("cryptnet.dll"); + BOOL ret; + CERT_REVOCATION_STATUS status = { sizeof(status), 0 }; + PCCERT_CONTEXT certs[2]; + CERT_REVOCATION_PARA revPara = { sizeof(revPara), 0 }; + FILETIME time; + + pCertVerifyRevocation = (void *)GetProcAddress(hCryptNet, + "CertDllVerifyRevocation"); + if (!pCertVerifyRevocation) + { + win_skip("no CertDllVerifyRevocation\n"); + return; + } + if (0) + { + /* Crash */ + ret = pCertVerifyRevocation(0, 0, 0, NULL, 0, NULL, NULL); + } + SetLastError(0xdeadbeef); + ret = pCertVerifyRevocation(0, 0, 0, NULL, 0, NULL, &status); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = pCertVerifyRevocation(X509_ASN_ENCODING, 0, 0, NULL, 0, NULL, + &status); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = pCertVerifyRevocation(0, CERT_CONTEXT_REVOCATION_TYPE, 0, NULL, 0, + NULL, &status); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + certs[0] = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, + sizeof(bigCert)); + SetLastError(0xdeadbeef); + ret = pCertVerifyRevocation(0, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)certs, 0, NULL, &status); + ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", GetLastError()); + ok(status.dwError == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", status.dwError); + ok(status.dwIndex == 0, "expected index 0, got %d\n", status.dwIndex); + CertFreeCertificateContext(certs[0]); + certs[0] = CertCreateCertificateContext(X509_ASN_ENCODING, + rootWithKeySignAndCRLSign, sizeof(rootWithKeySignAndCRLSign)); + certs[1] = CertCreateCertificateContext(X509_ASN_ENCODING, + eeCert, sizeof(eeCert)); + /* The root cert itself can't be checked for revocation */ + SetLastError(0xdeadbeef); + ret = pCertVerifyRevocation(0, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)certs, 0, NULL, &status); + ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", GetLastError()); + ok(status.dwError == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", status.dwError); + ok(status.dwIndex == 0, "expected index 0, got %d\n", status.dwIndex); + /* Neither can the end cert */ + SetLastError(0xdeadbeef); + ret = pCertVerifyRevocation(0, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)&certs[1], 0, NULL, &status); + ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", GetLastError()); + ok(status.dwError == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", status.dwError); + ok(status.dwIndex == 0, "expected index 0, got %d\n", status.dwIndex); + /* Both certs together can't, either (they're not CRLs) */ + SetLastError(0xdeadbeef); + ret = pCertVerifyRevocation(0, CERT_CONTEXT_REVOCATION_TYPE, + 2, (void **)certs, 0, NULL, &status); + ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", GetLastError()); + ok(status.dwError == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", status.dwError); + ok(status.dwIndex == 0, "expected index 0, got %d\n", status.dwIndex); + /* Now add a CRL to the hCrlStore */ + revPara.hCrlStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + CertAddEncodedCRLToStore(revPara.hCrlStore, X509_ASN_ENCODING, + rootSignedCRL, sizeof(rootSignedCRL), CERT_STORE_ADD_ALWAYS, NULL); + SetLastError(0xdeadbeef); + ret = pCertVerifyRevocation(0, CERT_CONTEXT_REVOCATION_TYPE, + 2, (void **)certs, 0, &revPara, &status); + ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", GetLastError()); + ok(status.dwError == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", status.dwError); + ok(status.dwIndex == 0, "expected index 0, got %d\n", status.dwIndex); + /* Specifying CERT_VERIFY_REV_CHAIN_FLAG doesn't change things either */ + SetLastError(0xdeadbeef); + ret = pCertVerifyRevocation(0, CERT_CONTEXT_REVOCATION_TYPE, + 2, (void **)certs, CERT_VERIFY_REV_CHAIN_FLAG, &revPara, &status); + ok(!ret && GetLastError() == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", GetLastError()); + ok(status.dwError == CRYPT_E_NO_REVOCATION_CHECK, + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", status.dwError); + ok(status.dwIndex == 0, "expected index 0, got %d\n", status.dwIndex); + /* Again, specifying the issuer cert: no change */ + revPara.pIssuerCert = certs[0]; + SetLastError(0xdeadbeef); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)&certs[1], 0, &revPara, &status); + /* Win2k thinks the cert is revoked, and it is, except the CRL is out of + * date, hence the revocation status should be unknown. + */ + ok(!ret && (GetLastError() == CRYPT_E_NO_REVOCATION_CHECK || + broken(GetLastError() == CRYPT_E_REVOKED /* Win2k */)), + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", GetLastError()); + ok(status.dwError == CRYPT_E_NO_REVOCATION_CHECK || + broken(status.dwError == CRYPT_E_REVOKED /* Win2k */), + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", status.dwError); + ok(status.dwIndex == 0, "expected index 0, got %d\n", status.dwIndex); + /* Specifying the time to check: still no change */ + SystemTimeToFileTime(&oct2007, &time); + revPara.pftTimeToUse = &time; + ret = pCertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)&certs[1], 0, &revPara, &status); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == CRYPT_E_NO_REVOCATION_CHECK || + broken(GetLastError() == CRYPT_E_REVOKED), /* W2K SP3/SP4 */ + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", GetLastError()); + ok(status.dwError == CRYPT_E_NO_REVOCATION_CHECK || + broken(GetLastError() == CRYPT_E_REVOKED), /* W2K SP3/SP4 */ + "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", status.dwError); + ok(status.dwIndex == 0, "expected index 0, got %d\n", status.dwIndex); + CertCloseStore(revPara.hCrlStore, 0); + CertFreeCertificateContext(certs[1]); + CertFreeCertificateContext(certs[0]); +} + START_TEST(cryptnet) { test_getObjectUrl(); test_retrieveObjectByUrl(); + test_verifyRevocation(); } diff --git a/rostests/winetests/cryptui/cryptui.c b/rostests/winetests/cryptui/cryptui.c index 534d0e7f6ae..996df0e7392 100644 --- a/rostests/winetests/cryptui/cryptui.c +++ b/rostests/winetests/cryptui/cryptui.c @@ -317,7 +317,6 @@ static BOOL find_and_delete_cert_in_store(HCERTSTORE store, PCCERT_CONTEXT cert) return FALSE; CertDeleteCertificateFromStore(found); - CertFreeCertificateContext(found); return TRUE; } @@ -560,7 +559,7 @@ static void test_crypt_ui_wiz_import(void) crl = CertEnumCRLsInStore(store, crl); if (crl) count++; - } while (cert); + } while (crl); ok(count == 1, "expected 1 CRL, got %d\n", count); } CertCloseStore(store, 0); @@ -596,7 +595,7 @@ static void test_crypt_ui_wiz_import(void) crl = CertEnumCRLsInStore(store, crl); if (crl) count++; - } while (cert); + } while (crl); ok(count == 0, "expected 0 CRLs, got %d\n", count); } SetLastError(0xdeadbeef); @@ -636,7 +635,7 @@ static void test_crypt_ui_wiz_import(void) crl = CertEnumCRLsInStore(store, crl); if (crl) count++; - } while (cert); + } while (crl); ok(count == 1, "expected 1 CRL, got %d\n", count); } SetLastError(0xdeadbeef); diff --git a/rostests/winetests/fusion/asmcache.c b/rostests/winetests/fusion/asmcache.c index 81c0e762d4f..06867e6783e 100644 --- a/rostests/winetests/fusion/asmcache.c +++ b/rostests/winetests/fusion/asmcache.c @@ -28,10 +28,6 @@ #include "wine/test.h" -#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 -#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 -#define CLDB_E_FILE_OLDVER EMAKEHR(0x1107) - typedef struct _tagASSEMBLY ASSEMBLY; typedef struct diff --git a/rostests/winetests/gdi32/bitmap.c b/rostests/winetests/gdi32/bitmap.c index f6a4434fd2f..8e5ad2ea797 100755 --- a/rostests/winetests/gdi32/bitmap.c +++ b/rostests/winetests/gdi32/bitmap.c @@ -411,7 +411,7 @@ static void test_dib_bits_access( HBITMAP hdib, void *bits ) char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)]; DWORD data[256]; BITMAPINFO *pbmi = (BITMAPINFO *)bmibuf; - HDC hdc = GetDC(0); + HDC hdc; char filename[MAX_PATH]; HANDLE file; DWORD written; @@ -435,11 +435,15 @@ static void test_dib_bits_access( HBITMAP hdib, void *bits ) pbmi->bmiHeader.biPlanes = 1; pbmi->bmiHeader.biCompression = BI_RGB; + hdc = GetDC(0); + ret = SetDIBits( hdc, hdib, 0, 16, data, pbmi, DIB_RGB_COLORS ); ok(ret == 16 || broken(ret == 0), /* win9x */ "SetDIBits failed: expected 16 got %d\n", ret); + ReleaseDC(0, hdc); + ok(VirtualQuery(bits, &info, sizeof(info)) == sizeof(info), "VirtualQuery failed\n"); ok(info.BaseAddress == bits, "%p != %p\n", info.BaseAddress, bits); @@ -542,6 +546,18 @@ static void test_dibsections(void) ok(hdib == NULL, "CreateDIBSection should fail when asked to create a compressed DIB section\n"); ok(GetLastError() == 0xdeadbeef, "wrong error %d\n", GetLastError()); + for (i = 0; i < 128; i++) + { + pbmi->bmiHeader.biBitCount = i; + pbmi->bmiHeader.biCompression = BI_RGB; + hdib = CreateDIBSection(hdc, pbmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); + if (i == 1 || i == 4 || i == 8 || i == 16 || i == 24 || i == 32) + ok(hdib != NULL, "CreateDIBSection bpp %u\n", i); + else + todo_wine ok(hdib == NULL, "CreateDIBSection bpp %u succeeded\n", i); + if (hdib) DeleteObject( hdib ); + } + pbmi->bmiHeader.biBitCount = 16; pbmi->bmiHeader.biCompression = BI_BITFIELDS; ((PDWORD)pbmi->bmiColors)[0] = 0xf800; @@ -864,8 +880,8 @@ static void test_dibsections(void) DeleteObject(hdib); DeleteObject(hpal); - DeleteDC(hdcmem); + DeleteDC(hdcmem2); ReleaseDC(0, hdc); } @@ -1805,9 +1821,11 @@ static void test_GetDIBits_BI_BITFIELDS(void) char dibinfo_buf[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)]; DWORD bits[32]; LPBITMAPINFO dibinfo = (LPBITMAPINFO) dibinfo_buf; + DWORD *bitmasks = (DWORD *)dibinfo->bmiColors; HDC hdc; HBITMAP hbm; int ret; + void *ptr; memset(dibinfo, 0, sizeof(dibinfo_buf)); dibinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); @@ -1822,8 +1840,6 @@ static void test_GetDIBits_BI_BITFIELDS(void) ok(ret == 1, "GetDIBits failed\n"); if (dibinfo->bmiHeader.biBitCount > 8) { - DWORD *bitmasks = (DWORD *)dibinfo->bmiColors; - ok( dibinfo->bmiHeader.biCompression == BI_BITFIELDS, "compression is %u\n", dibinfo->bmiHeader.biCompression ); @@ -1887,6 +1903,135 @@ static void test_GetDIBits_BI_BITFIELDS(void) } else skip("not in 16 bpp BI_BITFIELDS mode, skipping that test\n"); + DeleteObject(hbm); + + /* same thing now with a 32-bpp DIB section */ + + dibinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + dibinfo->bmiHeader.biWidth = 1; + dibinfo->bmiHeader.biHeight = 1; + dibinfo->bmiHeader.biPlanes = 1; + dibinfo->bmiHeader.biBitCount = 32; + dibinfo->bmiHeader.biCompression = BI_RGB; + dibinfo->bmiHeader.biSizeImage = 0; + dibinfo->bmiHeader.biXPelsPerMeter = 0; + dibinfo->bmiHeader.biYPelsPerMeter = 0; + dibinfo->bmiHeader.biClrUsed = 0; + dibinfo->bmiHeader.biClrImportant = 0; + bitmasks[0] = 0x0000ff; + bitmasks[1] = 0x00ff00; + bitmasks[2] = 0xff0000; + hbm = CreateDIBSection( hdc, dibinfo, DIB_RGB_COLORS, &ptr, NULL, 0 ); + ok( hbm != 0, "failed to create bitmap\n" ); + + memset(dibinfo, 0, sizeof(dibinfo_buf)); + dibinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + ret = GetDIBits(hdc, hbm, 0, 0, NULL, dibinfo, DIB_RGB_COLORS); + ok(ret == 1, "GetDIBits failed\n"); + ok( dibinfo->bmiHeader.biBitCount == 32, "wrong bit count %u\n", dibinfo->bmiHeader.biBitCount ); + + ok( dibinfo->bmiHeader.biCompression == BI_BITFIELDS, + "compression is %u\n", dibinfo->bmiHeader.biCompression ); + ok( !bitmasks[0], "red mask is set\n" ); + ok( !bitmasks[1], "green mask is set\n" ); + ok( !bitmasks[2], "blue mask is set\n" ); + + dibinfo->bmiHeader.biSizeImage = 0xdeadbeef; + ret = GetDIBits(hdc, hbm, 0, 1, bits, dibinfo, DIB_RGB_COLORS); + ok(ret == 1, "GetDIBits failed\n"); + ok( dibinfo->bmiHeader.biBitCount == 32, "wrong bit count %u\n", dibinfo->bmiHeader.biBitCount ); + ok( bitmasks[0] == 0xff0000, "wrong red mask %08x\n", bitmasks[0] ); + ok( bitmasks[1] == 0x00ff00, "wrong green mask %08x\n", bitmasks[1] ); + ok( bitmasks[2] == 0x0000ff, "wrong blue mask %08x\n", bitmasks[2] ); + ok( dibinfo->bmiHeader.biSizeImage != 0xdeadbeef || + broken(dibinfo->bmiHeader.biSizeImage == 0xdeadbeef), /* win9x */ + "size image not set\n" ); + + DeleteObject(hbm); + + dibinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + dibinfo->bmiHeader.biWidth = 1; + dibinfo->bmiHeader.biHeight = 1; + dibinfo->bmiHeader.biPlanes = 1; + dibinfo->bmiHeader.biBitCount = 32; + dibinfo->bmiHeader.biCompression = BI_BITFIELDS; + dibinfo->bmiHeader.biSizeImage = 0; + dibinfo->bmiHeader.biXPelsPerMeter = 0; + dibinfo->bmiHeader.biYPelsPerMeter = 0; + dibinfo->bmiHeader.biClrUsed = 0; + dibinfo->bmiHeader.biClrImportant = 0; + bitmasks[0] = 0x0000ff; + bitmasks[1] = 0x00ff00; + bitmasks[2] = 0xff0000; + hbm = CreateDIBSection( hdc, dibinfo, DIB_RGB_COLORS, &ptr, NULL, 0 ); + ok( hbm != 0 || broken(!hbm), /* win9x */ "failed to create bitmap\n" ); + + if (hbm) + { + memset(dibinfo, 0, sizeof(dibinfo_buf)); + dibinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + ret = GetDIBits(hdc, hbm, 0, 0, NULL, dibinfo, DIB_RGB_COLORS); + ok(ret == 1, "GetDIBits failed\n"); + + ok( dibinfo->bmiHeader.biCompression == BI_BITFIELDS, + "compression is %u\n", dibinfo->bmiHeader.biCompression ); + ok( !bitmasks[0], "red mask is set\n" ); + ok( !bitmasks[1], "green mask is set\n" ); + ok( !bitmasks[2], "blue mask is set\n" ); + + dibinfo->bmiHeader.biSizeImage = 0xdeadbeef; + ret = GetDIBits(hdc, hbm, 0, 1, bits, dibinfo, DIB_RGB_COLORS); + ok(ret == 1, "GetDIBits failed\n"); + ok( bitmasks[0] == 0x0000ff, "wrong red mask %08x\n", bitmasks[0] ); + ok( bitmasks[1] == 0x00ff00, "wrong green mask %08x\n", bitmasks[1] ); + ok( bitmasks[2] == 0xff0000, "wrong blue mask %08x\n", bitmasks[2] ); + ok( dibinfo->bmiHeader.biSizeImage != 0xdeadbeef, "size image not set\n" ); + + DeleteObject(hbm); + } + + /* 24-bpp DIB sections don't have bitfields */ + + dibinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + dibinfo->bmiHeader.biWidth = 1; + dibinfo->bmiHeader.biHeight = 1; + dibinfo->bmiHeader.biPlanes = 1; + dibinfo->bmiHeader.biBitCount = 24; + dibinfo->bmiHeader.biCompression = BI_BITFIELDS; + dibinfo->bmiHeader.biSizeImage = 0; + dibinfo->bmiHeader.biXPelsPerMeter = 0; + dibinfo->bmiHeader.biYPelsPerMeter = 0; + dibinfo->bmiHeader.biClrUsed = 0; + dibinfo->bmiHeader.biClrImportant = 0; + hbm = CreateDIBSection( hdc, dibinfo, DIB_RGB_COLORS, &ptr, NULL, 0 ); + ok( hbm == 0, "creating 24-bpp BI_BITFIELDS dibsection should fail\n" ); + dibinfo->bmiHeader.biCompression = BI_RGB; + hbm = CreateDIBSection( hdc, dibinfo, DIB_RGB_COLORS, &ptr, NULL, 0 ); + ok( hbm != 0, "failed to create bitmap\n" ); + + memset(dibinfo, 0, sizeof(dibinfo_buf)); + dibinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + ret = GetDIBits(hdc, hbm, 0, 0, NULL, dibinfo, DIB_RGB_COLORS); + ok(ret == 1, "GetDIBits failed\n"); + ok( dibinfo->bmiHeader.biBitCount == 24, "wrong bit count %u\n", dibinfo->bmiHeader.biBitCount ); + + ok( dibinfo->bmiHeader.biCompression == BI_RGB, + "compression is %u\n", dibinfo->bmiHeader.biCompression ); + ok( !bitmasks[0], "red mask is set\n" ); + ok( !bitmasks[1], "green mask is set\n" ); + ok( !bitmasks[2], "blue mask is set\n" ); + + dibinfo->bmiHeader.biSizeImage = 0xdeadbeef; + ret = GetDIBits(hdc, hbm, 0, 1, bits, dibinfo, DIB_RGB_COLORS); + ok(ret == 1, "GetDIBits failed\n"); + ok( dibinfo->bmiHeader.biBitCount == 24, "wrong bit count %u\n", dibinfo->bmiHeader.biBitCount ); + ok( !bitmasks[0], "red mask is set\n" ); + ok( !bitmasks[1], "green mask is set\n" ); + ok( !bitmasks[2], "blue mask is set\n" ); + ok( dibinfo->bmiHeader.biSizeImage != 0xdeadbeef || + broken(dibinfo->bmiHeader.biSizeImage == 0xdeadbeef), /* win9x */ + "size image not set\n" ); + DeleteObject(hbm); ReleaseDC(NULL, hdc); } @@ -2806,9 +2951,7 @@ static void test_GdiAlphaBlend(void) static void test_clipping(void) { HBITMAP bmpDst; - HBITMAP oldDst; HBITMAP bmpSrc; - HBITMAP oldSrc; HRGN hRgn; LPVOID bits; BOOL result; @@ -2826,11 +2969,11 @@ static void test_clipping(void) bmpDst = CreateDIBSection( hdcDst, &bmpinfo, DIB_RGB_COLORS, &bits, NULL, 0 ); ok(bmpDst != NULL, "Couldn't create destination bitmap\n"); - oldDst = SelectObject( hdcDst, bmpDst ); + SelectObject( hdcDst, bmpDst ); bmpSrc = CreateDIBSection( hdcSrc, &bmpinfo, DIB_RGB_COLORS, &bits, NULL, 0 ); ok(bmpSrc != NULL, "Couldn't create source bitmap\n"); - oldSrc = SelectObject( hdcSrc, bmpSrc ); + SelectObject( hdcSrc, bmpSrc ); result = BitBlt( hdcDst, 0, 0, 100, 100, hdcSrc, 100, 100, SRCCOPY ); ok(result, "BitBlt failed\n"); @@ -2848,6 +2991,54 @@ static void test_clipping(void) DeleteDC( hdcSrc ); } +static void test_32bit_bitmap_blt(void) +{ + BITMAPINFO biDst; + HBITMAP bmpSrc, bmpDst; + HBITMAP oldSrc, oldDst; + HDC hdcSrc, hdcDst, hdcScreen; + UINT32 *dstBuffer; + DWORD colorSrc = 0x11223344; + + memset(&biDst, 0, sizeof(BITMAPINFO)); + biDst.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + biDst.bmiHeader.biWidth = 2; + biDst.bmiHeader.biHeight = -2; + biDst.bmiHeader.biPlanes = 1; + biDst.bmiHeader.biBitCount = 32; + biDst.bmiHeader.biCompression = BI_RGB; + + hdcScreen = CreateCompatibleDC(0); + if(GetDeviceCaps(hdcScreen, BITSPIXEL) != 32) + { + DeleteDC(hdcScreen); + trace("Skipping 32-bit DDB test\n"); + return; + } + + hdcSrc = CreateCompatibleDC(hdcScreen); + bmpSrc = CreateBitmap(1, 1, 1, 32, &colorSrc); + oldSrc = SelectObject(hdcSrc, bmpSrc); + + hdcDst = CreateCompatibleDC(hdcScreen); + bmpDst = CreateDIBSection(hdcDst, &biDst, DIB_RGB_COLORS, (void**)&dstBuffer, NULL, 0); + oldDst = SelectObject(hdcDst, bmpDst); + + StretchBlt(hdcDst, 0, 0, 1, 1, hdcSrc, 0, 0, 1, 1, SRCCOPY); + ok(dstBuffer[0] == colorSrc, "Expected color=%x, received color=%x\n", colorSrc, dstBuffer[0]); + + /* Tidy up */ + SelectObject(hdcDst, oldDst); + DeleteObject(bmpDst); + DeleteDC(hdcDst); + + SelectObject(hdcSrc, oldSrc); + DeleteObject(bmpSrc); + DeleteDC(hdcSrc); + + DeleteDC(hdcScreen); +} + START_TEST(bitmap) { HMODULE hdll; @@ -2874,6 +3065,7 @@ START_TEST(bitmap) test_StretchBlt(); test_StretchDIBits(); test_GdiAlphaBlend(); + test_32bit_bitmap_blt(); test_bitmapinfoheadersize(); test_get16dibits(); test_clipping(); diff --git a/rostests/winetests/gdi32/dc.c b/rostests/winetests/gdi32/dc.c index 193832c5e1f..5d56caa5eb1 100644 --- a/rostests/winetests/gdi32/dc.c +++ b/rostests/winetests/gdi32/dc.c @@ -162,15 +162,35 @@ static void test_savedc(void) ret = RestoreDC(hdc, 3); ok(!ret, "ret = %d\n", ret); - /* Under win98 the following two succeed and both clear the save stack + /* Under Win9x the following RestoreDC call succeeds and clears the save stack. */ + ret = RestoreDC(hdc, -3); + ok(!ret || + broken(ret), /* Win9x */ + "ret = %d\n", ret); + + /* Trying to clear an empty save stack fails. */ ret = RestoreDC(hdc, -3); ok(!ret, "ret = %d\n", ret); + + ret = SaveDC(hdc); + ok(ret == 3 || + broken(ret == 1), /* Win9x */ + "ret = %d\n", ret); + + /* Under Win9x the following RestoreDC call succeeds and clears the save stack. */ + ret = RestoreDC(hdc, 0); + ok(!ret || + broken(ret), /* Win9x */ + "ret = %d\n", ret); + + /* Trying to clear an empty save stack fails. */ ret = RestoreDC(hdc, 0); ok(!ret, "ret = %d\n", ret); - */ ret = RestoreDC(hdc, 1); - ok(ret, "ret = %d\n", ret); + ok(ret || + broken(!ret), /* Win9x */ + "ret = %d\n", ret); DeleteDC(hdc); } @@ -474,6 +494,107 @@ todo_wine ok(ret, "UnregisterClassA failed\n"); } +static void test_boundsrect_invalid(void) +{ + HDC hdc; + RECT rect, expect; + UINT ret; + + hdc = GetDC(NULL); + ok(hdc != NULL, "GetDC failed\n"); + + ret = GetBoundsRect(hdc, NULL, 0); + ok(ret == 0 || + broken(ret == DCB_RESET), /* Win9x */ + "Expected GetBoundsRect to return 0, got %u\n", ret); + + ret = GetBoundsRect(hdc, NULL, ~0U); + ok(ret == 0 || + broken(ret == DCB_RESET), /* Win9x */ + "Expected GetBoundsRect to return 0, got %u\n", ret); + + if (GetBoundsRect(hdc, NULL, 0) == DCB_RESET) + win_skip("Win9x fails catastrophically with first GetBoundsRect call\n"); + else + { + /* Test parameter handling order. */ + SetRect(&rect, 0, 0, 50, 50); + ret = SetBoundsRect(hdc, &rect, DCB_SET); + ok(ret & DCB_RESET, + "Expected return flag DCB_RESET to be set, got %u\n", ret); + + ret = GetBoundsRect(hdc, NULL, DCB_RESET); + ok(ret == 0, + "Expected GetBoundsRect to return 0, got %u\n", ret); + + ret = GetBoundsRect(hdc, &rect, 0); + ok(ret == DCB_RESET, + "Expected GetBoundsRect to return DCB_RESET, got %u\n", ret); + SetRect(&expect, 0, 0, 0, 0); + ok(EqualRect(&rect, &expect), + "Expected output rectangle (0,0)-(0,0), got (%d,%d)-(%d,%d)\n", + rect.left, rect.top, rect.right, rect.bottom); + } + + if (GetBoundsRect(hdc, NULL, 0) == DCB_RESET) + win_skip("Win9x fails catastrophically with NULL device context parameter\n"); + else + { + ret = GetBoundsRect(NULL, NULL, 0); + ok(ret == 0, "Expected GetBoundsRect to return 0, got %u\n", ret); + + ret = GetBoundsRect(NULL, NULL, ~0U); + ok(ret == 0, "Expected GetBoundsRect to return 0, got %u\n", ret); + + ret = SetBoundsRect(NULL, NULL, 0); + ok(ret == 0, "Expected SetBoundsRect to return 0, got %u\n", ret); + + ret = SetBoundsRect(NULL, NULL, ~0U); + ok(ret == 0, "Expected SetBoundsRect to return 0, got %u\n", ret); + } + + DeleteDC(hdc); +} + +static void test_desktop_colorres(void) +{ + HDC hdc = GetDC(NULL); + int bitspixel, colorres; + + bitspixel = GetDeviceCaps(hdc, BITSPIXEL); + ok(bitspixel != 0, "Expected to get valid BITSPIXEL capability value\n"); + + colorres = GetDeviceCaps(hdc, COLORRES); + ok(colorres != 0 || + broken(colorres == 0), /* Win9x */ + "Expected to get valid COLORRES capability value\n"); + + if (colorres) + { + switch (bitspixel) + { + case 8: + ok(colorres == 18, + "Expected COLORRES to be 18, got %d\n", colorres); + break; + case 16: + ok(colorres == 16, + "Expected COLORRES to be 16, got %d\n", colorres); + break; + case 24: + case 32: + ok(colorres == 24, + "Expected COLORRES to be 24, got %d\n", bitspixel); + break; + default: + ok(0, "Got unknown BITSPIXEL %d with COLORRES %d\n", bitspixel, colorres); + break; + } + } + + DeleteDC(hdc); +} + START_TEST(dc) { test_savedc(); @@ -482,4 +603,6 @@ START_TEST(dc) test_CreateCompatibleDC(); test_DC_bitmap(); test_DeleteDC(); + test_boundsrect_invalid(); + test_desktop_colorres(); } diff --git a/rostests/winetests/gdi32/font.c b/rostests/winetests/gdi32/font.c index a5cfe22e910..d89132db441 100644 --- a/rostests/winetests/gdi32/font.c +++ b/rostests/winetests/gdi32/font.c @@ -30,6 +30,9 @@ #include "wine/test.h" +/* Do not allow more than 1 deviation here */ +#define match_off_by_1(a, b) (abs((a) - (b)) <= 1) + #define near_match(a, b) (abs((a) - (b)) <= 6) #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got) @@ -40,6 +43,7 @@ DWORD (WINAPI *pGetFontUnicodeRanges)(HDC hdc, LPGLYPHSET lpgs); DWORD (WINAPI *pGetGlyphIndicesA)(HDC hdc, LPCSTR lpstr, INT count, LPWORD pgi, DWORD flags); DWORD (WINAPI *pGetGlyphIndicesW)(HDC hdc, LPCWSTR lpstr, INT count, LPWORD pgi, DWORD flags); BOOL (WINAPI *pGdiRealizationInfo)(HDC hdc, DWORD *); +HFONT (WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDV *); static HMODULE hgdi32 = 0; @@ -54,6 +58,7 @@ static void init(void) pGetGlyphIndicesA = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesA"); pGetGlyphIndicesW = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesW"); pGdiRealizationInfo = (void *)GetProcAddress(hgdi32, "GdiRealizationInfo"); + pCreateFontIndirectExA = (void *)GetProcAddress(hgdi32, "CreateFontIndirectExA"); } static INT CALLBACK is_truetype_font_installed_proc(const LOGFONT *elf, const TEXTMETRIC *ntm, DWORD type, LPARAM lParam) @@ -308,9 +313,6 @@ static void test_bitmap_font(void) SIZE size_orig; INT ret, i, width_orig, height_orig, scale, lfWidth; - skip("ROS-HACK: Skipping bitmap font tests!\n"); - return; - hdc = GetDC(0); /* "System" has only 1 pixel size defined, otherwise the test breaks */ @@ -1169,9 +1171,9 @@ static void test_GetKerningPairs(void) otm.otmSize = sizeof(otm); /* just in case for Win9x compatibility */ ok(GetOutlineTextMetricsW(hdc, sizeof(otm), &otm) == sizeof(otm), "GetOutlineTextMetricsW error %d\n", GetLastError()); - ok(kd[i].tmHeight == otm.otmTextMetrics.tmHeight, "expected %d, got %d\n", + ok(match_off_by_1(kd[i].tmHeight, otm.otmTextMetrics.tmHeight), "expected %d, got %d\n", kd[i].tmHeight, otm.otmTextMetrics.tmHeight); - ok(kd[i].tmAscent == otm.otmTextMetrics.tmAscent, "expected %d, got %d\n", + ok(match_off_by_1(kd[i].tmAscent, otm.otmTextMetrics.tmAscent), "expected %d, got %d\n", kd[i].tmAscent, otm.otmTextMetrics.tmAscent); ok(kd[i].tmDescent == otm.otmTextMetrics.tmDescent, "expected %d, got %d\n", kd[i].tmDescent, otm.otmTextMetrics.tmDescent); @@ -1186,13 +1188,13 @@ static void test_GetKerningPairs(void) kd[i].otmLineGap, otm.otmLineGap); ok(near_match(kd[i].otmMacDescent, otm.otmMacDescent), "expected %d, got %d\n", kd[i].otmMacDescent, otm.otmMacDescent); + ok(near_match(kd[i].otmMacAscent, otm.otmMacAscent), "expected %d, got %d\n", + kd[i].otmMacAscent, otm.otmMacAscent); todo_wine { ok(kd[i].otmsCapEmHeight == otm.otmsCapEmHeight, "expected %u, got %u\n", kd[i].otmsCapEmHeight, otm.otmsCapEmHeight); ok(kd[i].otmsXHeight == otm.otmsXHeight, "expected %u, got %u\n", kd[i].otmsXHeight, otm.otmsXHeight); - ok(kd[i].otmMacAscent == otm.otmMacAscent, "expected %d, got %d\n", - kd[i].otmMacAscent, otm.otmMacAscent); /* FIXME: this one sometimes succeeds due to expected 0, enable it when removing todo */ if (0) ok(kd[i].otmMacLineGap == otm.otmMacLineGap, "expected %u, got %u\n", kd[i].otmMacLineGap, otm.otmMacLineGap); @@ -1257,6 +1259,74 @@ todo_wine { ReleaseDC(0, hdc); } +static void test_height_selection(void) +{ + static const struct font_data + { + const char face_name[LF_FACESIZE]; + int requested_height; + int weight, height, ascent, descent, int_leading, ext_leading, dpi; + } fd[] = + { + {"Tahoma", -12, FW_NORMAL, 14, 12, 2, 2, 0, 96 }, + {"Tahoma", -24, FW_NORMAL, 29, 24, 5, 5, 0, 96 }, + {"Tahoma", -48, FW_NORMAL, 58, 48, 10, 10, 0, 96 }, + {"Tahoma", -96, FW_NORMAL, 116, 96, 20, 20, 0, 96 }, + {"Tahoma", -192, FW_NORMAL, 232, 192, 40, 40, 0, 96 }, + {"Tahoma", 12, FW_NORMAL, 12, 10, 2, 2, 0, 96 }, + {"Tahoma", 24, FW_NORMAL, 24, 20, 4, 4, 0, 96 }, + {"Tahoma", 48, FW_NORMAL, 48, 40, 8, 8, 0, 96 }, + {"Tahoma", 96, FW_NORMAL, 96, 80, 16, 17, 0, 96 }, + {"Tahoma", 192, FW_NORMAL, 192, 159, 33, 33, 0, 96 } + }; + HDC hdc; + LOGFONT lf; + HFONT hfont, old_hfont; + TEXTMETRIC tm; + INT ret, i; + + hdc = CreateCompatibleDC(0); + assert(hdc); + + for (i = 0; i < sizeof(fd)/sizeof(fd[0]); i++) + { + if (!is_truetype_font_installed(fd[i].face_name)) + { + skip("%s is not installed\n", fd[i].face_name); + continue; + } + + memset(&lf, 0, sizeof(lf)); + lf.lfHeight = fd[i].requested_height; + lf.lfWeight = fd[i].weight; + strcpy(lf.lfFaceName, fd[i].face_name); + + hfont = CreateFontIndirect(&lf); + assert(hfont); + + old_hfont = SelectObject(hdc, hfont); + ret = GetTextMetrics(hdc, &tm); + ok(ret, "GetTextMetrics error %d\n", GetLastError()); + if(fd[i].dpi == tm.tmDigitizedAspectX) + { + trace("found font %s, height %d charset %x dpi %d\n", lf.lfFaceName, lf.lfHeight, lf.lfCharSet, fd[i].dpi); + ok(tm.tmWeight == fd[i].weight, "%s(%d): tm.tmWeight %d != %d\n", fd[i].face_name, fd[i].requested_height, tm.tmWeight, fd[i].weight); + ok(match_off_by_1(tm.tmHeight, fd[i].height), "%s(%d): tm.tmHeight %d != %d\n", fd[i].face_name, fd[i].requested_height, tm.tmHeight, fd[i].height); + ok(match_off_by_1(tm.tmAscent, fd[i].ascent), "%s(%d): tm.tmAscent %d != %d\n", fd[i].face_name, fd[i].requested_height, tm.tmAscent, fd[i].ascent); + ok(match_off_by_1(tm.tmDescent, fd[i].descent), "%s(%d): tm.tmDescent %d != %d\n", fd[i].face_name, fd[i].requested_height, tm.tmDescent, fd[i].descent); +#if 0 /* FIXME: calculation of tmInternalLeading in Wine doesn't match what Windows does */ + ok(tm.tmInternalLeading == fd[i].int_leading, "%s(%d): tm.tmInternalLeading %d != %d\n", fd[i].face_name, fd[i].requested_height, tm.tmInternalLeading, fd[i].int_leading); +#endif + ok(tm.tmExternalLeading == fd[i].ext_leading, "%s(%d): tm.tmExternalLeading %d != %d\n", fd[i].face_name, fd[i].requested_height, tm.tmExternalLeading, fd[i].ext_leading); + } + + SelectObject(hdc, old_hfont); + DeleteObject(hfont); + } + + DeleteDC(hdc); +} + static void test_GetOutlineTextMetrics(void) { OUTLINETEXTMETRIC *otm; @@ -1346,7 +1416,7 @@ static void test_GetOutlineTextMetrics(void) static void testJustification(HDC hdc, PSTR str, RECT *clientArea) { - INT x, y, + INT y, breakCount, justifiedWidth = 0, /* to test GetTextExtentExPointW() */ areaWidth = clientArea->right - clientArea->left, @@ -1402,8 +1472,6 @@ static void testJustification(HDC hdc, PSTR str, RECT *clientArea) } else lastExtent = TRUE; - x = clientArea->left; - /* catch errors and report them */ if (!lastExtent && (justifiedWidth != areaWidth)) { @@ -2970,7 +3038,7 @@ static void test_GetTextMetrics2(const char *fontname, int font_height) DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_LH_ANGLES, DEFAULT_QUALITY, VARIABLE_PITCH, fontname); - ok( hf != NULL, "CreateFontA failed\n"); + ok( hf != NULL, "CreateFontA(%s, %d) failed\n", fontname, font_height); of = SelectObject( hdc, hf); ret = GetTextMetricsA( hdc, &tm); ok(ret, "GetTextMetricsA error %u\n", GetLastError()); @@ -2993,7 +3061,7 @@ static void test_GetTextMetrics2(const char *fontname, int font_height) SelectObject(hdc, of); DeleteObject(hf); - if (tm.tmAveCharWidth == ave_width || width / height > 200) + if (match_off_by_1(tm.tmAveCharWidth, ave_width) || width / height > 200) break; } @@ -3029,7 +3097,9 @@ static void test_CreateFontIndirect(void) lstrcpyA(lf.lfFaceName, TestName[i]); hfont = CreateFontIndirectA(&lf); ok(hfont != 0, "CreateFontIndirectA failed\n"); + SetLastError(0xdeadbeef); ret = GetObject(hfont, sizeof(getobj_lf), &getobj_lf); + ok(ret, "GetObject failed: %d\n", GetLastError()); ok(lf.lfItalic == getobj_lf.lfItalic, "lfItalic: expect %02x got %02x\n", lf.lfItalic, getobj_lf.lfItalic); ok(lf.lfWeight == getobj_lf.lfWeight || broken((SHORT)lf.lfWeight == getobj_lf.lfWeight), /* win9x */ @@ -3041,9 +3111,41 @@ static void test_CreateFontIndirect(void) } } +static void test_CreateFontIndirectEx(void) +{ + ENUMLOGFONTEXDVA lfex; + HFONT hfont; + + if (!pCreateFontIndirectExA) + { + win_skip("CreateFontIndirectExA is not available\n"); + return; + } + + if (!is_truetype_font_installed("Arial")) + { + skip("Arial is not installed\n"); + return; + } + + SetLastError(0xdeadbeef); + hfont = pCreateFontIndirectExA(NULL); + ok(hfont == NULL, "got %p\n", hfont); + ok(GetLastError() == 0xdeadbeef, "got error %d\n", GetLastError()); + + memset(&lfex, 0, sizeof(lfex)); + lstrcpyA(lfex.elfEnumLogfontEx.elfLogFont.lfFaceName, "Arial"); + hfont = pCreateFontIndirectExA(&lfex); + ok(hfont != 0, "CreateFontIndirectEx failed\n"); + if (hfont) + check_font("Arial", &lfex.elfEnumLogfontEx.elfLogFont, hfont); + DeleteObject(hfont); +} + START_TEST(font) { init(); + test_logfont(); test_bitmap_font(); test_outline_font(); @@ -3059,6 +3161,7 @@ START_TEST(font) test_GetFontUnicodeRanges(); test_nonexistent_font(); test_orientation(); + test_height_selection(); /* On Windows Arial has a lot of default charset aliases such as Arial Cyr, * I'd like to avoid them in this test. @@ -3085,5 +3188,6 @@ START_TEST(font) test_GetTextMetrics2("Arial", -55); test_GetTextMetrics2("Arial", -110); test_CreateFontIndirect(); + test_CreateFontIndirectEx(); test_oemcharset(); } diff --git a/rostests/winetests/gdi32/generated.c b/rostests/winetests/gdi32/generated.c index 2bd6376e9e5..497d90084fb 100644 --- a/rostests/winetests/gdi32/generated.c +++ b/rostests/winetests/gdi32/generated.c @@ -51,45 +51,35 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + static void test_pack_ABC(void) { - /* ABC (pack 4) */ + /* ABC */ TEST_TYPE_SIZE (ABC, 12) TEST_TYPE_ALIGN (ABC, 4) TEST_FIELD_SIZE (ABC, abcA, 4) @@ -105,7 +95,7 @@ static void test_pack_ABC(void) static void test_pack_ABCFLOAT(void) { - /* ABCFLOAT (pack 4) */ + /* ABCFLOAT */ TEST_TYPE_SIZE (ABCFLOAT, 12) TEST_TYPE_ALIGN (ABCFLOAT, 4) TEST_FIELD_SIZE (ABCFLOAT, abcfA, 4) @@ -122,15 +112,15 @@ static void test_pack_ABCFLOAT(void) static void test_pack_ABORTPROC(void) { /* ABORTPROC */ - TEST_TYPE_SIZE (ABORTPROC, 4) - TEST_TYPE_ALIGN (ABORTPROC, 4) + TEST_TYPE_SIZE (ABORTPROC, 8) + TEST_TYPE_ALIGN (ABORTPROC, 8) } static void test_pack_BITMAP(void) { - /* BITMAP (pack 4) */ - TEST_TYPE_SIZE (BITMAP, 24) - TEST_TYPE_ALIGN (BITMAP, 4) + /* BITMAP */ + TEST_TYPE_SIZE (BITMAP, 32) + TEST_TYPE_ALIGN (BITMAP, 8) TEST_FIELD_SIZE (BITMAP, bmType, 4) TEST_FIELD_ALIGN (BITMAP, bmType, 4) TEST_FIELD_OFFSET(BITMAP, bmType, 0) @@ -149,14 +139,14 @@ static void test_pack_BITMAP(void) TEST_FIELD_SIZE (BITMAP, bmBitsPixel, 2) TEST_FIELD_ALIGN (BITMAP, bmBitsPixel, 2) TEST_FIELD_OFFSET(BITMAP, bmBitsPixel, 18) - TEST_FIELD_SIZE (BITMAP, bmBits, 4) - TEST_FIELD_ALIGN (BITMAP, bmBits, 4) - TEST_FIELD_OFFSET(BITMAP, bmBits, 20) + TEST_FIELD_SIZE (BITMAP, bmBits, 8) + TEST_FIELD_ALIGN (BITMAP, bmBits, 8) + TEST_FIELD_OFFSET(BITMAP, bmBits, 24) } static void test_pack_BITMAPCOREHEADER(void) { - /* BITMAPCOREHEADER (pack 4) */ + /* BITMAPCOREHEADER */ TEST_TYPE_SIZE (BITMAPCOREHEADER, 12) TEST_TYPE_ALIGN (BITMAPCOREHEADER, 4) TEST_FIELD_SIZE (BITMAPCOREHEADER, bcSize, 4) @@ -178,7 +168,7 @@ static void test_pack_BITMAPCOREHEADER(void) static void test_pack_BITMAPCOREINFO(void) { - /* BITMAPCOREINFO (pack 4) */ + /* BITMAPCOREINFO */ TEST_TYPE_SIZE (BITMAPCOREINFO, 16) TEST_TYPE_ALIGN (BITMAPCOREINFO, 4) TEST_FIELD_SIZE (BITMAPCOREINFO, bmciHeader, 12) @@ -213,7 +203,7 @@ static void test_pack_BITMAPFILEHEADER(void) static void test_pack_BITMAPINFO(void) { - /* BITMAPINFO (pack 4) */ + /* BITMAPINFO */ TEST_TYPE_SIZE (BITMAPINFO, 44) TEST_TYPE_ALIGN (BITMAPINFO, 4) TEST_FIELD_SIZE (BITMAPINFO, bmiHeader, 40) @@ -226,7 +216,7 @@ static void test_pack_BITMAPINFO(void) static void test_pack_BITMAPINFOHEADER(void) { - /* BITMAPINFOHEADER (pack 4) */ + /* BITMAPINFOHEADER */ TEST_TYPE_SIZE (BITMAPINFOHEADER, 40) TEST_TYPE_ALIGN (BITMAPINFOHEADER, 4) TEST_FIELD_SIZE (BITMAPINFOHEADER, biSize, 4) @@ -266,7 +256,7 @@ static void test_pack_BITMAPINFOHEADER(void) static void test_pack_BITMAPV4HEADER(void) { - /* BITMAPV4HEADER (pack 4) */ + /* BITMAPV4HEADER */ TEST_TYPE_SIZE (BITMAPV4HEADER, 108) TEST_TYPE_ALIGN (BITMAPV4HEADER, 4) TEST_FIELD_SIZE (BITMAPV4HEADER, bV4Size, 4) @@ -333,7 +323,7 @@ static void test_pack_BITMAPV4HEADER(void) static void test_pack_BITMAPV5HEADER(void) { - /* BITMAPV5HEADER (pack 4) */ + /* BITMAPV5HEADER */ TEST_TYPE_SIZE (BITMAPV5HEADER, 124) TEST_TYPE_ALIGN (BITMAPV5HEADER, 4) TEST_FIELD_SIZE (BITMAPV5HEADER, bV5Size, 4) @@ -412,7 +402,7 @@ static void test_pack_BITMAPV5HEADER(void) static void test_pack_BLENDFUNCTION(void) { - /* BLENDFUNCTION (pack 4) */ + /* BLENDFUNCTION */ TEST_TYPE_SIZE (BLENDFUNCTION, 4) TEST_TYPE_ALIGN (BLENDFUNCTION, 1) TEST_FIELD_SIZE (BLENDFUNCTION, BlendOp, 1) @@ -431,7 +421,7 @@ static void test_pack_BLENDFUNCTION(void) static void test_pack_CHARSETINFO(void) { - /* CHARSETINFO (pack 4) */ + /* CHARSETINFO */ TEST_TYPE_SIZE (CHARSETINFO, 32) TEST_TYPE_ALIGN (CHARSETINFO, 4) TEST_FIELD_SIZE (CHARSETINFO, ciCharset, 4) @@ -447,7 +437,7 @@ static void test_pack_CHARSETINFO(void) static void test_pack_CIEXYZ(void) { - /* CIEXYZ (pack 4) */ + /* CIEXYZ */ TEST_TYPE_SIZE (CIEXYZ, 12) TEST_TYPE_ALIGN (CIEXYZ, 4) TEST_FIELD_SIZE (CIEXYZ, ciexyzX, 4) @@ -463,7 +453,7 @@ static void test_pack_CIEXYZ(void) static void test_pack_CIEXYZTRIPLE(void) { - /* CIEXYZTRIPLE (pack 4) */ + /* CIEXYZTRIPLE */ TEST_TYPE_SIZE (CIEXYZTRIPLE, 36) TEST_TYPE_ALIGN (CIEXYZTRIPLE, 4) TEST_FIELD_SIZE (CIEXYZTRIPLE, ciexyzRed, 12) @@ -486,7 +476,7 @@ static void test_pack_COLOR16(void) static void test_pack_COLORADJUSTMENT(void) { - /* COLORADJUSTMENT (pack 4) */ + /* COLORADJUSTMENT */ TEST_TYPE_SIZE (COLORADJUSTMENT, 24) TEST_TYPE_ALIGN (COLORADJUSTMENT, 2) TEST_FIELD_SIZE (COLORADJUSTMENT, caSize, 2) @@ -529,7 +519,7 @@ static void test_pack_COLORADJUSTMENT(void) static void test_pack_DEVMODEA(void) { - /* DEVMODEA (pack 4) */ + /* DEVMODEA */ TEST_FIELD_SIZE (DEVMODEA, dmDeviceName, 32) TEST_FIELD_ALIGN (DEVMODEA, dmDeviceName, 1) TEST_FIELD_OFFSET(DEVMODEA, dmDeviceName, 0) @@ -552,7 +542,7 @@ static void test_pack_DEVMODEA(void) static void test_pack_DEVMODEW(void) { - /* DEVMODEW (pack 4) */ + /* DEVMODEW */ TEST_FIELD_SIZE (DEVMODEW, dmDeviceName, 64) TEST_FIELD_ALIGN (DEVMODEW, dmDeviceName, 2) TEST_FIELD_OFFSET(DEVMODEW, dmDeviceName, 0) @@ -575,29 +565,29 @@ static void test_pack_DEVMODEW(void) static void test_pack_DIBSECTION(void) { - /* DIBSECTION (pack 4) */ - TEST_TYPE_SIZE (DIBSECTION, 84) - TEST_TYPE_ALIGN (DIBSECTION, 4) - TEST_FIELD_SIZE (DIBSECTION, dsBm, 24) - TEST_FIELD_ALIGN (DIBSECTION, dsBm, 4) + /* DIBSECTION */ + TEST_TYPE_SIZE (DIBSECTION, 104) + TEST_TYPE_ALIGN (DIBSECTION, 8) + TEST_FIELD_SIZE (DIBSECTION, dsBm, 32) + TEST_FIELD_ALIGN (DIBSECTION, dsBm, 8) TEST_FIELD_OFFSET(DIBSECTION, dsBm, 0) TEST_FIELD_SIZE (DIBSECTION, dsBmih, 40) TEST_FIELD_ALIGN (DIBSECTION, dsBmih, 4) - TEST_FIELD_OFFSET(DIBSECTION, dsBmih, 24) + TEST_FIELD_OFFSET(DIBSECTION, dsBmih, 32) TEST_FIELD_SIZE (DIBSECTION, dsBitfields, 12) TEST_FIELD_ALIGN (DIBSECTION, dsBitfields, 4) - TEST_FIELD_OFFSET(DIBSECTION, dsBitfields, 64) - TEST_FIELD_SIZE (DIBSECTION, dshSection, 4) - TEST_FIELD_ALIGN (DIBSECTION, dshSection, 4) - TEST_FIELD_OFFSET(DIBSECTION, dshSection, 76) + TEST_FIELD_OFFSET(DIBSECTION, dsBitfields, 72) + TEST_FIELD_SIZE (DIBSECTION, dshSection, 8) + TEST_FIELD_ALIGN (DIBSECTION, dshSection, 8) + TEST_FIELD_OFFSET(DIBSECTION, dshSection, 88) TEST_FIELD_SIZE (DIBSECTION, dsOffset, 4) TEST_FIELD_ALIGN (DIBSECTION, dsOffset, 4) - TEST_FIELD_OFFSET(DIBSECTION, dsOffset, 80) + TEST_FIELD_OFFSET(DIBSECTION, dsOffset, 96) } static void test_pack_DISPLAY_DEVICEA(void) { - /* DISPLAY_DEVICEA (pack 4) */ + /* DISPLAY_DEVICEA */ TEST_TYPE_SIZE (DISPLAY_DEVICEA, 424) TEST_TYPE_ALIGN (DISPLAY_DEVICEA, 4) TEST_FIELD_SIZE (DISPLAY_DEVICEA, cb, 4) @@ -622,7 +612,7 @@ static void test_pack_DISPLAY_DEVICEA(void) static void test_pack_DISPLAY_DEVICEW(void) { - /* DISPLAY_DEVICEW (pack 4) */ + /* DISPLAY_DEVICEW */ TEST_TYPE_SIZE (DISPLAY_DEVICEW, 840) TEST_TYPE_ALIGN (DISPLAY_DEVICEW, 4) TEST_FIELD_SIZE (DISPLAY_DEVICEW, cb, 4) @@ -647,51 +637,51 @@ static void test_pack_DISPLAY_DEVICEW(void) static void test_pack_DOCINFOA(void) { - /* DOCINFOA (pack 4) */ - TEST_TYPE_SIZE (DOCINFOA, 20) - TEST_TYPE_ALIGN (DOCINFOA, 4) + /* DOCINFOA */ + TEST_TYPE_SIZE (DOCINFOA, 40) + TEST_TYPE_ALIGN (DOCINFOA, 8) TEST_FIELD_SIZE (DOCINFOA, cbSize, 4) TEST_FIELD_ALIGN (DOCINFOA, cbSize, 4) TEST_FIELD_OFFSET(DOCINFOA, cbSize, 0) - TEST_FIELD_SIZE (DOCINFOA, lpszDocName, 4) - TEST_FIELD_ALIGN (DOCINFOA, lpszDocName, 4) - TEST_FIELD_OFFSET(DOCINFOA, lpszDocName, 4) - TEST_FIELD_SIZE (DOCINFOA, lpszOutput, 4) - TEST_FIELD_ALIGN (DOCINFOA, lpszOutput, 4) - TEST_FIELD_OFFSET(DOCINFOA, lpszOutput, 8) - TEST_FIELD_SIZE (DOCINFOA, lpszDatatype, 4) - TEST_FIELD_ALIGN (DOCINFOA, lpszDatatype, 4) - TEST_FIELD_OFFSET(DOCINFOA, lpszDatatype, 12) + TEST_FIELD_SIZE (DOCINFOA, lpszDocName, 8) + TEST_FIELD_ALIGN (DOCINFOA, lpszDocName, 8) + TEST_FIELD_OFFSET(DOCINFOA, lpszDocName, 8) + TEST_FIELD_SIZE (DOCINFOA, lpszOutput, 8) + TEST_FIELD_ALIGN (DOCINFOA, lpszOutput, 8) + TEST_FIELD_OFFSET(DOCINFOA, lpszOutput, 16) + TEST_FIELD_SIZE (DOCINFOA, lpszDatatype, 8) + TEST_FIELD_ALIGN (DOCINFOA, lpszDatatype, 8) + TEST_FIELD_OFFSET(DOCINFOA, lpszDatatype, 24) TEST_FIELD_SIZE (DOCINFOA, fwType, 4) TEST_FIELD_ALIGN (DOCINFOA, fwType, 4) - TEST_FIELD_OFFSET(DOCINFOA, fwType, 16) + TEST_FIELD_OFFSET(DOCINFOA, fwType, 32) } static void test_pack_DOCINFOW(void) { - /* DOCINFOW (pack 4) */ - TEST_TYPE_SIZE (DOCINFOW, 20) - TEST_TYPE_ALIGN (DOCINFOW, 4) + /* DOCINFOW */ + TEST_TYPE_SIZE (DOCINFOW, 40) + TEST_TYPE_ALIGN (DOCINFOW, 8) TEST_FIELD_SIZE (DOCINFOW, cbSize, 4) TEST_FIELD_ALIGN (DOCINFOW, cbSize, 4) TEST_FIELD_OFFSET(DOCINFOW, cbSize, 0) - TEST_FIELD_SIZE (DOCINFOW, lpszDocName, 4) - TEST_FIELD_ALIGN (DOCINFOW, lpszDocName, 4) - TEST_FIELD_OFFSET(DOCINFOW, lpszDocName, 4) - TEST_FIELD_SIZE (DOCINFOW, lpszOutput, 4) - TEST_FIELD_ALIGN (DOCINFOW, lpszOutput, 4) - TEST_FIELD_OFFSET(DOCINFOW, lpszOutput, 8) - TEST_FIELD_SIZE (DOCINFOW, lpszDatatype, 4) - TEST_FIELD_ALIGN (DOCINFOW, lpszDatatype, 4) - TEST_FIELD_OFFSET(DOCINFOW, lpszDatatype, 12) + TEST_FIELD_SIZE (DOCINFOW, lpszDocName, 8) + TEST_FIELD_ALIGN (DOCINFOW, lpszDocName, 8) + TEST_FIELD_OFFSET(DOCINFOW, lpszDocName, 8) + TEST_FIELD_SIZE (DOCINFOW, lpszOutput, 8) + TEST_FIELD_ALIGN (DOCINFOW, lpszOutput, 8) + TEST_FIELD_OFFSET(DOCINFOW, lpszOutput, 16) + TEST_FIELD_SIZE (DOCINFOW, lpszDatatype, 8) + TEST_FIELD_ALIGN (DOCINFOW, lpszDatatype, 8) + TEST_FIELD_OFFSET(DOCINFOW, lpszDatatype, 24) TEST_FIELD_SIZE (DOCINFOW, fwType, 4) TEST_FIELD_ALIGN (DOCINFOW, fwType, 4) - TEST_FIELD_OFFSET(DOCINFOW, fwType, 16) + TEST_FIELD_OFFSET(DOCINFOW, fwType, 32) } static void test_pack_EMR(void) { - /* EMR (pack 4) */ + /* EMR */ TEST_TYPE_SIZE (EMR, 8) TEST_TYPE_ALIGN (EMR, 4) TEST_FIELD_SIZE (EMR, iType, 4) @@ -704,7 +694,7 @@ static void test_pack_EMR(void) static void test_pack_EMRABORTPATH(void) { - /* EMRABORTPATH (pack 4) */ + /* EMRABORTPATH */ TEST_TYPE_SIZE (EMRABORTPATH, 8) TEST_TYPE_ALIGN (EMRABORTPATH, 4) TEST_FIELD_SIZE (EMRABORTPATH, emr, 8) @@ -714,7 +704,7 @@ static void test_pack_EMRABORTPATH(void) static void test_pack_EMRANGLEARC(void) { - /* EMRANGLEARC (pack 4) */ + /* EMRANGLEARC */ TEST_TYPE_SIZE (EMRANGLEARC, 28) TEST_TYPE_ALIGN (EMRANGLEARC, 4) TEST_FIELD_SIZE (EMRANGLEARC, emr, 8) @@ -736,7 +726,7 @@ static void test_pack_EMRANGLEARC(void) static void test_pack_EMRARC(void) { - /* EMRARC (pack 4) */ + /* EMRARC */ TEST_TYPE_SIZE (EMRARC, 40) TEST_TYPE_ALIGN (EMRARC, 4) TEST_FIELD_SIZE (EMRARC, emr, 8) @@ -755,7 +745,7 @@ static void test_pack_EMRARC(void) static void test_pack_EMRARCTO(void) { - /* EMRARCTO (pack 4) */ + /* EMRARCTO */ TEST_TYPE_SIZE (EMRARCTO, 40) TEST_TYPE_ALIGN (EMRARCTO, 4) TEST_FIELD_SIZE (EMRARCTO, emr, 8) @@ -774,7 +764,7 @@ static void test_pack_EMRARCTO(void) static void test_pack_EMRBEGINPATH(void) { - /* EMRBEGINPATH (pack 4) */ + /* EMRBEGINPATH */ TEST_TYPE_SIZE (EMRBEGINPATH, 8) TEST_TYPE_ALIGN (EMRBEGINPATH, 4) TEST_FIELD_SIZE (EMRBEGINPATH, emr, 8) @@ -784,7 +774,7 @@ static void test_pack_EMRBEGINPATH(void) static void test_pack_EMRBITBLT(void) { - /* EMRBITBLT (pack 4) */ + /* EMRBITBLT */ TEST_TYPE_SIZE (EMRBITBLT, 100) TEST_TYPE_ALIGN (EMRBITBLT, 4) TEST_FIELD_SIZE (EMRBITBLT, emr, 8) @@ -839,7 +829,7 @@ static void test_pack_EMRBITBLT(void) static void test_pack_EMRCHORD(void) { - /* EMRCHORD (pack 4) */ + /* EMRCHORD */ TEST_TYPE_SIZE (EMRCHORD, 40) TEST_TYPE_ALIGN (EMRCHORD, 4) TEST_FIELD_SIZE (EMRCHORD, emr, 8) @@ -858,7 +848,7 @@ static void test_pack_EMRCHORD(void) static void test_pack_EMRCLOSEFIGURE(void) { - /* EMRCLOSEFIGURE (pack 4) */ + /* EMRCLOSEFIGURE */ TEST_TYPE_SIZE (EMRCLOSEFIGURE, 8) TEST_TYPE_ALIGN (EMRCLOSEFIGURE, 4) TEST_FIELD_SIZE (EMRCLOSEFIGURE, emr, 8) @@ -868,7 +858,7 @@ static void test_pack_EMRCLOSEFIGURE(void) static void test_pack_EMRCREATEBRUSHINDIRECT(void) { - /* EMRCREATEBRUSHINDIRECT (pack 4) */ + /* EMRCREATEBRUSHINDIRECT */ TEST_TYPE_SIZE (EMRCREATEBRUSHINDIRECT, 24) TEST_TYPE_ALIGN (EMRCREATEBRUSHINDIRECT, 4) TEST_FIELD_SIZE (EMRCREATEBRUSHINDIRECT, emr, 8) @@ -884,7 +874,7 @@ static void test_pack_EMRCREATEBRUSHINDIRECT(void) static void test_pack_EMRCREATECOLORSPACE(void) { - /* EMRCREATECOLORSPACE (pack 4) */ + /* EMRCREATECOLORSPACE */ TEST_TYPE_SIZE (EMRCREATECOLORSPACE, 340) TEST_TYPE_ALIGN (EMRCREATECOLORSPACE, 4) TEST_FIELD_SIZE (EMRCREATECOLORSPACE, emr, 8) @@ -900,7 +890,7 @@ static void test_pack_EMRCREATECOLORSPACE(void) static void test_pack_EMRCREATECOLORSPACEW(void) { - /* EMRCREATECOLORSPACEW (pack 4) */ + /* EMRCREATECOLORSPACEW */ TEST_TYPE_SIZE (EMRCREATECOLORSPACEW, 612) TEST_TYPE_ALIGN (EMRCREATECOLORSPACEW, 4) TEST_FIELD_SIZE (EMRCREATECOLORSPACEW, emr, 8) @@ -925,7 +915,7 @@ static void test_pack_EMRCREATECOLORSPACEW(void) static void test_pack_EMRCREATEDIBPATTERNBRUSHPT(void) { - /* EMRCREATEDIBPATTERNBRUSHPT (pack 4) */ + /* EMRCREATEDIBPATTERNBRUSHPT */ TEST_TYPE_SIZE (EMRCREATEDIBPATTERNBRUSHPT, 32) TEST_TYPE_ALIGN (EMRCREATEDIBPATTERNBRUSHPT, 4) TEST_FIELD_SIZE (EMRCREATEDIBPATTERNBRUSHPT, emr, 8) @@ -953,7 +943,7 @@ static void test_pack_EMRCREATEDIBPATTERNBRUSHPT(void) static void test_pack_EMRCREATEMONOBRUSH(void) { - /* EMRCREATEMONOBRUSH (pack 4) */ + /* EMRCREATEMONOBRUSH */ TEST_TYPE_SIZE (EMRCREATEMONOBRUSH, 32) TEST_TYPE_ALIGN (EMRCREATEMONOBRUSH, 4) TEST_FIELD_SIZE (EMRCREATEMONOBRUSH, emr, 8) @@ -981,7 +971,7 @@ static void test_pack_EMRCREATEMONOBRUSH(void) static void test_pack_EMRCREATEPEN(void) { - /* EMRCREATEPEN (pack 4) */ + /* EMRCREATEPEN */ TEST_TYPE_SIZE (EMRCREATEPEN, 28) TEST_TYPE_ALIGN (EMRCREATEPEN, 4) TEST_FIELD_SIZE (EMRCREATEPEN, emr, 8) @@ -997,7 +987,7 @@ static void test_pack_EMRCREATEPEN(void) static void test_pack_EMRDELETECOLORSPACE(void) { - /* EMRDELETECOLORSPACE (pack 4) */ + /* EMRDELETECOLORSPACE */ TEST_TYPE_SIZE (EMRDELETECOLORSPACE, 12) TEST_TYPE_ALIGN (EMRDELETECOLORSPACE, 4) TEST_FIELD_SIZE (EMRDELETECOLORSPACE, emr, 8) @@ -1010,7 +1000,7 @@ static void test_pack_EMRDELETECOLORSPACE(void) static void test_pack_EMRDELETEOBJECT(void) { - /* EMRDELETEOBJECT (pack 4) */ + /* EMRDELETEOBJECT */ TEST_TYPE_SIZE (EMRDELETEOBJECT, 12) TEST_TYPE_ALIGN (EMRDELETEOBJECT, 4) TEST_FIELD_SIZE (EMRDELETEOBJECT, emr, 8) @@ -1023,7 +1013,7 @@ static void test_pack_EMRDELETEOBJECT(void) static void test_pack_EMRELLIPSE(void) { - /* EMRELLIPSE (pack 4) */ + /* EMRELLIPSE */ TEST_TYPE_SIZE (EMRELLIPSE, 24) TEST_TYPE_ALIGN (EMRELLIPSE, 4) TEST_FIELD_SIZE (EMRELLIPSE, emr, 8) @@ -1036,7 +1026,7 @@ static void test_pack_EMRELLIPSE(void) static void test_pack_EMRENDPATH(void) { - /* EMRENDPATH (pack 4) */ + /* EMRENDPATH */ TEST_TYPE_SIZE (EMRENDPATH, 8) TEST_TYPE_ALIGN (EMRENDPATH, 4) TEST_FIELD_SIZE (EMRENDPATH, emr, 8) @@ -1046,7 +1036,7 @@ static void test_pack_EMRENDPATH(void) static void test_pack_EMREOF(void) { - /* EMREOF (pack 4) */ + /* EMREOF */ TEST_TYPE_SIZE (EMREOF, 20) TEST_TYPE_ALIGN (EMREOF, 4) TEST_FIELD_SIZE (EMREOF, emr, 8) @@ -1065,7 +1055,7 @@ static void test_pack_EMREOF(void) static void test_pack_EMREXCLUDECLIPRECT(void) { - /* EMREXCLUDECLIPRECT (pack 4) */ + /* EMREXCLUDECLIPRECT */ TEST_TYPE_SIZE (EMREXCLUDECLIPRECT, 24) TEST_TYPE_ALIGN (EMREXCLUDECLIPRECT, 4) TEST_FIELD_SIZE (EMREXCLUDECLIPRECT, emr, 8) @@ -1078,7 +1068,7 @@ static void test_pack_EMREXCLUDECLIPRECT(void) static void test_pack_EMREXTCREATEFONTINDIRECTW(void) { - /* EMREXTCREATEFONTINDIRECTW (pack 4) */ + /* EMREXTCREATEFONTINDIRECTW */ TEST_TYPE_SIZE (EMREXTCREATEFONTINDIRECTW, 332) TEST_TYPE_ALIGN (EMREXTCREATEFONTINDIRECTW, 4) TEST_FIELD_SIZE (EMREXTCREATEFONTINDIRECTW, emr, 8) @@ -1094,9 +1084,9 @@ static void test_pack_EMREXTCREATEFONTINDIRECTW(void) static void test_pack_EMREXTCREATEPEN(void) { - /* EMREXTCREATEPEN (pack 4) */ - TEST_TYPE_SIZE (EMREXTCREATEPEN, 56) - TEST_TYPE_ALIGN (EMREXTCREATEPEN, 4) + /* EMREXTCREATEPEN */ + TEST_TYPE_SIZE (EMREXTCREATEPEN, 64) + TEST_TYPE_ALIGN (EMREXTCREATEPEN, 8) TEST_FIELD_SIZE (EMREXTCREATEPEN, emr, 8) TEST_FIELD_ALIGN (EMREXTCREATEPEN, emr, 4) TEST_FIELD_OFFSET(EMREXTCREATEPEN, emr, 0) @@ -1115,14 +1105,14 @@ static void test_pack_EMREXTCREATEPEN(void) TEST_FIELD_SIZE (EMREXTCREATEPEN, cbBits, 4) TEST_FIELD_ALIGN (EMREXTCREATEPEN, cbBits, 4) TEST_FIELD_OFFSET(EMREXTCREATEPEN, cbBits, 24) - TEST_FIELD_SIZE (EMREXTCREATEPEN, elp, 28) - TEST_FIELD_ALIGN (EMREXTCREATEPEN, elp, 4) - TEST_FIELD_OFFSET(EMREXTCREATEPEN, elp, 28) + TEST_FIELD_SIZE (EMREXTCREATEPEN, elp, 32) + TEST_FIELD_ALIGN (EMREXTCREATEPEN, elp, 8) + TEST_FIELD_OFFSET(EMREXTCREATEPEN, elp, 32) } static void test_pack_EMREXTFLOODFILL(void) { - /* EMREXTFLOODFILL (pack 4) */ + /* EMREXTFLOODFILL */ TEST_TYPE_SIZE (EMREXTFLOODFILL, 24) TEST_TYPE_ALIGN (EMREXTFLOODFILL, 4) TEST_FIELD_SIZE (EMREXTFLOODFILL, emr, 8) @@ -1141,7 +1131,7 @@ static void test_pack_EMREXTFLOODFILL(void) static void test_pack_EMREXTSELECTCLIPRGN(void) { - /* EMREXTSELECTCLIPRGN (pack 4) */ + /* EMREXTSELECTCLIPRGN */ TEST_TYPE_SIZE (EMREXTSELECTCLIPRGN, 20) TEST_TYPE_ALIGN (EMREXTSELECTCLIPRGN, 4) TEST_FIELD_SIZE (EMREXTSELECTCLIPRGN, emr, 8) @@ -1160,7 +1150,7 @@ static void test_pack_EMREXTSELECTCLIPRGN(void) static void test_pack_EMREXTTEXTOUTA(void) { - /* EMREXTTEXTOUTA (pack 4) */ + /* EMREXTTEXTOUTA */ TEST_TYPE_SIZE (EMREXTTEXTOUTA, 76) TEST_TYPE_ALIGN (EMREXTTEXTOUTA, 4) TEST_FIELD_SIZE (EMREXTTEXTOUTA, emr, 8) @@ -1185,7 +1175,7 @@ static void test_pack_EMREXTTEXTOUTA(void) static void test_pack_EMREXTTEXTOUTW(void) { - /* EMREXTTEXTOUTW (pack 4) */ + /* EMREXTTEXTOUTW */ TEST_TYPE_SIZE (EMREXTTEXTOUTW, 76) TEST_TYPE_ALIGN (EMREXTTEXTOUTW, 4) TEST_FIELD_SIZE (EMREXTTEXTOUTW, emr, 8) @@ -1210,7 +1200,7 @@ static void test_pack_EMREXTTEXTOUTW(void) static void test_pack_EMRFILLPATH(void) { - /* EMRFILLPATH (pack 4) */ + /* EMRFILLPATH */ TEST_TYPE_SIZE (EMRFILLPATH, 24) TEST_TYPE_ALIGN (EMRFILLPATH, 4) TEST_FIELD_SIZE (EMRFILLPATH, emr, 8) @@ -1223,7 +1213,7 @@ static void test_pack_EMRFILLPATH(void) static void test_pack_EMRFILLRGN(void) { - /* EMRFILLRGN (pack 4) */ + /* EMRFILLRGN */ TEST_TYPE_SIZE (EMRFILLRGN, 36) TEST_TYPE_ALIGN (EMRFILLRGN, 4) TEST_FIELD_SIZE (EMRFILLRGN, emr, 8) @@ -1245,7 +1235,7 @@ static void test_pack_EMRFILLRGN(void) static void test_pack_EMRFLATTENPATH(void) { - /* EMRFLATTENPATH (pack 4) */ + /* EMRFLATTENPATH */ TEST_TYPE_SIZE (EMRFLATTENPATH, 8) TEST_TYPE_ALIGN (EMRFLATTENPATH, 4) TEST_FIELD_SIZE (EMRFLATTENPATH, emr, 8) @@ -1255,7 +1245,7 @@ static void test_pack_EMRFLATTENPATH(void) static void test_pack_EMRFORMAT(void) { - /* EMRFORMAT (pack 4) */ + /* EMRFORMAT */ TEST_TYPE_SIZE (EMRFORMAT, 16) TEST_TYPE_ALIGN (EMRFORMAT, 4) TEST_FIELD_SIZE (EMRFORMAT, dSignature, 4) @@ -1274,7 +1264,7 @@ static void test_pack_EMRFORMAT(void) static void test_pack_EMRFRAMERGN(void) { - /* EMRFRAMERGN (pack 4) */ + /* EMRFRAMERGN */ TEST_TYPE_SIZE (EMRFRAMERGN, 44) TEST_TYPE_ALIGN (EMRFRAMERGN, 4) TEST_FIELD_SIZE (EMRFRAMERGN, emr, 8) @@ -1299,7 +1289,7 @@ static void test_pack_EMRFRAMERGN(void) static void test_pack_EMRGDICOMMENT(void) { - /* EMRGDICOMMENT (pack 4) */ + /* EMRGDICOMMENT */ TEST_TYPE_SIZE (EMRGDICOMMENT, 16) TEST_TYPE_ALIGN (EMRGDICOMMENT, 4) TEST_FIELD_SIZE (EMRGDICOMMENT, emr, 8) @@ -1315,7 +1305,7 @@ static void test_pack_EMRGDICOMMENT(void) static void test_pack_EMRGLSBOUNDEDRECORD(void) { - /* EMRGLSBOUNDEDRECORD (pack 4) */ + /* EMRGLSBOUNDEDRECORD */ TEST_TYPE_SIZE (EMRGLSBOUNDEDRECORD, 32) TEST_TYPE_ALIGN (EMRGLSBOUNDEDRECORD, 4) TEST_FIELD_SIZE (EMRGLSBOUNDEDRECORD, emr, 8) @@ -1334,7 +1324,7 @@ static void test_pack_EMRGLSBOUNDEDRECORD(void) static void test_pack_EMRGLSRECORD(void) { - /* EMRGLSRECORD (pack 4) */ + /* EMRGLSRECORD */ TEST_TYPE_SIZE (EMRGLSRECORD, 16) TEST_TYPE_ALIGN (EMRGLSRECORD, 4) TEST_FIELD_SIZE (EMRGLSRECORD, emr, 8) @@ -1350,7 +1340,7 @@ static void test_pack_EMRGLSRECORD(void) static void test_pack_EMRINTERSECTCLIPRECT(void) { - /* EMRINTERSECTCLIPRECT (pack 4) */ + /* EMRINTERSECTCLIPRECT */ TEST_TYPE_SIZE (EMRINTERSECTCLIPRECT, 24) TEST_TYPE_ALIGN (EMRINTERSECTCLIPRECT, 4) TEST_FIELD_SIZE (EMRINTERSECTCLIPRECT, emr, 8) @@ -1363,7 +1353,7 @@ static void test_pack_EMRINTERSECTCLIPRECT(void) static void test_pack_EMRINVERTRGN(void) { - /* EMRINVERTRGN (pack 4) */ + /* EMRINVERTRGN */ TEST_TYPE_SIZE (EMRINVERTRGN, 32) TEST_TYPE_ALIGN (EMRINVERTRGN, 4) TEST_FIELD_SIZE (EMRINVERTRGN, emr, 8) @@ -1382,7 +1372,7 @@ static void test_pack_EMRINVERTRGN(void) static void test_pack_EMRLINETO(void) { - /* EMRLINETO (pack 4) */ + /* EMRLINETO */ TEST_TYPE_SIZE (EMRLINETO, 16) TEST_TYPE_ALIGN (EMRLINETO, 4) TEST_FIELD_SIZE (EMRLINETO, emr, 8) @@ -1395,7 +1385,7 @@ static void test_pack_EMRLINETO(void) static void test_pack_EMRMASKBLT(void) { - /* EMRMASKBLT (pack 4) */ + /* EMRMASKBLT */ TEST_TYPE_SIZE (EMRMASKBLT, 128) TEST_TYPE_ALIGN (EMRMASKBLT, 4) TEST_FIELD_SIZE (EMRMASKBLT, emr, 8) @@ -1471,7 +1461,7 @@ static void test_pack_EMRMASKBLT(void) static void test_pack_EMRMODIFYWORLDTRANSFORM(void) { - /* EMRMODIFYWORLDTRANSFORM (pack 4) */ + /* EMRMODIFYWORLDTRANSFORM */ TEST_TYPE_SIZE (EMRMODIFYWORLDTRANSFORM, 36) TEST_TYPE_ALIGN (EMRMODIFYWORLDTRANSFORM, 4) TEST_FIELD_SIZE (EMRMODIFYWORLDTRANSFORM, emr, 8) @@ -1487,7 +1477,7 @@ static void test_pack_EMRMODIFYWORLDTRANSFORM(void) static void test_pack_EMRMOVETOEX(void) { - /* EMRMOVETOEX (pack 4) */ + /* EMRMOVETOEX */ TEST_TYPE_SIZE (EMRMOVETOEX, 16) TEST_TYPE_ALIGN (EMRMOVETOEX, 4) TEST_FIELD_SIZE (EMRMOVETOEX, emr, 8) @@ -1500,7 +1490,7 @@ static void test_pack_EMRMOVETOEX(void) static void test_pack_EMROFFSETCLIPRGN(void) { - /* EMROFFSETCLIPRGN (pack 4) */ + /* EMROFFSETCLIPRGN */ TEST_TYPE_SIZE (EMROFFSETCLIPRGN, 16) TEST_TYPE_ALIGN (EMROFFSETCLIPRGN, 4) TEST_FIELD_SIZE (EMROFFSETCLIPRGN, emr, 8) @@ -1513,7 +1503,7 @@ static void test_pack_EMROFFSETCLIPRGN(void) static void test_pack_EMRPAINTRGN(void) { - /* EMRPAINTRGN (pack 4) */ + /* EMRPAINTRGN */ TEST_TYPE_SIZE (EMRPAINTRGN, 32) TEST_TYPE_ALIGN (EMRPAINTRGN, 4) TEST_FIELD_SIZE (EMRPAINTRGN, emr, 8) @@ -1532,7 +1522,7 @@ static void test_pack_EMRPAINTRGN(void) static void test_pack_EMRPIE(void) { - /* EMRPIE (pack 4) */ + /* EMRPIE */ TEST_TYPE_SIZE (EMRPIE, 40) TEST_TYPE_ALIGN (EMRPIE, 4) TEST_FIELD_SIZE (EMRPIE, emr, 8) @@ -1551,7 +1541,7 @@ static void test_pack_EMRPIE(void) static void test_pack_EMRPIXELFORMAT(void) { - /* EMRPIXELFORMAT (pack 4) */ + /* EMRPIXELFORMAT */ TEST_TYPE_SIZE (EMRPIXELFORMAT, 48) TEST_TYPE_ALIGN (EMRPIXELFORMAT, 4) TEST_FIELD_SIZE (EMRPIXELFORMAT, emr, 8) @@ -1564,7 +1554,7 @@ static void test_pack_EMRPIXELFORMAT(void) static void test_pack_EMRPLGBLT(void) { - /* EMRPLGBLT (pack 4) */ + /* EMRPLGBLT */ TEST_TYPE_SIZE (EMRPLGBLT, 140) TEST_TYPE_ALIGN (EMRPLGBLT, 4) TEST_FIELD_SIZE (EMRPLGBLT, emr, 8) @@ -1634,7 +1624,7 @@ static void test_pack_EMRPLGBLT(void) static void test_pack_EMRPOLYBEZIER(void) { - /* EMRPOLYBEZIER (pack 4) */ + /* EMRPOLYBEZIER */ TEST_TYPE_SIZE (EMRPOLYBEZIER, 36) TEST_TYPE_ALIGN (EMRPOLYBEZIER, 4) TEST_FIELD_SIZE (EMRPOLYBEZIER, emr, 8) @@ -1653,7 +1643,7 @@ static void test_pack_EMRPOLYBEZIER(void) static void test_pack_EMRPOLYBEZIER16(void) { - /* EMRPOLYBEZIER16 (pack 4) */ + /* EMRPOLYBEZIER16 */ TEST_TYPE_SIZE (EMRPOLYBEZIER16, 32) TEST_TYPE_ALIGN (EMRPOLYBEZIER16, 4) TEST_FIELD_SIZE (EMRPOLYBEZIER16, emr, 8) @@ -1672,7 +1662,7 @@ static void test_pack_EMRPOLYBEZIER16(void) static void test_pack_EMRPOLYBEZIERTO(void) { - /* EMRPOLYBEZIERTO (pack 4) */ + /* EMRPOLYBEZIERTO */ TEST_TYPE_SIZE (EMRPOLYBEZIERTO, 36) TEST_TYPE_ALIGN (EMRPOLYBEZIERTO, 4) TEST_FIELD_SIZE (EMRPOLYBEZIERTO, emr, 8) @@ -1691,7 +1681,7 @@ static void test_pack_EMRPOLYBEZIERTO(void) static void test_pack_EMRPOLYBEZIERTO16(void) { - /* EMRPOLYBEZIERTO16 (pack 4) */ + /* EMRPOLYBEZIERTO16 */ TEST_TYPE_SIZE (EMRPOLYBEZIERTO16, 32) TEST_TYPE_ALIGN (EMRPOLYBEZIERTO16, 4) TEST_FIELD_SIZE (EMRPOLYBEZIERTO16, emr, 8) @@ -1710,7 +1700,7 @@ static void test_pack_EMRPOLYBEZIERTO16(void) static void test_pack_EMRPOLYDRAW(void) { - /* EMRPOLYDRAW (pack 4) */ + /* EMRPOLYDRAW */ TEST_TYPE_SIZE (EMRPOLYDRAW, 40) TEST_TYPE_ALIGN (EMRPOLYDRAW, 4) TEST_FIELD_SIZE (EMRPOLYDRAW, emr, 8) @@ -1732,7 +1722,7 @@ static void test_pack_EMRPOLYDRAW(void) static void test_pack_EMRPOLYDRAW16(void) { - /* EMRPOLYDRAW16 (pack 4) */ + /* EMRPOLYDRAW16 */ TEST_TYPE_SIZE (EMRPOLYDRAW16, 36) TEST_TYPE_ALIGN (EMRPOLYDRAW16, 4) TEST_FIELD_SIZE (EMRPOLYDRAW16, emr, 8) @@ -1754,7 +1744,7 @@ static void test_pack_EMRPOLYDRAW16(void) static void test_pack_EMRPOLYGON(void) { - /* EMRPOLYGON (pack 4) */ + /* EMRPOLYGON */ TEST_TYPE_SIZE (EMRPOLYGON, 36) TEST_TYPE_ALIGN (EMRPOLYGON, 4) TEST_FIELD_SIZE (EMRPOLYGON, emr, 8) @@ -1773,7 +1763,7 @@ static void test_pack_EMRPOLYGON(void) static void test_pack_EMRPOLYGON16(void) { - /* EMRPOLYGON16 (pack 4) */ + /* EMRPOLYGON16 */ TEST_TYPE_SIZE (EMRPOLYGON16, 32) TEST_TYPE_ALIGN (EMRPOLYGON16, 4) TEST_FIELD_SIZE (EMRPOLYGON16, emr, 8) @@ -1792,7 +1782,7 @@ static void test_pack_EMRPOLYGON16(void) static void test_pack_EMRPOLYLINE(void) { - /* EMRPOLYLINE (pack 4) */ + /* EMRPOLYLINE */ TEST_TYPE_SIZE (EMRPOLYLINE, 36) TEST_TYPE_ALIGN (EMRPOLYLINE, 4) TEST_FIELD_SIZE (EMRPOLYLINE, emr, 8) @@ -1811,7 +1801,7 @@ static void test_pack_EMRPOLYLINE(void) static void test_pack_EMRPOLYLINE16(void) { - /* EMRPOLYLINE16 (pack 4) */ + /* EMRPOLYLINE16 */ TEST_TYPE_SIZE (EMRPOLYLINE16, 32) TEST_TYPE_ALIGN (EMRPOLYLINE16, 4) TEST_FIELD_SIZE (EMRPOLYLINE16, emr, 8) @@ -1830,7 +1820,7 @@ static void test_pack_EMRPOLYLINE16(void) static void test_pack_EMRPOLYLINETO(void) { - /* EMRPOLYLINETO (pack 4) */ + /* EMRPOLYLINETO */ TEST_TYPE_SIZE (EMRPOLYLINETO, 36) TEST_TYPE_ALIGN (EMRPOLYLINETO, 4) TEST_FIELD_SIZE (EMRPOLYLINETO, emr, 8) @@ -1849,7 +1839,7 @@ static void test_pack_EMRPOLYLINETO(void) static void test_pack_EMRPOLYLINETO16(void) { - /* EMRPOLYLINETO16 (pack 4) */ + /* EMRPOLYLINETO16 */ TEST_TYPE_SIZE (EMRPOLYLINETO16, 32) TEST_TYPE_ALIGN (EMRPOLYLINETO16, 4) TEST_FIELD_SIZE (EMRPOLYLINETO16, emr, 8) @@ -1868,7 +1858,7 @@ static void test_pack_EMRPOLYLINETO16(void) static void test_pack_EMRPOLYPOLYGON(void) { - /* EMRPOLYPOLYGON (pack 4) */ + /* EMRPOLYPOLYGON */ TEST_TYPE_SIZE (EMRPOLYPOLYGON, 44) TEST_TYPE_ALIGN (EMRPOLYPOLYGON, 4) TEST_FIELD_SIZE (EMRPOLYPOLYGON, emr, 8) @@ -1893,7 +1883,7 @@ static void test_pack_EMRPOLYPOLYGON(void) static void test_pack_EMRPOLYPOLYGON16(void) { - /* EMRPOLYPOLYGON16 (pack 4) */ + /* EMRPOLYPOLYGON16 */ TEST_TYPE_SIZE (EMRPOLYPOLYGON16, 40) TEST_TYPE_ALIGN (EMRPOLYPOLYGON16, 4) TEST_FIELD_SIZE (EMRPOLYPOLYGON16, emr, 8) @@ -1918,7 +1908,7 @@ static void test_pack_EMRPOLYPOLYGON16(void) static void test_pack_EMRPOLYPOLYLINE(void) { - /* EMRPOLYPOLYLINE (pack 4) */ + /* EMRPOLYPOLYLINE */ TEST_TYPE_SIZE (EMRPOLYPOLYLINE, 44) TEST_TYPE_ALIGN (EMRPOLYPOLYLINE, 4) TEST_FIELD_SIZE (EMRPOLYPOLYLINE, emr, 8) @@ -1943,7 +1933,7 @@ static void test_pack_EMRPOLYPOLYLINE(void) static void test_pack_EMRPOLYPOLYLINE16(void) { - /* EMRPOLYPOLYLINE16 (pack 4) */ + /* EMRPOLYPOLYLINE16 */ TEST_TYPE_SIZE (EMRPOLYPOLYLINE16, 40) TEST_TYPE_ALIGN (EMRPOLYPOLYLINE16, 4) TEST_FIELD_SIZE (EMRPOLYPOLYLINE16, emr, 8) @@ -1968,7 +1958,7 @@ static void test_pack_EMRPOLYPOLYLINE16(void) static void test_pack_EMRPOLYTEXTOUTA(void) { - /* EMRPOLYTEXTOUTA (pack 4) */ + /* EMRPOLYTEXTOUTA */ TEST_TYPE_SIZE (EMRPOLYTEXTOUTA, 80) TEST_TYPE_ALIGN (EMRPOLYTEXTOUTA, 4) TEST_FIELD_SIZE (EMRPOLYTEXTOUTA, emr, 8) @@ -1996,7 +1986,7 @@ static void test_pack_EMRPOLYTEXTOUTA(void) static void test_pack_EMRPOLYTEXTOUTW(void) { - /* EMRPOLYTEXTOUTW (pack 4) */ + /* EMRPOLYTEXTOUTW */ TEST_TYPE_SIZE (EMRPOLYTEXTOUTW, 80) TEST_TYPE_ALIGN (EMRPOLYTEXTOUTW, 4) TEST_FIELD_SIZE (EMRPOLYTEXTOUTW, emr, 8) @@ -2024,7 +2014,7 @@ static void test_pack_EMRPOLYTEXTOUTW(void) static void test_pack_EMRREALIZEPALETTE(void) { - /* EMRREALIZEPALETTE (pack 4) */ + /* EMRREALIZEPALETTE */ TEST_TYPE_SIZE (EMRREALIZEPALETTE, 8) TEST_TYPE_ALIGN (EMRREALIZEPALETTE, 4) TEST_FIELD_SIZE (EMRREALIZEPALETTE, emr, 8) @@ -2034,7 +2024,7 @@ static void test_pack_EMRREALIZEPALETTE(void) static void test_pack_EMRRECTANGLE(void) { - /* EMRRECTANGLE (pack 4) */ + /* EMRRECTANGLE */ TEST_TYPE_SIZE (EMRRECTANGLE, 24) TEST_TYPE_ALIGN (EMRRECTANGLE, 4) TEST_FIELD_SIZE (EMRRECTANGLE, emr, 8) @@ -2047,7 +2037,7 @@ static void test_pack_EMRRECTANGLE(void) static void test_pack_EMRRESIZEPALETTE(void) { - /* EMRRESIZEPALETTE (pack 4) */ + /* EMRRESIZEPALETTE */ TEST_TYPE_SIZE (EMRRESIZEPALETTE, 16) TEST_TYPE_ALIGN (EMRRESIZEPALETTE, 4) TEST_FIELD_SIZE (EMRRESIZEPALETTE, emr, 8) @@ -2063,7 +2053,7 @@ static void test_pack_EMRRESIZEPALETTE(void) static void test_pack_EMRRESTOREDC(void) { - /* EMRRESTOREDC (pack 4) */ + /* EMRRESTOREDC */ TEST_TYPE_SIZE (EMRRESTOREDC, 12) TEST_TYPE_ALIGN (EMRRESTOREDC, 4) TEST_FIELD_SIZE (EMRRESTOREDC, emr, 8) @@ -2076,7 +2066,7 @@ static void test_pack_EMRRESTOREDC(void) static void test_pack_EMRROUNDRECT(void) { - /* EMRROUNDRECT (pack 4) */ + /* EMRROUNDRECT */ TEST_TYPE_SIZE (EMRROUNDRECT, 32) TEST_TYPE_ALIGN (EMRROUNDRECT, 4) TEST_FIELD_SIZE (EMRROUNDRECT, emr, 8) @@ -2092,7 +2082,7 @@ static void test_pack_EMRROUNDRECT(void) static void test_pack_EMRSAVEDC(void) { - /* EMRSAVEDC (pack 4) */ + /* EMRSAVEDC */ TEST_TYPE_SIZE (EMRSAVEDC, 8) TEST_TYPE_ALIGN (EMRSAVEDC, 4) TEST_FIELD_SIZE (EMRSAVEDC, emr, 8) @@ -2102,7 +2092,7 @@ static void test_pack_EMRSAVEDC(void) static void test_pack_EMRSCALEVIEWPORTEXTEX(void) { - /* EMRSCALEVIEWPORTEXTEX (pack 4) */ + /* EMRSCALEVIEWPORTEXTEX */ TEST_TYPE_SIZE (EMRSCALEVIEWPORTEXTEX, 24) TEST_TYPE_ALIGN (EMRSCALEVIEWPORTEXTEX, 4) TEST_FIELD_SIZE (EMRSCALEVIEWPORTEXTEX, emr, 8) @@ -2124,7 +2114,7 @@ static void test_pack_EMRSCALEVIEWPORTEXTEX(void) static void test_pack_EMRSCALEWINDOWEXTEX(void) { - /* EMRSCALEWINDOWEXTEX (pack 4) */ + /* EMRSCALEWINDOWEXTEX */ TEST_TYPE_SIZE (EMRSCALEWINDOWEXTEX, 24) TEST_TYPE_ALIGN (EMRSCALEWINDOWEXTEX, 4) TEST_FIELD_SIZE (EMRSCALEWINDOWEXTEX, emr, 8) @@ -2146,7 +2136,7 @@ static void test_pack_EMRSCALEWINDOWEXTEX(void) static void test_pack_EMRSELECTCLIPPATH(void) { - /* EMRSELECTCLIPPATH (pack 4) */ + /* EMRSELECTCLIPPATH */ TEST_TYPE_SIZE (EMRSELECTCLIPPATH, 12) TEST_TYPE_ALIGN (EMRSELECTCLIPPATH, 4) TEST_FIELD_SIZE (EMRSELECTCLIPPATH, emr, 8) @@ -2159,7 +2149,7 @@ static void test_pack_EMRSELECTCLIPPATH(void) static void test_pack_EMRSELECTCOLORSPACE(void) { - /* EMRSELECTCOLORSPACE (pack 4) */ + /* EMRSELECTCOLORSPACE */ TEST_TYPE_SIZE (EMRSELECTCOLORSPACE, 12) TEST_TYPE_ALIGN (EMRSELECTCOLORSPACE, 4) TEST_FIELD_SIZE (EMRSELECTCOLORSPACE, emr, 8) @@ -2172,7 +2162,7 @@ static void test_pack_EMRSELECTCOLORSPACE(void) static void test_pack_EMRSELECTOBJECT(void) { - /* EMRSELECTOBJECT (pack 4) */ + /* EMRSELECTOBJECT */ TEST_TYPE_SIZE (EMRSELECTOBJECT, 12) TEST_TYPE_ALIGN (EMRSELECTOBJECT, 4) TEST_FIELD_SIZE (EMRSELECTOBJECT, emr, 8) @@ -2185,7 +2175,7 @@ static void test_pack_EMRSELECTOBJECT(void) static void test_pack_EMRSELECTPALETTE(void) { - /* EMRSELECTPALETTE (pack 4) */ + /* EMRSELECTPALETTE */ TEST_TYPE_SIZE (EMRSELECTPALETTE, 12) TEST_TYPE_ALIGN (EMRSELECTPALETTE, 4) TEST_FIELD_SIZE (EMRSELECTPALETTE, emr, 8) @@ -2198,7 +2188,7 @@ static void test_pack_EMRSELECTPALETTE(void) static void test_pack_EMRSETARCDIRECTION(void) { - /* EMRSETARCDIRECTION (pack 4) */ + /* EMRSETARCDIRECTION */ TEST_TYPE_SIZE (EMRSETARCDIRECTION, 12) TEST_TYPE_ALIGN (EMRSETARCDIRECTION, 4) TEST_FIELD_SIZE (EMRSETARCDIRECTION, emr, 8) @@ -2211,7 +2201,7 @@ static void test_pack_EMRSETARCDIRECTION(void) static void test_pack_EMRSETBKCOLOR(void) { - /* EMRSETBKCOLOR (pack 4) */ + /* EMRSETBKCOLOR */ TEST_TYPE_SIZE (EMRSETBKCOLOR, 12) TEST_TYPE_ALIGN (EMRSETBKCOLOR, 4) TEST_FIELD_SIZE (EMRSETBKCOLOR, emr, 8) @@ -2224,7 +2214,7 @@ static void test_pack_EMRSETBKCOLOR(void) static void test_pack_EMRSETBKMODE(void) { - /* EMRSETBKMODE (pack 4) */ + /* EMRSETBKMODE */ TEST_TYPE_SIZE (EMRSETBKMODE, 12) TEST_TYPE_ALIGN (EMRSETBKMODE, 4) TEST_FIELD_SIZE (EMRSETBKMODE, emr, 8) @@ -2237,7 +2227,7 @@ static void test_pack_EMRSETBKMODE(void) static void test_pack_EMRSETBRUSHORGEX(void) { - /* EMRSETBRUSHORGEX (pack 4) */ + /* EMRSETBRUSHORGEX */ TEST_TYPE_SIZE (EMRSETBRUSHORGEX, 16) TEST_TYPE_ALIGN (EMRSETBRUSHORGEX, 4) TEST_FIELD_SIZE (EMRSETBRUSHORGEX, emr, 8) @@ -2250,7 +2240,7 @@ static void test_pack_EMRSETBRUSHORGEX(void) static void test_pack_EMRSETCOLORADJUSTMENT(void) { - /* EMRSETCOLORADJUSTMENT (pack 4) */ + /* EMRSETCOLORADJUSTMENT */ TEST_TYPE_SIZE (EMRSETCOLORADJUSTMENT, 32) TEST_TYPE_ALIGN (EMRSETCOLORADJUSTMENT, 4) TEST_FIELD_SIZE (EMRSETCOLORADJUSTMENT, emr, 8) @@ -2263,7 +2253,7 @@ static void test_pack_EMRSETCOLORADJUSTMENT(void) static void test_pack_EMRSETCOLORSPACE(void) { - /* EMRSETCOLORSPACE (pack 4) */ + /* EMRSETCOLORSPACE */ TEST_TYPE_SIZE (EMRSETCOLORSPACE, 12) TEST_TYPE_ALIGN (EMRSETCOLORSPACE, 4) TEST_FIELD_SIZE (EMRSETCOLORSPACE, emr, 8) @@ -2276,7 +2266,7 @@ static void test_pack_EMRSETCOLORSPACE(void) static void test_pack_EMRSETDIBITSTODEVICE(void) { - /* EMRSETDIBITSTODEVICE (pack 4) */ + /* EMRSETDIBITSTODEVICE */ TEST_TYPE_SIZE (EMRSETDIBITSTODEVICE, 76) TEST_TYPE_ALIGN (EMRSETDIBITSTODEVICE, 4) TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, emr, 8) @@ -2328,7 +2318,7 @@ static void test_pack_EMRSETDIBITSTODEVICE(void) static void test_pack_EMRSETICMMODE(void) { - /* EMRSETICMMODE (pack 4) */ + /* EMRSETICMMODE */ TEST_TYPE_SIZE (EMRSETICMMODE, 12) TEST_TYPE_ALIGN (EMRSETICMMODE, 4) TEST_FIELD_SIZE (EMRSETICMMODE, emr, 8) @@ -2341,7 +2331,7 @@ static void test_pack_EMRSETICMMODE(void) static void test_pack_EMRSETLAYOUT(void) { - /* EMRSETLAYOUT (pack 4) */ + /* EMRSETLAYOUT */ TEST_TYPE_SIZE (EMRSETLAYOUT, 12) TEST_TYPE_ALIGN (EMRSETLAYOUT, 4) TEST_FIELD_SIZE (EMRSETLAYOUT, emr, 8) @@ -2354,7 +2344,7 @@ static void test_pack_EMRSETLAYOUT(void) static void test_pack_EMRSETMAPMODE(void) { - /* EMRSETMAPMODE (pack 4) */ + /* EMRSETMAPMODE */ TEST_TYPE_SIZE (EMRSETMAPMODE, 12) TEST_TYPE_ALIGN (EMRSETMAPMODE, 4) TEST_FIELD_SIZE (EMRSETMAPMODE, emr, 8) @@ -2367,7 +2357,7 @@ static void test_pack_EMRSETMAPMODE(void) static void test_pack_EMRSETMAPPERFLAGS(void) { - /* EMRSETMAPPERFLAGS (pack 4) */ + /* EMRSETMAPPERFLAGS */ TEST_TYPE_SIZE (EMRSETMAPPERFLAGS, 12) TEST_TYPE_ALIGN (EMRSETMAPPERFLAGS, 4) TEST_FIELD_SIZE (EMRSETMAPPERFLAGS, emr, 8) @@ -2380,7 +2370,7 @@ static void test_pack_EMRSETMAPPERFLAGS(void) static void test_pack_EMRSETMETARGN(void) { - /* EMRSETMETARGN (pack 4) */ + /* EMRSETMETARGN */ TEST_TYPE_SIZE (EMRSETMETARGN, 8) TEST_TYPE_ALIGN (EMRSETMETARGN, 4) TEST_FIELD_SIZE (EMRSETMETARGN, emr, 8) @@ -2390,7 +2380,7 @@ static void test_pack_EMRSETMETARGN(void) static void test_pack_EMRSETMITERLIMIT(void) { - /* EMRSETMITERLIMIT (pack 4) */ + /* EMRSETMITERLIMIT */ TEST_TYPE_SIZE (EMRSETMITERLIMIT, 12) TEST_TYPE_ALIGN (EMRSETMITERLIMIT, 4) TEST_FIELD_SIZE (EMRSETMITERLIMIT, emr, 8) @@ -2403,7 +2393,7 @@ static void test_pack_EMRSETMITERLIMIT(void) static void test_pack_EMRSETPIXELV(void) { - /* EMRSETPIXELV (pack 4) */ + /* EMRSETPIXELV */ TEST_TYPE_SIZE (EMRSETPIXELV, 20) TEST_TYPE_ALIGN (EMRSETPIXELV, 4) TEST_FIELD_SIZE (EMRSETPIXELV, emr, 8) @@ -2419,7 +2409,7 @@ static void test_pack_EMRSETPIXELV(void) static void test_pack_EMRSETPOLYFILLMODE(void) { - /* EMRSETPOLYFILLMODE (pack 4) */ + /* EMRSETPOLYFILLMODE */ TEST_TYPE_SIZE (EMRSETPOLYFILLMODE, 12) TEST_TYPE_ALIGN (EMRSETPOLYFILLMODE, 4) TEST_FIELD_SIZE (EMRSETPOLYFILLMODE, emr, 8) @@ -2432,7 +2422,7 @@ static void test_pack_EMRSETPOLYFILLMODE(void) static void test_pack_EMRSETROP2(void) { - /* EMRSETROP2 (pack 4) */ + /* EMRSETROP2 */ TEST_TYPE_SIZE (EMRSETROP2, 12) TEST_TYPE_ALIGN (EMRSETROP2, 4) TEST_FIELD_SIZE (EMRSETROP2, emr, 8) @@ -2445,7 +2435,7 @@ static void test_pack_EMRSETROP2(void) static void test_pack_EMRSETSTRETCHBLTMODE(void) { - /* EMRSETSTRETCHBLTMODE (pack 4) */ + /* EMRSETSTRETCHBLTMODE */ TEST_TYPE_SIZE (EMRSETSTRETCHBLTMODE, 12) TEST_TYPE_ALIGN (EMRSETSTRETCHBLTMODE, 4) TEST_FIELD_SIZE (EMRSETSTRETCHBLTMODE, emr, 8) @@ -2458,7 +2448,7 @@ static void test_pack_EMRSETSTRETCHBLTMODE(void) static void test_pack_EMRSETTEXTALIGN(void) { - /* EMRSETTEXTALIGN (pack 4) */ + /* EMRSETTEXTALIGN */ TEST_TYPE_SIZE (EMRSETTEXTALIGN, 12) TEST_TYPE_ALIGN (EMRSETTEXTALIGN, 4) TEST_FIELD_SIZE (EMRSETTEXTALIGN, emr, 8) @@ -2471,7 +2461,7 @@ static void test_pack_EMRSETTEXTALIGN(void) static void test_pack_EMRSETTEXTCOLOR(void) { - /* EMRSETTEXTCOLOR (pack 4) */ + /* EMRSETTEXTCOLOR */ TEST_TYPE_SIZE (EMRSETTEXTCOLOR, 12) TEST_TYPE_ALIGN (EMRSETTEXTCOLOR, 4) TEST_FIELD_SIZE (EMRSETTEXTCOLOR, emr, 8) @@ -2484,7 +2474,7 @@ static void test_pack_EMRSETTEXTCOLOR(void) static void test_pack_EMRSETVIEWPORTEXTEX(void) { - /* EMRSETVIEWPORTEXTEX (pack 4) */ + /* EMRSETVIEWPORTEXTEX */ TEST_TYPE_SIZE (EMRSETVIEWPORTEXTEX, 16) TEST_TYPE_ALIGN (EMRSETVIEWPORTEXTEX, 4) TEST_FIELD_SIZE (EMRSETVIEWPORTEXTEX, emr, 8) @@ -2497,7 +2487,7 @@ static void test_pack_EMRSETVIEWPORTEXTEX(void) static void test_pack_EMRSETVIEWPORTORGEX(void) { - /* EMRSETVIEWPORTORGEX (pack 4) */ + /* EMRSETVIEWPORTORGEX */ TEST_TYPE_SIZE (EMRSETVIEWPORTORGEX, 16) TEST_TYPE_ALIGN (EMRSETVIEWPORTORGEX, 4) TEST_FIELD_SIZE (EMRSETVIEWPORTORGEX, emr, 8) @@ -2510,7 +2500,7 @@ static void test_pack_EMRSETVIEWPORTORGEX(void) static void test_pack_EMRSETWINDOWEXTEX(void) { - /* EMRSETWINDOWEXTEX (pack 4) */ + /* EMRSETWINDOWEXTEX */ TEST_TYPE_SIZE (EMRSETWINDOWEXTEX, 16) TEST_TYPE_ALIGN (EMRSETWINDOWEXTEX, 4) TEST_FIELD_SIZE (EMRSETWINDOWEXTEX, emr, 8) @@ -2523,7 +2513,7 @@ static void test_pack_EMRSETWINDOWEXTEX(void) static void test_pack_EMRSETWINDOWORGEX(void) { - /* EMRSETWINDOWORGEX (pack 4) */ + /* EMRSETWINDOWORGEX */ TEST_TYPE_SIZE (EMRSETWINDOWORGEX, 16) TEST_TYPE_ALIGN (EMRSETWINDOWORGEX, 4) TEST_FIELD_SIZE (EMRSETWINDOWORGEX, emr, 8) @@ -2536,7 +2526,7 @@ static void test_pack_EMRSETWINDOWORGEX(void) static void test_pack_EMRSETWORLDTRANSFORM(void) { - /* EMRSETWORLDTRANSFORM (pack 4) */ + /* EMRSETWORLDTRANSFORM */ TEST_TYPE_SIZE (EMRSETWORLDTRANSFORM, 32) TEST_TYPE_ALIGN (EMRSETWORLDTRANSFORM, 4) TEST_FIELD_SIZE (EMRSETWORLDTRANSFORM, emr, 8) @@ -2549,7 +2539,7 @@ static void test_pack_EMRSETWORLDTRANSFORM(void) static void test_pack_EMRSTRETCHBLT(void) { - /* EMRSTRETCHBLT (pack 4) */ + /* EMRSTRETCHBLT */ TEST_TYPE_SIZE (EMRSTRETCHBLT, 108) TEST_TYPE_ALIGN (EMRSTRETCHBLT, 4) TEST_FIELD_SIZE (EMRSTRETCHBLT, emr, 8) @@ -2610,7 +2600,7 @@ static void test_pack_EMRSTRETCHBLT(void) static void test_pack_EMRSTRETCHDIBITS(void) { - /* EMRSTRETCHDIBITS (pack 4) */ + /* EMRSTRETCHDIBITS */ TEST_TYPE_SIZE (EMRSTRETCHDIBITS, 80) TEST_TYPE_ALIGN (EMRSTRETCHDIBITS, 4) TEST_FIELD_SIZE (EMRSTRETCHDIBITS, emr, 8) @@ -2665,7 +2655,7 @@ static void test_pack_EMRSTRETCHDIBITS(void) static void test_pack_EMRSTROKEANDFILLPATH(void) { - /* EMRSTROKEANDFILLPATH (pack 4) */ + /* EMRSTROKEANDFILLPATH */ TEST_TYPE_SIZE (EMRSTROKEANDFILLPATH, 24) TEST_TYPE_ALIGN (EMRSTROKEANDFILLPATH, 4) TEST_FIELD_SIZE (EMRSTROKEANDFILLPATH, emr, 8) @@ -2678,7 +2668,7 @@ static void test_pack_EMRSTROKEANDFILLPATH(void) static void test_pack_EMRSTROKEPATH(void) { - /* EMRSTROKEPATH (pack 4) */ + /* EMRSTROKEPATH */ TEST_TYPE_SIZE (EMRSTROKEPATH, 24) TEST_TYPE_ALIGN (EMRSTROKEPATH, 4) TEST_FIELD_SIZE (EMRSTROKEPATH, emr, 8) @@ -2691,7 +2681,7 @@ static void test_pack_EMRSTROKEPATH(void) static void test_pack_EMRTEXT(void) { - /* EMRTEXT (pack 4) */ + /* EMRTEXT */ TEST_TYPE_SIZE (EMRTEXT, 40) TEST_TYPE_ALIGN (EMRTEXT, 4) TEST_FIELD_SIZE (EMRTEXT, ptlReference, 8) @@ -2716,7 +2706,7 @@ static void test_pack_EMRTEXT(void) static void test_pack_EMRWIDENPATH(void) { - /* EMRWIDENPATH (pack 4) */ + /* EMRWIDENPATH */ TEST_TYPE_SIZE (EMRWIDENPATH, 8) TEST_TYPE_ALIGN (EMRWIDENPATH, 4) TEST_FIELD_SIZE (EMRWIDENPATH, emr, 8) @@ -2726,7 +2716,7 @@ static void test_pack_EMRWIDENPATH(void) static void test_pack_ENHMETAHEADER(void) { - /* ENHMETAHEADER (pack 4) */ + /* ENHMETAHEADER */ TEST_TYPE_SIZE (ENHMETAHEADER, 108) TEST_TYPE_ALIGN (ENHMETAHEADER, 4) TEST_FIELD_SIZE (ENHMETAHEADER, iType, 4) @@ -2790,7 +2780,7 @@ static void test_pack_ENHMETAHEADER(void) static void test_pack_ENHMETARECORD(void) { - /* ENHMETARECORD (pack 4) */ + /* ENHMETARECORD */ TEST_TYPE_SIZE (ENHMETARECORD, 12) TEST_TYPE_ALIGN (ENHMETARECORD, 4) TEST_FIELD_SIZE (ENHMETARECORD, iType, 4) @@ -2807,13 +2797,13 @@ static void test_pack_ENHMETARECORD(void) static void test_pack_ENHMFENUMPROC(void) { /* ENHMFENUMPROC */ - TEST_TYPE_SIZE (ENHMFENUMPROC, 4) - TEST_TYPE_ALIGN (ENHMFENUMPROC, 4) + TEST_TYPE_SIZE (ENHMFENUMPROC, 8) + TEST_TYPE_ALIGN (ENHMFENUMPROC, 8) } static void test_pack_ENUMLOGFONTA(void) { - /* ENUMLOGFONTA (pack 4) */ + /* ENUMLOGFONTA */ TEST_TYPE_SIZE (ENUMLOGFONTA, 156) TEST_TYPE_ALIGN (ENUMLOGFONTA, 4) TEST_FIELD_SIZE (ENUMLOGFONTA, elfLogFont, 60) @@ -2829,7 +2819,7 @@ static void test_pack_ENUMLOGFONTA(void) static void test_pack_ENUMLOGFONTEXA(void) { - /* ENUMLOGFONTEXA (pack 4) */ + /* ENUMLOGFONTEXA */ TEST_TYPE_SIZE (ENUMLOGFONTEXA, 188) TEST_TYPE_ALIGN (ENUMLOGFONTEXA, 4) TEST_FIELD_SIZE (ENUMLOGFONTEXA, elfLogFont, 60) @@ -2848,7 +2838,7 @@ static void test_pack_ENUMLOGFONTEXA(void) static void test_pack_ENUMLOGFONTEXW(void) { - /* ENUMLOGFONTEXW (pack 4) */ + /* ENUMLOGFONTEXW */ TEST_TYPE_SIZE (ENUMLOGFONTEXW, 348) TEST_TYPE_ALIGN (ENUMLOGFONTEXW, 4) TEST_FIELD_SIZE (ENUMLOGFONTEXW, elfLogFont, 92) @@ -2867,7 +2857,7 @@ static void test_pack_ENUMLOGFONTEXW(void) static void test_pack_ENUMLOGFONTW(void) { - /* ENUMLOGFONTW (pack 4) */ + /* ENUMLOGFONTW */ TEST_TYPE_SIZE (ENUMLOGFONTW, 284) TEST_TYPE_ALIGN (ENUMLOGFONTW, 4) TEST_FIELD_SIZE (ENUMLOGFONTW, elfLogFont, 92) @@ -2883,7 +2873,7 @@ static void test_pack_ENUMLOGFONTW(void) static void test_pack_EXTLOGFONTA(void) { - /* EXTLOGFONTA (pack 4) */ + /* EXTLOGFONTA */ TEST_TYPE_SIZE (EXTLOGFONTA, 192) TEST_TYPE_ALIGN (EXTLOGFONTA, 4) TEST_FIELD_SIZE (EXTLOGFONTA, elfLogFont, 60) @@ -2920,7 +2910,7 @@ static void test_pack_EXTLOGFONTA(void) static void test_pack_EXTLOGFONTW(void) { - /* EXTLOGFONTW (pack 4) */ + /* EXTLOGFONTW */ TEST_TYPE_SIZE (EXTLOGFONTW, 320) TEST_TYPE_ALIGN (EXTLOGFONTW, 4) TEST_FIELD_SIZE (EXTLOGFONTW, elfLogFont, 92) @@ -2957,7 +2947,6537 @@ static void test_pack_EXTLOGFONTW(void) static void test_pack_EXTLOGPEN(void) { - /* EXTLOGPEN (pack 4) */ + /* EXTLOGPEN */ + TEST_TYPE_SIZE (EXTLOGPEN, 32) + TEST_TYPE_ALIGN (EXTLOGPEN, 8) + TEST_FIELD_SIZE (EXTLOGPEN, elpPenStyle, 4) + TEST_FIELD_ALIGN (EXTLOGPEN, elpPenStyle, 4) + TEST_FIELD_OFFSET(EXTLOGPEN, elpPenStyle, 0) + TEST_FIELD_SIZE (EXTLOGPEN, elpWidth, 4) + TEST_FIELD_ALIGN (EXTLOGPEN, elpWidth, 4) + TEST_FIELD_OFFSET(EXTLOGPEN, elpWidth, 4) + TEST_FIELD_SIZE (EXTLOGPEN, elpBrushStyle, 4) + TEST_FIELD_ALIGN (EXTLOGPEN, elpBrushStyle, 4) + TEST_FIELD_OFFSET(EXTLOGPEN, elpBrushStyle, 8) + TEST_FIELD_SIZE (EXTLOGPEN, elpColor, 4) + TEST_FIELD_ALIGN (EXTLOGPEN, elpColor, 4) + TEST_FIELD_OFFSET(EXTLOGPEN, elpColor, 12) + TEST_FIELD_SIZE (EXTLOGPEN, elpHatch, 8) + TEST_FIELD_ALIGN (EXTLOGPEN, elpHatch, 8) + TEST_FIELD_OFFSET(EXTLOGPEN, elpHatch, 16) + TEST_FIELD_SIZE (EXTLOGPEN, elpNumEntries, 4) + TEST_FIELD_ALIGN (EXTLOGPEN, elpNumEntries, 4) + TEST_FIELD_OFFSET(EXTLOGPEN, elpNumEntries, 24) + TEST_FIELD_SIZE (EXTLOGPEN, elpStyleEntry, 4) + TEST_FIELD_ALIGN (EXTLOGPEN, elpStyleEntry, 4) + TEST_FIELD_OFFSET(EXTLOGPEN, elpStyleEntry, 28) +} + +static void test_pack_FIXED(void) +{ + /* FIXED */ + TEST_TYPE_SIZE (FIXED, 4) + TEST_TYPE_ALIGN (FIXED, 2) + TEST_FIELD_SIZE (FIXED, fract, 2) + TEST_FIELD_ALIGN (FIXED, fract, 2) + TEST_FIELD_OFFSET(FIXED, fract, 0) + TEST_FIELD_SIZE (FIXED, value, 2) + TEST_FIELD_ALIGN (FIXED, value, 2) + TEST_FIELD_OFFSET(FIXED, value, 2) +} + +static void test_pack_FONTENUMPROCA(void) +{ + /* FONTENUMPROCA */ + TEST_TYPE_SIZE (FONTENUMPROCA, 8) + TEST_TYPE_ALIGN (FONTENUMPROCA, 8) +} + +static void test_pack_FONTENUMPROCW(void) +{ + /* FONTENUMPROCW */ + TEST_TYPE_SIZE (FONTENUMPROCW, 8) + TEST_TYPE_ALIGN (FONTENUMPROCW, 8) +} + +static void test_pack_FONTSIGNATURE(void) +{ + /* FONTSIGNATURE */ + TEST_TYPE_SIZE (FONTSIGNATURE, 24) + TEST_TYPE_ALIGN (FONTSIGNATURE, 4) + TEST_FIELD_SIZE (FONTSIGNATURE, fsUsb, 16) + TEST_FIELD_ALIGN (FONTSIGNATURE, fsUsb, 4) + TEST_FIELD_OFFSET(FONTSIGNATURE, fsUsb, 0) + TEST_FIELD_SIZE (FONTSIGNATURE, fsCsb, 8) + TEST_FIELD_ALIGN (FONTSIGNATURE, fsCsb, 4) + TEST_FIELD_OFFSET(FONTSIGNATURE, fsCsb, 16) +} + +static void test_pack_FXPT16DOT16(void) +{ + /* FXPT16DOT16 */ + TEST_TYPE_SIZE (FXPT16DOT16, 4) + TEST_TYPE_ALIGN (FXPT16DOT16, 4) +} + +static void test_pack_FXPT2DOT30(void) +{ + /* FXPT2DOT30 */ + TEST_TYPE_SIZE (FXPT2DOT30, 4) + TEST_TYPE_ALIGN (FXPT2DOT30, 4) +} + +static void test_pack_GCP_RESULTSA(void) +{ + /* GCP_RESULTSA */ + TEST_TYPE_SIZE (GCP_RESULTSA, 64) + TEST_TYPE_ALIGN (GCP_RESULTSA, 8) + TEST_FIELD_SIZE (GCP_RESULTSA, lStructSize, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, lStructSize, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, lStructSize, 0) + TEST_FIELD_SIZE (GCP_RESULTSA, lpOutString, 8) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpOutString, 8) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpOutString, 8) + TEST_FIELD_SIZE (GCP_RESULTSA, lpOrder, 8) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpOrder, 8) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpOrder, 16) + TEST_FIELD_SIZE (GCP_RESULTSA, lpDx, 8) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpDx, 8) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpDx, 24) + TEST_FIELD_SIZE (GCP_RESULTSA, lpCaretPos, 8) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpCaretPos, 8) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpCaretPos, 32) + TEST_FIELD_SIZE (GCP_RESULTSA, lpClass, 8) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpClass, 8) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpClass, 40) + TEST_FIELD_SIZE (GCP_RESULTSA, lpGlyphs, 8) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpGlyphs, 8) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpGlyphs, 48) + TEST_FIELD_SIZE (GCP_RESULTSA, nGlyphs, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, nGlyphs, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, nGlyphs, 56) + TEST_FIELD_SIZE (GCP_RESULTSA, nMaxFit, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, nMaxFit, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, nMaxFit, 60) +} + +static void test_pack_GCP_RESULTSW(void) +{ + /* GCP_RESULTSW */ + TEST_TYPE_SIZE (GCP_RESULTSW, 64) + TEST_TYPE_ALIGN (GCP_RESULTSW, 8) + TEST_FIELD_SIZE (GCP_RESULTSW, lStructSize, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, lStructSize, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, lStructSize, 0) + TEST_FIELD_SIZE (GCP_RESULTSW, lpOutString, 8) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpOutString, 8) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpOutString, 8) + TEST_FIELD_SIZE (GCP_RESULTSW, lpOrder, 8) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpOrder, 8) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpOrder, 16) + TEST_FIELD_SIZE (GCP_RESULTSW, lpDx, 8) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpDx, 8) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpDx, 24) + TEST_FIELD_SIZE (GCP_RESULTSW, lpCaretPos, 8) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpCaretPos, 8) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpCaretPos, 32) + TEST_FIELD_SIZE (GCP_RESULTSW, lpClass, 8) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpClass, 8) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpClass, 40) + TEST_FIELD_SIZE (GCP_RESULTSW, lpGlyphs, 8) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpGlyphs, 8) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpGlyphs, 48) + TEST_FIELD_SIZE (GCP_RESULTSW, nGlyphs, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, nGlyphs, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, nGlyphs, 56) + TEST_FIELD_SIZE (GCP_RESULTSW, nMaxFit, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, nMaxFit, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, nMaxFit, 60) +} + +static void test_pack_GLYPHMETRICS(void) +{ + /* GLYPHMETRICS */ + TEST_TYPE_SIZE (GLYPHMETRICS, 20) + TEST_TYPE_ALIGN (GLYPHMETRICS, 4) + TEST_FIELD_SIZE (GLYPHMETRICS, gmBlackBoxX, 4) + TEST_FIELD_ALIGN (GLYPHMETRICS, gmBlackBoxX, 4) + TEST_FIELD_OFFSET(GLYPHMETRICS, gmBlackBoxX, 0) + TEST_FIELD_SIZE (GLYPHMETRICS, gmBlackBoxY, 4) + TEST_FIELD_ALIGN (GLYPHMETRICS, gmBlackBoxY, 4) + TEST_FIELD_OFFSET(GLYPHMETRICS, gmBlackBoxY, 4) + TEST_FIELD_SIZE (GLYPHMETRICS, gmptGlyphOrigin, 8) + TEST_FIELD_ALIGN (GLYPHMETRICS, gmptGlyphOrigin, 4) + TEST_FIELD_OFFSET(GLYPHMETRICS, gmptGlyphOrigin, 8) + TEST_FIELD_SIZE (GLYPHMETRICS, gmCellIncX, 2) + TEST_FIELD_ALIGN (GLYPHMETRICS, gmCellIncX, 2) + TEST_FIELD_OFFSET(GLYPHMETRICS, gmCellIncX, 16) + TEST_FIELD_SIZE (GLYPHMETRICS, gmCellIncY, 2) + TEST_FIELD_ALIGN (GLYPHMETRICS, gmCellIncY, 2) + TEST_FIELD_OFFSET(GLYPHMETRICS, gmCellIncY, 18) +} + +static void test_pack_GLYPHMETRICSFLOAT(void) +{ + /* GLYPHMETRICSFLOAT */ + TEST_TYPE_SIZE (GLYPHMETRICSFLOAT, 24) + TEST_TYPE_ALIGN (GLYPHMETRICSFLOAT, 4) + TEST_FIELD_SIZE (GLYPHMETRICSFLOAT, gmfBlackBoxX, 4) + TEST_FIELD_ALIGN (GLYPHMETRICSFLOAT, gmfBlackBoxX, 4) + TEST_FIELD_OFFSET(GLYPHMETRICSFLOAT, gmfBlackBoxX, 0) + TEST_FIELD_SIZE (GLYPHMETRICSFLOAT, gmfBlackBoxY, 4) + TEST_FIELD_ALIGN (GLYPHMETRICSFLOAT, gmfBlackBoxY, 4) + TEST_FIELD_OFFSET(GLYPHMETRICSFLOAT, gmfBlackBoxY, 4) + TEST_FIELD_SIZE (GLYPHMETRICSFLOAT, gmfptGlyphOrigin, 8) + TEST_FIELD_ALIGN (GLYPHMETRICSFLOAT, gmfptGlyphOrigin, 4) + TEST_FIELD_OFFSET(GLYPHMETRICSFLOAT, gmfptGlyphOrigin, 8) + TEST_FIELD_SIZE (GLYPHMETRICSFLOAT, gmfCellIncX, 4) + TEST_FIELD_ALIGN (GLYPHMETRICSFLOAT, gmfCellIncX, 4) + TEST_FIELD_OFFSET(GLYPHMETRICSFLOAT, gmfCellIncX, 16) + TEST_FIELD_SIZE (GLYPHMETRICSFLOAT, gmfCellIncY, 4) + TEST_FIELD_ALIGN (GLYPHMETRICSFLOAT, gmfCellIncY, 4) + TEST_FIELD_OFFSET(GLYPHMETRICSFLOAT, gmfCellIncY, 20) +} + +static void test_pack_GOBJENUMPROC(void) +{ + /* GOBJENUMPROC */ + TEST_TYPE_SIZE (GOBJENUMPROC, 8) + TEST_TYPE_ALIGN (GOBJENUMPROC, 8) +} + +static void test_pack_GRADIENT_RECT(void) +{ + /* GRADIENT_RECT */ + TEST_TYPE_SIZE (GRADIENT_RECT, 8) + TEST_TYPE_ALIGN (GRADIENT_RECT, 4) + TEST_FIELD_SIZE (GRADIENT_RECT, UpperLeft, 4) + TEST_FIELD_ALIGN (GRADIENT_RECT, UpperLeft, 4) + TEST_FIELD_OFFSET(GRADIENT_RECT, UpperLeft, 0) + TEST_FIELD_SIZE (GRADIENT_RECT, LowerRight, 4) + TEST_FIELD_ALIGN (GRADIENT_RECT, LowerRight, 4) + TEST_FIELD_OFFSET(GRADIENT_RECT, LowerRight, 4) +} + +static void test_pack_GRADIENT_TRIANGLE(void) +{ + /* GRADIENT_TRIANGLE */ + TEST_TYPE_SIZE (GRADIENT_TRIANGLE, 12) + TEST_TYPE_ALIGN (GRADIENT_TRIANGLE, 4) + TEST_FIELD_SIZE (GRADIENT_TRIANGLE, Vertex1, 4) + TEST_FIELD_ALIGN (GRADIENT_TRIANGLE, Vertex1, 4) + TEST_FIELD_OFFSET(GRADIENT_TRIANGLE, Vertex1, 0) + TEST_FIELD_SIZE (GRADIENT_TRIANGLE, Vertex2, 4) + TEST_FIELD_ALIGN (GRADIENT_TRIANGLE, Vertex2, 4) + TEST_FIELD_OFFSET(GRADIENT_TRIANGLE, Vertex2, 4) + TEST_FIELD_SIZE (GRADIENT_TRIANGLE, Vertex3, 4) + TEST_FIELD_ALIGN (GRADIENT_TRIANGLE, Vertex3, 4) + TEST_FIELD_OFFSET(GRADIENT_TRIANGLE, Vertex3, 8) +} + +static void test_pack_HANDLETABLE(void) +{ + /* HANDLETABLE */ + TEST_TYPE_SIZE (HANDLETABLE, 8) + TEST_TYPE_ALIGN (HANDLETABLE, 8) + TEST_FIELD_SIZE (HANDLETABLE, objectHandle, 8) + TEST_FIELD_ALIGN (HANDLETABLE, objectHandle, 8) + TEST_FIELD_OFFSET(HANDLETABLE, objectHandle, 0) +} + +static void test_pack_ICMENUMPROCA(void) +{ + /* ICMENUMPROCA */ + TEST_TYPE_SIZE (ICMENUMPROCA, 8) + TEST_TYPE_ALIGN (ICMENUMPROCA, 8) +} + +static void test_pack_ICMENUMPROCW(void) +{ + /* ICMENUMPROCW */ + TEST_TYPE_SIZE (ICMENUMPROCW, 8) + TEST_TYPE_ALIGN (ICMENUMPROCW, 8) +} + +static void test_pack_KERNINGPAIR(void) +{ + /* KERNINGPAIR */ + TEST_TYPE_SIZE (KERNINGPAIR, 8) + TEST_TYPE_ALIGN (KERNINGPAIR, 4) + TEST_FIELD_SIZE (KERNINGPAIR, wFirst, 2) + TEST_FIELD_ALIGN (KERNINGPAIR, wFirst, 2) + TEST_FIELD_OFFSET(KERNINGPAIR, wFirst, 0) + TEST_FIELD_SIZE (KERNINGPAIR, wSecond, 2) + TEST_FIELD_ALIGN (KERNINGPAIR, wSecond, 2) + TEST_FIELD_OFFSET(KERNINGPAIR, wSecond, 2) + TEST_FIELD_SIZE (KERNINGPAIR, iKernAmount, 4) + TEST_FIELD_ALIGN (KERNINGPAIR, iKernAmount, 4) + TEST_FIELD_OFFSET(KERNINGPAIR, iKernAmount, 4) +} + +static void test_pack_LAYERPLANEDESCRIPTOR(void) +{ + /* LAYERPLANEDESCRIPTOR */ + TEST_TYPE_SIZE (LAYERPLANEDESCRIPTOR, 32) + TEST_TYPE_ALIGN (LAYERPLANEDESCRIPTOR, 4) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, nSize, 2) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, nSize, 2) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, nSize, 0) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, nVersion, 2) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, nVersion, 2) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, nVersion, 2) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, dwFlags, 4) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, dwFlags, 4) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, dwFlags, 4) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, iPixelType, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, iPixelType, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, iPixelType, 8) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cColorBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cColorBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cColorBits, 9) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cRedBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cRedBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cRedBits, 10) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cRedShift, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cRedShift, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cRedShift, 11) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cGreenBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cGreenBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cGreenBits, 12) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cGreenShift, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cGreenShift, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cGreenShift, 13) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cBlueBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cBlueBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cBlueBits, 14) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cBlueShift, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cBlueShift, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cBlueShift, 15) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cAlphaBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cAlphaBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cAlphaBits, 16) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cAlphaShift, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cAlphaShift, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cAlphaShift, 17) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cAccumBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cAccumBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cAccumBits, 18) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cAccumRedBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cAccumRedBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cAccumRedBits, 19) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cAccumGreenBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cAccumGreenBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cAccumGreenBits, 20) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cAccumBlueBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cAccumBlueBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cAccumBlueBits, 21) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cAccumAlphaBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cAccumAlphaBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cAccumAlphaBits, 22) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cDepthBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cDepthBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cDepthBits, 23) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cStencilBits, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cStencilBits, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cStencilBits, 24) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, cAuxBuffers, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, cAuxBuffers, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, cAuxBuffers, 25) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, iLayerPlane, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, iLayerPlane, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, iLayerPlane, 26) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, bReserved, 1) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, bReserved, 1) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, bReserved, 27) + TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, crTransparent, 4) + TEST_FIELD_ALIGN (LAYERPLANEDESCRIPTOR, crTransparent, 4) + TEST_FIELD_OFFSET(LAYERPLANEDESCRIPTOR, crTransparent, 28) +} + +static void test_pack_LCSCSTYPE(void) +{ + /* LCSCSTYPE */ + TEST_TYPE_SIZE (LCSCSTYPE, 4) + TEST_TYPE_ALIGN (LCSCSTYPE, 4) +} + +static void test_pack_LCSGAMUTMATCH(void) +{ + /* LCSGAMUTMATCH */ + TEST_TYPE_SIZE (LCSGAMUTMATCH, 4) + TEST_TYPE_ALIGN (LCSGAMUTMATCH, 4) +} + +static void test_pack_LINEDDAPROC(void) +{ + /* LINEDDAPROC */ + TEST_TYPE_SIZE (LINEDDAPROC, 8) + TEST_TYPE_ALIGN (LINEDDAPROC, 8) +} + +static void test_pack_LOCALESIGNATURE(void) +{ + /* LOCALESIGNATURE */ + TEST_TYPE_SIZE (LOCALESIGNATURE, 32) + TEST_TYPE_ALIGN (LOCALESIGNATURE, 4) + TEST_FIELD_SIZE (LOCALESIGNATURE, lsUsb, 16) + TEST_FIELD_ALIGN (LOCALESIGNATURE, lsUsb, 4) + TEST_FIELD_OFFSET(LOCALESIGNATURE, lsUsb, 0) + TEST_FIELD_SIZE (LOCALESIGNATURE, lsCsbDefault, 8) + TEST_FIELD_ALIGN (LOCALESIGNATURE, lsCsbDefault, 4) + TEST_FIELD_OFFSET(LOCALESIGNATURE, lsCsbDefault, 16) + TEST_FIELD_SIZE (LOCALESIGNATURE, lsCsbSupported, 8) + TEST_FIELD_ALIGN (LOCALESIGNATURE, lsCsbSupported, 4) + TEST_FIELD_OFFSET(LOCALESIGNATURE, lsCsbSupported, 24) +} + +static void test_pack_LOGBRUSH(void) +{ + /* LOGBRUSH */ + TEST_TYPE_SIZE (LOGBRUSH, 16) + TEST_TYPE_ALIGN (LOGBRUSH, 8) + TEST_FIELD_SIZE (LOGBRUSH, lbStyle, 4) + TEST_FIELD_ALIGN (LOGBRUSH, lbStyle, 4) + TEST_FIELD_OFFSET(LOGBRUSH, lbStyle, 0) + TEST_FIELD_SIZE (LOGBRUSH, lbColor, 4) + TEST_FIELD_ALIGN (LOGBRUSH, lbColor, 4) + TEST_FIELD_OFFSET(LOGBRUSH, lbColor, 4) + TEST_FIELD_SIZE (LOGBRUSH, lbHatch, 8) + TEST_FIELD_ALIGN (LOGBRUSH, lbHatch, 8) + TEST_FIELD_OFFSET(LOGBRUSH, lbHatch, 8) +} + +static void test_pack_LOGCOLORSPACEA(void) +{ + /* LOGCOLORSPACEA */ + TEST_TYPE_SIZE (LOGCOLORSPACEA, 328) + TEST_TYPE_ALIGN (LOGCOLORSPACEA, 4) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsSignature, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsSignature, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsSignature, 0) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsVersion, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsVersion, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsVersion, 4) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsSize, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsSize, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsSize, 8) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsCSType, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsCSType, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsCSType, 12) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsIntent, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsIntent, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsIntent, 16) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsEndpoints, 36) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsEndpoints, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsEndpoints, 20) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsGammaRed, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsGammaRed, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsGammaRed, 56) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsGammaGreen, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsGammaGreen, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsGammaGreen, 60) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsGammaBlue, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsGammaBlue, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsGammaBlue, 64) + TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsFilename, 260) + TEST_FIELD_ALIGN (LOGCOLORSPACEA, lcsFilename, 1) + TEST_FIELD_OFFSET(LOGCOLORSPACEA, lcsFilename, 68) +} + +static void test_pack_LOGCOLORSPACEW(void) +{ + /* LOGCOLORSPACEW */ + TEST_TYPE_SIZE (LOGCOLORSPACEW, 588) + TEST_TYPE_ALIGN (LOGCOLORSPACEW, 4) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsSignature, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsSignature, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsSignature, 0) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsVersion, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsVersion, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsVersion, 4) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsSize, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsSize, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsSize, 8) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsCSType, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsCSType, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsCSType, 12) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsIntent, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsIntent, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsIntent, 16) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsEndpoints, 36) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsEndpoints, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsEndpoints, 20) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsGammaRed, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsGammaRed, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsGammaRed, 56) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsGammaGreen, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsGammaGreen, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsGammaGreen, 60) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsGammaBlue, 4) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsGammaBlue, 4) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsGammaBlue, 64) + TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsFilename, 520) + TEST_FIELD_ALIGN (LOGCOLORSPACEW, lcsFilename, 2) + TEST_FIELD_OFFSET(LOGCOLORSPACEW, lcsFilename, 68) +} + +static void test_pack_LOGFONTA(void) +{ + /* LOGFONTA */ + TEST_TYPE_SIZE (LOGFONTA, 60) + TEST_TYPE_ALIGN (LOGFONTA, 4) + TEST_FIELD_SIZE (LOGFONTA, lfHeight, 4) + TEST_FIELD_ALIGN (LOGFONTA, lfHeight, 4) + TEST_FIELD_OFFSET(LOGFONTA, lfHeight, 0) + TEST_FIELD_SIZE (LOGFONTA, lfWidth, 4) + TEST_FIELD_ALIGN (LOGFONTA, lfWidth, 4) + TEST_FIELD_OFFSET(LOGFONTA, lfWidth, 4) + TEST_FIELD_SIZE (LOGFONTA, lfEscapement, 4) + TEST_FIELD_ALIGN (LOGFONTA, lfEscapement, 4) + TEST_FIELD_OFFSET(LOGFONTA, lfEscapement, 8) + TEST_FIELD_SIZE (LOGFONTA, lfOrientation, 4) + TEST_FIELD_ALIGN (LOGFONTA, lfOrientation, 4) + TEST_FIELD_OFFSET(LOGFONTA, lfOrientation, 12) + TEST_FIELD_SIZE (LOGFONTA, lfWeight, 4) + TEST_FIELD_ALIGN (LOGFONTA, lfWeight, 4) + TEST_FIELD_OFFSET(LOGFONTA, lfWeight, 16) + TEST_FIELD_SIZE (LOGFONTA, lfItalic, 1) + TEST_FIELD_ALIGN (LOGFONTA, lfItalic, 1) + TEST_FIELD_OFFSET(LOGFONTA, lfItalic, 20) + TEST_FIELD_SIZE (LOGFONTA, lfUnderline, 1) + TEST_FIELD_ALIGN (LOGFONTA, lfUnderline, 1) + TEST_FIELD_OFFSET(LOGFONTA, lfUnderline, 21) + TEST_FIELD_SIZE (LOGFONTA, lfStrikeOut, 1) + TEST_FIELD_ALIGN (LOGFONTA, lfStrikeOut, 1) + TEST_FIELD_OFFSET(LOGFONTA, lfStrikeOut, 22) + TEST_FIELD_SIZE (LOGFONTA, lfCharSet, 1) + TEST_FIELD_ALIGN (LOGFONTA, lfCharSet, 1) + TEST_FIELD_OFFSET(LOGFONTA, lfCharSet, 23) + TEST_FIELD_SIZE (LOGFONTA, lfOutPrecision, 1) + TEST_FIELD_ALIGN (LOGFONTA, lfOutPrecision, 1) + TEST_FIELD_OFFSET(LOGFONTA, lfOutPrecision, 24) + TEST_FIELD_SIZE (LOGFONTA, lfClipPrecision, 1) + TEST_FIELD_ALIGN (LOGFONTA, lfClipPrecision, 1) + TEST_FIELD_OFFSET(LOGFONTA, lfClipPrecision, 25) + TEST_FIELD_SIZE (LOGFONTA, lfQuality, 1) + TEST_FIELD_ALIGN (LOGFONTA, lfQuality, 1) + TEST_FIELD_OFFSET(LOGFONTA, lfQuality, 26) + TEST_FIELD_SIZE (LOGFONTA, lfPitchAndFamily, 1) + TEST_FIELD_ALIGN (LOGFONTA, lfPitchAndFamily, 1) + TEST_FIELD_OFFSET(LOGFONTA, lfPitchAndFamily, 27) + TEST_FIELD_SIZE (LOGFONTA, lfFaceName, 32) + TEST_FIELD_ALIGN (LOGFONTA, lfFaceName, 1) + TEST_FIELD_OFFSET(LOGFONTA, lfFaceName, 28) +} + +static void test_pack_LOGFONTW(void) +{ + /* LOGFONTW */ + TEST_TYPE_SIZE (LOGFONTW, 92) + TEST_TYPE_ALIGN (LOGFONTW, 4) + TEST_FIELD_SIZE (LOGFONTW, lfHeight, 4) + TEST_FIELD_ALIGN (LOGFONTW, lfHeight, 4) + TEST_FIELD_OFFSET(LOGFONTW, lfHeight, 0) + TEST_FIELD_SIZE (LOGFONTW, lfWidth, 4) + TEST_FIELD_ALIGN (LOGFONTW, lfWidth, 4) + TEST_FIELD_OFFSET(LOGFONTW, lfWidth, 4) + TEST_FIELD_SIZE (LOGFONTW, lfEscapement, 4) + TEST_FIELD_ALIGN (LOGFONTW, lfEscapement, 4) + TEST_FIELD_OFFSET(LOGFONTW, lfEscapement, 8) + TEST_FIELD_SIZE (LOGFONTW, lfOrientation, 4) + TEST_FIELD_ALIGN (LOGFONTW, lfOrientation, 4) + TEST_FIELD_OFFSET(LOGFONTW, lfOrientation, 12) + TEST_FIELD_SIZE (LOGFONTW, lfWeight, 4) + TEST_FIELD_ALIGN (LOGFONTW, lfWeight, 4) + TEST_FIELD_OFFSET(LOGFONTW, lfWeight, 16) + TEST_FIELD_SIZE (LOGFONTW, lfItalic, 1) + TEST_FIELD_ALIGN (LOGFONTW, lfItalic, 1) + TEST_FIELD_OFFSET(LOGFONTW, lfItalic, 20) + TEST_FIELD_SIZE (LOGFONTW, lfUnderline, 1) + TEST_FIELD_ALIGN (LOGFONTW, lfUnderline, 1) + TEST_FIELD_OFFSET(LOGFONTW, lfUnderline, 21) + TEST_FIELD_SIZE (LOGFONTW, lfStrikeOut, 1) + TEST_FIELD_ALIGN (LOGFONTW, lfStrikeOut, 1) + TEST_FIELD_OFFSET(LOGFONTW, lfStrikeOut, 22) + TEST_FIELD_SIZE (LOGFONTW, lfCharSet, 1) + TEST_FIELD_ALIGN (LOGFONTW, lfCharSet, 1) + TEST_FIELD_OFFSET(LOGFONTW, lfCharSet, 23) + TEST_FIELD_SIZE (LOGFONTW, lfOutPrecision, 1) + TEST_FIELD_ALIGN (LOGFONTW, lfOutPrecision, 1) + TEST_FIELD_OFFSET(LOGFONTW, lfOutPrecision, 24) + TEST_FIELD_SIZE (LOGFONTW, lfClipPrecision, 1) + TEST_FIELD_ALIGN (LOGFONTW, lfClipPrecision, 1) + TEST_FIELD_OFFSET(LOGFONTW, lfClipPrecision, 25) + TEST_FIELD_SIZE (LOGFONTW, lfQuality, 1) + TEST_FIELD_ALIGN (LOGFONTW, lfQuality, 1) + TEST_FIELD_OFFSET(LOGFONTW, lfQuality, 26) + TEST_FIELD_SIZE (LOGFONTW, lfPitchAndFamily, 1) + TEST_FIELD_ALIGN (LOGFONTW, lfPitchAndFamily, 1) + TEST_FIELD_OFFSET(LOGFONTW, lfPitchAndFamily, 27) + TEST_FIELD_SIZE (LOGFONTW, lfFaceName, 64) + TEST_FIELD_ALIGN (LOGFONTW, lfFaceName, 2) + TEST_FIELD_OFFSET(LOGFONTW, lfFaceName, 28) +} + +static void test_pack_LOGPEN(void) +{ + /* LOGPEN */ + TEST_TYPE_SIZE (LOGPEN, 16) + TEST_TYPE_ALIGN (LOGPEN, 4) + TEST_FIELD_SIZE (LOGPEN, lopnStyle, 4) + TEST_FIELD_ALIGN (LOGPEN, lopnStyle, 4) + TEST_FIELD_OFFSET(LOGPEN, lopnStyle, 0) + TEST_FIELD_SIZE (LOGPEN, lopnWidth, 8) + TEST_FIELD_ALIGN (LOGPEN, lopnWidth, 4) + TEST_FIELD_OFFSET(LOGPEN, lopnWidth, 4) + TEST_FIELD_SIZE (LOGPEN, lopnColor, 4) + TEST_FIELD_ALIGN (LOGPEN, lopnColor, 4) + TEST_FIELD_OFFSET(LOGPEN, lopnColor, 12) +} + +static void test_pack_LPABC(void) +{ + /* LPABC */ + TEST_TYPE_SIZE (LPABC, 8) + TEST_TYPE_ALIGN (LPABC, 8) + TEST_TARGET_SIZE (LPABC, 12) + TEST_TARGET_ALIGN(LPABC, 4) +} + +static void test_pack_LPABCFLOAT(void) +{ + /* LPABCFLOAT */ + TEST_TYPE_SIZE (LPABCFLOAT, 8) + TEST_TYPE_ALIGN (LPABCFLOAT, 8) + TEST_TARGET_SIZE (LPABCFLOAT, 12) + TEST_TARGET_ALIGN(LPABCFLOAT, 4) +} + +static void test_pack_LPBITMAP(void) +{ + /* LPBITMAP */ + TEST_TYPE_SIZE (LPBITMAP, 8) + TEST_TYPE_ALIGN (LPBITMAP, 8) + TEST_TARGET_SIZE (LPBITMAP, 32) + TEST_TARGET_ALIGN(LPBITMAP, 8) +} + +static void test_pack_LPBITMAPCOREHEADER(void) +{ + /* LPBITMAPCOREHEADER */ + TEST_TYPE_SIZE (LPBITMAPCOREHEADER, 8) + TEST_TYPE_ALIGN (LPBITMAPCOREHEADER, 8) + TEST_TARGET_SIZE (LPBITMAPCOREHEADER, 12) + TEST_TARGET_ALIGN(LPBITMAPCOREHEADER, 4) +} + +static void test_pack_LPBITMAPCOREINFO(void) +{ + /* LPBITMAPCOREINFO */ + TEST_TYPE_SIZE (LPBITMAPCOREINFO, 8) + TEST_TYPE_ALIGN (LPBITMAPCOREINFO, 8) + TEST_TARGET_SIZE (LPBITMAPCOREINFO, 16) + TEST_TARGET_ALIGN(LPBITMAPCOREINFO, 4) +} + +static void test_pack_LPBITMAPFILEHEADER(void) +{ + /* LPBITMAPFILEHEADER */ + TEST_TYPE_SIZE (LPBITMAPFILEHEADER, 8) + TEST_TYPE_ALIGN (LPBITMAPFILEHEADER, 8) + TEST_TARGET_SIZE (LPBITMAPFILEHEADER, 14) + TEST_TARGET_ALIGN(LPBITMAPFILEHEADER, 2) +} + +static void test_pack_LPBITMAPINFO(void) +{ + /* LPBITMAPINFO */ + TEST_TYPE_SIZE (LPBITMAPINFO, 8) + TEST_TYPE_ALIGN (LPBITMAPINFO, 8) + TEST_TARGET_SIZE (LPBITMAPINFO, 44) + TEST_TARGET_ALIGN(LPBITMAPINFO, 4) +} + +static void test_pack_LPBITMAPINFOHEADER(void) +{ + /* LPBITMAPINFOHEADER */ + TEST_TYPE_SIZE (LPBITMAPINFOHEADER, 8) + TEST_TYPE_ALIGN (LPBITMAPINFOHEADER, 8) + TEST_TARGET_SIZE (LPBITMAPINFOHEADER, 40) + TEST_TARGET_ALIGN(LPBITMAPINFOHEADER, 4) +} + +static void test_pack_LPBITMAPV5HEADER(void) +{ + /* LPBITMAPV5HEADER */ + TEST_TYPE_SIZE (LPBITMAPV5HEADER, 8) + TEST_TYPE_ALIGN (LPBITMAPV5HEADER, 8) + TEST_TARGET_SIZE (LPBITMAPV5HEADER, 124) + TEST_TARGET_ALIGN(LPBITMAPV5HEADER, 4) +} + +static void test_pack_LPCHARSETINFO(void) +{ + /* LPCHARSETINFO */ + TEST_TYPE_SIZE (LPCHARSETINFO, 8) + TEST_TYPE_ALIGN (LPCHARSETINFO, 8) + TEST_TARGET_SIZE (LPCHARSETINFO, 32) + TEST_TARGET_ALIGN(LPCHARSETINFO, 4) +} + +static void test_pack_LPCIEXYZ(void) +{ + /* LPCIEXYZ */ + TEST_TYPE_SIZE (LPCIEXYZ, 8) + TEST_TYPE_ALIGN (LPCIEXYZ, 8) + TEST_TARGET_SIZE (LPCIEXYZ, 12) + TEST_TARGET_ALIGN(LPCIEXYZ, 4) +} + +static void test_pack_LPCIEXYZTRIPLE(void) +{ + /* LPCIEXYZTRIPLE */ + TEST_TYPE_SIZE (LPCIEXYZTRIPLE, 8) + TEST_TYPE_ALIGN (LPCIEXYZTRIPLE, 8) + TEST_TARGET_SIZE (LPCIEXYZTRIPLE, 36) + TEST_TARGET_ALIGN(LPCIEXYZTRIPLE, 4) +} + +static void test_pack_LPCOLORADJUSTMENT(void) +{ + /* LPCOLORADJUSTMENT */ + TEST_TYPE_SIZE (LPCOLORADJUSTMENT, 8) + TEST_TYPE_ALIGN (LPCOLORADJUSTMENT, 8) + TEST_TARGET_SIZE (LPCOLORADJUSTMENT, 24) + TEST_TARGET_ALIGN(LPCOLORADJUSTMENT, 2) +} + +static void test_pack_LPDEVMODEA(void) +{ + /* LPDEVMODEA */ + TEST_TYPE_SIZE (LPDEVMODEA, 8) + TEST_TYPE_ALIGN (LPDEVMODEA, 8) +} + +static void test_pack_LPDEVMODEW(void) +{ + /* LPDEVMODEW */ + TEST_TYPE_SIZE (LPDEVMODEW, 8) + TEST_TYPE_ALIGN (LPDEVMODEW, 8) +} + +static void test_pack_LPDIBSECTION(void) +{ + /* LPDIBSECTION */ + TEST_TYPE_SIZE (LPDIBSECTION, 8) + TEST_TYPE_ALIGN (LPDIBSECTION, 8) + TEST_TARGET_SIZE (LPDIBSECTION, 104) + TEST_TARGET_ALIGN(LPDIBSECTION, 8) +} + +static void test_pack_LPDISPLAY_DEVICEA(void) +{ + /* LPDISPLAY_DEVICEA */ + TEST_TYPE_SIZE (LPDISPLAY_DEVICEA, 8) + TEST_TYPE_ALIGN (LPDISPLAY_DEVICEA, 8) + TEST_TARGET_SIZE (LPDISPLAY_DEVICEA, 424) + TEST_TARGET_ALIGN(LPDISPLAY_DEVICEA, 4) +} + +static void test_pack_LPDISPLAY_DEVICEW(void) +{ + /* LPDISPLAY_DEVICEW */ + TEST_TYPE_SIZE (LPDISPLAY_DEVICEW, 8) + TEST_TYPE_ALIGN (LPDISPLAY_DEVICEW, 8) + TEST_TARGET_SIZE (LPDISPLAY_DEVICEW, 840) + TEST_TARGET_ALIGN(LPDISPLAY_DEVICEW, 4) +} + +static void test_pack_LPDOCINFOA(void) +{ + /* LPDOCINFOA */ + TEST_TYPE_SIZE (LPDOCINFOA, 8) + TEST_TYPE_ALIGN (LPDOCINFOA, 8) + TEST_TARGET_SIZE (LPDOCINFOA, 40) + TEST_TARGET_ALIGN(LPDOCINFOA, 8) +} + +static void test_pack_LPDOCINFOW(void) +{ + /* LPDOCINFOW */ + TEST_TYPE_SIZE (LPDOCINFOW, 8) + TEST_TYPE_ALIGN (LPDOCINFOW, 8) + TEST_TARGET_SIZE (LPDOCINFOW, 40) + TEST_TARGET_ALIGN(LPDOCINFOW, 8) +} + +static void test_pack_LPENHMETAHEADER(void) +{ + /* LPENHMETAHEADER */ + TEST_TYPE_SIZE (LPENHMETAHEADER, 8) + TEST_TYPE_ALIGN (LPENHMETAHEADER, 8) + TEST_TARGET_SIZE (LPENHMETAHEADER, 108) + TEST_TARGET_ALIGN(LPENHMETAHEADER, 4) +} + +static void test_pack_LPENHMETARECORD(void) +{ + /* LPENHMETARECORD */ + TEST_TYPE_SIZE (LPENHMETARECORD, 8) + TEST_TYPE_ALIGN (LPENHMETARECORD, 8) + TEST_TARGET_SIZE (LPENHMETARECORD, 12) + TEST_TARGET_ALIGN(LPENHMETARECORD, 4) +} + +static void test_pack_LPENUMLOGFONTA(void) +{ + /* LPENUMLOGFONTA */ + TEST_TYPE_SIZE (LPENUMLOGFONTA, 8) + TEST_TYPE_ALIGN (LPENUMLOGFONTA, 8) + TEST_TARGET_SIZE (LPENUMLOGFONTA, 156) + TEST_TARGET_ALIGN(LPENUMLOGFONTA, 4) +} + +static void test_pack_LPENUMLOGFONTEXA(void) +{ + /* LPENUMLOGFONTEXA */ + TEST_TYPE_SIZE (LPENUMLOGFONTEXA, 8) + TEST_TYPE_ALIGN (LPENUMLOGFONTEXA, 8) + TEST_TARGET_SIZE (LPENUMLOGFONTEXA, 188) + TEST_TARGET_ALIGN(LPENUMLOGFONTEXA, 4) +} + +static void test_pack_LPENUMLOGFONTEXW(void) +{ + /* LPENUMLOGFONTEXW */ + TEST_TYPE_SIZE (LPENUMLOGFONTEXW, 8) + TEST_TYPE_ALIGN (LPENUMLOGFONTEXW, 8) + TEST_TARGET_SIZE (LPENUMLOGFONTEXW, 348) + TEST_TARGET_ALIGN(LPENUMLOGFONTEXW, 4) +} + +static void test_pack_LPENUMLOGFONTW(void) +{ + /* LPENUMLOGFONTW */ + TEST_TYPE_SIZE (LPENUMLOGFONTW, 8) + TEST_TYPE_ALIGN (LPENUMLOGFONTW, 8) + TEST_TARGET_SIZE (LPENUMLOGFONTW, 284) + TEST_TARGET_ALIGN(LPENUMLOGFONTW, 4) +} + +static void test_pack_LPEXTLOGFONTA(void) +{ + /* LPEXTLOGFONTA */ + TEST_TYPE_SIZE (LPEXTLOGFONTA, 8) + TEST_TYPE_ALIGN (LPEXTLOGFONTA, 8) + TEST_TARGET_SIZE (LPEXTLOGFONTA, 192) + TEST_TARGET_ALIGN(LPEXTLOGFONTA, 4) +} + +static void test_pack_LPEXTLOGFONTW(void) +{ + /* LPEXTLOGFONTW */ + TEST_TYPE_SIZE (LPEXTLOGFONTW, 8) + TEST_TYPE_ALIGN (LPEXTLOGFONTW, 8) + TEST_TARGET_SIZE (LPEXTLOGFONTW, 320) + TEST_TARGET_ALIGN(LPEXTLOGFONTW, 4) +} + +static void test_pack_LPEXTLOGPEN(void) +{ + /* LPEXTLOGPEN */ + TEST_TYPE_SIZE (LPEXTLOGPEN, 8) + TEST_TYPE_ALIGN (LPEXTLOGPEN, 8) + TEST_TARGET_SIZE (LPEXTLOGPEN, 32) + TEST_TARGET_ALIGN(LPEXTLOGPEN, 8) +} + +static void test_pack_LPFONTSIGNATURE(void) +{ + /* LPFONTSIGNATURE */ + TEST_TYPE_SIZE (LPFONTSIGNATURE, 8) + TEST_TYPE_ALIGN (LPFONTSIGNATURE, 8) + TEST_TARGET_SIZE (LPFONTSIGNATURE, 24) + TEST_TARGET_ALIGN(LPFONTSIGNATURE, 4) +} + +static void test_pack_LPGCP_RESULTSA(void) +{ + /* LPGCP_RESULTSA */ + TEST_TYPE_SIZE (LPGCP_RESULTSA, 8) + TEST_TYPE_ALIGN (LPGCP_RESULTSA, 8) + TEST_TARGET_SIZE (LPGCP_RESULTSA, 64) + TEST_TARGET_ALIGN(LPGCP_RESULTSA, 8) +} + +static void test_pack_LPGCP_RESULTSW(void) +{ + /* LPGCP_RESULTSW */ + TEST_TYPE_SIZE (LPGCP_RESULTSW, 8) + TEST_TYPE_ALIGN (LPGCP_RESULTSW, 8) + TEST_TARGET_SIZE (LPGCP_RESULTSW, 64) + TEST_TARGET_ALIGN(LPGCP_RESULTSW, 8) +} + +static void test_pack_LPGLYPHMETRICS(void) +{ + /* LPGLYPHMETRICS */ + TEST_TYPE_SIZE (LPGLYPHMETRICS, 8) + TEST_TYPE_ALIGN (LPGLYPHMETRICS, 8) + TEST_TARGET_SIZE (LPGLYPHMETRICS, 20) + TEST_TARGET_ALIGN(LPGLYPHMETRICS, 4) +} + +static void test_pack_LPGLYPHMETRICSFLOAT(void) +{ + /* LPGLYPHMETRICSFLOAT */ + TEST_TYPE_SIZE (LPGLYPHMETRICSFLOAT, 8) + TEST_TYPE_ALIGN (LPGLYPHMETRICSFLOAT, 8) + TEST_TARGET_SIZE (LPGLYPHMETRICSFLOAT, 24) + TEST_TARGET_ALIGN(LPGLYPHMETRICSFLOAT, 4) +} + +static void test_pack_LPGRADIENT_RECT(void) +{ + /* LPGRADIENT_RECT */ + TEST_TYPE_SIZE (LPGRADIENT_RECT, 8) + TEST_TYPE_ALIGN (LPGRADIENT_RECT, 8) + TEST_TARGET_SIZE (LPGRADIENT_RECT, 8) + TEST_TARGET_ALIGN(LPGRADIENT_RECT, 4) +} + +static void test_pack_LPGRADIENT_TRIANGLE(void) +{ + /* LPGRADIENT_TRIANGLE */ + TEST_TYPE_SIZE (LPGRADIENT_TRIANGLE, 8) + TEST_TYPE_ALIGN (LPGRADIENT_TRIANGLE, 8) + TEST_TARGET_SIZE (LPGRADIENT_TRIANGLE, 12) + TEST_TARGET_ALIGN(LPGRADIENT_TRIANGLE, 4) +} + +static void test_pack_LPHANDLETABLE(void) +{ + /* LPHANDLETABLE */ + TEST_TYPE_SIZE (LPHANDLETABLE, 8) + TEST_TYPE_ALIGN (LPHANDLETABLE, 8) + TEST_TARGET_SIZE (LPHANDLETABLE, 8) + TEST_TARGET_ALIGN(LPHANDLETABLE, 8) +} + +static void test_pack_LPKERNINGPAIR(void) +{ + /* LPKERNINGPAIR */ + TEST_TYPE_SIZE (LPKERNINGPAIR, 8) + TEST_TYPE_ALIGN (LPKERNINGPAIR, 8) + TEST_TARGET_SIZE (LPKERNINGPAIR, 8) + TEST_TARGET_ALIGN(LPKERNINGPAIR, 4) +} + +static void test_pack_LPLAYERPLANEDESCRIPTOR(void) +{ + /* LPLAYERPLANEDESCRIPTOR */ + TEST_TYPE_SIZE (LPLAYERPLANEDESCRIPTOR, 8) + TEST_TYPE_ALIGN (LPLAYERPLANEDESCRIPTOR, 8) + TEST_TARGET_SIZE (LPLAYERPLANEDESCRIPTOR, 32) + TEST_TARGET_ALIGN(LPLAYERPLANEDESCRIPTOR, 4) +} + +static void test_pack_LPLOCALESIGNATURE(void) +{ + /* LPLOCALESIGNATURE */ + TEST_TYPE_SIZE (LPLOCALESIGNATURE, 8) + TEST_TYPE_ALIGN (LPLOCALESIGNATURE, 8) + TEST_TARGET_SIZE (LPLOCALESIGNATURE, 32) + TEST_TARGET_ALIGN(LPLOCALESIGNATURE, 4) +} + +static void test_pack_LPLOGBRUSH(void) +{ + /* LPLOGBRUSH */ + TEST_TYPE_SIZE (LPLOGBRUSH, 8) + TEST_TYPE_ALIGN (LPLOGBRUSH, 8) + TEST_TARGET_SIZE (LPLOGBRUSH, 16) + TEST_TARGET_ALIGN(LPLOGBRUSH, 8) +} + +static void test_pack_LPLOGCOLORSPACEA(void) +{ + /* LPLOGCOLORSPACEA */ + TEST_TYPE_SIZE (LPLOGCOLORSPACEA, 8) + TEST_TYPE_ALIGN (LPLOGCOLORSPACEA, 8) + TEST_TARGET_SIZE (LPLOGCOLORSPACEA, 328) + TEST_TARGET_ALIGN(LPLOGCOLORSPACEA, 4) +} + +static void test_pack_LPLOGCOLORSPACEW(void) +{ + /* LPLOGCOLORSPACEW */ + TEST_TYPE_SIZE (LPLOGCOLORSPACEW, 8) + TEST_TYPE_ALIGN (LPLOGCOLORSPACEW, 8) + TEST_TARGET_SIZE (LPLOGCOLORSPACEW, 588) + TEST_TARGET_ALIGN(LPLOGCOLORSPACEW, 4) +} + +static void test_pack_LPLOGFONTA(void) +{ + /* LPLOGFONTA */ + TEST_TYPE_SIZE (LPLOGFONTA, 8) + TEST_TYPE_ALIGN (LPLOGFONTA, 8) + TEST_TARGET_SIZE (LPLOGFONTA, 60) + TEST_TARGET_ALIGN(LPLOGFONTA, 4) +} + +static void test_pack_LPLOGFONTW(void) +{ + /* LPLOGFONTW */ + TEST_TYPE_SIZE (LPLOGFONTW, 8) + TEST_TYPE_ALIGN (LPLOGFONTW, 8) + TEST_TARGET_SIZE (LPLOGFONTW, 92) + TEST_TARGET_ALIGN(LPLOGFONTW, 4) +} + +static void test_pack_LPLOGPEN(void) +{ + /* LPLOGPEN */ + TEST_TYPE_SIZE (LPLOGPEN, 8) + TEST_TYPE_ALIGN (LPLOGPEN, 8) + TEST_TARGET_SIZE (LPLOGPEN, 16) + TEST_TARGET_ALIGN(LPLOGPEN, 4) +} + +static void test_pack_LPMAT2(void) +{ + /* LPMAT2 */ + TEST_TYPE_SIZE (LPMAT2, 8) + TEST_TYPE_ALIGN (LPMAT2, 8) + TEST_TARGET_SIZE (LPMAT2, 16) + TEST_TARGET_ALIGN(LPMAT2, 2) +} + +static void test_pack_LPMETAFILEPICT(void) +{ + /* LPMETAFILEPICT */ + TEST_TYPE_SIZE (LPMETAFILEPICT, 8) + TEST_TYPE_ALIGN (LPMETAFILEPICT, 8) + TEST_TARGET_SIZE (LPMETAFILEPICT, 24) + TEST_TARGET_ALIGN(LPMETAFILEPICT, 8) +} + +static void test_pack_LPMETAHEADER(void) +{ + /* LPMETAHEADER */ + TEST_TYPE_SIZE (LPMETAHEADER, 8) + TEST_TYPE_ALIGN (LPMETAHEADER, 8) + TEST_TARGET_SIZE (LPMETAHEADER, 18) + TEST_TARGET_ALIGN(LPMETAHEADER, 2) +} + +static void test_pack_LPMETARECORD(void) +{ + /* LPMETARECORD */ + TEST_TYPE_SIZE (LPMETARECORD, 8) + TEST_TYPE_ALIGN (LPMETARECORD, 8) + TEST_TARGET_SIZE (LPMETARECORD, 8) + TEST_TARGET_ALIGN(LPMETARECORD, 4) +} + +static void test_pack_LPNEWTEXTMETRICA(void) +{ + /* LPNEWTEXTMETRICA */ + TEST_TYPE_SIZE (LPNEWTEXTMETRICA, 8) + TEST_TYPE_ALIGN (LPNEWTEXTMETRICA, 8) + TEST_TARGET_SIZE (LPNEWTEXTMETRICA, 72) + TEST_TARGET_ALIGN(LPNEWTEXTMETRICA, 4) +} + +static void test_pack_LPNEWTEXTMETRICW(void) +{ + /* LPNEWTEXTMETRICW */ + TEST_TYPE_SIZE (LPNEWTEXTMETRICW, 8) + TEST_TYPE_ALIGN (LPNEWTEXTMETRICW, 8) + TEST_TARGET_SIZE (LPNEWTEXTMETRICW, 76) + TEST_TARGET_ALIGN(LPNEWTEXTMETRICW, 4) +} + +static void test_pack_LPOUTLINETEXTMETRICA(void) +{ + /* LPOUTLINETEXTMETRICA */ + TEST_TYPE_SIZE (LPOUTLINETEXTMETRICA, 8) + TEST_TYPE_ALIGN (LPOUTLINETEXTMETRICA, 8) + TEST_TARGET_SIZE (LPOUTLINETEXTMETRICA, 232) + TEST_TARGET_ALIGN(LPOUTLINETEXTMETRICA, 8) +} + +static void test_pack_LPOUTLINETEXTMETRICW(void) +{ + /* LPOUTLINETEXTMETRICW */ + TEST_TYPE_SIZE (LPOUTLINETEXTMETRICW, 8) + TEST_TYPE_ALIGN (LPOUTLINETEXTMETRICW, 8) + TEST_TARGET_SIZE (LPOUTLINETEXTMETRICW, 232) + TEST_TARGET_ALIGN(LPOUTLINETEXTMETRICW, 8) +} + +static void test_pack_LPPANOSE(void) +{ + /* LPPANOSE */ + TEST_TYPE_SIZE (LPPANOSE, 8) + TEST_TYPE_ALIGN (LPPANOSE, 8) + TEST_TARGET_SIZE (LPPANOSE, 10) + TEST_TARGET_ALIGN(LPPANOSE, 1) +} + +static void test_pack_LPPELARRAY(void) +{ + /* LPPELARRAY */ + TEST_TYPE_SIZE (LPPELARRAY, 8) + TEST_TYPE_ALIGN (LPPELARRAY, 8) + TEST_TARGET_SIZE (LPPELARRAY, 20) + TEST_TARGET_ALIGN(LPPELARRAY, 4) +} + +static void test_pack_LPPIXELFORMATDESCRIPTOR(void) +{ + /* LPPIXELFORMATDESCRIPTOR */ + TEST_TYPE_SIZE (LPPIXELFORMATDESCRIPTOR, 8) + TEST_TYPE_ALIGN (LPPIXELFORMATDESCRIPTOR, 8) + TEST_TARGET_SIZE (LPPIXELFORMATDESCRIPTOR, 40) + TEST_TARGET_ALIGN(LPPIXELFORMATDESCRIPTOR, 4) +} + +static void test_pack_LPPOINTFX(void) +{ + /* LPPOINTFX */ + TEST_TYPE_SIZE (LPPOINTFX, 8) + TEST_TYPE_ALIGN (LPPOINTFX, 8) + TEST_TARGET_SIZE (LPPOINTFX, 8) + TEST_TARGET_ALIGN(LPPOINTFX, 2) +} + +static void test_pack_LPPOLYTEXTA(void) +{ + /* LPPOLYTEXTA */ + TEST_TYPE_SIZE (LPPOLYTEXTA, 8) + TEST_TYPE_ALIGN (LPPOLYTEXTA, 8) + TEST_TARGET_SIZE (LPPOLYTEXTA, 56) + TEST_TARGET_ALIGN(LPPOLYTEXTA, 8) +} + +static void test_pack_LPPOLYTEXTW(void) +{ + /* LPPOLYTEXTW */ + TEST_TYPE_SIZE (LPPOLYTEXTW, 8) + TEST_TYPE_ALIGN (LPPOLYTEXTW, 8) + TEST_TARGET_SIZE (LPPOLYTEXTW, 56) + TEST_TARGET_ALIGN(LPPOLYTEXTW, 8) +} + +static void test_pack_LPRASTERIZER_STATUS(void) +{ + /* LPRASTERIZER_STATUS */ + TEST_TYPE_SIZE (LPRASTERIZER_STATUS, 8) + TEST_TYPE_ALIGN (LPRASTERIZER_STATUS, 8) + TEST_TARGET_SIZE (LPRASTERIZER_STATUS, 6) + TEST_TARGET_ALIGN(LPRASTERIZER_STATUS, 2) +} + +static void test_pack_LPRGBQUAD(void) +{ + /* LPRGBQUAD */ + TEST_TYPE_SIZE (LPRGBQUAD, 8) + TEST_TYPE_ALIGN (LPRGBQUAD, 8) + TEST_TARGET_SIZE (LPRGBQUAD, 4) + TEST_TARGET_ALIGN(LPRGBQUAD, 1) +} + +static void test_pack_LPRGNDATA(void) +{ + /* LPRGNDATA */ + TEST_TYPE_SIZE (LPRGNDATA, 8) + TEST_TYPE_ALIGN (LPRGNDATA, 8) + TEST_TARGET_SIZE (LPRGNDATA, 36) + TEST_TARGET_ALIGN(LPRGNDATA, 4) +} + +static void test_pack_LPTEXTMETRICA(void) +{ + /* LPTEXTMETRICA */ + TEST_TYPE_SIZE (LPTEXTMETRICA, 8) + TEST_TYPE_ALIGN (LPTEXTMETRICA, 8) + TEST_TARGET_SIZE (LPTEXTMETRICA, 56) + TEST_TARGET_ALIGN(LPTEXTMETRICA, 4) +} + +static void test_pack_LPTEXTMETRICW(void) +{ + /* LPTEXTMETRICW */ + TEST_TYPE_SIZE (LPTEXTMETRICW, 8) + TEST_TYPE_ALIGN (LPTEXTMETRICW, 8) + TEST_TARGET_SIZE (LPTEXTMETRICW, 60) + TEST_TARGET_ALIGN(LPTEXTMETRICW, 4) +} + +static void test_pack_LPTRIVERTEX(void) +{ + /* LPTRIVERTEX */ + TEST_TYPE_SIZE (LPTRIVERTEX, 8) + TEST_TYPE_ALIGN (LPTRIVERTEX, 8) + TEST_TARGET_SIZE (LPTRIVERTEX, 16) + TEST_TARGET_ALIGN(LPTRIVERTEX, 4) +} + +static void test_pack_LPTTPOLYCURVE(void) +{ + /* LPTTPOLYCURVE */ + TEST_TYPE_SIZE (LPTTPOLYCURVE, 8) + TEST_TYPE_ALIGN (LPTTPOLYCURVE, 8) + TEST_TARGET_SIZE (LPTTPOLYCURVE, 12) + TEST_TARGET_ALIGN(LPTTPOLYCURVE, 2) +} + +static void test_pack_LPTTPOLYGONHEADER(void) +{ + /* LPTTPOLYGONHEADER */ + TEST_TYPE_SIZE (LPTTPOLYGONHEADER, 8) + TEST_TYPE_ALIGN (LPTTPOLYGONHEADER, 8) + TEST_TARGET_SIZE (LPTTPOLYGONHEADER, 16) + TEST_TARGET_ALIGN(LPTTPOLYGONHEADER, 4) +} + +static void test_pack_LPXFORM(void) +{ + /* LPXFORM */ + TEST_TYPE_SIZE (LPXFORM, 8) + TEST_TYPE_ALIGN (LPXFORM, 8) + TEST_TARGET_SIZE (LPXFORM, 24) + TEST_TARGET_ALIGN(LPXFORM, 4) +} + +static void test_pack_MAT2(void) +{ + /* MAT2 */ + TEST_TYPE_SIZE (MAT2, 16) + TEST_TYPE_ALIGN (MAT2, 2) + TEST_FIELD_SIZE (MAT2, eM11, 4) + TEST_FIELD_ALIGN (MAT2, eM11, 2) + TEST_FIELD_OFFSET(MAT2, eM11, 0) + TEST_FIELD_SIZE (MAT2, eM12, 4) + TEST_FIELD_ALIGN (MAT2, eM12, 2) + TEST_FIELD_OFFSET(MAT2, eM12, 4) + TEST_FIELD_SIZE (MAT2, eM21, 4) + TEST_FIELD_ALIGN (MAT2, eM21, 2) + TEST_FIELD_OFFSET(MAT2, eM21, 8) + TEST_FIELD_SIZE (MAT2, eM22, 4) + TEST_FIELD_ALIGN (MAT2, eM22, 2) + TEST_FIELD_OFFSET(MAT2, eM22, 12) +} + +static void test_pack_METAFILEPICT(void) +{ + /* METAFILEPICT */ + TEST_TYPE_SIZE (METAFILEPICT, 24) + TEST_TYPE_ALIGN (METAFILEPICT, 8) + TEST_FIELD_SIZE (METAFILEPICT, mm, 4) + TEST_FIELD_ALIGN (METAFILEPICT, mm, 4) + TEST_FIELD_OFFSET(METAFILEPICT, mm, 0) + TEST_FIELD_SIZE (METAFILEPICT, xExt, 4) + TEST_FIELD_ALIGN (METAFILEPICT, xExt, 4) + TEST_FIELD_OFFSET(METAFILEPICT, xExt, 4) + TEST_FIELD_SIZE (METAFILEPICT, yExt, 4) + TEST_FIELD_ALIGN (METAFILEPICT, yExt, 4) + TEST_FIELD_OFFSET(METAFILEPICT, yExt, 8) + TEST_FIELD_SIZE (METAFILEPICT, hMF, 8) + TEST_FIELD_ALIGN (METAFILEPICT, hMF, 8) + TEST_FIELD_OFFSET(METAFILEPICT, hMF, 16) +} + +static void test_pack_METAHEADER(void) +{ + /* METAHEADER (pack 2) */ + TEST_TYPE_SIZE (METAHEADER, 18) + TEST_TYPE_ALIGN (METAHEADER, 2) + TEST_FIELD_SIZE (METAHEADER, mtType, 2) + TEST_FIELD_ALIGN (METAHEADER, mtType, 2) + TEST_FIELD_OFFSET(METAHEADER, mtType, 0) + TEST_FIELD_SIZE (METAHEADER, mtHeaderSize, 2) + TEST_FIELD_ALIGN (METAHEADER, mtHeaderSize, 2) + TEST_FIELD_OFFSET(METAHEADER, mtHeaderSize, 2) + TEST_FIELD_SIZE (METAHEADER, mtVersion, 2) + TEST_FIELD_ALIGN (METAHEADER, mtVersion, 2) + TEST_FIELD_OFFSET(METAHEADER, mtVersion, 4) + TEST_FIELD_SIZE (METAHEADER, mtSize, 4) + TEST_FIELD_ALIGN (METAHEADER, mtSize, 2) + TEST_FIELD_OFFSET(METAHEADER, mtSize, 6) + TEST_FIELD_SIZE (METAHEADER, mtNoObjects, 2) + TEST_FIELD_ALIGN (METAHEADER, mtNoObjects, 2) + TEST_FIELD_OFFSET(METAHEADER, mtNoObjects, 10) + TEST_FIELD_SIZE (METAHEADER, mtMaxRecord, 4) + TEST_FIELD_ALIGN (METAHEADER, mtMaxRecord, 2) + TEST_FIELD_OFFSET(METAHEADER, mtMaxRecord, 12) + TEST_FIELD_SIZE (METAHEADER, mtNoParameters, 2) + TEST_FIELD_ALIGN (METAHEADER, mtNoParameters, 2) + TEST_FIELD_OFFSET(METAHEADER, mtNoParameters, 16) +} + +static void test_pack_METARECORD(void) +{ + /* METARECORD */ + TEST_TYPE_SIZE (METARECORD, 8) + TEST_TYPE_ALIGN (METARECORD, 4) + TEST_FIELD_SIZE (METARECORD, rdSize, 4) + TEST_FIELD_ALIGN (METARECORD, rdSize, 4) + TEST_FIELD_OFFSET(METARECORD, rdSize, 0) + TEST_FIELD_SIZE (METARECORD, rdFunction, 2) + TEST_FIELD_ALIGN (METARECORD, rdFunction, 2) + TEST_FIELD_OFFSET(METARECORD, rdFunction, 4) + TEST_FIELD_SIZE (METARECORD, rdParm, 2) + TEST_FIELD_ALIGN (METARECORD, rdParm, 2) + TEST_FIELD_OFFSET(METARECORD, rdParm, 6) +} + +static void test_pack_MFENUMPROC(void) +{ + /* MFENUMPROC */ + TEST_TYPE_SIZE (MFENUMPROC, 8) + TEST_TYPE_ALIGN (MFENUMPROC, 8) +} + +static void test_pack_NEWTEXTMETRICA(void) +{ + /* NEWTEXTMETRICA */ + TEST_TYPE_SIZE (NEWTEXTMETRICA, 72) + TEST_TYPE_ALIGN (NEWTEXTMETRICA, 4) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmHeight, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmHeight, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmHeight, 0) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmAscent, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmAscent, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmAscent, 4) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmDescent, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmDescent, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmDescent, 8) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmInternalLeading, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmInternalLeading, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmInternalLeading, 12) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmExternalLeading, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmExternalLeading, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmExternalLeading, 16) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmAveCharWidth, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmAveCharWidth, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmAveCharWidth, 20) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmMaxCharWidth, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmMaxCharWidth, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmMaxCharWidth, 24) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmWeight, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmWeight, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmWeight, 28) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmOverhang, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmOverhang, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmOverhang, 32) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmDigitizedAspectX, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmDigitizedAspectX, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmDigitizedAspectX, 36) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmDigitizedAspectY, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmDigitizedAspectY, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmDigitizedAspectY, 40) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmFirstChar, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmFirstChar, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmFirstChar, 44) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmLastChar, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmLastChar, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmLastChar, 45) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmDefaultChar, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmDefaultChar, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmDefaultChar, 46) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmBreakChar, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmBreakChar, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmBreakChar, 47) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmItalic, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmItalic, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmItalic, 48) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmUnderlined, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmUnderlined, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmUnderlined, 49) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmStruckOut, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmStruckOut, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmStruckOut, 50) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmPitchAndFamily, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmPitchAndFamily, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmPitchAndFamily, 51) + TEST_FIELD_SIZE (NEWTEXTMETRICA, tmCharSet, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, tmCharSet, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, tmCharSet, 52) + TEST_FIELD_SIZE (NEWTEXTMETRICA, ntmFlags, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, ntmFlags, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, ntmFlags, 56) + TEST_FIELD_SIZE (NEWTEXTMETRICA, ntmSizeEM, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, ntmSizeEM, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, ntmSizeEM, 60) + TEST_FIELD_SIZE (NEWTEXTMETRICA, ntmCellHeight, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, ntmCellHeight, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, ntmCellHeight, 64) + TEST_FIELD_SIZE (NEWTEXTMETRICA, ntmAvgWidth, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICA, ntmAvgWidth, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICA, ntmAvgWidth, 68) +} + +static void test_pack_NEWTEXTMETRICEXA(void) +{ + /* NEWTEXTMETRICEXA */ + TEST_TYPE_SIZE (NEWTEXTMETRICEXA, 96) + TEST_TYPE_ALIGN (NEWTEXTMETRICEXA, 4) + TEST_FIELD_SIZE (NEWTEXTMETRICEXA, ntmTm, 72) + TEST_FIELD_ALIGN (NEWTEXTMETRICEXA, ntmTm, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICEXA, ntmTm, 0) + TEST_FIELD_SIZE (NEWTEXTMETRICEXA, ntmFontSig, 24) + TEST_FIELD_ALIGN (NEWTEXTMETRICEXA, ntmFontSig, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICEXA, ntmFontSig, 72) +} + +static void test_pack_NEWTEXTMETRICEXW(void) +{ + /* NEWTEXTMETRICEXW */ + TEST_TYPE_SIZE (NEWTEXTMETRICEXW, 100) + TEST_TYPE_ALIGN (NEWTEXTMETRICEXW, 4) + TEST_FIELD_SIZE (NEWTEXTMETRICEXW, ntmTm, 76) + TEST_FIELD_ALIGN (NEWTEXTMETRICEXW, ntmTm, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICEXW, ntmTm, 0) + TEST_FIELD_SIZE (NEWTEXTMETRICEXW, ntmFontSig, 24) + TEST_FIELD_ALIGN (NEWTEXTMETRICEXW, ntmFontSig, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICEXW, ntmFontSig, 76) +} + +static void test_pack_NEWTEXTMETRICW(void) +{ + /* NEWTEXTMETRICW */ + TEST_TYPE_SIZE (NEWTEXTMETRICW, 76) + TEST_TYPE_ALIGN (NEWTEXTMETRICW, 4) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmHeight, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmHeight, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmHeight, 0) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmAscent, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmAscent, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmAscent, 4) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmDescent, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmDescent, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmDescent, 8) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmInternalLeading, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmInternalLeading, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmInternalLeading, 12) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmExternalLeading, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmExternalLeading, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmExternalLeading, 16) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmAveCharWidth, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmAveCharWidth, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmAveCharWidth, 20) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmMaxCharWidth, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmMaxCharWidth, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmMaxCharWidth, 24) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmWeight, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmWeight, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmWeight, 28) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmOverhang, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmOverhang, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmOverhang, 32) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmDigitizedAspectX, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmDigitizedAspectX, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmDigitizedAspectX, 36) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmDigitizedAspectY, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmDigitizedAspectY, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmDigitizedAspectY, 40) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmFirstChar, 2) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmFirstChar, 2) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmFirstChar, 44) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmLastChar, 2) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmLastChar, 2) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmLastChar, 46) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmDefaultChar, 2) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmDefaultChar, 2) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmDefaultChar, 48) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmBreakChar, 2) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmBreakChar, 2) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmBreakChar, 50) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmItalic, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmItalic, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmItalic, 52) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmUnderlined, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmUnderlined, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmUnderlined, 53) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmStruckOut, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmStruckOut, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmStruckOut, 54) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmPitchAndFamily, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmPitchAndFamily, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmPitchAndFamily, 55) + TEST_FIELD_SIZE (NEWTEXTMETRICW, tmCharSet, 1) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, tmCharSet, 1) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, tmCharSet, 56) + TEST_FIELD_SIZE (NEWTEXTMETRICW, ntmFlags, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, ntmFlags, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, ntmFlags, 60) + TEST_FIELD_SIZE (NEWTEXTMETRICW, ntmSizeEM, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, ntmSizeEM, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, ntmSizeEM, 64) + TEST_FIELD_SIZE (NEWTEXTMETRICW, ntmCellHeight, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, ntmCellHeight, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, ntmCellHeight, 68) + TEST_FIELD_SIZE (NEWTEXTMETRICW, ntmAvgWidth, 4) + TEST_FIELD_ALIGN (NEWTEXTMETRICW, ntmAvgWidth, 4) + TEST_FIELD_OFFSET(NEWTEXTMETRICW, ntmAvgWidth, 72) +} + +static void test_pack_NPEXTLOGPEN(void) +{ + /* NPEXTLOGPEN */ + TEST_TYPE_SIZE (NPEXTLOGPEN, 8) + TEST_TYPE_ALIGN (NPEXTLOGPEN, 8) + TEST_TARGET_SIZE (NPEXTLOGPEN, 32) + TEST_TARGET_ALIGN(NPEXTLOGPEN, 8) +} + +static void test_pack_OLDFONTENUMPROC(void) +{ + /* OLDFONTENUMPROC */ + TEST_TYPE_SIZE (OLDFONTENUMPROC, 8) + TEST_TYPE_ALIGN (OLDFONTENUMPROC, 8) +} + +static void test_pack_OLDFONTENUMPROCA(void) +{ + /* OLDFONTENUMPROCA */ + TEST_TYPE_SIZE (OLDFONTENUMPROCA, 8) + TEST_TYPE_ALIGN (OLDFONTENUMPROCA, 8) +} + +static void test_pack_OLDFONTENUMPROCW(void) +{ + /* OLDFONTENUMPROCW */ + TEST_TYPE_SIZE (OLDFONTENUMPROCW, 8) + TEST_TYPE_ALIGN (OLDFONTENUMPROCW, 8) +} + +static void test_pack_OUTLINETEXTMETRICA(void) +{ + /* OUTLINETEXTMETRICA */ + TEST_TYPE_SIZE (OUTLINETEXTMETRICA, 232) + TEST_TYPE_ALIGN (OUTLINETEXTMETRICA, 8) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmSize, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmSize, 0) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmTextMetrics, 56) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmTextMetrics, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmTextMetrics, 4) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmFiller, 1) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmFiller, 1) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmFiller, 60) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmPanoseNumber, 10) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmPanoseNumber, 1) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmPanoseNumber, 61) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmfsSelection, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmfsSelection, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmfsSelection, 72) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmfsType, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmfsType, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmfsType, 76) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmsCharSlopeRise, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmsCharSlopeRise, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmsCharSlopeRise, 80) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmsCharSlopeRun, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmsCharSlopeRun, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmsCharSlopeRun, 84) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmItalicAngle, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmItalicAngle, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmItalicAngle, 88) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmEMSquare, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmEMSquare, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmEMSquare, 92) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmAscent, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmAscent, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmAscent, 96) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmDescent, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmDescent, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmDescent, 100) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmLineGap, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmLineGap, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmLineGap, 104) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmsCapEmHeight, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmsCapEmHeight, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmsCapEmHeight, 108) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmsXHeight, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmsXHeight, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmsXHeight, 112) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmrcFontBox, 16) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmrcFontBox, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmrcFontBox, 116) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmMacAscent, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmMacAscent, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmMacAscent, 132) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmMacDescent, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmMacDescent, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmMacDescent, 136) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmMacLineGap, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmMacLineGap, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmMacLineGap, 140) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmusMinimumPPEM, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmusMinimumPPEM, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmusMinimumPPEM, 144) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmptSubscriptSize, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmptSubscriptSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmptSubscriptSize, 148) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmptSubscriptOffset, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmptSubscriptOffset, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmptSubscriptOffset, 156) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmptSuperscriptSize, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmptSuperscriptSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmptSuperscriptSize, 164) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmptSuperscriptOffset, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmptSuperscriptOffset, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmptSuperscriptOffset, 172) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmsStrikeoutSize, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmsStrikeoutSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmsStrikeoutSize, 180) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmsStrikeoutPosition, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmsStrikeoutPosition, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmsStrikeoutPosition, 184) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmsUnderscoreSize, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmsUnderscoreSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmsUnderscoreSize, 188) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmsUnderscorePosition, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmsUnderscorePosition, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmsUnderscorePosition, 192) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmpFamilyName, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmpFamilyName, 8) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmpFamilyName, 200) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmpFaceName, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmpFaceName, 8) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmpFaceName, 208) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmpStyleName, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmpStyleName, 8) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmpStyleName, 216) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmpFullName, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmpFullName, 8) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmpFullName, 224) +} + +static void test_pack_OUTLINETEXTMETRICW(void) +{ + /* OUTLINETEXTMETRICW */ + TEST_TYPE_SIZE (OUTLINETEXTMETRICW, 232) + TEST_TYPE_ALIGN (OUTLINETEXTMETRICW, 8) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmSize, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmSize, 0) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmTextMetrics, 60) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmTextMetrics, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmTextMetrics, 4) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmFiller, 1) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmFiller, 1) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmFiller, 64) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmPanoseNumber, 10) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmPanoseNumber, 1) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmPanoseNumber, 65) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmfsSelection, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmfsSelection, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmfsSelection, 76) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmfsType, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmfsType, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmfsType, 80) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmsCharSlopeRise, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmsCharSlopeRise, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmsCharSlopeRise, 84) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmsCharSlopeRun, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmsCharSlopeRun, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmsCharSlopeRun, 88) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmItalicAngle, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmItalicAngle, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmItalicAngle, 92) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmEMSquare, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmEMSquare, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmEMSquare, 96) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmAscent, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmAscent, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmAscent, 100) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmDescent, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmDescent, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmDescent, 104) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmLineGap, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmLineGap, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmLineGap, 108) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmsCapEmHeight, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmsCapEmHeight, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmsCapEmHeight, 112) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmsXHeight, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmsXHeight, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmsXHeight, 116) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmrcFontBox, 16) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmrcFontBox, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmrcFontBox, 120) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmMacAscent, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmMacAscent, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmMacAscent, 136) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmMacDescent, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmMacDescent, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmMacDescent, 140) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmMacLineGap, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmMacLineGap, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmMacLineGap, 144) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmusMinimumPPEM, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmusMinimumPPEM, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmusMinimumPPEM, 148) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmptSubscriptSize, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmptSubscriptSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmptSubscriptSize, 152) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmptSubscriptOffset, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmptSubscriptOffset, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmptSubscriptOffset, 160) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmptSuperscriptSize, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmptSuperscriptSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmptSuperscriptSize, 168) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmptSuperscriptOffset, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmptSuperscriptOffset, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmptSuperscriptOffset, 176) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmsStrikeoutSize, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmsStrikeoutSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmsStrikeoutSize, 184) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmsStrikeoutPosition, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmsStrikeoutPosition, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmsStrikeoutPosition, 188) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmsUnderscoreSize, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmsUnderscoreSize, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmsUnderscoreSize, 192) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmsUnderscorePosition, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmsUnderscorePosition, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmsUnderscorePosition, 196) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmpFamilyName, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmpFamilyName, 8) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmpFamilyName, 200) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmpFaceName, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmpFaceName, 8) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmpFaceName, 208) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmpStyleName, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmpStyleName, 8) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmpStyleName, 216) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmpFullName, 8) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmpFullName, 8) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmpFullName, 224) +} + +static void test_pack_PABC(void) +{ + /* PABC */ + TEST_TYPE_SIZE (PABC, 8) + TEST_TYPE_ALIGN (PABC, 8) + TEST_TARGET_SIZE (PABC, 12) + TEST_TARGET_ALIGN(PABC, 4) +} + +static void test_pack_PABCFLOAT(void) +{ + /* PABCFLOAT */ + TEST_TYPE_SIZE (PABCFLOAT, 8) + TEST_TYPE_ALIGN (PABCFLOAT, 8) + TEST_TARGET_SIZE (PABCFLOAT, 12) + TEST_TARGET_ALIGN(PABCFLOAT, 4) +} + +static void test_pack_PANOSE(void) +{ + /* PANOSE */ + TEST_TYPE_SIZE (PANOSE, 10) + TEST_TYPE_ALIGN (PANOSE, 1) + TEST_FIELD_SIZE (PANOSE, bFamilyType, 1) + TEST_FIELD_ALIGN (PANOSE, bFamilyType, 1) + TEST_FIELD_OFFSET(PANOSE, bFamilyType, 0) + TEST_FIELD_SIZE (PANOSE, bSerifStyle, 1) + TEST_FIELD_ALIGN (PANOSE, bSerifStyle, 1) + TEST_FIELD_OFFSET(PANOSE, bSerifStyle, 1) + TEST_FIELD_SIZE (PANOSE, bWeight, 1) + TEST_FIELD_ALIGN (PANOSE, bWeight, 1) + TEST_FIELD_OFFSET(PANOSE, bWeight, 2) + TEST_FIELD_SIZE (PANOSE, bProportion, 1) + TEST_FIELD_ALIGN (PANOSE, bProportion, 1) + TEST_FIELD_OFFSET(PANOSE, bProportion, 3) + TEST_FIELD_SIZE (PANOSE, bContrast, 1) + TEST_FIELD_ALIGN (PANOSE, bContrast, 1) + TEST_FIELD_OFFSET(PANOSE, bContrast, 4) + TEST_FIELD_SIZE (PANOSE, bStrokeVariation, 1) + TEST_FIELD_ALIGN (PANOSE, bStrokeVariation, 1) + TEST_FIELD_OFFSET(PANOSE, bStrokeVariation, 5) + TEST_FIELD_SIZE (PANOSE, bArmStyle, 1) + TEST_FIELD_ALIGN (PANOSE, bArmStyle, 1) + TEST_FIELD_OFFSET(PANOSE, bArmStyle, 6) + TEST_FIELD_SIZE (PANOSE, bLetterform, 1) + TEST_FIELD_ALIGN (PANOSE, bLetterform, 1) + TEST_FIELD_OFFSET(PANOSE, bLetterform, 7) + TEST_FIELD_SIZE (PANOSE, bMidline, 1) + TEST_FIELD_ALIGN (PANOSE, bMidline, 1) + TEST_FIELD_OFFSET(PANOSE, bMidline, 8) + TEST_FIELD_SIZE (PANOSE, bXHeight, 1) + TEST_FIELD_ALIGN (PANOSE, bXHeight, 1) + TEST_FIELD_OFFSET(PANOSE, bXHeight, 9) +} + +static void test_pack_PATTERN(void) +{ + /* PATTERN */ + TEST_TYPE_SIZE (PATTERN, 16) + TEST_TYPE_ALIGN (PATTERN, 8) +} + +static void test_pack_PBITMAP(void) +{ + /* PBITMAP */ + TEST_TYPE_SIZE (PBITMAP, 8) + TEST_TYPE_ALIGN (PBITMAP, 8) + TEST_TARGET_SIZE (PBITMAP, 32) + TEST_TARGET_ALIGN(PBITMAP, 8) +} + +static void test_pack_PBITMAPCOREHEADER(void) +{ + /* PBITMAPCOREHEADER */ + TEST_TYPE_SIZE (PBITMAPCOREHEADER, 8) + TEST_TYPE_ALIGN (PBITMAPCOREHEADER, 8) + TEST_TARGET_SIZE (PBITMAPCOREHEADER, 12) + TEST_TARGET_ALIGN(PBITMAPCOREHEADER, 4) +} + +static void test_pack_PBITMAPCOREINFO(void) +{ + /* PBITMAPCOREINFO */ + TEST_TYPE_SIZE (PBITMAPCOREINFO, 8) + TEST_TYPE_ALIGN (PBITMAPCOREINFO, 8) + TEST_TARGET_SIZE (PBITMAPCOREINFO, 16) + TEST_TARGET_ALIGN(PBITMAPCOREINFO, 4) +} + +static void test_pack_PBITMAPFILEHEADER(void) +{ + /* PBITMAPFILEHEADER */ + TEST_TYPE_SIZE (PBITMAPFILEHEADER, 8) + TEST_TYPE_ALIGN (PBITMAPFILEHEADER, 8) + TEST_TARGET_SIZE (PBITMAPFILEHEADER, 14) + TEST_TARGET_ALIGN(PBITMAPFILEHEADER, 2) +} + +static void test_pack_PBITMAPINFO(void) +{ + /* PBITMAPINFO */ + TEST_TYPE_SIZE (PBITMAPINFO, 8) + TEST_TYPE_ALIGN (PBITMAPINFO, 8) + TEST_TARGET_SIZE (PBITMAPINFO, 44) + TEST_TARGET_ALIGN(PBITMAPINFO, 4) +} + +static void test_pack_PBITMAPINFOHEADER(void) +{ + /* PBITMAPINFOHEADER */ + TEST_TYPE_SIZE (PBITMAPINFOHEADER, 8) + TEST_TYPE_ALIGN (PBITMAPINFOHEADER, 8) + TEST_TARGET_SIZE (PBITMAPINFOHEADER, 40) + TEST_TARGET_ALIGN(PBITMAPINFOHEADER, 4) +} + +static void test_pack_PBITMAPV4HEADER(void) +{ + /* PBITMAPV4HEADER */ + TEST_TYPE_SIZE (PBITMAPV4HEADER, 8) + TEST_TYPE_ALIGN (PBITMAPV4HEADER, 8) + TEST_TARGET_SIZE (PBITMAPV4HEADER, 108) + TEST_TARGET_ALIGN(PBITMAPV4HEADER, 4) +} + +static void test_pack_PBITMAPV5HEADER(void) +{ + /* PBITMAPV5HEADER */ + TEST_TYPE_SIZE (PBITMAPV5HEADER, 8) + TEST_TYPE_ALIGN (PBITMAPV5HEADER, 8) + TEST_TARGET_SIZE (PBITMAPV5HEADER, 124) + TEST_TARGET_ALIGN(PBITMAPV5HEADER, 4) +} + +static void test_pack_PBLENDFUNCTION(void) +{ + /* PBLENDFUNCTION */ + TEST_TYPE_SIZE (PBLENDFUNCTION, 8) + TEST_TYPE_ALIGN (PBLENDFUNCTION, 8) + TEST_TARGET_SIZE (PBLENDFUNCTION, 4) + TEST_TARGET_ALIGN(PBLENDFUNCTION, 1) +} + +static void test_pack_PCHARSETINFO(void) +{ + /* PCHARSETINFO */ + TEST_TYPE_SIZE (PCHARSETINFO, 8) + TEST_TYPE_ALIGN (PCHARSETINFO, 8) + TEST_TARGET_SIZE (PCHARSETINFO, 32) + TEST_TARGET_ALIGN(PCHARSETINFO, 4) +} + +static void test_pack_PCOLORADJUSTMENT(void) +{ + /* PCOLORADJUSTMENT */ + TEST_TYPE_SIZE (PCOLORADJUSTMENT, 8) + TEST_TYPE_ALIGN (PCOLORADJUSTMENT, 8) + TEST_TARGET_SIZE (PCOLORADJUSTMENT, 24) + TEST_TARGET_ALIGN(PCOLORADJUSTMENT, 2) +} + +static void test_pack_PDEVMODEA(void) +{ + /* PDEVMODEA */ + TEST_TYPE_SIZE (PDEVMODEA, 8) + TEST_TYPE_ALIGN (PDEVMODEA, 8) +} + +static void test_pack_PDEVMODEW(void) +{ + /* PDEVMODEW */ + TEST_TYPE_SIZE (PDEVMODEW, 8) + TEST_TYPE_ALIGN (PDEVMODEW, 8) +} + +static void test_pack_PDIBSECTION(void) +{ + /* PDIBSECTION */ + TEST_TYPE_SIZE (PDIBSECTION, 8) + TEST_TYPE_ALIGN (PDIBSECTION, 8) + TEST_TARGET_SIZE (PDIBSECTION, 104) + TEST_TARGET_ALIGN(PDIBSECTION, 8) +} + +static void test_pack_PDISPLAY_DEVICEA(void) +{ + /* PDISPLAY_DEVICEA */ + TEST_TYPE_SIZE (PDISPLAY_DEVICEA, 8) + TEST_TYPE_ALIGN (PDISPLAY_DEVICEA, 8) + TEST_TARGET_SIZE (PDISPLAY_DEVICEA, 424) + TEST_TARGET_ALIGN(PDISPLAY_DEVICEA, 4) +} + +static void test_pack_PDISPLAY_DEVICEW(void) +{ + /* PDISPLAY_DEVICEW */ + TEST_TYPE_SIZE (PDISPLAY_DEVICEW, 8) + TEST_TYPE_ALIGN (PDISPLAY_DEVICEW, 8) + TEST_TARGET_SIZE (PDISPLAY_DEVICEW, 840) + TEST_TARGET_ALIGN(PDISPLAY_DEVICEW, 4) +} + +static void test_pack_PELARRAY(void) +{ + /* PELARRAY */ + TEST_TYPE_SIZE (PELARRAY, 20) + TEST_TYPE_ALIGN (PELARRAY, 4) + TEST_FIELD_SIZE (PELARRAY, paXCount, 4) + TEST_FIELD_ALIGN (PELARRAY, paXCount, 4) + TEST_FIELD_OFFSET(PELARRAY, paXCount, 0) + TEST_FIELD_SIZE (PELARRAY, paYCount, 4) + TEST_FIELD_ALIGN (PELARRAY, paYCount, 4) + TEST_FIELD_OFFSET(PELARRAY, paYCount, 4) + TEST_FIELD_SIZE (PELARRAY, paXExt, 4) + TEST_FIELD_ALIGN (PELARRAY, paXExt, 4) + TEST_FIELD_OFFSET(PELARRAY, paXExt, 8) + TEST_FIELD_SIZE (PELARRAY, paYExt, 4) + TEST_FIELD_ALIGN (PELARRAY, paYExt, 4) + TEST_FIELD_OFFSET(PELARRAY, paYExt, 12) + TEST_FIELD_SIZE (PELARRAY, paRGBs, 1) + TEST_FIELD_ALIGN (PELARRAY, paRGBs, 1) + TEST_FIELD_OFFSET(PELARRAY, paRGBs, 16) +} + +static void test_pack_PEMR(void) +{ + /* PEMR */ + TEST_TYPE_SIZE (PEMR, 8) + TEST_TYPE_ALIGN (PEMR, 8) + TEST_TARGET_SIZE (PEMR, 8) + TEST_TARGET_ALIGN(PEMR, 4) +} + +static void test_pack_PEMRABORTPATH(void) +{ + /* PEMRABORTPATH */ + TEST_TYPE_SIZE (PEMRABORTPATH, 8) + TEST_TYPE_ALIGN (PEMRABORTPATH, 8) + TEST_TARGET_SIZE (PEMRABORTPATH, 8) + TEST_TARGET_ALIGN(PEMRABORTPATH, 4) +} + +static void test_pack_PEMRANGLEARC(void) +{ + /* PEMRANGLEARC */ + TEST_TYPE_SIZE (PEMRANGLEARC, 8) + TEST_TYPE_ALIGN (PEMRANGLEARC, 8) + TEST_TARGET_SIZE (PEMRANGLEARC, 28) + TEST_TARGET_ALIGN(PEMRANGLEARC, 4) +} + +static void test_pack_PEMRARC(void) +{ + /* PEMRARC */ + TEST_TYPE_SIZE (PEMRARC, 8) + TEST_TYPE_ALIGN (PEMRARC, 8) + TEST_TARGET_SIZE (PEMRARC, 40) + TEST_TARGET_ALIGN(PEMRARC, 4) +} + +static void test_pack_PEMRARCTO(void) +{ + /* PEMRARCTO */ + TEST_TYPE_SIZE (PEMRARCTO, 8) + TEST_TYPE_ALIGN (PEMRARCTO, 8) + TEST_TARGET_SIZE (PEMRARCTO, 40) + TEST_TARGET_ALIGN(PEMRARCTO, 4) +} + +static void test_pack_PEMRBEGINPATH(void) +{ + /* PEMRBEGINPATH */ + TEST_TYPE_SIZE (PEMRBEGINPATH, 8) + TEST_TYPE_ALIGN (PEMRBEGINPATH, 8) + TEST_TARGET_SIZE (PEMRBEGINPATH, 8) + TEST_TARGET_ALIGN(PEMRBEGINPATH, 4) +} + +static void test_pack_PEMRBITBLT(void) +{ + /* PEMRBITBLT */ + TEST_TYPE_SIZE (PEMRBITBLT, 8) + TEST_TYPE_ALIGN (PEMRBITBLT, 8) + TEST_TARGET_SIZE (PEMRBITBLT, 100) + TEST_TARGET_ALIGN(PEMRBITBLT, 4) +} + +static void test_pack_PEMRCHORD(void) +{ + /* PEMRCHORD */ + TEST_TYPE_SIZE (PEMRCHORD, 8) + TEST_TYPE_ALIGN (PEMRCHORD, 8) + TEST_TARGET_SIZE (PEMRCHORD, 40) + TEST_TARGET_ALIGN(PEMRCHORD, 4) +} + +static void test_pack_PEMRCLOSEFIGURE(void) +{ + /* PEMRCLOSEFIGURE */ + TEST_TYPE_SIZE (PEMRCLOSEFIGURE, 8) + TEST_TYPE_ALIGN (PEMRCLOSEFIGURE, 8) + TEST_TARGET_SIZE (PEMRCLOSEFIGURE, 8) + TEST_TARGET_ALIGN(PEMRCLOSEFIGURE, 4) +} + +static void test_pack_PEMRCREATEBRUSHINDIRECT(void) +{ + /* PEMRCREATEBRUSHINDIRECT */ + TEST_TYPE_SIZE (PEMRCREATEBRUSHINDIRECT, 8) + TEST_TYPE_ALIGN (PEMRCREATEBRUSHINDIRECT, 8) + TEST_TARGET_SIZE (PEMRCREATEBRUSHINDIRECT, 24) + TEST_TARGET_ALIGN(PEMRCREATEBRUSHINDIRECT, 4) +} + +static void test_pack_PEMRCREATECOLORSPACE(void) +{ + /* PEMRCREATECOLORSPACE */ + TEST_TYPE_SIZE (PEMRCREATECOLORSPACE, 8) + TEST_TYPE_ALIGN (PEMRCREATECOLORSPACE, 8) + TEST_TARGET_SIZE (PEMRCREATECOLORSPACE, 340) + TEST_TARGET_ALIGN(PEMRCREATECOLORSPACE, 4) +} + +static void test_pack_PEMRCREATECOLORSPACEW(void) +{ + /* PEMRCREATECOLORSPACEW */ + TEST_TYPE_SIZE (PEMRCREATECOLORSPACEW, 8) + TEST_TYPE_ALIGN (PEMRCREATECOLORSPACEW, 8) + TEST_TARGET_SIZE (PEMRCREATECOLORSPACEW, 612) + TEST_TARGET_ALIGN(PEMRCREATECOLORSPACEW, 4) +} + +static void test_pack_PEMRCREATEDIBPATTERNBRUSHPT(void) +{ + /* PEMRCREATEDIBPATTERNBRUSHPT */ + TEST_TYPE_SIZE (PEMRCREATEDIBPATTERNBRUSHPT, 8) + TEST_TYPE_ALIGN (PEMRCREATEDIBPATTERNBRUSHPT, 8) + TEST_TARGET_SIZE (PEMRCREATEDIBPATTERNBRUSHPT, 32) + TEST_TARGET_ALIGN(PEMRCREATEDIBPATTERNBRUSHPT, 4) +} + +static void test_pack_PEMRCREATEMONOBRUSH(void) +{ + /* PEMRCREATEMONOBRUSH */ + TEST_TYPE_SIZE (PEMRCREATEMONOBRUSH, 8) + TEST_TYPE_ALIGN (PEMRCREATEMONOBRUSH, 8) + TEST_TARGET_SIZE (PEMRCREATEMONOBRUSH, 32) + TEST_TARGET_ALIGN(PEMRCREATEMONOBRUSH, 4) +} + +static void test_pack_PEMRCREATEPALETTE(void) +{ + /* PEMRCREATEPALETTE */ + TEST_TYPE_SIZE (PEMRCREATEPALETTE, 8) + TEST_TYPE_ALIGN (PEMRCREATEPALETTE, 8) + TEST_TARGET_SIZE (PEMRCREATEPALETTE, 20) + TEST_TARGET_ALIGN(PEMRCREATEPALETTE, 4) +} + +static void test_pack_PEMRCREATEPEN(void) +{ + /* PEMRCREATEPEN */ + TEST_TYPE_SIZE (PEMRCREATEPEN, 8) + TEST_TYPE_ALIGN (PEMRCREATEPEN, 8) + TEST_TARGET_SIZE (PEMRCREATEPEN, 28) + TEST_TARGET_ALIGN(PEMRCREATEPEN, 4) +} + +static void test_pack_PEMRDELETECOLORSPACE(void) +{ + /* PEMRDELETECOLORSPACE */ + TEST_TYPE_SIZE (PEMRDELETECOLORSPACE, 8) + TEST_TYPE_ALIGN (PEMRDELETECOLORSPACE, 8) + TEST_TARGET_SIZE (PEMRDELETECOLORSPACE, 12) + TEST_TARGET_ALIGN(PEMRDELETECOLORSPACE, 4) +} + +static void test_pack_PEMRDELETEOBJECT(void) +{ + /* PEMRDELETEOBJECT */ + TEST_TYPE_SIZE (PEMRDELETEOBJECT, 8) + TEST_TYPE_ALIGN (PEMRDELETEOBJECT, 8) + TEST_TARGET_SIZE (PEMRDELETEOBJECT, 12) + TEST_TARGET_ALIGN(PEMRDELETEOBJECT, 4) +} + +static void test_pack_PEMRELLIPSE(void) +{ + /* PEMRELLIPSE */ + TEST_TYPE_SIZE (PEMRELLIPSE, 8) + TEST_TYPE_ALIGN (PEMRELLIPSE, 8) + TEST_TARGET_SIZE (PEMRELLIPSE, 24) + TEST_TARGET_ALIGN(PEMRELLIPSE, 4) +} + +static void test_pack_PEMRENDPATH(void) +{ + /* PEMRENDPATH */ + TEST_TYPE_SIZE (PEMRENDPATH, 8) + TEST_TYPE_ALIGN (PEMRENDPATH, 8) + TEST_TARGET_SIZE (PEMRENDPATH, 8) + TEST_TARGET_ALIGN(PEMRENDPATH, 4) +} + +static void test_pack_PEMREOF(void) +{ + /* PEMREOF */ + TEST_TYPE_SIZE (PEMREOF, 8) + TEST_TYPE_ALIGN (PEMREOF, 8) + TEST_TARGET_SIZE (PEMREOF, 20) + TEST_TARGET_ALIGN(PEMREOF, 4) +} + +static void test_pack_PEMREXCLUDECLIPRECT(void) +{ + /* PEMREXCLUDECLIPRECT */ + TEST_TYPE_SIZE (PEMREXCLUDECLIPRECT, 8) + TEST_TYPE_ALIGN (PEMREXCLUDECLIPRECT, 8) + TEST_TARGET_SIZE (PEMREXCLUDECLIPRECT, 24) + TEST_TARGET_ALIGN(PEMREXCLUDECLIPRECT, 4) +} + +static void test_pack_PEMREXTCREATEFONTINDIRECTW(void) +{ + /* PEMREXTCREATEFONTINDIRECTW */ + TEST_TYPE_SIZE (PEMREXTCREATEFONTINDIRECTW, 8) + TEST_TYPE_ALIGN (PEMREXTCREATEFONTINDIRECTW, 8) + TEST_TARGET_SIZE (PEMREXTCREATEFONTINDIRECTW, 332) + TEST_TARGET_ALIGN(PEMREXTCREATEFONTINDIRECTW, 4) +} + +static void test_pack_PEMREXTCREATEPEN(void) +{ + /* PEMREXTCREATEPEN */ + TEST_TYPE_SIZE (PEMREXTCREATEPEN, 8) + TEST_TYPE_ALIGN (PEMREXTCREATEPEN, 8) + TEST_TARGET_SIZE (PEMREXTCREATEPEN, 64) + TEST_TARGET_ALIGN(PEMREXTCREATEPEN, 8) +} + +static void test_pack_PEMREXTFLOODFILL(void) +{ + /* PEMREXTFLOODFILL */ + TEST_TYPE_SIZE (PEMREXTFLOODFILL, 8) + TEST_TYPE_ALIGN (PEMREXTFLOODFILL, 8) + TEST_TARGET_SIZE (PEMREXTFLOODFILL, 24) + TEST_TARGET_ALIGN(PEMREXTFLOODFILL, 4) +} + +static void test_pack_PEMREXTSELECTCLIPRGN(void) +{ + /* PEMREXTSELECTCLIPRGN */ + TEST_TYPE_SIZE (PEMREXTSELECTCLIPRGN, 8) + TEST_TYPE_ALIGN (PEMREXTSELECTCLIPRGN, 8) + TEST_TARGET_SIZE (PEMREXTSELECTCLIPRGN, 20) + TEST_TARGET_ALIGN(PEMREXTSELECTCLIPRGN, 4) +} + +static void test_pack_PEMREXTTEXTOUTA(void) +{ + /* PEMREXTTEXTOUTA */ + TEST_TYPE_SIZE (PEMREXTTEXTOUTA, 8) + TEST_TYPE_ALIGN (PEMREXTTEXTOUTA, 8) + TEST_TARGET_SIZE (PEMREXTTEXTOUTA, 76) + TEST_TARGET_ALIGN(PEMREXTTEXTOUTA, 4) +} + +static void test_pack_PEMREXTTEXTOUTW(void) +{ + /* PEMREXTTEXTOUTW */ + TEST_TYPE_SIZE (PEMREXTTEXTOUTW, 8) + TEST_TYPE_ALIGN (PEMREXTTEXTOUTW, 8) + TEST_TARGET_SIZE (PEMREXTTEXTOUTW, 76) + TEST_TARGET_ALIGN(PEMREXTTEXTOUTW, 4) +} + +static void test_pack_PEMRFILLPATH(void) +{ + /* PEMRFILLPATH */ + TEST_TYPE_SIZE (PEMRFILLPATH, 8) + TEST_TYPE_ALIGN (PEMRFILLPATH, 8) + TEST_TARGET_SIZE (PEMRFILLPATH, 24) + TEST_TARGET_ALIGN(PEMRFILLPATH, 4) +} + +static void test_pack_PEMRFILLRGN(void) +{ + /* PEMRFILLRGN */ + TEST_TYPE_SIZE (PEMRFILLRGN, 8) + TEST_TYPE_ALIGN (PEMRFILLRGN, 8) + TEST_TARGET_SIZE (PEMRFILLRGN, 36) + TEST_TARGET_ALIGN(PEMRFILLRGN, 4) +} + +static void test_pack_PEMRFLATTENPATH(void) +{ + /* PEMRFLATTENPATH */ + TEST_TYPE_SIZE (PEMRFLATTENPATH, 8) + TEST_TYPE_ALIGN (PEMRFLATTENPATH, 8) + TEST_TARGET_SIZE (PEMRFLATTENPATH, 8) + TEST_TARGET_ALIGN(PEMRFLATTENPATH, 4) +} + +static void test_pack_PEMRFORMAT(void) +{ + /* PEMRFORMAT */ + TEST_TYPE_SIZE (PEMRFORMAT, 8) + TEST_TYPE_ALIGN (PEMRFORMAT, 8) + TEST_TARGET_SIZE (PEMRFORMAT, 16) + TEST_TARGET_ALIGN(PEMRFORMAT, 4) +} + +static void test_pack_PEMRFRAMERGN(void) +{ + /* PEMRFRAMERGN */ + TEST_TYPE_SIZE (PEMRFRAMERGN, 8) + TEST_TYPE_ALIGN (PEMRFRAMERGN, 8) + TEST_TARGET_SIZE (PEMRFRAMERGN, 44) + TEST_TARGET_ALIGN(PEMRFRAMERGN, 4) +} + +static void test_pack_PEMRGDICOMMENT(void) +{ + /* PEMRGDICOMMENT */ + TEST_TYPE_SIZE (PEMRGDICOMMENT, 8) + TEST_TYPE_ALIGN (PEMRGDICOMMENT, 8) + TEST_TARGET_SIZE (PEMRGDICOMMENT, 16) + TEST_TARGET_ALIGN(PEMRGDICOMMENT, 4) +} + +static void test_pack_PEMRGLSBOUNDEDRECORD(void) +{ + /* PEMRGLSBOUNDEDRECORD */ + TEST_TYPE_SIZE (PEMRGLSBOUNDEDRECORD, 8) + TEST_TYPE_ALIGN (PEMRGLSBOUNDEDRECORD, 8) + TEST_TARGET_SIZE (PEMRGLSBOUNDEDRECORD, 32) + TEST_TARGET_ALIGN(PEMRGLSBOUNDEDRECORD, 4) +} + +static void test_pack_PEMRGLSRECORD(void) +{ + /* PEMRGLSRECORD */ + TEST_TYPE_SIZE (PEMRGLSRECORD, 8) + TEST_TYPE_ALIGN (PEMRGLSRECORD, 8) + TEST_TARGET_SIZE (PEMRGLSRECORD, 16) + TEST_TARGET_ALIGN(PEMRGLSRECORD, 4) +} + +static void test_pack_PEMRINTERSECTCLIPRECT(void) +{ + /* PEMRINTERSECTCLIPRECT */ + TEST_TYPE_SIZE (PEMRINTERSECTCLIPRECT, 8) + TEST_TYPE_ALIGN (PEMRINTERSECTCLIPRECT, 8) + TEST_TARGET_SIZE (PEMRINTERSECTCLIPRECT, 24) + TEST_TARGET_ALIGN(PEMRINTERSECTCLIPRECT, 4) +} + +static void test_pack_PEMRINVERTRGN(void) +{ + /* PEMRINVERTRGN */ + TEST_TYPE_SIZE (PEMRINVERTRGN, 8) + TEST_TYPE_ALIGN (PEMRINVERTRGN, 8) + TEST_TARGET_SIZE (PEMRINVERTRGN, 32) + TEST_TARGET_ALIGN(PEMRINVERTRGN, 4) +} + +static void test_pack_PEMRLINETO(void) +{ + /* PEMRLINETO */ + TEST_TYPE_SIZE (PEMRLINETO, 8) + TEST_TYPE_ALIGN (PEMRLINETO, 8) + TEST_TARGET_SIZE (PEMRLINETO, 16) + TEST_TARGET_ALIGN(PEMRLINETO, 4) +} + +static void test_pack_PEMRMASKBLT(void) +{ + /* PEMRMASKBLT */ + TEST_TYPE_SIZE (PEMRMASKBLT, 8) + TEST_TYPE_ALIGN (PEMRMASKBLT, 8) + TEST_TARGET_SIZE (PEMRMASKBLT, 128) + TEST_TARGET_ALIGN(PEMRMASKBLT, 4) +} + +static void test_pack_PEMRMODIFYWORLDTRANSFORM(void) +{ + /* PEMRMODIFYWORLDTRANSFORM */ + TEST_TYPE_SIZE (PEMRMODIFYWORLDTRANSFORM, 8) + TEST_TYPE_ALIGN (PEMRMODIFYWORLDTRANSFORM, 8) + TEST_TARGET_SIZE (PEMRMODIFYWORLDTRANSFORM, 36) + TEST_TARGET_ALIGN(PEMRMODIFYWORLDTRANSFORM, 4) +} + +static void test_pack_PEMRMOVETOEX(void) +{ + /* PEMRMOVETOEX */ + TEST_TYPE_SIZE (PEMRMOVETOEX, 8) + TEST_TYPE_ALIGN (PEMRMOVETOEX, 8) + TEST_TARGET_SIZE (PEMRMOVETOEX, 16) + TEST_TARGET_ALIGN(PEMRMOVETOEX, 4) +} + +static void test_pack_PEMROFFSETCLIPRGN(void) +{ + /* PEMROFFSETCLIPRGN */ + TEST_TYPE_SIZE (PEMROFFSETCLIPRGN, 8) + TEST_TYPE_ALIGN (PEMROFFSETCLIPRGN, 8) + TEST_TARGET_SIZE (PEMROFFSETCLIPRGN, 16) + TEST_TARGET_ALIGN(PEMROFFSETCLIPRGN, 4) +} + +static void test_pack_PEMRPAINTRGN(void) +{ + /* PEMRPAINTRGN */ + TEST_TYPE_SIZE (PEMRPAINTRGN, 8) + TEST_TYPE_ALIGN (PEMRPAINTRGN, 8) + TEST_TARGET_SIZE (PEMRPAINTRGN, 32) + TEST_TARGET_ALIGN(PEMRPAINTRGN, 4) +} + +static void test_pack_PEMRPIE(void) +{ + /* PEMRPIE */ + TEST_TYPE_SIZE (PEMRPIE, 8) + TEST_TYPE_ALIGN (PEMRPIE, 8) + TEST_TARGET_SIZE (PEMRPIE, 40) + TEST_TARGET_ALIGN(PEMRPIE, 4) +} + +static void test_pack_PEMRPIXELFORMAT(void) +{ + /* PEMRPIXELFORMAT */ + TEST_TYPE_SIZE (PEMRPIXELFORMAT, 8) + TEST_TYPE_ALIGN (PEMRPIXELFORMAT, 8) + TEST_TARGET_SIZE (PEMRPIXELFORMAT, 48) + TEST_TARGET_ALIGN(PEMRPIXELFORMAT, 4) +} + +static void test_pack_PEMRPLGBLT(void) +{ + /* PEMRPLGBLT */ + TEST_TYPE_SIZE (PEMRPLGBLT, 8) + TEST_TYPE_ALIGN (PEMRPLGBLT, 8) + TEST_TARGET_SIZE (PEMRPLGBLT, 140) + TEST_TARGET_ALIGN(PEMRPLGBLT, 4) +} + +static void test_pack_PEMRPOLYBEZIER(void) +{ + /* PEMRPOLYBEZIER */ + TEST_TYPE_SIZE (PEMRPOLYBEZIER, 8) + TEST_TYPE_ALIGN (PEMRPOLYBEZIER, 8) + TEST_TARGET_SIZE (PEMRPOLYBEZIER, 36) + TEST_TARGET_ALIGN(PEMRPOLYBEZIER, 4) +} + +static void test_pack_PEMRPOLYBEZIER16(void) +{ + /* PEMRPOLYBEZIER16 */ + TEST_TYPE_SIZE (PEMRPOLYBEZIER16, 8) + TEST_TYPE_ALIGN (PEMRPOLYBEZIER16, 8) + TEST_TARGET_SIZE (PEMRPOLYBEZIER16, 32) + TEST_TARGET_ALIGN(PEMRPOLYBEZIER16, 4) +} + +static void test_pack_PEMRPOLYBEZIERTO(void) +{ + /* PEMRPOLYBEZIERTO */ + TEST_TYPE_SIZE (PEMRPOLYBEZIERTO, 8) + TEST_TYPE_ALIGN (PEMRPOLYBEZIERTO, 8) + TEST_TARGET_SIZE (PEMRPOLYBEZIERTO, 36) + TEST_TARGET_ALIGN(PEMRPOLYBEZIERTO, 4) +} + +static void test_pack_PEMRPOLYBEZIERTO16(void) +{ + /* PEMRPOLYBEZIERTO16 */ + TEST_TYPE_SIZE (PEMRPOLYBEZIERTO16, 8) + TEST_TYPE_ALIGN (PEMRPOLYBEZIERTO16, 8) + TEST_TARGET_SIZE (PEMRPOLYBEZIERTO16, 32) + TEST_TARGET_ALIGN(PEMRPOLYBEZIERTO16, 4) +} + +static void test_pack_PEMRPOLYDRAW(void) +{ + /* PEMRPOLYDRAW */ + TEST_TYPE_SIZE (PEMRPOLYDRAW, 8) + TEST_TYPE_ALIGN (PEMRPOLYDRAW, 8) + TEST_TARGET_SIZE (PEMRPOLYDRAW, 40) + TEST_TARGET_ALIGN(PEMRPOLYDRAW, 4) +} + +static void test_pack_PEMRPOLYDRAW16(void) +{ + /* PEMRPOLYDRAW16 */ + TEST_TYPE_SIZE (PEMRPOLYDRAW16, 8) + TEST_TYPE_ALIGN (PEMRPOLYDRAW16, 8) + TEST_TARGET_SIZE (PEMRPOLYDRAW16, 36) + TEST_TARGET_ALIGN(PEMRPOLYDRAW16, 4) +} + +static void test_pack_PEMRPOLYGON(void) +{ + /* PEMRPOLYGON */ + TEST_TYPE_SIZE (PEMRPOLYGON, 8) + TEST_TYPE_ALIGN (PEMRPOLYGON, 8) + TEST_TARGET_SIZE (PEMRPOLYGON, 36) + TEST_TARGET_ALIGN(PEMRPOLYGON, 4) +} + +static void test_pack_PEMRPOLYGON16(void) +{ + /* PEMRPOLYGON16 */ + TEST_TYPE_SIZE (PEMRPOLYGON16, 8) + TEST_TYPE_ALIGN (PEMRPOLYGON16, 8) + TEST_TARGET_SIZE (PEMRPOLYGON16, 32) + TEST_TARGET_ALIGN(PEMRPOLYGON16, 4) +} + +static void test_pack_PEMRPOLYLINE(void) +{ + /* PEMRPOLYLINE */ + TEST_TYPE_SIZE (PEMRPOLYLINE, 8) + TEST_TYPE_ALIGN (PEMRPOLYLINE, 8) + TEST_TARGET_SIZE (PEMRPOLYLINE, 36) + TEST_TARGET_ALIGN(PEMRPOLYLINE, 4) +} + +static void test_pack_PEMRPOLYLINE16(void) +{ + /* PEMRPOLYLINE16 */ + TEST_TYPE_SIZE (PEMRPOLYLINE16, 8) + TEST_TYPE_ALIGN (PEMRPOLYLINE16, 8) + TEST_TARGET_SIZE (PEMRPOLYLINE16, 32) + TEST_TARGET_ALIGN(PEMRPOLYLINE16, 4) +} + +static void test_pack_PEMRPOLYLINETO(void) +{ + /* PEMRPOLYLINETO */ + TEST_TYPE_SIZE (PEMRPOLYLINETO, 8) + TEST_TYPE_ALIGN (PEMRPOLYLINETO, 8) + TEST_TARGET_SIZE (PEMRPOLYLINETO, 36) + TEST_TARGET_ALIGN(PEMRPOLYLINETO, 4) +} + +static void test_pack_PEMRPOLYLINETO16(void) +{ + /* PEMRPOLYLINETO16 */ + TEST_TYPE_SIZE (PEMRPOLYLINETO16, 8) + TEST_TYPE_ALIGN (PEMRPOLYLINETO16, 8) + TEST_TARGET_SIZE (PEMRPOLYLINETO16, 32) + TEST_TARGET_ALIGN(PEMRPOLYLINETO16, 4) +} + +static void test_pack_PEMRPOLYPOLYGON(void) +{ + /* PEMRPOLYPOLYGON */ + TEST_TYPE_SIZE (PEMRPOLYPOLYGON, 8) + TEST_TYPE_ALIGN (PEMRPOLYPOLYGON, 8) + TEST_TARGET_SIZE (PEMRPOLYPOLYGON, 44) + TEST_TARGET_ALIGN(PEMRPOLYPOLYGON, 4) +} + +static void test_pack_PEMRPOLYPOLYGON16(void) +{ + /* PEMRPOLYPOLYGON16 */ + TEST_TYPE_SIZE (PEMRPOLYPOLYGON16, 8) + TEST_TYPE_ALIGN (PEMRPOLYPOLYGON16, 8) + TEST_TARGET_SIZE (PEMRPOLYPOLYGON16, 40) + TEST_TARGET_ALIGN(PEMRPOLYPOLYGON16, 4) +} + +static void test_pack_PEMRPOLYPOLYLINE(void) +{ + /* PEMRPOLYPOLYLINE */ + TEST_TYPE_SIZE (PEMRPOLYPOLYLINE, 8) + TEST_TYPE_ALIGN (PEMRPOLYPOLYLINE, 8) + TEST_TARGET_SIZE (PEMRPOLYPOLYLINE, 44) + TEST_TARGET_ALIGN(PEMRPOLYPOLYLINE, 4) +} + +static void test_pack_PEMRPOLYPOLYLINE16(void) +{ + /* PEMRPOLYPOLYLINE16 */ + TEST_TYPE_SIZE (PEMRPOLYPOLYLINE16, 8) + TEST_TYPE_ALIGN (PEMRPOLYPOLYLINE16, 8) + TEST_TARGET_SIZE (PEMRPOLYPOLYLINE16, 40) + TEST_TARGET_ALIGN(PEMRPOLYPOLYLINE16, 4) +} + +static void test_pack_PEMRPOLYTEXTOUTA(void) +{ + /* PEMRPOLYTEXTOUTA */ + TEST_TYPE_SIZE (PEMRPOLYTEXTOUTA, 8) + TEST_TYPE_ALIGN (PEMRPOLYTEXTOUTA, 8) + TEST_TARGET_SIZE (PEMRPOLYTEXTOUTA, 80) + TEST_TARGET_ALIGN(PEMRPOLYTEXTOUTA, 4) +} + +static void test_pack_PEMRPOLYTEXTOUTW(void) +{ + /* PEMRPOLYTEXTOUTW */ + TEST_TYPE_SIZE (PEMRPOLYTEXTOUTW, 8) + TEST_TYPE_ALIGN (PEMRPOLYTEXTOUTW, 8) + TEST_TARGET_SIZE (PEMRPOLYTEXTOUTW, 80) + TEST_TARGET_ALIGN(PEMRPOLYTEXTOUTW, 4) +} + +static void test_pack_PEMRREALIZEPALETTE(void) +{ + /* PEMRREALIZEPALETTE */ + TEST_TYPE_SIZE (PEMRREALIZEPALETTE, 8) + TEST_TYPE_ALIGN (PEMRREALIZEPALETTE, 8) + TEST_TARGET_SIZE (PEMRREALIZEPALETTE, 8) + TEST_TARGET_ALIGN(PEMRREALIZEPALETTE, 4) +} + +static void test_pack_PEMRRECTANGLE(void) +{ + /* PEMRRECTANGLE */ + TEST_TYPE_SIZE (PEMRRECTANGLE, 8) + TEST_TYPE_ALIGN (PEMRRECTANGLE, 8) + TEST_TARGET_SIZE (PEMRRECTANGLE, 24) + TEST_TARGET_ALIGN(PEMRRECTANGLE, 4) +} + +static void test_pack_PEMRRESIZEPALETTE(void) +{ + /* PEMRRESIZEPALETTE */ + TEST_TYPE_SIZE (PEMRRESIZEPALETTE, 8) + TEST_TYPE_ALIGN (PEMRRESIZEPALETTE, 8) + TEST_TARGET_SIZE (PEMRRESIZEPALETTE, 16) + TEST_TARGET_ALIGN(PEMRRESIZEPALETTE, 4) +} + +static void test_pack_PEMRRESTOREDC(void) +{ + /* PEMRRESTOREDC */ + TEST_TYPE_SIZE (PEMRRESTOREDC, 8) + TEST_TYPE_ALIGN (PEMRRESTOREDC, 8) + TEST_TARGET_SIZE (PEMRRESTOREDC, 12) + TEST_TARGET_ALIGN(PEMRRESTOREDC, 4) +} + +static void test_pack_PEMRROUNDRECT(void) +{ + /* PEMRROUNDRECT */ + TEST_TYPE_SIZE (PEMRROUNDRECT, 8) + TEST_TYPE_ALIGN (PEMRROUNDRECT, 8) + TEST_TARGET_SIZE (PEMRROUNDRECT, 32) + TEST_TARGET_ALIGN(PEMRROUNDRECT, 4) +} + +static void test_pack_PEMRSAVEDC(void) +{ + /* PEMRSAVEDC */ + TEST_TYPE_SIZE (PEMRSAVEDC, 8) + TEST_TYPE_ALIGN (PEMRSAVEDC, 8) + TEST_TARGET_SIZE (PEMRSAVEDC, 8) + TEST_TARGET_ALIGN(PEMRSAVEDC, 4) +} + +static void test_pack_PEMRSCALEVIEWPORTEXTEX(void) +{ + /* PEMRSCALEVIEWPORTEXTEX */ + TEST_TYPE_SIZE (PEMRSCALEVIEWPORTEXTEX, 8) + TEST_TYPE_ALIGN (PEMRSCALEVIEWPORTEXTEX, 8) + TEST_TARGET_SIZE (PEMRSCALEVIEWPORTEXTEX, 24) + TEST_TARGET_ALIGN(PEMRSCALEVIEWPORTEXTEX, 4) +} + +static void test_pack_PEMRSCALEWINDOWEXTEX(void) +{ + /* PEMRSCALEWINDOWEXTEX */ + TEST_TYPE_SIZE (PEMRSCALEWINDOWEXTEX, 8) + TEST_TYPE_ALIGN (PEMRSCALEWINDOWEXTEX, 8) + TEST_TARGET_SIZE (PEMRSCALEWINDOWEXTEX, 24) + TEST_TARGET_ALIGN(PEMRSCALEWINDOWEXTEX, 4) +} + +static void test_pack_PEMRSELECTCLIPPATH(void) +{ + /* PEMRSELECTCLIPPATH */ + TEST_TYPE_SIZE (PEMRSELECTCLIPPATH, 8) + TEST_TYPE_ALIGN (PEMRSELECTCLIPPATH, 8) + TEST_TARGET_SIZE (PEMRSELECTCLIPPATH, 12) + TEST_TARGET_ALIGN(PEMRSELECTCLIPPATH, 4) +} + +static void test_pack_PEMRSELECTCOLORSPACE(void) +{ + /* PEMRSELECTCOLORSPACE */ + TEST_TYPE_SIZE (PEMRSELECTCOLORSPACE, 8) + TEST_TYPE_ALIGN (PEMRSELECTCOLORSPACE, 8) + TEST_TARGET_SIZE (PEMRSELECTCOLORSPACE, 12) + TEST_TARGET_ALIGN(PEMRSELECTCOLORSPACE, 4) +} + +static void test_pack_PEMRSELECTOBJECT(void) +{ + /* PEMRSELECTOBJECT */ + TEST_TYPE_SIZE (PEMRSELECTOBJECT, 8) + TEST_TYPE_ALIGN (PEMRSELECTOBJECT, 8) + TEST_TARGET_SIZE (PEMRSELECTOBJECT, 12) + TEST_TARGET_ALIGN(PEMRSELECTOBJECT, 4) +} + +static void test_pack_PEMRSELECTPALETTE(void) +{ + /* PEMRSELECTPALETTE */ + TEST_TYPE_SIZE (PEMRSELECTPALETTE, 8) + TEST_TYPE_ALIGN (PEMRSELECTPALETTE, 8) + TEST_TARGET_SIZE (PEMRSELECTPALETTE, 12) + TEST_TARGET_ALIGN(PEMRSELECTPALETTE, 4) +} + +static void test_pack_PEMRSETARCDIRECTION(void) +{ + /* PEMRSETARCDIRECTION */ + TEST_TYPE_SIZE (PEMRSETARCDIRECTION, 8) + TEST_TYPE_ALIGN (PEMRSETARCDIRECTION, 8) + TEST_TARGET_SIZE (PEMRSETARCDIRECTION, 12) + TEST_TARGET_ALIGN(PEMRSETARCDIRECTION, 4) +} + +static void test_pack_PEMRSETBKCOLOR(void) +{ + /* PEMRSETBKCOLOR */ + TEST_TYPE_SIZE (PEMRSETBKCOLOR, 8) + TEST_TYPE_ALIGN (PEMRSETBKCOLOR, 8) + TEST_TARGET_SIZE (PEMRSETBKCOLOR, 12) + TEST_TARGET_ALIGN(PEMRSETBKCOLOR, 4) +} + +static void test_pack_PEMRSETBKMODE(void) +{ + /* PEMRSETBKMODE */ + TEST_TYPE_SIZE (PEMRSETBKMODE, 8) + TEST_TYPE_ALIGN (PEMRSETBKMODE, 8) + TEST_TARGET_SIZE (PEMRSETBKMODE, 12) + TEST_TARGET_ALIGN(PEMRSETBKMODE, 4) +} + +static void test_pack_PEMRSETBRUSHORGEX(void) +{ + /* PEMRSETBRUSHORGEX */ + TEST_TYPE_SIZE (PEMRSETBRUSHORGEX, 8) + TEST_TYPE_ALIGN (PEMRSETBRUSHORGEX, 8) + TEST_TARGET_SIZE (PEMRSETBRUSHORGEX, 16) + TEST_TARGET_ALIGN(PEMRSETBRUSHORGEX, 4) +} + +static void test_pack_PEMRSETCOLORADJUSTMENT(void) +{ + /* PEMRSETCOLORADJUSTMENT */ + TEST_TYPE_SIZE (PEMRSETCOLORADJUSTMENT, 8) + TEST_TYPE_ALIGN (PEMRSETCOLORADJUSTMENT, 8) + TEST_TARGET_SIZE (PEMRSETCOLORADJUSTMENT, 32) + TEST_TARGET_ALIGN(PEMRSETCOLORADJUSTMENT, 4) +} + +static void test_pack_PEMRSETCOLORSPACE(void) +{ + /* PEMRSETCOLORSPACE */ + TEST_TYPE_SIZE (PEMRSETCOLORSPACE, 8) + TEST_TYPE_ALIGN (PEMRSETCOLORSPACE, 8) + TEST_TARGET_SIZE (PEMRSETCOLORSPACE, 12) + TEST_TARGET_ALIGN(PEMRSETCOLORSPACE, 4) +} + +static void test_pack_PEMRSETDIBITSTODEVICE(void) +{ + /* PEMRSETDIBITSTODEVICE */ + TEST_TYPE_SIZE (PEMRSETDIBITSTODEVICE, 8) + TEST_TYPE_ALIGN (PEMRSETDIBITSTODEVICE, 8) + TEST_TARGET_SIZE (PEMRSETDIBITSTODEVICE, 76) + TEST_TARGET_ALIGN(PEMRSETDIBITSTODEVICE, 4) +} + +static void test_pack_PEMRSETICMMODE(void) +{ + /* PEMRSETICMMODE */ + TEST_TYPE_SIZE (PEMRSETICMMODE, 8) + TEST_TYPE_ALIGN (PEMRSETICMMODE, 8) + TEST_TARGET_SIZE (PEMRSETICMMODE, 12) + TEST_TARGET_ALIGN(PEMRSETICMMODE, 4) +} + +static void test_pack_PEMRSETLAYOUT(void) +{ + /* PEMRSETLAYOUT */ + TEST_TYPE_SIZE (PEMRSETLAYOUT, 8) + TEST_TYPE_ALIGN (PEMRSETLAYOUT, 8) + TEST_TARGET_SIZE (PEMRSETLAYOUT, 12) + TEST_TARGET_ALIGN(PEMRSETLAYOUT, 4) +} + +static void test_pack_PEMRSETMAPMODE(void) +{ + /* PEMRSETMAPMODE */ + TEST_TYPE_SIZE (PEMRSETMAPMODE, 8) + TEST_TYPE_ALIGN (PEMRSETMAPMODE, 8) + TEST_TARGET_SIZE (PEMRSETMAPMODE, 12) + TEST_TARGET_ALIGN(PEMRSETMAPMODE, 4) +} + +static void test_pack_PEMRSETMAPPERFLAGS(void) +{ + /* PEMRSETMAPPERFLAGS */ + TEST_TYPE_SIZE (PEMRSETMAPPERFLAGS, 8) + TEST_TYPE_ALIGN (PEMRSETMAPPERFLAGS, 8) + TEST_TARGET_SIZE (PEMRSETMAPPERFLAGS, 12) + TEST_TARGET_ALIGN(PEMRSETMAPPERFLAGS, 4) +} + +static void test_pack_PEMRSETMETARGN(void) +{ + /* PEMRSETMETARGN */ + TEST_TYPE_SIZE (PEMRSETMETARGN, 8) + TEST_TYPE_ALIGN (PEMRSETMETARGN, 8) + TEST_TARGET_SIZE (PEMRSETMETARGN, 8) + TEST_TARGET_ALIGN(PEMRSETMETARGN, 4) +} + +static void test_pack_PEMRSETMITERLIMIT(void) +{ + /* PEMRSETMITERLIMIT */ + TEST_TYPE_SIZE (PEMRSETMITERLIMIT, 8) + TEST_TYPE_ALIGN (PEMRSETMITERLIMIT, 8) + TEST_TARGET_SIZE (PEMRSETMITERLIMIT, 12) + TEST_TARGET_ALIGN(PEMRSETMITERLIMIT, 4) +} + +static void test_pack_PEMRSETPALETTEENTRIES(void) +{ + /* PEMRSETPALETTEENTRIES */ + TEST_TYPE_SIZE (PEMRSETPALETTEENTRIES, 8) + TEST_TYPE_ALIGN (PEMRSETPALETTEENTRIES, 8) + TEST_TARGET_SIZE (PEMRSETPALETTEENTRIES, 24) + TEST_TARGET_ALIGN(PEMRSETPALETTEENTRIES, 4) +} + +static void test_pack_PEMRSETPIXELV(void) +{ + /* PEMRSETPIXELV */ + TEST_TYPE_SIZE (PEMRSETPIXELV, 8) + TEST_TYPE_ALIGN (PEMRSETPIXELV, 8) + TEST_TARGET_SIZE (PEMRSETPIXELV, 20) + TEST_TARGET_ALIGN(PEMRSETPIXELV, 4) +} + +static void test_pack_PEMRSETPOLYFILLMODE(void) +{ + /* PEMRSETPOLYFILLMODE */ + TEST_TYPE_SIZE (PEMRSETPOLYFILLMODE, 8) + TEST_TYPE_ALIGN (PEMRSETPOLYFILLMODE, 8) + TEST_TARGET_SIZE (PEMRSETPOLYFILLMODE, 12) + TEST_TARGET_ALIGN(PEMRSETPOLYFILLMODE, 4) +} + +static void test_pack_PEMRSETROP2(void) +{ + /* PEMRSETROP2 */ + TEST_TYPE_SIZE (PEMRSETROP2, 8) + TEST_TYPE_ALIGN (PEMRSETROP2, 8) + TEST_TARGET_SIZE (PEMRSETROP2, 12) + TEST_TARGET_ALIGN(PEMRSETROP2, 4) +} + +static void test_pack_PEMRSETSTRETCHBLTMODE(void) +{ + /* PEMRSETSTRETCHBLTMODE */ + TEST_TYPE_SIZE (PEMRSETSTRETCHBLTMODE, 8) + TEST_TYPE_ALIGN (PEMRSETSTRETCHBLTMODE, 8) + TEST_TARGET_SIZE (PEMRSETSTRETCHBLTMODE, 12) + TEST_TARGET_ALIGN(PEMRSETSTRETCHBLTMODE, 4) +} + +static void test_pack_PEMRSETTEXTALIGN(void) +{ + /* PEMRSETTEXTALIGN */ + TEST_TYPE_SIZE (PEMRSETTEXTALIGN, 8) + TEST_TYPE_ALIGN (PEMRSETTEXTALIGN, 8) + TEST_TARGET_SIZE (PEMRSETTEXTALIGN, 12) + TEST_TARGET_ALIGN(PEMRSETTEXTALIGN, 4) +} + +static void test_pack_PEMRSETTEXTCOLOR(void) +{ + /* PEMRSETTEXTCOLOR */ + TEST_TYPE_SIZE (PEMRSETTEXTCOLOR, 8) + TEST_TYPE_ALIGN (PEMRSETTEXTCOLOR, 8) + TEST_TARGET_SIZE (PEMRSETTEXTCOLOR, 12) + TEST_TARGET_ALIGN(PEMRSETTEXTCOLOR, 4) +} + +static void test_pack_PEMRSETVIEWPORTEXTEX(void) +{ + /* PEMRSETVIEWPORTEXTEX */ + TEST_TYPE_SIZE (PEMRSETVIEWPORTEXTEX, 8) + TEST_TYPE_ALIGN (PEMRSETVIEWPORTEXTEX, 8) + TEST_TARGET_SIZE (PEMRSETVIEWPORTEXTEX, 16) + TEST_TARGET_ALIGN(PEMRSETVIEWPORTEXTEX, 4) +} + +static void test_pack_PEMRSETVIEWPORTORGEX(void) +{ + /* PEMRSETVIEWPORTORGEX */ + TEST_TYPE_SIZE (PEMRSETVIEWPORTORGEX, 8) + TEST_TYPE_ALIGN (PEMRSETVIEWPORTORGEX, 8) + TEST_TARGET_SIZE (PEMRSETVIEWPORTORGEX, 16) + TEST_TARGET_ALIGN(PEMRSETVIEWPORTORGEX, 4) +} + +static void test_pack_PEMRSETWINDOWEXTEX(void) +{ + /* PEMRSETWINDOWEXTEX */ + TEST_TYPE_SIZE (PEMRSETWINDOWEXTEX, 8) + TEST_TYPE_ALIGN (PEMRSETWINDOWEXTEX, 8) + TEST_TARGET_SIZE (PEMRSETWINDOWEXTEX, 16) + TEST_TARGET_ALIGN(PEMRSETWINDOWEXTEX, 4) +} + +static void test_pack_PEMRSETWINDOWORGEX(void) +{ + /* PEMRSETWINDOWORGEX */ + TEST_TYPE_SIZE (PEMRSETWINDOWORGEX, 8) + TEST_TYPE_ALIGN (PEMRSETWINDOWORGEX, 8) + TEST_TARGET_SIZE (PEMRSETWINDOWORGEX, 16) + TEST_TARGET_ALIGN(PEMRSETWINDOWORGEX, 4) +} + +static void test_pack_PEMRSETWORLDTRANSFORM(void) +{ + /* PEMRSETWORLDTRANSFORM */ + TEST_TYPE_SIZE (PEMRSETWORLDTRANSFORM, 8) + TEST_TYPE_ALIGN (PEMRSETWORLDTRANSFORM, 8) + TEST_TARGET_SIZE (PEMRSETWORLDTRANSFORM, 32) + TEST_TARGET_ALIGN(PEMRSETWORLDTRANSFORM, 4) +} + +static void test_pack_PEMRSTRETCHBLT(void) +{ + /* PEMRSTRETCHBLT */ + TEST_TYPE_SIZE (PEMRSTRETCHBLT, 8) + TEST_TYPE_ALIGN (PEMRSTRETCHBLT, 8) + TEST_TARGET_SIZE (PEMRSTRETCHBLT, 108) + TEST_TARGET_ALIGN(PEMRSTRETCHBLT, 4) +} + +static void test_pack_PEMRSTRETCHDIBITS(void) +{ + /* PEMRSTRETCHDIBITS */ + TEST_TYPE_SIZE (PEMRSTRETCHDIBITS, 8) + TEST_TYPE_ALIGN (PEMRSTRETCHDIBITS, 8) + TEST_TARGET_SIZE (PEMRSTRETCHDIBITS, 80) + TEST_TARGET_ALIGN(PEMRSTRETCHDIBITS, 4) +} + +static void test_pack_PEMRSTROKEANDFILLPATH(void) +{ + /* PEMRSTROKEANDFILLPATH */ + TEST_TYPE_SIZE (PEMRSTROKEANDFILLPATH, 8) + TEST_TYPE_ALIGN (PEMRSTROKEANDFILLPATH, 8) + TEST_TARGET_SIZE (PEMRSTROKEANDFILLPATH, 24) + TEST_TARGET_ALIGN(PEMRSTROKEANDFILLPATH, 4) +} + +static void test_pack_PEMRSTROKEPATH(void) +{ + /* PEMRSTROKEPATH */ + TEST_TYPE_SIZE (PEMRSTROKEPATH, 8) + TEST_TYPE_ALIGN (PEMRSTROKEPATH, 8) + TEST_TARGET_SIZE (PEMRSTROKEPATH, 24) + TEST_TARGET_ALIGN(PEMRSTROKEPATH, 4) +} + +static void test_pack_PEMRTEXT(void) +{ + /* PEMRTEXT */ + TEST_TYPE_SIZE (PEMRTEXT, 8) + TEST_TYPE_ALIGN (PEMRTEXT, 8) + TEST_TARGET_SIZE (PEMRTEXT, 40) + TEST_TARGET_ALIGN(PEMRTEXT, 4) +} + +static void test_pack_PEMRWIDENPATH(void) +{ + /* PEMRWIDENPATH */ + TEST_TYPE_SIZE (PEMRWIDENPATH, 8) + TEST_TYPE_ALIGN (PEMRWIDENPATH, 8) + TEST_TARGET_SIZE (PEMRWIDENPATH, 8) + TEST_TARGET_ALIGN(PEMRWIDENPATH, 4) +} + +static void test_pack_PENHMETAHEADER(void) +{ + /* PENHMETAHEADER */ + TEST_TYPE_SIZE (PENHMETAHEADER, 8) + TEST_TYPE_ALIGN (PENHMETAHEADER, 8) + TEST_TARGET_SIZE (PENHMETAHEADER, 108) + TEST_TARGET_ALIGN(PENHMETAHEADER, 4) +} + +static void test_pack_PEXTLOGFONTA(void) +{ + /* PEXTLOGFONTA */ + TEST_TYPE_SIZE (PEXTLOGFONTA, 8) + TEST_TYPE_ALIGN (PEXTLOGFONTA, 8) + TEST_TARGET_SIZE (PEXTLOGFONTA, 192) + TEST_TARGET_ALIGN(PEXTLOGFONTA, 4) +} + +static void test_pack_PEXTLOGFONTW(void) +{ + /* PEXTLOGFONTW */ + TEST_TYPE_SIZE (PEXTLOGFONTW, 8) + TEST_TYPE_ALIGN (PEXTLOGFONTW, 8) + TEST_TARGET_SIZE (PEXTLOGFONTW, 320) + TEST_TARGET_ALIGN(PEXTLOGFONTW, 4) +} + +static void test_pack_PEXTLOGPEN(void) +{ + /* PEXTLOGPEN */ + TEST_TYPE_SIZE (PEXTLOGPEN, 8) + TEST_TYPE_ALIGN (PEXTLOGPEN, 8) + TEST_TARGET_SIZE (PEXTLOGPEN, 32) + TEST_TARGET_ALIGN(PEXTLOGPEN, 8) +} + +static void test_pack_PFONTSIGNATURE(void) +{ + /* PFONTSIGNATURE */ + TEST_TYPE_SIZE (PFONTSIGNATURE, 8) + TEST_TYPE_ALIGN (PFONTSIGNATURE, 8) + TEST_TARGET_SIZE (PFONTSIGNATURE, 24) + TEST_TARGET_ALIGN(PFONTSIGNATURE, 4) +} + +static void test_pack_PGLYPHMETRICSFLOAT(void) +{ + /* PGLYPHMETRICSFLOAT */ + TEST_TYPE_SIZE (PGLYPHMETRICSFLOAT, 8) + TEST_TYPE_ALIGN (PGLYPHMETRICSFLOAT, 8) + TEST_TARGET_SIZE (PGLYPHMETRICSFLOAT, 24) + TEST_TARGET_ALIGN(PGLYPHMETRICSFLOAT, 4) +} + +static void test_pack_PGRADIENT_RECT(void) +{ + /* PGRADIENT_RECT */ + TEST_TYPE_SIZE (PGRADIENT_RECT, 8) + TEST_TYPE_ALIGN (PGRADIENT_RECT, 8) + TEST_TARGET_SIZE (PGRADIENT_RECT, 8) + TEST_TARGET_ALIGN(PGRADIENT_RECT, 4) +} + +static void test_pack_PGRADIENT_TRIANGLE(void) +{ + /* PGRADIENT_TRIANGLE */ + TEST_TYPE_SIZE (PGRADIENT_TRIANGLE, 8) + TEST_TYPE_ALIGN (PGRADIENT_TRIANGLE, 8) + TEST_TARGET_SIZE (PGRADIENT_TRIANGLE, 12) + TEST_TARGET_ALIGN(PGRADIENT_TRIANGLE, 4) +} + +static void test_pack_PHANDLETABLE(void) +{ + /* PHANDLETABLE */ + TEST_TYPE_SIZE (PHANDLETABLE, 8) + TEST_TYPE_ALIGN (PHANDLETABLE, 8) + TEST_TARGET_SIZE (PHANDLETABLE, 8) + TEST_TARGET_ALIGN(PHANDLETABLE, 8) +} + +static void test_pack_PIXELFORMATDESCRIPTOR(void) +{ + /* PIXELFORMATDESCRIPTOR */ + TEST_TYPE_SIZE (PIXELFORMATDESCRIPTOR, 40) + TEST_TYPE_ALIGN (PIXELFORMATDESCRIPTOR, 4) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, nSize, 2) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, nSize, 2) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, nSize, 0) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, nVersion, 2) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, nVersion, 2) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, nVersion, 2) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, dwFlags, 4) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, dwFlags, 4) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, dwFlags, 4) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, iPixelType, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, iPixelType, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, iPixelType, 8) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cColorBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cColorBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cColorBits, 9) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cRedBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cRedBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cRedBits, 10) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cRedShift, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cRedShift, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cRedShift, 11) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cGreenBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cGreenBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cGreenBits, 12) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cGreenShift, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cGreenShift, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cGreenShift, 13) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cBlueBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cBlueBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cBlueBits, 14) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cBlueShift, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cBlueShift, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cBlueShift, 15) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cAlphaBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cAlphaBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cAlphaBits, 16) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cAlphaShift, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cAlphaShift, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cAlphaShift, 17) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cAccumBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cAccumBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cAccumBits, 18) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cAccumRedBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cAccumRedBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cAccumRedBits, 19) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cAccumGreenBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cAccumGreenBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cAccumGreenBits, 20) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cAccumBlueBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cAccumBlueBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cAccumBlueBits, 21) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cAccumAlphaBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cAccumAlphaBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cAccumAlphaBits, 22) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cDepthBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cDepthBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cDepthBits, 23) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cStencilBits, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cStencilBits, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cStencilBits, 24) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, cAuxBuffers, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, cAuxBuffers, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, cAuxBuffers, 25) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, iLayerType, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, iLayerType, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, iLayerType, 26) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, bReserved, 1) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, bReserved, 1) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, bReserved, 27) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, dwLayerMask, 4) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, dwLayerMask, 4) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, dwLayerMask, 28) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, dwVisibleMask, 4) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, dwVisibleMask, 4) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, dwVisibleMask, 32) + TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, dwDamageMask, 4) + TEST_FIELD_ALIGN (PIXELFORMATDESCRIPTOR, dwDamageMask, 4) + TEST_FIELD_OFFSET(PIXELFORMATDESCRIPTOR, dwDamageMask, 36) +} + +static void test_pack_PLAYERPLANEDESCRIPTOR(void) +{ + /* PLAYERPLANEDESCRIPTOR */ + TEST_TYPE_SIZE (PLAYERPLANEDESCRIPTOR, 8) + TEST_TYPE_ALIGN (PLAYERPLANEDESCRIPTOR, 8) + TEST_TARGET_SIZE (PLAYERPLANEDESCRIPTOR, 32) + TEST_TARGET_ALIGN(PLAYERPLANEDESCRIPTOR, 4) +} + +static void test_pack_PLOCALESIGNATURE(void) +{ + /* PLOCALESIGNATURE */ + TEST_TYPE_SIZE (PLOCALESIGNATURE, 8) + TEST_TYPE_ALIGN (PLOCALESIGNATURE, 8) + TEST_TARGET_SIZE (PLOCALESIGNATURE, 32) + TEST_TARGET_ALIGN(PLOCALESIGNATURE, 4) +} + +static void test_pack_PLOGBRUSH(void) +{ + /* PLOGBRUSH */ + TEST_TYPE_SIZE (PLOGBRUSH, 8) + TEST_TYPE_ALIGN (PLOGBRUSH, 8) + TEST_TARGET_SIZE (PLOGBRUSH, 16) + TEST_TARGET_ALIGN(PLOGBRUSH, 8) +} + +static void test_pack_PLOGFONTA(void) +{ + /* PLOGFONTA */ + TEST_TYPE_SIZE (PLOGFONTA, 8) + TEST_TYPE_ALIGN (PLOGFONTA, 8) + TEST_TARGET_SIZE (PLOGFONTA, 60) + TEST_TARGET_ALIGN(PLOGFONTA, 4) +} + +static void test_pack_PLOGFONTW(void) +{ + /* PLOGFONTW */ + TEST_TYPE_SIZE (PLOGFONTW, 8) + TEST_TYPE_ALIGN (PLOGFONTW, 8) + TEST_TARGET_SIZE (PLOGFONTW, 92) + TEST_TARGET_ALIGN(PLOGFONTW, 4) +} + +static void test_pack_PMETAHEADER(void) +{ + /* PMETAHEADER */ + TEST_TYPE_SIZE (PMETAHEADER, 8) + TEST_TYPE_ALIGN (PMETAHEADER, 8) + TEST_TARGET_SIZE (PMETAHEADER, 18) + TEST_TARGET_ALIGN(PMETAHEADER, 2) +} + +static void test_pack_PMETARECORD(void) +{ + /* PMETARECORD */ + TEST_TYPE_SIZE (PMETARECORD, 8) + TEST_TYPE_ALIGN (PMETARECORD, 8) + TEST_TARGET_SIZE (PMETARECORD, 8) + TEST_TARGET_ALIGN(PMETARECORD, 4) +} + +static void test_pack_PNEWTEXTMETRICA(void) +{ + /* PNEWTEXTMETRICA */ + TEST_TYPE_SIZE (PNEWTEXTMETRICA, 8) + TEST_TYPE_ALIGN (PNEWTEXTMETRICA, 8) + TEST_TARGET_SIZE (PNEWTEXTMETRICA, 72) + TEST_TARGET_ALIGN(PNEWTEXTMETRICA, 4) +} + +static void test_pack_PNEWTEXTMETRICW(void) +{ + /* PNEWTEXTMETRICW */ + TEST_TYPE_SIZE (PNEWTEXTMETRICW, 8) + TEST_TYPE_ALIGN (PNEWTEXTMETRICW, 8) + TEST_TARGET_SIZE (PNEWTEXTMETRICW, 76) + TEST_TARGET_ALIGN(PNEWTEXTMETRICW, 4) +} + +static void test_pack_POINTFLOAT(void) +{ + /* POINTFLOAT */ + TEST_TYPE_SIZE (POINTFLOAT, 8) + TEST_TYPE_ALIGN (POINTFLOAT, 4) + TEST_FIELD_SIZE (POINTFLOAT, x, 4) + TEST_FIELD_ALIGN (POINTFLOAT, x, 4) + TEST_FIELD_OFFSET(POINTFLOAT, x, 0) + TEST_FIELD_SIZE (POINTFLOAT, y, 4) + TEST_FIELD_ALIGN (POINTFLOAT, y, 4) + TEST_FIELD_OFFSET(POINTFLOAT, y, 4) +} + +static void test_pack_POINTFX(void) +{ + /* POINTFX */ + TEST_TYPE_SIZE (POINTFX, 8) + TEST_TYPE_ALIGN (POINTFX, 2) + TEST_FIELD_SIZE (POINTFX, x, 4) + TEST_FIELD_ALIGN (POINTFX, x, 2) + TEST_FIELD_OFFSET(POINTFX, x, 0) + TEST_FIELD_SIZE (POINTFX, y, 4) + TEST_FIELD_ALIGN (POINTFX, y, 2) + TEST_FIELD_OFFSET(POINTFX, y, 4) +} + +static void test_pack_POLYTEXTA(void) +{ + /* POLYTEXTA */ + TEST_TYPE_SIZE (POLYTEXTA, 56) + TEST_TYPE_ALIGN (POLYTEXTA, 8) + TEST_FIELD_SIZE (POLYTEXTA, x, 4) + TEST_FIELD_ALIGN (POLYTEXTA, x, 4) + TEST_FIELD_OFFSET(POLYTEXTA, x, 0) + TEST_FIELD_SIZE (POLYTEXTA, y, 4) + TEST_FIELD_ALIGN (POLYTEXTA, y, 4) + TEST_FIELD_OFFSET(POLYTEXTA, y, 4) + TEST_FIELD_SIZE (POLYTEXTA, n, 4) + TEST_FIELD_ALIGN (POLYTEXTA, n, 4) + TEST_FIELD_OFFSET(POLYTEXTA, n, 8) + TEST_FIELD_SIZE (POLYTEXTA, lpstr, 8) + TEST_FIELD_ALIGN (POLYTEXTA, lpstr, 8) + TEST_FIELD_OFFSET(POLYTEXTA, lpstr, 16) + TEST_FIELD_SIZE (POLYTEXTA, uiFlags, 4) + TEST_FIELD_ALIGN (POLYTEXTA, uiFlags, 4) + TEST_FIELD_OFFSET(POLYTEXTA, uiFlags, 24) + TEST_FIELD_SIZE (POLYTEXTA, rcl, 16) + TEST_FIELD_ALIGN (POLYTEXTA, rcl, 4) + TEST_FIELD_OFFSET(POLYTEXTA, rcl, 28) + TEST_FIELD_SIZE (POLYTEXTA, pdx, 8) + TEST_FIELD_ALIGN (POLYTEXTA, pdx, 8) + TEST_FIELD_OFFSET(POLYTEXTA, pdx, 48) +} + +static void test_pack_POLYTEXTW(void) +{ + /* POLYTEXTW */ + TEST_TYPE_SIZE (POLYTEXTW, 56) + TEST_TYPE_ALIGN (POLYTEXTW, 8) + TEST_FIELD_SIZE (POLYTEXTW, x, 4) + TEST_FIELD_ALIGN (POLYTEXTW, x, 4) + TEST_FIELD_OFFSET(POLYTEXTW, x, 0) + TEST_FIELD_SIZE (POLYTEXTW, y, 4) + TEST_FIELD_ALIGN (POLYTEXTW, y, 4) + TEST_FIELD_OFFSET(POLYTEXTW, y, 4) + TEST_FIELD_SIZE (POLYTEXTW, n, 4) + TEST_FIELD_ALIGN (POLYTEXTW, n, 4) + TEST_FIELD_OFFSET(POLYTEXTW, n, 8) + TEST_FIELD_SIZE (POLYTEXTW, lpstr, 8) + TEST_FIELD_ALIGN (POLYTEXTW, lpstr, 8) + TEST_FIELD_OFFSET(POLYTEXTW, lpstr, 16) + TEST_FIELD_SIZE (POLYTEXTW, uiFlags, 4) + TEST_FIELD_ALIGN (POLYTEXTW, uiFlags, 4) + TEST_FIELD_OFFSET(POLYTEXTW, uiFlags, 24) + TEST_FIELD_SIZE (POLYTEXTW, rcl, 16) + TEST_FIELD_ALIGN (POLYTEXTW, rcl, 4) + TEST_FIELD_OFFSET(POLYTEXTW, rcl, 28) + TEST_FIELD_SIZE (POLYTEXTW, pdx, 8) + TEST_FIELD_ALIGN (POLYTEXTW, pdx, 8) + TEST_FIELD_OFFSET(POLYTEXTW, pdx, 48) +} + +static void test_pack_POUTLINETEXTMETRICA(void) +{ + /* POUTLINETEXTMETRICA */ + TEST_TYPE_SIZE (POUTLINETEXTMETRICA, 8) + TEST_TYPE_ALIGN (POUTLINETEXTMETRICA, 8) + TEST_TARGET_SIZE (POUTLINETEXTMETRICA, 232) + TEST_TARGET_ALIGN(POUTLINETEXTMETRICA, 8) +} + +static void test_pack_POUTLINETEXTMETRICW(void) +{ + /* POUTLINETEXTMETRICW */ + TEST_TYPE_SIZE (POUTLINETEXTMETRICW, 8) + TEST_TYPE_ALIGN (POUTLINETEXTMETRICW, 8) + TEST_TARGET_SIZE (POUTLINETEXTMETRICW, 232) + TEST_TARGET_ALIGN(POUTLINETEXTMETRICW, 8) +} + +static void test_pack_PPELARRAY(void) +{ + /* PPELARRAY */ + TEST_TYPE_SIZE (PPELARRAY, 8) + TEST_TYPE_ALIGN (PPELARRAY, 8) + TEST_TARGET_SIZE (PPELARRAY, 20) + TEST_TARGET_ALIGN(PPELARRAY, 4) +} + +static void test_pack_PPIXELFORMATDESCRIPTOR(void) +{ + /* PPIXELFORMATDESCRIPTOR */ + TEST_TYPE_SIZE (PPIXELFORMATDESCRIPTOR, 8) + TEST_TYPE_ALIGN (PPIXELFORMATDESCRIPTOR, 8) + TEST_TARGET_SIZE (PPIXELFORMATDESCRIPTOR, 40) + TEST_TARGET_ALIGN(PPIXELFORMATDESCRIPTOR, 4) +} + +static void test_pack_PPOINTFLOAT(void) +{ + /* PPOINTFLOAT */ + TEST_TYPE_SIZE (PPOINTFLOAT, 8) + TEST_TYPE_ALIGN (PPOINTFLOAT, 8) + TEST_TARGET_SIZE (PPOINTFLOAT, 8) + TEST_TARGET_ALIGN(PPOINTFLOAT, 4) +} + +static void test_pack_PPOLYTEXTA(void) +{ + /* PPOLYTEXTA */ + TEST_TYPE_SIZE (PPOLYTEXTA, 8) + TEST_TYPE_ALIGN (PPOLYTEXTA, 8) + TEST_TARGET_SIZE (PPOLYTEXTA, 56) + TEST_TARGET_ALIGN(PPOLYTEXTA, 8) +} + +static void test_pack_PPOLYTEXTW(void) +{ + /* PPOLYTEXTW */ + TEST_TYPE_SIZE (PPOLYTEXTW, 8) + TEST_TYPE_ALIGN (PPOLYTEXTW, 8) + TEST_TARGET_SIZE (PPOLYTEXTW, 56) + TEST_TARGET_ALIGN(PPOLYTEXTW, 8) +} + +static void test_pack_PRGNDATA(void) +{ + /* PRGNDATA */ + TEST_TYPE_SIZE (PRGNDATA, 8) + TEST_TYPE_ALIGN (PRGNDATA, 8) + TEST_TARGET_SIZE (PRGNDATA, 36) + TEST_TARGET_ALIGN(PRGNDATA, 4) +} + +static void test_pack_PRGNDATAHEADER(void) +{ + /* PRGNDATAHEADER */ + TEST_TYPE_SIZE (PRGNDATAHEADER, 8) + TEST_TYPE_ALIGN (PRGNDATAHEADER, 8) + TEST_TARGET_SIZE (PRGNDATAHEADER, 32) + TEST_TARGET_ALIGN(PRGNDATAHEADER, 4) +} + +static void test_pack_PTEXTMETRICA(void) +{ + /* PTEXTMETRICA */ + TEST_TYPE_SIZE (PTEXTMETRICA, 8) + TEST_TYPE_ALIGN (PTEXTMETRICA, 8) + TEST_TARGET_SIZE (PTEXTMETRICA, 56) + TEST_TARGET_ALIGN(PTEXTMETRICA, 4) +} + +static void test_pack_PTEXTMETRICW(void) +{ + /* PTEXTMETRICW */ + TEST_TYPE_SIZE (PTEXTMETRICW, 8) + TEST_TYPE_ALIGN (PTEXTMETRICW, 8) + TEST_TARGET_SIZE (PTEXTMETRICW, 60) + TEST_TARGET_ALIGN(PTEXTMETRICW, 4) +} + +static void test_pack_PTRIVERTEX(void) +{ + /* PTRIVERTEX */ + TEST_TYPE_SIZE (PTRIVERTEX, 8) + TEST_TYPE_ALIGN (PTRIVERTEX, 8) + TEST_TARGET_SIZE (PTRIVERTEX, 16) + TEST_TARGET_ALIGN(PTRIVERTEX, 4) +} + +static void test_pack_PXFORM(void) +{ + /* PXFORM */ + TEST_TYPE_SIZE (PXFORM, 8) + TEST_TYPE_ALIGN (PXFORM, 8) + TEST_TARGET_SIZE (PXFORM, 24) + TEST_TARGET_ALIGN(PXFORM, 4) +} + +static void test_pack_RASTERIZER_STATUS(void) +{ + /* RASTERIZER_STATUS */ + TEST_TYPE_SIZE (RASTERIZER_STATUS, 6) + TEST_TYPE_ALIGN (RASTERIZER_STATUS, 2) + TEST_FIELD_SIZE (RASTERIZER_STATUS, nSize, 2) + TEST_FIELD_ALIGN (RASTERIZER_STATUS, nSize, 2) + TEST_FIELD_OFFSET(RASTERIZER_STATUS, nSize, 0) + TEST_FIELD_SIZE (RASTERIZER_STATUS, wFlags, 2) + TEST_FIELD_ALIGN (RASTERIZER_STATUS, wFlags, 2) + TEST_FIELD_OFFSET(RASTERIZER_STATUS, wFlags, 2) + TEST_FIELD_SIZE (RASTERIZER_STATUS, nLanguageID, 2) + TEST_FIELD_ALIGN (RASTERIZER_STATUS, nLanguageID, 2) + TEST_FIELD_OFFSET(RASTERIZER_STATUS, nLanguageID, 4) +} + +static void test_pack_RGBQUAD(void) +{ + /* RGBQUAD */ + TEST_TYPE_SIZE (RGBQUAD, 4) + TEST_TYPE_ALIGN (RGBQUAD, 1) + TEST_FIELD_SIZE (RGBQUAD, rgbBlue, 1) + TEST_FIELD_ALIGN (RGBQUAD, rgbBlue, 1) + TEST_FIELD_OFFSET(RGBQUAD, rgbBlue, 0) + TEST_FIELD_SIZE (RGBQUAD, rgbGreen, 1) + TEST_FIELD_ALIGN (RGBQUAD, rgbGreen, 1) + TEST_FIELD_OFFSET(RGBQUAD, rgbGreen, 1) + TEST_FIELD_SIZE (RGBQUAD, rgbRed, 1) + TEST_FIELD_ALIGN (RGBQUAD, rgbRed, 1) + TEST_FIELD_OFFSET(RGBQUAD, rgbRed, 2) + TEST_FIELD_SIZE (RGBQUAD, rgbReserved, 1) + TEST_FIELD_ALIGN (RGBQUAD, rgbReserved, 1) + TEST_FIELD_OFFSET(RGBQUAD, rgbReserved, 3) +} + +static void test_pack_RGBTRIPLE(void) +{ + /* RGBTRIPLE */ + TEST_TYPE_SIZE (RGBTRIPLE, 3) + TEST_TYPE_ALIGN (RGBTRIPLE, 1) + TEST_FIELD_SIZE (RGBTRIPLE, rgbtBlue, 1) + TEST_FIELD_ALIGN (RGBTRIPLE, rgbtBlue, 1) + TEST_FIELD_OFFSET(RGBTRIPLE, rgbtBlue, 0) + TEST_FIELD_SIZE (RGBTRIPLE, rgbtGreen, 1) + TEST_FIELD_ALIGN (RGBTRIPLE, rgbtGreen, 1) + TEST_FIELD_OFFSET(RGBTRIPLE, rgbtGreen, 1) + TEST_FIELD_SIZE (RGBTRIPLE, rgbtRed, 1) + TEST_FIELD_ALIGN (RGBTRIPLE, rgbtRed, 1) + TEST_FIELD_OFFSET(RGBTRIPLE, rgbtRed, 2) +} + +static void test_pack_RGNDATA(void) +{ + /* RGNDATA */ + TEST_TYPE_SIZE (RGNDATA, 36) + TEST_TYPE_ALIGN (RGNDATA, 4) + TEST_FIELD_SIZE (RGNDATA, rdh, 32) + TEST_FIELD_ALIGN (RGNDATA, rdh, 4) + TEST_FIELD_OFFSET(RGNDATA, rdh, 0) + TEST_FIELD_SIZE (RGNDATA, Buffer, 1) + TEST_FIELD_ALIGN (RGNDATA, Buffer, 1) + TEST_FIELD_OFFSET(RGNDATA, Buffer, 32) +} + +static void test_pack_RGNDATAHEADER(void) +{ + /* RGNDATAHEADER */ + TEST_TYPE_SIZE (RGNDATAHEADER, 32) + TEST_TYPE_ALIGN (RGNDATAHEADER, 4) + TEST_FIELD_SIZE (RGNDATAHEADER, dwSize, 4) + TEST_FIELD_ALIGN (RGNDATAHEADER, dwSize, 4) + TEST_FIELD_OFFSET(RGNDATAHEADER, dwSize, 0) + TEST_FIELD_SIZE (RGNDATAHEADER, iType, 4) + TEST_FIELD_ALIGN (RGNDATAHEADER, iType, 4) + TEST_FIELD_OFFSET(RGNDATAHEADER, iType, 4) + TEST_FIELD_SIZE (RGNDATAHEADER, nCount, 4) + TEST_FIELD_ALIGN (RGNDATAHEADER, nCount, 4) + TEST_FIELD_OFFSET(RGNDATAHEADER, nCount, 8) + TEST_FIELD_SIZE (RGNDATAHEADER, nRgnSize, 4) + TEST_FIELD_ALIGN (RGNDATAHEADER, nRgnSize, 4) + TEST_FIELD_OFFSET(RGNDATAHEADER, nRgnSize, 12) + TEST_FIELD_SIZE (RGNDATAHEADER, rcBound, 16) + TEST_FIELD_ALIGN (RGNDATAHEADER, rcBound, 4) + TEST_FIELD_OFFSET(RGNDATAHEADER, rcBound, 16) +} + +static void test_pack_TEXTMETRICA(void) +{ + /* TEXTMETRICA */ + TEST_TYPE_SIZE (TEXTMETRICA, 56) + TEST_TYPE_ALIGN (TEXTMETRICA, 4) + TEST_FIELD_SIZE (TEXTMETRICA, tmHeight, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmHeight, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmHeight, 0) + TEST_FIELD_SIZE (TEXTMETRICA, tmAscent, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmAscent, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmAscent, 4) + TEST_FIELD_SIZE (TEXTMETRICA, tmDescent, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmDescent, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmDescent, 8) + TEST_FIELD_SIZE (TEXTMETRICA, tmInternalLeading, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmInternalLeading, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmInternalLeading, 12) + TEST_FIELD_SIZE (TEXTMETRICA, tmExternalLeading, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmExternalLeading, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmExternalLeading, 16) + TEST_FIELD_SIZE (TEXTMETRICA, tmAveCharWidth, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmAveCharWidth, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmAveCharWidth, 20) + TEST_FIELD_SIZE (TEXTMETRICA, tmMaxCharWidth, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmMaxCharWidth, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmMaxCharWidth, 24) + TEST_FIELD_SIZE (TEXTMETRICA, tmWeight, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmWeight, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmWeight, 28) + TEST_FIELD_SIZE (TEXTMETRICA, tmOverhang, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmOverhang, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmOverhang, 32) + TEST_FIELD_SIZE (TEXTMETRICA, tmDigitizedAspectX, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmDigitizedAspectX, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmDigitizedAspectX, 36) + TEST_FIELD_SIZE (TEXTMETRICA, tmDigitizedAspectY, 4) + TEST_FIELD_ALIGN (TEXTMETRICA, tmDigitizedAspectY, 4) + TEST_FIELD_OFFSET(TEXTMETRICA, tmDigitizedAspectY, 40) + TEST_FIELD_SIZE (TEXTMETRICA, tmFirstChar, 1) + TEST_FIELD_ALIGN (TEXTMETRICA, tmFirstChar, 1) + TEST_FIELD_OFFSET(TEXTMETRICA, tmFirstChar, 44) + TEST_FIELD_SIZE (TEXTMETRICA, tmLastChar, 1) + TEST_FIELD_ALIGN (TEXTMETRICA, tmLastChar, 1) + TEST_FIELD_OFFSET(TEXTMETRICA, tmLastChar, 45) + TEST_FIELD_SIZE (TEXTMETRICA, tmDefaultChar, 1) + TEST_FIELD_ALIGN (TEXTMETRICA, tmDefaultChar, 1) + TEST_FIELD_OFFSET(TEXTMETRICA, tmDefaultChar, 46) + TEST_FIELD_SIZE (TEXTMETRICA, tmBreakChar, 1) + TEST_FIELD_ALIGN (TEXTMETRICA, tmBreakChar, 1) + TEST_FIELD_OFFSET(TEXTMETRICA, tmBreakChar, 47) + TEST_FIELD_SIZE (TEXTMETRICA, tmItalic, 1) + TEST_FIELD_ALIGN (TEXTMETRICA, tmItalic, 1) + TEST_FIELD_OFFSET(TEXTMETRICA, tmItalic, 48) + TEST_FIELD_SIZE (TEXTMETRICA, tmUnderlined, 1) + TEST_FIELD_ALIGN (TEXTMETRICA, tmUnderlined, 1) + TEST_FIELD_OFFSET(TEXTMETRICA, tmUnderlined, 49) + TEST_FIELD_SIZE (TEXTMETRICA, tmStruckOut, 1) + TEST_FIELD_ALIGN (TEXTMETRICA, tmStruckOut, 1) + TEST_FIELD_OFFSET(TEXTMETRICA, tmStruckOut, 50) + TEST_FIELD_SIZE (TEXTMETRICA, tmPitchAndFamily, 1) + TEST_FIELD_ALIGN (TEXTMETRICA, tmPitchAndFamily, 1) + TEST_FIELD_OFFSET(TEXTMETRICA, tmPitchAndFamily, 51) + TEST_FIELD_SIZE (TEXTMETRICA, tmCharSet, 1) + TEST_FIELD_ALIGN (TEXTMETRICA, tmCharSet, 1) + TEST_FIELD_OFFSET(TEXTMETRICA, tmCharSet, 52) +} + +static void test_pack_TEXTMETRICW(void) +{ + /* TEXTMETRICW */ + TEST_TYPE_SIZE (TEXTMETRICW, 60) + TEST_TYPE_ALIGN (TEXTMETRICW, 4) + TEST_FIELD_SIZE (TEXTMETRICW, tmHeight, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmHeight, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmHeight, 0) + TEST_FIELD_SIZE (TEXTMETRICW, tmAscent, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmAscent, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmAscent, 4) + TEST_FIELD_SIZE (TEXTMETRICW, tmDescent, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmDescent, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmDescent, 8) + TEST_FIELD_SIZE (TEXTMETRICW, tmInternalLeading, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmInternalLeading, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmInternalLeading, 12) + TEST_FIELD_SIZE (TEXTMETRICW, tmExternalLeading, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmExternalLeading, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmExternalLeading, 16) + TEST_FIELD_SIZE (TEXTMETRICW, tmAveCharWidth, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmAveCharWidth, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmAveCharWidth, 20) + TEST_FIELD_SIZE (TEXTMETRICW, tmMaxCharWidth, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmMaxCharWidth, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmMaxCharWidth, 24) + TEST_FIELD_SIZE (TEXTMETRICW, tmWeight, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmWeight, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmWeight, 28) + TEST_FIELD_SIZE (TEXTMETRICW, tmOverhang, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmOverhang, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmOverhang, 32) + TEST_FIELD_SIZE (TEXTMETRICW, tmDigitizedAspectX, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmDigitizedAspectX, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmDigitizedAspectX, 36) + TEST_FIELD_SIZE (TEXTMETRICW, tmDigitizedAspectY, 4) + TEST_FIELD_ALIGN (TEXTMETRICW, tmDigitizedAspectY, 4) + TEST_FIELD_OFFSET(TEXTMETRICW, tmDigitizedAspectY, 40) + TEST_FIELD_SIZE (TEXTMETRICW, tmFirstChar, 2) + TEST_FIELD_ALIGN (TEXTMETRICW, tmFirstChar, 2) + TEST_FIELD_OFFSET(TEXTMETRICW, tmFirstChar, 44) + TEST_FIELD_SIZE (TEXTMETRICW, tmLastChar, 2) + TEST_FIELD_ALIGN (TEXTMETRICW, tmLastChar, 2) + TEST_FIELD_OFFSET(TEXTMETRICW, tmLastChar, 46) + TEST_FIELD_SIZE (TEXTMETRICW, tmDefaultChar, 2) + TEST_FIELD_ALIGN (TEXTMETRICW, tmDefaultChar, 2) + TEST_FIELD_OFFSET(TEXTMETRICW, tmDefaultChar, 48) + TEST_FIELD_SIZE (TEXTMETRICW, tmBreakChar, 2) + TEST_FIELD_ALIGN (TEXTMETRICW, tmBreakChar, 2) + TEST_FIELD_OFFSET(TEXTMETRICW, tmBreakChar, 50) + TEST_FIELD_SIZE (TEXTMETRICW, tmItalic, 1) + TEST_FIELD_ALIGN (TEXTMETRICW, tmItalic, 1) + TEST_FIELD_OFFSET(TEXTMETRICW, tmItalic, 52) + TEST_FIELD_SIZE (TEXTMETRICW, tmUnderlined, 1) + TEST_FIELD_ALIGN (TEXTMETRICW, tmUnderlined, 1) + TEST_FIELD_OFFSET(TEXTMETRICW, tmUnderlined, 53) + TEST_FIELD_SIZE (TEXTMETRICW, tmStruckOut, 1) + TEST_FIELD_ALIGN (TEXTMETRICW, tmStruckOut, 1) + TEST_FIELD_OFFSET(TEXTMETRICW, tmStruckOut, 54) + TEST_FIELD_SIZE (TEXTMETRICW, tmPitchAndFamily, 1) + TEST_FIELD_ALIGN (TEXTMETRICW, tmPitchAndFamily, 1) + TEST_FIELD_OFFSET(TEXTMETRICW, tmPitchAndFamily, 55) + TEST_FIELD_SIZE (TEXTMETRICW, tmCharSet, 1) + TEST_FIELD_ALIGN (TEXTMETRICW, tmCharSet, 1) + TEST_FIELD_OFFSET(TEXTMETRICW, tmCharSet, 56) +} + +static void test_pack_TRIVERTEX(void) +{ + /* TRIVERTEX */ + TEST_TYPE_SIZE (TRIVERTEX, 16) + TEST_TYPE_ALIGN (TRIVERTEX, 4) + TEST_FIELD_SIZE (TRIVERTEX, x, 4) + TEST_FIELD_ALIGN (TRIVERTEX, x, 4) + TEST_FIELD_OFFSET(TRIVERTEX, x, 0) + TEST_FIELD_SIZE (TRIVERTEX, y, 4) + TEST_FIELD_ALIGN (TRIVERTEX, y, 4) + TEST_FIELD_OFFSET(TRIVERTEX, y, 4) + TEST_FIELD_SIZE (TRIVERTEX, Red, 2) + TEST_FIELD_ALIGN (TRIVERTEX, Red, 2) + TEST_FIELD_OFFSET(TRIVERTEX, Red, 8) + TEST_FIELD_SIZE (TRIVERTEX, Green, 2) + TEST_FIELD_ALIGN (TRIVERTEX, Green, 2) + TEST_FIELD_OFFSET(TRIVERTEX, Green, 10) + TEST_FIELD_SIZE (TRIVERTEX, Blue, 2) + TEST_FIELD_ALIGN (TRIVERTEX, Blue, 2) + TEST_FIELD_OFFSET(TRIVERTEX, Blue, 12) + TEST_FIELD_SIZE (TRIVERTEX, Alpha, 2) + TEST_FIELD_ALIGN (TRIVERTEX, Alpha, 2) + TEST_FIELD_OFFSET(TRIVERTEX, Alpha, 14) +} + +static void test_pack_TTPOLYCURVE(void) +{ + /* TTPOLYCURVE */ + TEST_TYPE_SIZE (TTPOLYCURVE, 12) + TEST_TYPE_ALIGN (TTPOLYCURVE, 2) + TEST_FIELD_SIZE (TTPOLYCURVE, wType, 2) + TEST_FIELD_ALIGN (TTPOLYCURVE, wType, 2) + TEST_FIELD_OFFSET(TTPOLYCURVE, wType, 0) + TEST_FIELD_SIZE (TTPOLYCURVE, cpfx, 2) + TEST_FIELD_ALIGN (TTPOLYCURVE, cpfx, 2) + TEST_FIELD_OFFSET(TTPOLYCURVE, cpfx, 2) + TEST_FIELD_SIZE (TTPOLYCURVE, apfx, 8) + TEST_FIELD_ALIGN (TTPOLYCURVE, apfx, 2) + TEST_FIELD_OFFSET(TTPOLYCURVE, apfx, 4) +} + +static void test_pack_TTPOLYGONHEADER(void) +{ + /* TTPOLYGONHEADER */ + TEST_TYPE_SIZE (TTPOLYGONHEADER, 16) + TEST_TYPE_ALIGN (TTPOLYGONHEADER, 4) + TEST_FIELD_SIZE (TTPOLYGONHEADER, cb, 4) + TEST_FIELD_ALIGN (TTPOLYGONHEADER, cb, 4) + TEST_FIELD_OFFSET(TTPOLYGONHEADER, cb, 0) + TEST_FIELD_SIZE (TTPOLYGONHEADER, dwType, 4) + TEST_FIELD_ALIGN (TTPOLYGONHEADER, dwType, 4) + TEST_FIELD_OFFSET(TTPOLYGONHEADER, dwType, 4) + TEST_FIELD_SIZE (TTPOLYGONHEADER, pfxStart, 8) + TEST_FIELD_ALIGN (TTPOLYGONHEADER, pfxStart, 2) + TEST_FIELD_OFFSET(TTPOLYGONHEADER, pfxStart, 8) +} + +static void test_pack_XFORM(void) +{ + /* XFORM */ + TEST_TYPE_SIZE (XFORM, 24) + TEST_TYPE_ALIGN (XFORM, 4) + TEST_FIELD_SIZE (XFORM, eM11, 4) + TEST_FIELD_ALIGN (XFORM, eM11, 4) + TEST_FIELD_OFFSET(XFORM, eM11, 0) + TEST_FIELD_SIZE (XFORM, eM12, 4) + TEST_FIELD_ALIGN (XFORM, eM12, 4) + TEST_FIELD_OFFSET(XFORM, eM12, 4) + TEST_FIELD_SIZE (XFORM, eM21, 4) + TEST_FIELD_ALIGN (XFORM, eM21, 4) + TEST_FIELD_OFFSET(XFORM, eM21, 8) + TEST_FIELD_SIZE (XFORM, eM22, 4) + TEST_FIELD_ALIGN (XFORM, eM22, 4) + TEST_FIELD_OFFSET(XFORM, eM22, 12) + TEST_FIELD_SIZE (XFORM, eDx, 4) + TEST_FIELD_ALIGN (XFORM, eDx, 4) + TEST_FIELD_OFFSET(XFORM, eDx, 16) + TEST_FIELD_SIZE (XFORM, eDy, 4) + TEST_FIELD_ALIGN (XFORM, eDy, 4) + TEST_FIELD_OFFSET(XFORM, eDy, 20) +} + +#else /* _WIN64 */ + +static void test_pack_ABC(void) +{ + /* ABC */ + TEST_TYPE_SIZE (ABC, 12) + TEST_TYPE_ALIGN (ABC, 4) + TEST_FIELD_SIZE (ABC, abcA, 4) + TEST_FIELD_ALIGN (ABC, abcA, 4) + TEST_FIELD_OFFSET(ABC, abcA, 0) + TEST_FIELD_SIZE (ABC, abcB, 4) + TEST_FIELD_ALIGN (ABC, abcB, 4) + TEST_FIELD_OFFSET(ABC, abcB, 4) + TEST_FIELD_SIZE (ABC, abcC, 4) + TEST_FIELD_ALIGN (ABC, abcC, 4) + TEST_FIELD_OFFSET(ABC, abcC, 8) +} + +static void test_pack_ABCFLOAT(void) +{ + /* ABCFLOAT */ + TEST_TYPE_SIZE (ABCFLOAT, 12) + TEST_TYPE_ALIGN (ABCFLOAT, 4) + TEST_FIELD_SIZE (ABCFLOAT, abcfA, 4) + TEST_FIELD_ALIGN (ABCFLOAT, abcfA, 4) + TEST_FIELD_OFFSET(ABCFLOAT, abcfA, 0) + TEST_FIELD_SIZE (ABCFLOAT, abcfB, 4) + TEST_FIELD_ALIGN (ABCFLOAT, abcfB, 4) + TEST_FIELD_OFFSET(ABCFLOAT, abcfB, 4) + TEST_FIELD_SIZE (ABCFLOAT, abcfC, 4) + TEST_FIELD_ALIGN (ABCFLOAT, abcfC, 4) + TEST_FIELD_OFFSET(ABCFLOAT, abcfC, 8) +} + +static void test_pack_ABORTPROC(void) +{ + /* ABORTPROC */ + TEST_TYPE_SIZE (ABORTPROC, 4) + TEST_TYPE_ALIGN (ABORTPROC, 4) +} + +static void test_pack_BITMAP(void) +{ + /* BITMAP */ + TEST_TYPE_SIZE (BITMAP, 24) + TEST_TYPE_ALIGN (BITMAP, 4) + TEST_FIELD_SIZE (BITMAP, bmType, 4) + TEST_FIELD_ALIGN (BITMAP, bmType, 4) + TEST_FIELD_OFFSET(BITMAP, bmType, 0) + TEST_FIELD_SIZE (BITMAP, bmWidth, 4) + TEST_FIELD_ALIGN (BITMAP, bmWidth, 4) + TEST_FIELD_OFFSET(BITMAP, bmWidth, 4) + TEST_FIELD_SIZE (BITMAP, bmHeight, 4) + TEST_FIELD_ALIGN (BITMAP, bmHeight, 4) + TEST_FIELD_OFFSET(BITMAP, bmHeight, 8) + TEST_FIELD_SIZE (BITMAP, bmWidthBytes, 4) + TEST_FIELD_ALIGN (BITMAP, bmWidthBytes, 4) + TEST_FIELD_OFFSET(BITMAP, bmWidthBytes, 12) + TEST_FIELD_SIZE (BITMAP, bmPlanes, 2) + TEST_FIELD_ALIGN (BITMAP, bmPlanes, 2) + TEST_FIELD_OFFSET(BITMAP, bmPlanes, 16) + TEST_FIELD_SIZE (BITMAP, bmBitsPixel, 2) + TEST_FIELD_ALIGN (BITMAP, bmBitsPixel, 2) + TEST_FIELD_OFFSET(BITMAP, bmBitsPixel, 18) + TEST_FIELD_SIZE (BITMAP, bmBits, 4) + TEST_FIELD_ALIGN (BITMAP, bmBits, 4) + TEST_FIELD_OFFSET(BITMAP, bmBits, 20) +} + +static void test_pack_BITMAPCOREHEADER(void) +{ + /* BITMAPCOREHEADER */ + TEST_TYPE_SIZE (BITMAPCOREHEADER, 12) + TEST_TYPE_ALIGN (BITMAPCOREHEADER, 4) + TEST_FIELD_SIZE (BITMAPCOREHEADER, bcSize, 4) + TEST_FIELD_ALIGN (BITMAPCOREHEADER, bcSize, 4) + TEST_FIELD_OFFSET(BITMAPCOREHEADER, bcSize, 0) + TEST_FIELD_SIZE (BITMAPCOREHEADER, bcWidth, 2) + TEST_FIELD_ALIGN (BITMAPCOREHEADER, bcWidth, 2) + TEST_FIELD_OFFSET(BITMAPCOREHEADER, bcWidth, 4) + TEST_FIELD_SIZE (BITMAPCOREHEADER, bcHeight, 2) + TEST_FIELD_ALIGN (BITMAPCOREHEADER, bcHeight, 2) + TEST_FIELD_OFFSET(BITMAPCOREHEADER, bcHeight, 6) + TEST_FIELD_SIZE (BITMAPCOREHEADER, bcPlanes, 2) + TEST_FIELD_ALIGN (BITMAPCOREHEADER, bcPlanes, 2) + TEST_FIELD_OFFSET(BITMAPCOREHEADER, bcPlanes, 8) + TEST_FIELD_SIZE (BITMAPCOREHEADER, bcBitCount, 2) + TEST_FIELD_ALIGN (BITMAPCOREHEADER, bcBitCount, 2) + TEST_FIELD_OFFSET(BITMAPCOREHEADER, bcBitCount, 10) +} + +static void test_pack_BITMAPCOREINFO(void) +{ + /* BITMAPCOREINFO */ + TEST_TYPE_SIZE (BITMAPCOREINFO, 16) + TEST_TYPE_ALIGN (BITMAPCOREINFO, 4) + TEST_FIELD_SIZE (BITMAPCOREINFO, bmciHeader, 12) + TEST_FIELD_ALIGN (BITMAPCOREINFO, bmciHeader, 4) + TEST_FIELD_OFFSET(BITMAPCOREINFO, bmciHeader, 0) + TEST_FIELD_SIZE (BITMAPCOREINFO, bmciColors, 3) + TEST_FIELD_ALIGN (BITMAPCOREINFO, bmciColors, 1) + TEST_FIELD_OFFSET(BITMAPCOREINFO, bmciColors, 12) +} + +static void test_pack_BITMAPFILEHEADER(void) +{ + /* BITMAPFILEHEADER (pack 2) */ + TEST_TYPE_SIZE (BITMAPFILEHEADER, 14) + TEST_TYPE_ALIGN (BITMAPFILEHEADER, 2) + TEST_FIELD_SIZE (BITMAPFILEHEADER, bfType, 2) + TEST_FIELD_ALIGN (BITMAPFILEHEADER, bfType, 2) + TEST_FIELD_OFFSET(BITMAPFILEHEADER, bfType, 0) + TEST_FIELD_SIZE (BITMAPFILEHEADER, bfSize, 4) + TEST_FIELD_ALIGN (BITMAPFILEHEADER, bfSize, 2) + TEST_FIELD_OFFSET(BITMAPFILEHEADER, bfSize, 2) + TEST_FIELD_SIZE (BITMAPFILEHEADER, bfReserved1, 2) + TEST_FIELD_ALIGN (BITMAPFILEHEADER, bfReserved1, 2) + TEST_FIELD_OFFSET(BITMAPFILEHEADER, bfReserved1, 6) + TEST_FIELD_SIZE (BITMAPFILEHEADER, bfReserved2, 2) + TEST_FIELD_ALIGN (BITMAPFILEHEADER, bfReserved2, 2) + TEST_FIELD_OFFSET(BITMAPFILEHEADER, bfReserved2, 8) + TEST_FIELD_SIZE (BITMAPFILEHEADER, bfOffBits, 4) + TEST_FIELD_ALIGN (BITMAPFILEHEADER, bfOffBits, 2) + TEST_FIELD_OFFSET(BITMAPFILEHEADER, bfOffBits, 10) +} + +static void test_pack_BITMAPINFO(void) +{ + /* BITMAPINFO */ + TEST_TYPE_SIZE (BITMAPINFO, 44) + TEST_TYPE_ALIGN (BITMAPINFO, 4) + TEST_FIELD_SIZE (BITMAPINFO, bmiHeader, 40) + TEST_FIELD_ALIGN (BITMAPINFO, bmiHeader, 4) + TEST_FIELD_OFFSET(BITMAPINFO, bmiHeader, 0) + TEST_FIELD_SIZE (BITMAPINFO, bmiColors, 4) + TEST_FIELD_ALIGN (BITMAPINFO, bmiColors, 1) + TEST_FIELD_OFFSET(BITMAPINFO, bmiColors, 40) +} + +static void test_pack_BITMAPINFOHEADER(void) +{ + /* BITMAPINFOHEADER */ + TEST_TYPE_SIZE (BITMAPINFOHEADER, 40) + TEST_TYPE_ALIGN (BITMAPINFOHEADER, 4) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biSize, 4) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biSize, 4) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biSize, 0) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biWidth, 4) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biWidth, 4) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biWidth, 4) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biHeight, 4) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biHeight, 4) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biHeight, 8) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biPlanes, 2) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biPlanes, 2) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biPlanes, 12) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biBitCount, 2) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biBitCount, 2) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biBitCount, 14) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biCompression, 4) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biCompression, 4) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biCompression, 16) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biSizeImage, 4) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biSizeImage, 4) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biSizeImage, 20) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biXPelsPerMeter, 4) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biXPelsPerMeter, 4) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biXPelsPerMeter, 24) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biYPelsPerMeter, 4) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biYPelsPerMeter, 4) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biYPelsPerMeter, 28) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biClrUsed, 4) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biClrUsed, 4) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biClrUsed, 32) + TEST_FIELD_SIZE (BITMAPINFOHEADER, biClrImportant, 4) + TEST_FIELD_ALIGN (BITMAPINFOHEADER, biClrImportant, 4) + TEST_FIELD_OFFSET(BITMAPINFOHEADER, biClrImportant, 36) +} + +static void test_pack_BITMAPV4HEADER(void) +{ + /* BITMAPV4HEADER */ + TEST_TYPE_SIZE (BITMAPV4HEADER, 108) + TEST_TYPE_ALIGN (BITMAPV4HEADER, 4) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4Size, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4Size, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4Size, 0) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4Width, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4Width, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4Width, 4) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4Height, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4Height, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4Height, 8) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4Planes, 2) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4Planes, 2) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4Planes, 12) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4BitCount, 2) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4BitCount, 2) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4BitCount, 14) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4V4Compression, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4V4Compression, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4V4Compression, 16) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4SizeImage, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4SizeImage, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4SizeImage, 20) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4XPelsPerMeter, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4XPelsPerMeter, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4XPelsPerMeter, 24) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4YPelsPerMeter, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4YPelsPerMeter, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4YPelsPerMeter, 28) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4ClrUsed, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4ClrUsed, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4ClrUsed, 32) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4ClrImportant, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4ClrImportant, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4ClrImportant, 36) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4RedMask, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4RedMask, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4RedMask, 40) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4GreenMask, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4GreenMask, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4GreenMask, 44) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4BlueMask, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4BlueMask, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4BlueMask, 48) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4AlphaMask, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4AlphaMask, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4AlphaMask, 52) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4CSType, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4CSType, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4CSType, 56) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4Endpoints, 36) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4Endpoints, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4Endpoints, 60) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4GammaRed, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4GammaRed, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4GammaRed, 96) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4GammaGreen, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4GammaGreen, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4GammaGreen, 100) + TEST_FIELD_SIZE (BITMAPV4HEADER, bV4GammaBlue, 4) + TEST_FIELD_ALIGN (BITMAPV4HEADER, bV4GammaBlue, 4) + TEST_FIELD_OFFSET(BITMAPV4HEADER, bV4GammaBlue, 104) +} + +static void test_pack_BITMAPV5HEADER(void) +{ + /* BITMAPV5HEADER */ + TEST_TYPE_SIZE (BITMAPV5HEADER, 124) + TEST_TYPE_ALIGN (BITMAPV5HEADER, 4) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5Size, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5Size, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5Size, 0) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5Width, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5Width, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5Width, 4) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5Height, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5Height, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5Height, 8) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5Planes, 2) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5Planes, 2) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5Planes, 12) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5BitCount, 2) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5BitCount, 2) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5BitCount, 14) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5Compression, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5Compression, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5Compression, 16) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5SizeImage, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5SizeImage, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5SizeImage, 20) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5XPelsPerMeter, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5XPelsPerMeter, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5XPelsPerMeter, 24) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5YPelsPerMeter, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5YPelsPerMeter, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5YPelsPerMeter, 28) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5ClrUsed, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5ClrUsed, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5ClrUsed, 32) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5ClrImportant, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5ClrImportant, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5ClrImportant, 36) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5RedMask, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5RedMask, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5RedMask, 40) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5GreenMask, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5GreenMask, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5GreenMask, 44) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5BlueMask, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5BlueMask, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5BlueMask, 48) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5AlphaMask, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5AlphaMask, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5AlphaMask, 52) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5CSType, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5CSType, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5CSType, 56) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5Endpoints, 36) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5Endpoints, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5Endpoints, 60) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5GammaRed, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5GammaRed, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5GammaRed, 96) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5GammaGreen, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5GammaGreen, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5GammaGreen, 100) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5GammaBlue, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5GammaBlue, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5GammaBlue, 104) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5Intent, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5Intent, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5Intent, 108) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5ProfileData, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5ProfileData, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5ProfileData, 112) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5ProfileSize, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5ProfileSize, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5ProfileSize, 116) + TEST_FIELD_SIZE (BITMAPV5HEADER, bV5Reserved, 4) + TEST_FIELD_ALIGN (BITMAPV5HEADER, bV5Reserved, 4) + TEST_FIELD_OFFSET(BITMAPV5HEADER, bV5Reserved, 120) +} + +static void test_pack_BLENDFUNCTION(void) +{ + /* BLENDFUNCTION */ + TEST_TYPE_SIZE (BLENDFUNCTION, 4) + TEST_TYPE_ALIGN (BLENDFUNCTION, 1) + TEST_FIELD_SIZE (BLENDFUNCTION, BlendOp, 1) + TEST_FIELD_ALIGN (BLENDFUNCTION, BlendOp, 1) + TEST_FIELD_OFFSET(BLENDFUNCTION, BlendOp, 0) + TEST_FIELD_SIZE (BLENDFUNCTION, BlendFlags, 1) + TEST_FIELD_ALIGN (BLENDFUNCTION, BlendFlags, 1) + TEST_FIELD_OFFSET(BLENDFUNCTION, BlendFlags, 1) + TEST_FIELD_SIZE (BLENDFUNCTION, SourceConstantAlpha, 1) + TEST_FIELD_ALIGN (BLENDFUNCTION, SourceConstantAlpha, 1) + TEST_FIELD_OFFSET(BLENDFUNCTION, SourceConstantAlpha, 2) + TEST_FIELD_SIZE (BLENDFUNCTION, AlphaFormat, 1) + TEST_FIELD_ALIGN (BLENDFUNCTION, AlphaFormat, 1) + TEST_FIELD_OFFSET(BLENDFUNCTION, AlphaFormat, 3) +} + +static void test_pack_CHARSETINFO(void) +{ + /* CHARSETINFO */ + TEST_TYPE_SIZE (CHARSETINFO, 32) + TEST_TYPE_ALIGN (CHARSETINFO, 4) + TEST_FIELD_SIZE (CHARSETINFO, ciCharset, 4) + TEST_FIELD_ALIGN (CHARSETINFO, ciCharset, 4) + TEST_FIELD_OFFSET(CHARSETINFO, ciCharset, 0) + TEST_FIELD_SIZE (CHARSETINFO, ciACP, 4) + TEST_FIELD_ALIGN (CHARSETINFO, ciACP, 4) + TEST_FIELD_OFFSET(CHARSETINFO, ciACP, 4) + TEST_FIELD_SIZE (CHARSETINFO, fs, 24) + TEST_FIELD_ALIGN (CHARSETINFO, fs, 4) + TEST_FIELD_OFFSET(CHARSETINFO, fs, 8) +} + +static void test_pack_CIEXYZ(void) +{ + /* CIEXYZ */ + TEST_TYPE_SIZE (CIEXYZ, 12) + TEST_TYPE_ALIGN (CIEXYZ, 4) + TEST_FIELD_SIZE (CIEXYZ, ciexyzX, 4) + TEST_FIELD_ALIGN (CIEXYZ, ciexyzX, 4) + TEST_FIELD_OFFSET(CIEXYZ, ciexyzX, 0) + TEST_FIELD_SIZE (CIEXYZ, ciexyzY, 4) + TEST_FIELD_ALIGN (CIEXYZ, ciexyzY, 4) + TEST_FIELD_OFFSET(CIEXYZ, ciexyzY, 4) + TEST_FIELD_SIZE (CIEXYZ, ciexyzZ, 4) + TEST_FIELD_ALIGN (CIEXYZ, ciexyzZ, 4) + TEST_FIELD_OFFSET(CIEXYZ, ciexyzZ, 8) +} + +static void test_pack_CIEXYZTRIPLE(void) +{ + /* CIEXYZTRIPLE */ + TEST_TYPE_SIZE (CIEXYZTRIPLE, 36) + TEST_TYPE_ALIGN (CIEXYZTRIPLE, 4) + TEST_FIELD_SIZE (CIEXYZTRIPLE, ciexyzRed, 12) + TEST_FIELD_ALIGN (CIEXYZTRIPLE, ciexyzRed, 4) + TEST_FIELD_OFFSET(CIEXYZTRIPLE, ciexyzRed, 0) + TEST_FIELD_SIZE (CIEXYZTRIPLE, ciexyzGreen, 12) + TEST_FIELD_ALIGN (CIEXYZTRIPLE, ciexyzGreen, 4) + TEST_FIELD_OFFSET(CIEXYZTRIPLE, ciexyzGreen, 12) + TEST_FIELD_SIZE (CIEXYZTRIPLE, ciexyzBlue, 12) + TEST_FIELD_ALIGN (CIEXYZTRIPLE, ciexyzBlue, 4) + TEST_FIELD_OFFSET(CIEXYZTRIPLE, ciexyzBlue, 24) +} + +static void test_pack_COLOR16(void) +{ + /* COLOR16 */ + TEST_TYPE_SIZE (COLOR16, 2) + TEST_TYPE_ALIGN (COLOR16, 2) +} + +static void test_pack_COLORADJUSTMENT(void) +{ + /* COLORADJUSTMENT */ + TEST_TYPE_SIZE (COLORADJUSTMENT, 24) + TEST_TYPE_ALIGN (COLORADJUSTMENT, 2) + TEST_FIELD_SIZE (COLORADJUSTMENT, caSize, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caSize, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caSize, 0) + TEST_FIELD_SIZE (COLORADJUSTMENT, caFlags, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caFlags, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caFlags, 2) + TEST_FIELD_SIZE (COLORADJUSTMENT, caIlluminantIndex, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caIlluminantIndex, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caIlluminantIndex, 4) + TEST_FIELD_SIZE (COLORADJUSTMENT, caRedGamma, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caRedGamma, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caRedGamma, 6) + TEST_FIELD_SIZE (COLORADJUSTMENT, caGreenGamma, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caGreenGamma, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caGreenGamma, 8) + TEST_FIELD_SIZE (COLORADJUSTMENT, caBlueGamma, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caBlueGamma, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caBlueGamma, 10) + TEST_FIELD_SIZE (COLORADJUSTMENT, caReferenceBlack, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caReferenceBlack, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caReferenceBlack, 12) + TEST_FIELD_SIZE (COLORADJUSTMENT, caReferenceWhite, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caReferenceWhite, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caReferenceWhite, 14) + TEST_FIELD_SIZE (COLORADJUSTMENT, caContrast, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caContrast, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caContrast, 16) + TEST_FIELD_SIZE (COLORADJUSTMENT, caBrightness, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caBrightness, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caBrightness, 18) + TEST_FIELD_SIZE (COLORADJUSTMENT, caColorfulness, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caColorfulness, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caColorfulness, 20) + TEST_FIELD_SIZE (COLORADJUSTMENT, caRedGreenTint, 2) + TEST_FIELD_ALIGN (COLORADJUSTMENT, caRedGreenTint, 2) + TEST_FIELD_OFFSET(COLORADJUSTMENT, caRedGreenTint, 22) +} + +static void test_pack_DEVMODEA(void) +{ + /* DEVMODEA */ + TEST_FIELD_SIZE (DEVMODEA, dmDeviceName, 32) + TEST_FIELD_ALIGN (DEVMODEA, dmDeviceName, 1) + TEST_FIELD_OFFSET(DEVMODEA, dmDeviceName, 0) + TEST_FIELD_SIZE (DEVMODEA, dmSpecVersion, 2) + TEST_FIELD_ALIGN (DEVMODEA, dmSpecVersion, 2) + TEST_FIELD_OFFSET(DEVMODEA, dmSpecVersion, 32) + TEST_FIELD_SIZE (DEVMODEA, dmDriverVersion, 2) + TEST_FIELD_ALIGN (DEVMODEA, dmDriverVersion, 2) + TEST_FIELD_OFFSET(DEVMODEA, dmDriverVersion, 34) + TEST_FIELD_SIZE (DEVMODEA, dmSize, 2) + TEST_FIELD_ALIGN (DEVMODEA, dmSize, 2) + TEST_FIELD_OFFSET(DEVMODEA, dmSize, 36) + TEST_FIELD_SIZE (DEVMODEA, dmDriverExtra, 2) + TEST_FIELD_ALIGN (DEVMODEA, dmDriverExtra, 2) + TEST_FIELD_OFFSET(DEVMODEA, dmDriverExtra, 38) + TEST_FIELD_SIZE (DEVMODEA, dmFields, 4) + TEST_FIELD_ALIGN (DEVMODEA, dmFields, 4) + TEST_FIELD_OFFSET(DEVMODEA, dmFields, 40) +} + +static void test_pack_DEVMODEW(void) +{ + /* DEVMODEW */ + TEST_FIELD_SIZE (DEVMODEW, dmDeviceName, 64) + TEST_FIELD_ALIGN (DEVMODEW, dmDeviceName, 2) + TEST_FIELD_OFFSET(DEVMODEW, dmDeviceName, 0) + TEST_FIELD_SIZE (DEVMODEW, dmSpecVersion, 2) + TEST_FIELD_ALIGN (DEVMODEW, dmSpecVersion, 2) + TEST_FIELD_OFFSET(DEVMODEW, dmSpecVersion, 64) + TEST_FIELD_SIZE (DEVMODEW, dmDriverVersion, 2) + TEST_FIELD_ALIGN (DEVMODEW, dmDriverVersion, 2) + TEST_FIELD_OFFSET(DEVMODEW, dmDriverVersion, 66) + TEST_FIELD_SIZE (DEVMODEW, dmSize, 2) + TEST_FIELD_ALIGN (DEVMODEW, dmSize, 2) + TEST_FIELD_OFFSET(DEVMODEW, dmSize, 68) + TEST_FIELD_SIZE (DEVMODEW, dmDriverExtra, 2) + TEST_FIELD_ALIGN (DEVMODEW, dmDriverExtra, 2) + TEST_FIELD_OFFSET(DEVMODEW, dmDriverExtra, 70) + TEST_FIELD_SIZE (DEVMODEW, dmFields, 4) + TEST_FIELD_ALIGN (DEVMODEW, dmFields, 4) + TEST_FIELD_OFFSET(DEVMODEW, dmFields, 72) +} + +static void test_pack_DIBSECTION(void) +{ + /* DIBSECTION */ + TEST_TYPE_SIZE (DIBSECTION, 84) + TEST_TYPE_ALIGN (DIBSECTION, 4) + TEST_FIELD_SIZE (DIBSECTION, dsBm, 24) + TEST_FIELD_ALIGN (DIBSECTION, dsBm, 4) + TEST_FIELD_OFFSET(DIBSECTION, dsBm, 0) + TEST_FIELD_SIZE (DIBSECTION, dsBmih, 40) + TEST_FIELD_ALIGN (DIBSECTION, dsBmih, 4) + TEST_FIELD_OFFSET(DIBSECTION, dsBmih, 24) + TEST_FIELD_SIZE (DIBSECTION, dsBitfields, 12) + TEST_FIELD_ALIGN (DIBSECTION, dsBitfields, 4) + TEST_FIELD_OFFSET(DIBSECTION, dsBitfields, 64) + TEST_FIELD_SIZE (DIBSECTION, dshSection, 4) + TEST_FIELD_ALIGN (DIBSECTION, dshSection, 4) + TEST_FIELD_OFFSET(DIBSECTION, dshSection, 76) + TEST_FIELD_SIZE (DIBSECTION, dsOffset, 4) + TEST_FIELD_ALIGN (DIBSECTION, dsOffset, 4) + TEST_FIELD_OFFSET(DIBSECTION, dsOffset, 80) +} + +static void test_pack_DISPLAY_DEVICEA(void) +{ + /* DISPLAY_DEVICEA */ + TEST_TYPE_SIZE (DISPLAY_DEVICEA, 424) + TEST_TYPE_ALIGN (DISPLAY_DEVICEA, 4) + TEST_FIELD_SIZE (DISPLAY_DEVICEA, cb, 4) + TEST_FIELD_ALIGN (DISPLAY_DEVICEA, cb, 4) + TEST_FIELD_OFFSET(DISPLAY_DEVICEA, cb, 0) + TEST_FIELD_SIZE (DISPLAY_DEVICEA, DeviceName, 32) + TEST_FIELD_ALIGN (DISPLAY_DEVICEA, DeviceName, 1) + TEST_FIELD_OFFSET(DISPLAY_DEVICEA, DeviceName, 4) + TEST_FIELD_SIZE (DISPLAY_DEVICEA, DeviceString, 128) + TEST_FIELD_ALIGN (DISPLAY_DEVICEA, DeviceString, 1) + TEST_FIELD_OFFSET(DISPLAY_DEVICEA, DeviceString, 36) + TEST_FIELD_SIZE (DISPLAY_DEVICEA, StateFlags, 4) + TEST_FIELD_ALIGN (DISPLAY_DEVICEA, StateFlags, 4) + TEST_FIELD_OFFSET(DISPLAY_DEVICEA, StateFlags, 164) + TEST_FIELD_SIZE (DISPLAY_DEVICEA, DeviceID, 128) + TEST_FIELD_ALIGN (DISPLAY_DEVICEA, DeviceID, 1) + TEST_FIELD_OFFSET(DISPLAY_DEVICEA, DeviceID, 168) + TEST_FIELD_SIZE (DISPLAY_DEVICEA, DeviceKey, 128) + TEST_FIELD_ALIGN (DISPLAY_DEVICEA, DeviceKey, 1) + TEST_FIELD_OFFSET(DISPLAY_DEVICEA, DeviceKey, 296) +} + +static void test_pack_DISPLAY_DEVICEW(void) +{ + /* DISPLAY_DEVICEW */ + TEST_TYPE_SIZE (DISPLAY_DEVICEW, 840) + TEST_TYPE_ALIGN (DISPLAY_DEVICEW, 4) + TEST_FIELD_SIZE (DISPLAY_DEVICEW, cb, 4) + TEST_FIELD_ALIGN (DISPLAY_DEVICEW, cb, 4) + TEST_FIELD_OFFSET(DISPLAY_DEVICEW, cb, 0) + TEST_FIELD_SIZE (DISPLAY_DEVICEW, DeviceName, 64) + TEST_FIELD_ALIGN (DISPLAY_DEVICEW, DeviceName, 2) + TEST_FIELD_OFFSET(DISPLAY_DEVICEW, DeviceName, 4) + TEST_FIELD_SIZE (DISPLAY_DEVICEW, DeviceString, 256) + TEST_FIELD_ALIGN (DISPLAY_DEVICEW, DeviceString, 2) + TEST_FIELD_OFFSET(DISPLAY_DEVICEW, DeviceString, 68) + TEST_FIELD_SIZE (DISPLAY_DEVICEW, StateFlags, 4) + TEST_FIELD_ALIGN (DISPLAY_DEVICEW, StateFlags, 4) + TEST_FIELD_OFFSET(DISPLAY_DEVICEW, StateFlags, 324) + TEST_FIELD_SIZE (DISPLAY_DEVICEW, DeviceID, 256) + TEST_FIELD_ALIGN (DISPLAY_DEVICEW, DeviceID, 2) + TEST_FIELD_OFFSET(DISPLAY_DEVICEW, DeviceID, 328) + TEST_FIELD_SIZE (DISPLAY_DEVICEW, DeviceKey, 256) + TEST_FIELD_ALIGN (DISPLAY_DEVICEW, DeviceKey, 2) + TEST_FIELD_OFFSET(DISPLAY_DEVICEW, DeviceKey, 584) +} + +static void test_pack_DOCINFOA(void) +{ + /* DOCINFOA */ + TEST_TYPE_SIZE (DOCINFOA, 20) + TEST_TYPE_ALIGN (DOCINFOA, 4) + TEST_FIELD_SIZE (DOCINFOA, cbSize, 4) + TEST_FIELD_ALIGN (DOCINFOA, cbSize, 4) + TEST_FIELD_OFFSET(DOCINFOA, cbSize, 0) + TEST_FIELD_SIZE (DOCINFOA, lpszDocName, 4) + TEST_FIELD_ALIGN (DOCINFOA, lpszDocName, 4) + TEST_FIELD_OFFSET(DOCINFOA, lpszDocName, 4) + TEST_FIELD_SIZE (DOCINFOA, lpszOutput, 4) + TEST_FIELD_ALIGN (DOCINFOA, lpszOutput, 4) + TEST_FIELD_OFFSET(DOCINFOA, lpszOutput, 8) + TEST_FIELD_SIZE (DOCINFOA, lpszDatatype, 4) + TEST_FIELD_ALIGN (DOCINFOA, lpszDatatype, 4) + TEST_FIELD_OFFSET(DOCINFOA, lpszDatatype, 12) + TEST_FIELD_SIZE (DOCINFOA, fwType, 4) + TEST_FIELD_ALIGN (DOCINFOA, fwType, 4) + TEST_FIELD_OFFSET(DOCINFOA, fwType, 16) +} + +static void test_pack_DOCINFOW(void) +{ + /* DOCINFOW */ + TEST_TYPE_SIZE (DOCINFOW, 20) + TEST_TYPE_ALIGN (DOCINFOW, 4) + TEST_FIELD_SIZE (DOCINFOW, cbSize, 4) + TEST_FIELD_ALIGN (DOCINFOW, cbSize, 4) + TEST_FIELD_OFFSET(DOCINFOW, cbSize, 0) + TEST_FIELD_SIZE (DOCINFOW, lpszDocName, 4) + TEST_FIELD_ALIGN (DOCINFOW, lpszDocName, 4) + TEST_FIELD_OFFSET(DOCINFOW, lpszDocName, 4) + TEST_FIELD_SIZE (DOCINFOW, lpszOutput, 4) + TEST_FIELD_ALIGN (DOCINFOW, lpszOutput, 4) + TEST_FIELD_OFFSET(DOCINFOW, lpszOutput, 8) + TEST_FIELD_SIZE (DOCINFOW, lpszDatatype, 4) + TEST_FIELD_ALIGN (DOCINFOW, lpszDatatype, 4) + TEST_FIELD_OFFSET(DOCINFOW, lpszDatatype, 12) + TEST_FIELD_SIZE (DOCINFOW, fwType, 4) + TEST_FIELD_ALIGN (DOCINFOW, fwType, 4) + TEST_FIELD_OFFSET(DOCINFOW, fwType, 16) +} + +static void test_pack_EMR(void) +{ + /* EMR */ + TEST_TYPE_SIZE (EMR, 8) + TEST_TYPE_ALIGN (EMR, 4) + TEST_FIELD_SIZE (EMR, iType, 4) + TEST_FIELD_ALIGN (EMR, iType, 4) + TEST_FIELD_OFFSET(EMR, iType, 0) + TEST_FIELD_SIZE (EMR, nSize, 4) + TEST_FIELD_ALIGN (EMR, nSize, 4) + TEST_FIELD_OFFSET(EMR, nSize, 4) +} + +static void test_pack_EMRABORTPATH(void) +{ + /* EMRABORTPATH */ + TEST_TYPE_SIZE (EMRABORTPATH, 8) + TEST_TYPE_ALIGN (EMRABORTPATH, 4) + TEST_FIELD_SIZE (EMRABORTPATH, emr, 8) + TEST_FIELD_ALIGN (EMRABORTPATH, emr, 4) + TEST_FIELD_OFFSET(EMRABORTPATH, emr, 0) +} + +static void test_pack_EMRANGLEARC(void) +{ + /* EMRANGLEARC */ + TEST_TYPE_SIZE (EMRANGLEARC, 28) + TEST_TYPE_ALIGN (EMRANGLEARC, 4) + TEST_FIELD_SIZE (EMRANGLEARC, emr, 8) + TEST_FIELD_ALIGN (EMRANGLEARC, emr, 4) + TEST_FIELD_OFFSET(EMRANGLEARC, emr, 0) + TEST_FIELD_SIZE (EMRANGLEARC, ptlCenter, 8) + TEST_FIELD_ALIGN (EMRANGLEARC, ptlCenter, 4) + TEST_FIELD_OFFSET(EMRANGLEARC, ptlCenter, 8) + TEST_FIELD_SIZE (EMRANGLEARC, nRadius, 4) + TEST_FIELD_ALIGN (EMRANGLEARC, nRadius, 4) + TEST_FIELD_OFFSET(EMRANGLEARC, nRadius, 16) + TEST_FIELD_SIZE (EMRANGLEARC, eStartAngle, 4) + TEST_FIELD_ALIGN (EMRANGLEARC, eStartAngle, 4) + TEST_FIELD_OFFSET(EMRANGLEARC, eStartAngle, 20) + TEST_FIELD_SIZE (EMRANGLEARC, eSweepAngle, 4) + TEST_FIELD_ALIGN (EMRANGLEARC, eSweepAngle, 4) + TEST_FIELD_OFFSET(EMRANGLEARC, eSweepAngle, 24) +} + +static void test_pack_EMRARC(void) +{ + /* EMRARC */ + TEST_TYPE_SIZE (EMRARC, 40) + TEST_TYPE_ALIGN (EMRARC, 4) + TEST_FIELD_SIZE (EMRARC, emr, 8) + TEST_FIELD_ALIGN (EMRARC, emr, 4) + TEST_FIELD_OFFSET(EMRARC, emr, 0) + TEST_FIELD_SIZE (EMRARC, rclBox, 16) + TEST_FIELD_ALIGN (EMRARC, rclBox, 4) + TEST_FIELD_OFFSET(EMRARC, rclBox, 8) + TEST_FIELD_SIZE (EMRARC, ptlStart, 8) + TEST_FIELD_ALIGN (EMRARC, ptlStart, 4) + TEST_FIELD_OFFSET(EMRARC, ptlStart, 24) + TEST_FIELD_SIZE (EMRARC, ptlEnd, 8) + TEST_FIELD_ALIGN (EMRARC, ptlEnd, 4) + TEST_FIELD_OFFSET(EMRARC, ptlEnd, 32) +} + +static void test_pack_EMRARCTO(void) +{ + /* EMRARCTO */ + TEST_TYPE_SIZE (EMRARCTO, 40) + TEST_TYPE_ALIGN (EMRARCTO, 4) + TEST_FIELD_SIZE (EMRARCTO, emr, 8) + TEST_FIELD_ALIGN (EMRARCTO, emr, 4) + TEST_FIELD_OFFSET(EMRARCTO, emr, 0) + TEST_FIELD_SIZE (EMRARCTO, rclBox, 16) + TEST_FIELD_ALIGN (EMRARCTO, rclBox, 4) + TEST_FIELD_OFFSET(EMRARCTO, rclBox, 8) + TEST_FIELD_SIZE (EMRARCTO, ptlStart, 8) + TEST_FIELD_ALIGN (EMRARCTO, ptlStart, 4) + TEST_FIELD_OFFSET(EMRARCTO, ptlStart, 24) + TEST_FIELD_SIZE (EMRARCTO, ptlEnd, 8) + TEST_FIELD_ALIGN (EMRARCTO, ptlEnd, 4) + TEST_FIELD_OFFSET(EMRARCTO, ptlEnd, 32) +} + +static void test_pack_EMRBEGINPATH(void) +{ + /* EMRBEGINPATH */ + TEST_TYPE_SIZE (EMRBEGINPATH, 8) + TEST_TYPE_ALIGN (EMRBEGINPATH, 4) + TEST_FIELD_SIZE (EMRBEGINPATH, emr, 8) + TEST_FIELD_ALIGN (EMRBEGINPATH, emr, 4) + TEST_FIELD_OFFSET(EMRBEGINPATH, emr, 0) +} + +static void test_pack_EMRBITBLT(void) +{ + /* EMRBITBLT */ + TEST_TYPE_SIZE (EMRBITBLT, 100) + TEST_TYPE_ALIGN (EMRBITBLT, 4) + TEST_FIELD_SIZE (EMRBITBLT, emr, 8) + TEST_FIELD_ALIGN (EMRBITBLT, emr, 4) + TEST_FIELD_OFFSET(EMRBITBLT, emr, 0) + TEST_FIELD_SIZE (EMRBITBLT, rclBounds, 16) + TEST_FIELD_ALIGN (EMRBITBLT, rclBounds, 4) + TEST_FIELD_OFFSET(EMRBITBLT, rclBounds, 8) + TEST_FIELD_SIZE (EMRBITBLT, xDest, 4) + TEST_FIELD_ALIGN (EMRBITBLT, xDest, 4) + TEST_FIELD_OFFSET(EMRBITBLT, xDest, 24) + TEST_FIELD_SIZE (EMRBITBLT, yDest, 4) + TEST_FIELD_ALIGN (EMRBITBLT, yDest, 4) + TEST_FIELD_OFFSET(EMRBITBLT, yDest, 28) + TEST_FIELD_SIZE (EMRBITBLT, cxDest, 4) + TEST_FIELD_ALIGN (EMRBITBLT, cxDest, 4) + TEST_FIELD_OFFSET(EMRBITBLT, cxDest, 32) + TEST_FIELD_SIZE (EMRBITBLT, cyDest, 4) + TEST_FIELD_ALIGN (EMRBITBLT, cyDest, 4) + TEST_FIELD_OFFSET(EMRBITBLT, cyDest, 36) + TEST_FIELD_SIZE (EMRBITBLT, dwRop, 4) + TEST_FIELD_ALIGN (EMRBITBLT, dwRop, 4) + TEST_FIELD_OFFSET(EMRBITBLT, dwRop, 40) + TEST_FIELD_SIZE (EMRBITBLT, xSrc, 4) + TEST_FIELD_ALIGN (EMRBITBLT, xSrc, 4) + TEST_FIELD_OFFSET(EMRBITBLT, xSrc, 44) + TEST_FIELD_SIZE (EMRBITBLT, ySrc, 4) + TEST_FIELD_ALIGN (EMRBITBLT, ySrc, 4) + TEST_FIELD_OFFSET(EMRBITBLT, ySrc, 48) + TEST_FIELD_SIZE (EMRBITBLT, xformSrc, 24) + TEST_FIELD_ALIGN (EMRBITBLT, xformSrc, 4) + TEST_FIELD_OFFSET(EMRBITBLT, xformSrc, 52) + TEST_FIELD_SIZE (EMRBITBLT, crBkColorSrc, 4) + TEST_FIELD_ALIGN (EMRBITBLT, crBkColorSrc, 4) + TEST_FIELD_OFFSET(EMRBITBLT, crBkColorSrc, 76) + TEST_FIELD_SIZE (EMRBITBLT, iUsageSrc, 4) + TEST_FIELD_ALIGN (EMRBITBLT, iUsageSrc, 4) + TEST_FIELD_OFFSET(EMRBITBLT, iUsageSrc, 80) + TEST_FIELD_SIZE (EMRBITBLT, offBmiSrc, 4) + TEST_FIELD_ALIGN (EMRBITBLT, offBmiSrc, 4) + TEST_FIELD_OFFSET(EMRBITBLT, offBmiSrc, 84) + TEST_FIELD_SIZE (EMRBITBLT, cbBmiSrc, 4) + TEST_FIELD_ALIGN (EMRBITBLT, cbBmiSrc, 4) + TEST_FIELD_OFFSET(EMRBITBLT, cbBmiSrc, 88) + TEST_FIELD_SIZE (EMRBITBLT, offBitsSrc, 4) + TEST_FIELD_ALIGN (EMRBITBLT, offBitsSrc, 4) + TEST_FIELD_OFFSET(EMRBITBLT, offBitsSrc, 92) + TEST_FIELD_SIZE (EMRBITBLT, cbBitsSrc, 4) + TEST_FIELD_ALIGN (EMRBITBLT, cbBitsSrc, 4) + TEST_FIELD_OFFSET(EMRBITBLT, cbBitsSrc, 96) +} + +static void test_pack_EMRCHORD(void) +{ + /* EMRCHORD */ + TEST_TYPE_SIZE (EMRCHORD, 40) + TEST_TYPE_ALIGN (EMRCHORD, 4) + TEST_FIELD_SIZE (EMRCHORD, emr, 8) + TEST_FIELD_ALIGN (EMRCHORD, emr, 4) + TEST_FIELD_OFFSET(EMRCHORD, emr, 0) + TEST_FIELD_SIZE (EMRCHORD, rclBox, 16) + TEST_FIELD_ALIGN (EMRCHORD, rclBox, 4) + TEST_FIELD_OFFSET(EMRCHORD, rclBox, 8) + TEST_FIELD_SIZE (EMRCHORD, ptlStart, 8) + TEST_FIELD_ALIGN (EMRCHORD, ptlStart, 4) + TEST_FIELD_OFFSET(EMRCHORD, ptlStart, 24) + TEST_FIELD_SIZE (EMRCHORD, ptlEnd, 8) + TEST_FIELD_ALIGN (EMRCHORD, ptlEnd, 4) + TEST_FIELD_OFFSET(EMRCHORD, ptlEnd, 32) +} + +static void test_pack_EMRCLOSEFIGURE(void) +{ + /* EMRCLOSEFIGURE */ + TEST_TYPE_SIZE (EMRCLOSEFIGURE, 8) + TEST_TYPE_ALIGN (EMRCLOSEFIGURE, 4) + TEST_FIELD_SIZE (EMRCLOSEFIGURE, emr, 8) + TEST_FIELD_ALIGN (EMRCLOSEFIGURE, emr, 4) + TEST_FIELD_OFFSET(EMRCLOSEFIGURE, emr, 0) +} + +static void test_pack_EMRCREATEBRUSHINDIRECT(void) +{ + /* EMRCREATEBRUSHINDIRECT */ + TEST_TYPE_SIZE (EMRCREATEBRUSHINDIRECT, 24) + TEST_TYPE_ALIGN (EMRCREATEBRUSHINDIRECT, 4) + TEST_FIELD_SIZE (EMRCREATEBRUSHINDIRECT, emr, 8) + TEST_FIELD_ALIGN (EMRCREATEBRUSHINDIRECT, emr, 4) + TEST_FIELD_OFFSET(EMRCREATEBRUSHINDIRECT, emr, 0) + TEST_FIELD_SIZE (EMRCREATEBRUSHINDIRECT, ihBrush, 4) + TEST_FIELD_ALIGN (EMRCREATEBRUSHINDIRECT, ihBrush, 4) + TEST_FIELD_OFFSET(EMRCREATEBRUSHINDIRECT, ihBrush, 8) + TEST_FIELD_SIZE (EMRCREATEBRUSHINDIRECT, lb, 12) + TEST_FIELD_ALIGN (EMRCREATEBRUSHINDIRECT, lb, 4) + TEST_FIELD_OFFSET(EMRCREATEBRUSHINDIRECT, lb, 12) +} + +static void test_pack_EMRCREATECOLORSPACE(void) +{ + /* EMRCREATECOLORSPACE */ + TEST_TYPE_SIZE (EMRCREATECOLORSPACE, 340) + TEST_TYPE_ALIGN (EMRCREATECOLORSPACE, 4) + TEST_FIELD_SIZE (EMRCREATECOLORSPACE, emr, 8) + TEST_FIELD_ALIGN (EMRCREATECOLORSPACE, emr, 4) + TEST_FIELD_OFFSET(EMRCREATECOLORSPACE, emr, 0) + TEST_FIELD_SIZE (EMRCREATECOLORSPACE, ihCS, 4) + TEST_FIELD_ALIGN (EMRCREATECOLORSPACE, ihCS, 4) + TEST_FIELD_OFFSET(EMRCREATECOLORSPACE, ihCS, 8) + TEST_FIELD_SIZE (EMRCREATECOLORSPACE, lcs, 328) + TEST_FIELD_ALIGN (EMRCREATECOLORSPACE, lcs, 4) + TEST_FIELD_OFFSET(EMRCREATECOLORSPACE, lcs, 12) +} + +static void test_pack_EMRCREATECOLORSPACEW(void) +{ + /* EMRCREATECOLORSPACEW */ + TEST_TYPE_SIZE (EMRCREATECOLORSPACEW, 612) + TEST_TYPE_ALIGN (EMRCREATECOLORSPACEW, 4) + TEST_FIELD_SIZE (EMRCREATECOLORSPACEW, emr, 8) + TEST_FIELD_ALIGN (EMRCREATECOLORSPACEW, emr, 4) + TEST_FIELD_OFFSET(EMRCREATECOLORSPACEW, emr, 0) + TEST_FIELD_SIZE (EMRCREATECOLORSPACEW, ihCS, 4) + TEST_FIELD_ALIGN (EMRCREATECOLORSPACEW, ihCS, 4) + TEST_FIELD_OFFSET(EMRCREATECOLORSPACEW, ihCS, 8) + TEST_FIELD_SIZE (EMRCREATECOLORSPACEW, lcs, 588) + TEST_FIELD_ALIGN (EMRCREATECOLORSPACEW, lcs, 4) + TEST_FIELD_OFFSET(EMRCREATECOLORSPACEW, lcs, 12) + TEST_FIELD_SIZE (EMRCREATECOLORSPACEW, dwFlags, 4) + TEST_FIELD_ALIGN (EMRCREATECOLORSPACEW, dwFlags, 4) + TEST_FIELD_OFFSET(EMRCREATECOLORSPACEW, dwFlags, 600) + TEST_FIELD_SIZE (EMRCREATECOLORSPACEW, cbData, 4) + TEST_FIELD_ALIGN (EMRCREATECOLORSPACEW, cbData, 4) + TEST_FIELD_OFFSET(EMRCREATECOLORSPACEW, cbData, 604) + TEST_FIELD_SIZE (EMRCREATECOLORSPACEW, Data, 1) + TEST_FIELD_ALIGN (EMRCREATECOLORSPACEW, Data, 1) + TEST_FIELD_OFFSET(EMRCREATECOLORSPACEW, Data, 608) +} + +static void test_pack_EMRCREATEDIBPATTERNBRUSHPT(void) +{ + /* EMRCREATEDIBPATTERNBRUSHPT */ + TEST_TYPE_SIZE (EMRCREATEDIBPATTERNBRUSHPT, 32) + TEST_TYPE_ALIGN (EMRCREATEDIBPATTERNBRUSHPT, 4) + TEST_FIELD_SIZE (EMRCREATEDIBPATTERNBRUSHPT, emr, 8) + TEST_FIELD_ALIGN (EMRCREATEDIBPATTERNBRUSHPT, emr, 4) + TEST_FIELD_OFFSET(EMRCREATEDIBPATTERNBRUSHPT, emr, 0) + TEST_FIELD_SIZE (EMRCREATEDIBPATTERNBRUSHPT, ihBrush, 4) + TEST_FIELD_ALIGN (EMRCREATEDIBPATTERNBRUSHPT, ihBrush, 4) + TEST_FIELD_OFFSET(EMRCREATEDIBPATTERNBRUSHPT, ihBrush, 8) + TEST_FIELD_SIZE (EMRCREATEDIBPATTERNBRUSHPT, iUsage, 4) + TEST_FIELD_ALIGN (EMRCREATEDIBPATTERNBRUSHPT, iUsage, 4) + TEST_FIELD_OFFSET(EMRCREATEDIBPATTERNBRUSHPT, iUsage, 12) + TEST_FIELD_SIZE (EMRCREATEDIBPATTERNBRUSHPT, offBmi, 4) + TEST_FIELD_ALIGN (EMRCREATEDIBPATTERNBRUSHPT, offBmi, 4) + TEST_FIELD_OFFSET(EMRCREATEDIBPATTERNBRUSHPT, offBmi, 16) + TEST_FIELD_SIZE (EMRCREATEDIBPATTERNBRUSHPT, cbBmi, 4) + TEST_FIELD_ALIGN (EMRCREATEDIBPATTERNBRUSHPT, cbBmi, 4) + TEST_FIELD_OFFSET(EMRCREATEDIBPATTERNBRUSHPT, cbBmi, 20) + TEST_FIELD_SIZE (EMRCREATEDIBPATTERNBRUSHPT, offBits, 4) + TEST_FIELD_ALIGN (EMRCREATEDIBPATTERNBRUSHPT, offBits, 4) + TEST_FIELD_OFFSET(EMRCREATEDIBPATTERNBRUSHPT, offBits, 24) + TEST_FIELD_SIZE (EMRCREATEDIBPATTERNBRUSHPT, cbBits, 4) + TEST_FIELD_ALIGN (EMRCREATEDIBPATTERNBRUSHPT, cbBits, 4) + TEST_FIELD_OFFSET(EMRCREATEDIBPATTERNBRUSHPT, cbBits, 28) +} + +static void test_pack_EMRCREATEMONOBRUSH(void) +{ + /* EMRCREATEMONOBRUSH */ + TEST_TYPE_SIZE (EMRCREATEMONOBRUSH, 32) + TEST_TYPE_ALIGN (EMRCREATEMONOBRUSH, 4) + TEST_FIELD_SIZE (EMRCREATEMONOBRUSH, emr, 8) + TEST_FIELD_ALIGN (EMRCREATEMONOBRUSH, emr, 4) + TEST_FIELD_OFFSET(EMRCREATEMONOBRUSH, emr, 0) + TEST_FIELD_SIZE (EMRCREATEMONOBRUSH, ihBrush, 4) + TEST_FIELD_ALIGN (EMRCREATEMONOBRUSH, ihBrush, 4) + TEST_FIELD_OFFSET(EMRCREATEMONOBRUSH, ihBrush, 8) + TEST_FIELD_SIZE (EMRCREATEMONOBRUSH, iUsage, 4) + TEST_FIELD_ALIGN (EMRCREATEMONOBRUSH, iUsage, 4) + TEST_FIELD_OFFSET(EMRCREATEMONOBRUSH, iUsage, 12) + TEST_FIELD_SIZE (EMRCREATEMONOBRUSH, offBmi, 4) + TEST_FIELD_ALIGN (EMRCREATEMONOBRUSH, offBmi, 4) + TEST_FIELD_OFFSET(EMRCREATEMONOBRUSH, offBmi, 16) + TEST_FIELD_SIZE (EMRCREATEMONOBRUSH, cbBmi, 4) + TEST_FIELD_ALIGN (EMRCREATEMONOBRUSH, cbBmi, 4) + TEST_FIELD_OFFSET(EMRCREATEMONOBRUSH, cbBmi, 20) + TEST_FIELD_SIZE (EMRCREATEMONOBRUSH, offBits, 4) + TEST_FIELD_ALIGN (EMRCREATEMONOBRUSH, offBits, 4) + TEST_FIELD_OFFSET(EMRCREATEMONOBRUSH, offBits, 24) + TEST_FIELD_SIZE (EMRCREATEMONOBRUSH, cbBits, 4) + TEST_FIELD_ALIGN (EMRCREATEMONOBRUSH, cbBits, 4) + TEST_FIELD_OFFSET(EMRCREATEMONOBRUSH, cbBits, 28) +} + +static void test_pack_EMRCREATEPEN(void) +{ + /* EMRCREATEPEN */ + TEST_TYPE_SIZE (EMRCREATEPEN, 28) + TEST_TYPE_ALIGN (EMRCREATEPEN, 4) + TEST_FIELD_SIZE (EMRCREATEPEN, emr, 8) + TEST_FIELD_ALIGN (EMRCREATEPEN, emr, 4) + TEST_FIELD_OFFSET(EMRCREATEPEN, emr, 0) + TEST_FIELD_SIZE (EMRCREATEPEN, ihPen, 4) + TEST_FIELD_ALIGN (EMRCREATEPEN, ihPen, 4) + TEST_FIELD_OFFSET(EMRCREATEPEN, ihPen, 8) + TEST_FIELD_SIZE (EMRCREATEPEN, lopn, 16) + TEST_FIELD_ALIGN (EMRCREATEPEN, lopn, 4) + TEST_FIELD_OFFSET(EMRCREATEPEN, lopn, 12) +} + +static void test_pack_EMRDELETECOLORSPACE(void) +{ + /* EMRDELETECOLORSPACE */ + TEST_TYPE_SIZE (EMRDELETECOLORSPACE, 12) + TEST_TYPE_ALIGN (EMRDELETECOLORSPACE, 4) + TEST_FIELD_SIZE (EMRDELETECOLORSPACE, emr, 8) + TEST_FIELD_ALIGN (EMRDELETECOLORSPACE, emr, 4) + TEST_FIELD_OFFSET(EMRDELETECOLORSPACE, emr, 0) + TEST_FIELD_SIZE (EMRDELETECOLORSPACE, ihCS, 4) + TEST_FIELD_ALIGN (EMRDELETECOLORSPACE, ihCS, 4) + TEST_FIELD_OFFSET(EMRDELETECOLORSPACE, ihCS, 8) +} + +static void test_pack_EMRDELETEOBJECT(void) +{ + /* EMRDELETEOBJECT */ + TEST_TYPE_SIZE (EMRDELETEOBJECT, 12) + TEST_TYPE_ALIGN (EMRDELETEOBJECT, 4) + TEST_FIELD_SIZE (EMRDELETEOBJECT, emr, 8) + TEST_FIELD_ALIGN (EMRDELETEOBJECT, emr, 4) + TEST_FIELD_OFFSET(EMRDELETEOBJECT, emr, 0) + TEST_FIELD_SIZE (EMRDELETEOBJECT, ihObject, 4) + TEST_FIELD_ALIGN (EMRDELETEOBJECT, ihObject, 4) + TEST_FIELD_OFFSET(EMRDELETEOBJECT, ihObject, 8) +} + +static void test_pack_EMRELLIPSE(void) +{ + /* EMRELLIPSE */ + TEST_TYPE_SIZE (EMRELLIPSE, 24) + TEST_TYPE_ALIGN (EMRELLIPSE, 4) + TEST_FIELD_SIZE (EMRELLIPSE, emr, 8) + TEST_FIELD_ALIGN (EMRELLIPSE, emr, 4) + TEST_FIELD_OFFSET(EMRELLIPSE, emr, 0) + TEST_FIELD_SIZE (EMRELLIPSE, rclBox, 16) + TEST_FIELD_ALIGN (EMRELLIPSE, rclBox, 4) + TEST_FIELD_OFFSET(EMRELLIPSE, rclBox, 8) +} + +static void test_pack_EMRENDPATH(void) +{ + /* EMRENDPATH */ + TEST_TYPE_SIZE (EMRENDPATH, 8) + TEST_TYPE_ALIGN (EMRENDPATH, 4) + TEST_FIELD_SIZE (EMRENDPATH, emr, 8) + TEST_FIELD_ALIGN (EMRENDPATH, emr, 4) + TEST_FIELD_OFFSET(EMRENDPATH, emr, 0) +} + +static void test_pack_EMREOF(void) +{ + /* EMREOF */ + TEST_TYPE_SIZE (EMREOF, 20) + TEST_TYPE_ALIGN (EMREOF, 4) + TEST_FIELD_SIZE (EMREOF, emr, 8) + TEST_FIELD_ALIGN (EMREOF, emr, 4) + TEST_FIELD_OFFSET(EMREOF, emr, 0) + TEST_FIELD_SIZE (EMREOF, nPalEntries, 4) + TEST_FIELD_ALIGN (EMREOF, nPalEntries, 4) + TEST_FIELD_OFFSET(EMREOF, nPalEntries, 8) + TEST_FIELD_SIZE (EMREOF, offPalEntries, 4) + TEST_FIELD_ALIGN (EMREOF, offPalEntries, 4) + TEST_FIELD_OFFSET(EMREOF, offPalEntries, 12) + TEST_FIELD_SIZE (EMREOF, nSizeLast, 4) + TEST_FIELD_ALIGN (EMREOF, nSizeLast, 4) + TEST_FIELD_OFFSET(EMREOF, nSizeLast, 16) +} + +static void test_pack_EMREXCLUDECLIPRECT(void) +{ + /* EMREXCLUDECLIPRECT */ + TEST_TYPE_SIZE (EMREXCLUDECLIPRECT, 24) + TEST_TYPE_ALIGN (EMREXCLUDECLIPRECT, 4) + TEST_FIELD_SIZE (EMREXCLUDECLIPRECT, emr, 8) + TEST_FIELD_ALIGN (EMREXCLUDECLIPRECT, emr, 4) + TEST_FIELD_OFFSET(EMREXCLUDECLIPRECT, emr, 0) + TEST_FIELD_SIZE (EMREXCLUDECLIPRECT, rclClip, 16) + TEST_FIELD_ALIGN (EMREXCLUDECLIPRECT, rclClip, 4) + TEST_FIELD_OFFSET(EMREXCLUDECLIPRECT, rclClip, 8) +} + +static void test_pack_EMREXTCREATEFONTINDIRECTW(void) +{ + /* EMREXTCREATEFONTINDIRECTW */ + TEST_TYPE_SIZE (EMREXTCREATEFONTINDIRECTW, 332) + TEST_TYPE_ALIGN (EMREXTCREATEFONTINDIRECTW, 4) + TEST_FIELD_SIZE (EMREXTCREATEFONTINDIRECTW, emr, 8) + TEST_FIELD_ALIGN (EMREXTCREATEFONTINDIRECTW, emr, 4) + TEST_FIELD_OFFSET(EMREXTCREATEFONTINDIRECTW, emr, 0) + TEST_FIELD_SIZE (EMREXTCREATEFONTINDIRECTW, ihFont, 4) + TEST_FIELD_ALIGN (EMREXTCREATEFONTINDIRECTW, ihFont, 4) + TEST_FIELD_OFFSET(EMREXTCREATEFONTINDIRECTW, ihFont, 8) + TEST_FIELD_SIZE (EMREXTCREATEFONTINDIRECTW, elfw, 320) + TEST_FIELD_ALIGN (EMREXTCREATEFONTINDIRECTW, elfw, 4) + TEST_FIELD_OFFSET(EMREXTCREATEFONTINDIRECTW, elfw, 12) +} + +static void test_pack_EMREXTCREATEPEN(void) +{ + /* EMREXTCREATEPEN */ + TEST_TYPE_SIZE (EMREXTCREATEPEN, 56) + TEST_TYPE_ALIGN (EMREXTCREATEPEN, 4) + TEST_FIELD_SIZE (EMREXTCREATEPEN, emr, 8) + TEST_FIELD_ALIGN (EMREXTCREATEPEN, emr, 4) + TEST_FIELD_OFFSET(EMREXTCREATEPEN, emr, 0) + TEST_FIELD_SIZE (EMREXTCREATEPEN, ihPen, 4) + TEST_FIELD_ALIGN (EMREXTCREATEPEN, ihPen, 4) + TEST_FIELD_OFFSET(EMREXTCREATEPEN, ihPen, 8) + TEST_FIELD_SIZE (EMREXTCREATEPEN, offBmi, 4) + TEST_FIELD_ALIGN (EMREXTCREATEPEN, offBmi, 4) + TEST_FIELD_OFFSET(EMREXTCREATEPEN, offBmi, 12) + TEST_FIELD_SIZE (EMREXTCREATEPEN, cbBmi, 4) + TEST_FIELD_ALIGN (EMREXTCREATEPEN, cbBmi, 4) + TEST_FIELD_OFFSET(EMREXTCREATEPEN, cbBmi, 16) + TEST_FIELD_SIZE (EMREXTCREATEPEN, offBits, 4) + TEST_FIELD_ALIGN (EMREXTCREATEPEN, offBits, 4) + TEST_FIELD_OFFSET(EMREXTCREATEPEN, offBits, 20) + TEST_FIELD_SIZE (EMREXTCREATEPEN, cbBits, 4) + TEST_FIELD_ALIGN (EMREXTCREATEPEN, cbBits, 4) + TEST_FIELD_OFFSET(EMREXTCREATEPEN, cbBits, 24) + TEST_FIELD_SIZE (EMREXTCREATEPEN, elp, 28) + TEST_FIELD_ALIGN (EMREXTCREATEPEN, elp, 4) + TEST_FIELD_OFFSET(EMREXTCREATEPEN, elp, 28) +} + +static void test_pack_EMREXTFLOODFILL(void) +{ + /* EMREXTFLOODFILL */ + TEST_TYPE_SIZE (EMREXTFLOODFILL, 24) + TEST_TYPE_ALIGN (EMREXTFLOODFILL, 4) + TEST_FIELD_SIZE (EMREXTFLOODFILL, emr, 8) + TEST_FIELD_ALIGN (EMREXTFLOODFILL, emr, 4) + TEST_FIELD_OFFSET(EMREXTFLOODFILL, emr, 0) + TEST_FIELD_SIZE (EMREXTFLOODFILL, ptlStart, 8) + TEST_FIELD_ALIGN (EMREXTFLOODFILL, ptlStart, 4) + TEST_FIELD_OFFSET(EMREXTFLOODFILL, ptlStart, 8) + TEST_FIELD_SIZE (EMREXTFLOODFILL, crColor, 4) + TEST_FIELD_ALIGN (EMREXTFLOODFILL, crColor, 4) + TEST_FIELD_OFFSET(EMREXTFLOODFILL, crColor, 16) + TEST_FIELD_SIZE (EMREXTFLOODFILL, iMode, 4) + TEST_FIELD_ALIGN (EMREXTFLOODFILL, iMode, 4) + TEST_FIELD_OFFSET(EMREXTFLOODFILL, iMode, 20) +} + +static void test_pack_EMREXTSELECTCLIPRGN(void) +{ + /* EMREXTSELECTCLIPRGN */ + TEST_TYPE_SIZE (EMREXTSELECTCLIPRGN, 20) + TEST_TYPE_ALIGN (EMREXTSELECTCLIPRGN, 4) + TEST_FIELD_SIZE (EMREXTSELECTCLIPRGN, emr, 8) + TEST_FIELD_ALIGN (EMREXTSELECTCLIPRGN, emr, 4) + TEST_FIELD_OFFSET(EMREXTSELECTCLIPRGN, emr, 0) + TEST_FIELD_SIZE (EMREXTSELECTCLIPRGN, cbRgnData, 4) + TEST_FIELD_ALIGN (EMREXTSELECTCLIPRGN, cbRgnData, 4) + TEST_FIELD_OFFSET(EMREXTSELECTCLIPRGN, cbRgnData, 8) + TEST_FIELD_SIZE (EMREXTSELECTCLIPRGN, iMode, 4) + TEST_FIELD_ALIGN (EMREXTSELECTCLIPRGN, iMode, 4) + TEST_FIELD_OFFSET(EMREXTSELECTCLIPRGN, iMode, 12) + TEST_FIELD_SIZE (EMREXTSELECTCLIPRGN, RgnData, 1) + TEST_FIELD_ALIGN (EMREXTSELECTCLIPRGN, RgnData, 1) + TEST_FIELD_OFFSET(EMREXTSELECTCLIPRGN, RgnData, 16) +} + +static void test_pack_EMREXTTEXTOUTA(void) +{ + /* EMREXTTEXTOUTA */ + TEST_TYPE_SIZE (EMREXTTEXTOUTA, 76) + TEST_TYPE_ALIGN (EMREXTTEXTOUTA, 4) + TEST_FIELD_SIZE (EMREXTTEXTOUTA, emr, 8) + TEST_FIELD_ALIGN (EMREXTTEXTOUTA, emr, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTA, emr, 0) + TEST_FIELD_SIZE (EMREXTTEXTOUTA, rclBounds, 16) + TEST_FIELD_ALIGN (EMREXTTEXTOUTA, rclBounds, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTA, rclBounds, 8) + TEST_FIELD_SIZE (EMREXTTEXTOUTA, iGraphicsMode, 4) + TEST_FIELD_ALIGN (EMREXTTEXTOUTA, iGraphicsMode, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTA, iGraphicsMode, 24) + TEST_FIELD_SIZE (EMREXTTEXTOUTA, exScale, 4) + TEST_FIELD_ALIGN (EMREXTTEXTOUTA, exScale, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTA, exScale, 28) + TEST_FIELD_SIZE (EMREXTTEXTOUTA, eyScale, 4) + TEST_FIELD_ALIGN (EMREXTTEXTOUTA, eyScale, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTA, eyScale, 32) + TEST_FIELD_SIZE (EMREXTTEXTOUTA, emrtext, 40) + TEST_FIELD_ALIGN (EMREXTTEXTOUTA, emrtext, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTA, emrtext, 36) +} + +static void test_pack_EMREXTTEXTOUTW(void) +{ + /* EMREXTTEXTOUTW */ + TEST_TYPE_SIZE (EMREXTTEXTOUTW, 76) + TEST_TYPE_ALIGN (EMREXTTEXTOUTW, 4) + TEST_FIELD_SIZE (EMREXTTEXTOUTW, emr, 8) + TEST_FIELD_ALIGN (EMREXTTEXTOUTW, emr, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTW, emr, 0) + TEST_FIELD_SIZE (EMREXTTEXTOUTW, rclBounds, 16) + TEST_FIELD_ALIGN (EMREXTTEXTOUTW, rclBounds, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTW, rclBounds, 8) + TEST_FIELD_SIZE (EMREXTTEXTOUTW, iGraphicsMode, 4) + TEST_FIELD_ALIGN (EMREXTTEXTOUTW, iGraphicsMode, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTW, iGraphicsMode, 24) + TEST_FIELD_SIZE (EMREXTTEXTOUTW, exScale, 4) + TEST_FIELD_ALIGN (EMREXTTEXTOUTW, exScale, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTW, exScale, 28) + TEST_FIELD_SIZE (EMREXTTEXTOUTW, eyScale, 4) + TEST_FIELD_ALIGN (EMREXTTEXTOUTW, eyScale, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTW, eyScale, 32) + TEST_FIELD_SIZE (EMREXTTEXTOUTW, emrtext, 40) + TEST_FIELD_ALIGN (EMREXTTEXTOUTW, emrtext, 4) + TEST_FIELD_OFFSET(EMREXTTEXTOUTW, emrtext, 36) +} + +static void test_pack_EMRFILLPATH(void) +{ + /* EMRFILLPATH */ + TEST_TYPE_SIZE (EMRFILLPATH, 24) + TEST_TYPE_ALIGN (EMRFILLPATH, 4) + TEST_FIELD_SIZE (EMRFILLPATH, emr, 8) + TEST_FIELD_ALIGN (EMRFILLPATH, emr, 4) + TEST_FIELD_OFFSET(EMRFILLPATH, emr, 0) + TEST_FIELD_SIZE (EMRFILLPATH, rclBounds, 16) + TEST_FIELD_ALIGN (EMRFILLPATH, rclBounds, 4) + TEST_FIELD_OFFSET(EMRFILLPATH, rclBounds, 8) +} + +static void test_pack_EMRFILLRGN(void) +{ + /* EMRFILLRGN */ + TEST_TYPE_SIZE (EMRFILLRGN, 36) + TEST_TYPE_ALIGN (EMRFILLRGN, 4) + TEST_FIELD_SIZE (EMRFILLRGN, emr, 8) + TEST_FIELD_ALIGN (EMRFILLRGN, emr, 4) + TEST_FIELD_OFFSET(EMRFILLRGN, emr, 0) + TEST_FIELD_SIZE (EMRFILLRGN, rclBounds, 16) + TEST_FIELD_ALIGN (EMRFILLRGN, rclBounds, 4) + TEST_FIELD_OFFSET(EMRFILLRGN, rclBounds, 8) + TEST_FIELD_SIZE (EMRFILLRGN, cbRgnData, 4) + TEST_FIELD_ALIGN (EMRFILLRGN, cbRgnData, 4) + TEST_FIELD_OFFSET(EMRFILLRGN, cbRgnData, 24) + TEST_FIELD_SIZE (EMRFILLRGN, ihBrush, 4) + TEST_FIELD_ALIGN (EMRFILLRGN, ihBrush, 4) + TEST_FIELD_OFFSET(EMRFILLRGN, ihBrush, 28) + TEST_FIELD_SIZE (EMRFILLRGN, RgnData, 1) + TEST_FIELD_ALIGN (EMRFILLRGN, RgnData, 1) + TEST_FIELD_OFFSET(EMRFILLRGN, RgnData, 32) +} + +static void test_pack_EMRFLATTENPATH(void) +{ + /* EMRFLATTENPATH */ + TEST_TYPE_SIZE (EMRFLATTENPATH, 8) + TEST_TYPE_ALIGN (EMRFLATTENPATH, 4) + TEST_FIELD_SIZE (EMRFLATTENPATH, emr, 8) + TEST_FIELD_ALIGN (EMRFLATTENPATH, emr, 4) + TEST_FIELD_OFFSET(EMRFLATTENPATH, emr, 0) +} + +static void test_pack_EMRFORMAT(void) +{ + /* EMRFORMAT */ + TEST_TYPE_SIZE (EMRFORMAT, 16) + TEST_TYPE_ALIGN (EMRFORMAT, 4) + TEST_FIELD_SIZE (EMRFORMAT, dSignature, 4) + TEST_FIELD_ALIGN (EMRFORMAT, dSignature, 4) + TEST_FIELD_OFFSET(EMRFORMAT, dSignature, 0) + TEST_FIELD_SIZE (EMRFORMAT, nVersion, 4) + TEST_FIELD_ALIGN (EMRFORMAT, nVersion, 4) + TEST_FIELD_OFFSET(EMRFORMAT, nVersion, 4) + TEST_FIELD_SIZE (EMRFORMAT, cbData, 4) + TEST_FIELD_ALIGN (EMRFORMAT, cbData, 4) + TEST_FIELD_OFFSET(EMRFORMAT, cbData, 8) + TEST_FIELD_SIZE (EMRFORMAT, offData, 4) + TEST_FIELD_ALIGN (EMRFORMAT, offData, 4) + TEST_FIELD_OFFSET(EMRFORMAT, offData, 12) +} + +static void test_pack_EMRFRAMERGN(void) +{ + /* EMRFRAMERGN */ + TEST_TYPE_SIZE (EMRFRAMERGN, 44) + TEST_TYPE_ALIGN (EMRFRAMERGN, 4) + TEST_FIELD_SIZE (EMRFRAMERGN, emr, 8) + TEST_FIELD_ALIGN (EMRFRAMERGN, emr, 4) + TEST_FIELD_OFFSET(EMRFRAMERGN, emr, 0) + TEST_FIELD_SIZE (EMRFRAMERGN, rclBounds, 16) + TEST_FIELD_ALIGN (EMRFRAMERGN, rclBounds, 4) + TEST_FIELD_OFFSET(EMRFRAMERGN, rclBounds, 8) + TEST_FIELD_SIZE (EMRFRAMERGN, cbRgnData, 4) + TEST_FIELD_ALIGN (EMRFRAMERGN, cbRgnData, 4) + TEST_FIELD_OFFSET(EMRFRAMERGN, cbRgnData, 24) + TEST_FIELD_SIZE (EMRFRAMERGN, ihBrush, 4) + TEST_FIELD_ALIGN (EMRFRAMERGN, ihBrush, 4) + TEST_FIELD_OFFSET(EMRFRAMERGN, ihBrush, 28) + TEST_FIELD_SIZE (EMRFRAMERGN, szlStroke, 8) + TEST_FIELD_ALIGN (EMRFRAMERGN, szlStroke, 4) + TEST_FIELD_OFFSET(EMRFRAMERGN, szlStroke, 32) + TEST_FIELD_SIZE (EMRFRAMERGN, RgnData, 1) + TEST_FIELD_ALIGN (EMRFRAMERGN, RgnData, 1) + TEST_FIELD_OFFSET(EMRFRAMERGN, RgnData, 40) +} + +static void test_pack_EMRGDICOMMENT(void) +{ + /* EMRGDICOMMENT */ + TEST_TYPE_SIZE (EMRGDICOMMENT, 16) + TEST_TYPE_ALIGN (EMRGDICOMMENT, 4) + TEST_FIELD_SIZE (EMRGDICOMMENT, emr, 8) + TEST_FIELD_ALIGN (EMRGDICOMMENT, emr, 4) + TEST_FIELD_OFFSET(EMRGDICOMMENT, emr, 0) + TEST_FIELD_SIZE (EMRGDICOMMENT, cbData, 4) + TEST_FIELD_ALIGN (EMRGDICOMMENT, cbData, 4) + TEST_FIELD_OFFSET(EMRGDICOMMENT, cbData, 8) + TEST_FIELD_SIZE (EMRGDICOMMENT, Data, 1) + TEST_FIELD_ALIGN (EMRGDICOMMENT, Data, 1) + TEST_FIELD_OFFSET(EMRGDICOMMENT, Data, 12) +} + +static void test_pack_EMRGLSBOUNDEDRECORD(void) +{ + /* EMRGLSBOUNDEDRECORD */ + TEST_TYPE_SIZE (EMRGLSBOUNDEDRECORD, 32) + TEST_TYPE_ALIGN (EMRGLSBOUNDEDRECORD, 4) + TEST_FIELD_SIZE (EMRGLSBOUNDEDRECORD, emr, 8) + TEST_FIELD_ALIGN (EMRGLSBOUNDEDRECORD, emr, 4) + TEST_FIELD_OFFSET(EMRGLSBOUNDEDRECORD, emr, 0) + TEST_FIELD_SIZE (EMRGLSBOUNDEDRECORD, rclBounds, 16) + TEST_FIELD_ALIGN (EMRGLSBOUNDEDRECORD, rclBounds, 4) + TEST_FIELD_OFFSET(EMRGLSBOUNDEDRECORD, rclBounds, 8) + TEST_FIELD_SIZE (EMRGLSBOUNDEDRECORD, cbData, 4) + TEST_FIELD_ALIGN (EMRGLSBOUNDEDRECORD, cbData, 4) + TEST_FIELD_OFFSET(EMRGLSBOUNDEDRECORD, cbData, 24) + TEST_FIELD_SIZE (EMRGLSBOUNDEDRECORD, Data, 1) + TEST_FIELD_ALIGN (EMRGLSBOUNDEDRECORD, Data, 1) + TEST_FIELD_OFFSET(EMRGLSBOUNDEDRECORD, Data, 28) +} + +static void test_pack_EMRGLSRECORD(void) +{ + /* EMRGLSRECORD */ + TEST_TYPE_SIZE (EMRGLSRECORD, 16) + TEST_TYPE_ALIGN (EMRGLSRECORD, 4) + TEST_FIELD_SIZE (EMRGLSRECORD, emr, 8) + TEST_FIELD_ALIGN (EMRGLSRECORD, emr, 4) + TEST_FIELD_OFFSET(EMRGLSRECORD, emr, 0) + TEST_FIELD_SIZE (EMRGLSRECORD, cbData, 4) + TEST_FIELD_ALIGN (EMRGLSRECORD, cbData, 4) + TEST_FIELD_OFFSET(EMRGLSRECORD, cbData, 8) + TEST_FIELD_SIZE (EMRGLSRECORD, Data, 1) + TEST_FIELD_ALIGN (EMRGLSRECORD, Data, 1) + TEST_FIELD_OFFSET(EMRGLSRECORD, Data, 12) +} + +static void test_pack_EMRINTERSECTCLIPRECT(void) +{ + /* EMRINTERSECTCLIPRECT */ + TEST_TYPE_SIZE (EMRINTERSECTCLIPRECT, 24) + TEST_TYPE_ALIGN (EMRINTERSECTCLIPRECT, 4) + TEST_FIELD_SIZE (EMRINTERSECTCLIPRECT, emr, 8) + TEST_FIELD_ALIGN (EMRINTERSECTCLIPRECT, emr, 4) + TEST_FIELD_OFFSET(EMRINTERSECTCLIPRECT, emr, 0) + TEST_FIELD_SIZE (EMRINTERSECTCLIPRECT, rclClip, 16) + TEST_FIELD_ALIGN (EMRINTERSECTCLIPRECT, rclClip, 4) + TEST_FIELD_OFFSET(EMRINTERSECTCLIPRECT, rclClip, 8) +} + +static void test_pack_EMRINVERTRGN(void) +{ + /* EMRINVERTRGN */ + TEST_TYPE_SIZE (EMRINVERTRGN, 32) + TEST_TYPE_ALIGN (EMRINVERTRGN, 4) + TEST_FIELD_SIZE (EMRINVERTRGN, emr, 8) + TEST_FIELD_ALIGN (EMRINVERTRGN, emr, 4) + TEST_FIELD_OFFSET(EMRINVERTRGN, emr, 0) + TEST_FIELD_SIZE (EMRINVERTRGN, rclBounds, 16) + TEST_FIELD_ALIGN (EMRINVERTRGN, rclBounds, 4) + TEST_FIELD_OFFSET(EMRINVERTRGN, rclBounds, 8) + TEST_FIELD_SIZE (EMRINVERTRGN, cbRgnData, 4) + TEST_FIELD_ALIGN (EMRINVERTRGN, cbRgnData, 4) + TEST_FIELD_OFFSET(EMRINVERTRGN, cbRgnData, 24) + TEST_FIELD_SIZE (EMRINVERTRGN, RgnData, 1) + TEST_FIELD_ALIGN (EMRINVERTRGN, RgnData, 1) + TEST_FIELD_OFFSET(EMRINVERTRGN, RgnData, 28) +} + +static void test_pack_EMRLINETO(void) +{ + /* EMRLINETO */ + TEST_TYPE_SIZE (EMRLINETO, 16) + TEST_TYPE_ALIGN (EMRLINETO, 4) + TEST_FIELD_SIZE (EMRLINETO, emr, 8) + TEST_FIELD_ALIGN (EMRLINETO, emr, 4) + TEST_FIELD_OFFSET(EMRLINETO, emr, 0) + TEST_FIELD_SIZE (EMRLINETO, ptl, 8) + TEST_FIELD_ALIGN (EMRLINETO, ptl, 4) + TEST_FIELD_OFFSET(EMRLINETO, ptl, 8) +} + +static void test_pack_EMRMASKBLT(void) +{ + /* EMRMASKBLT */ + TEST_TYPE_SIZE (EMRMASKBLT, 128) + TEST_TYPE_ALIGN (EMRMASKBLT, 4) + TEST_FIELD_SIZE (EMRMASKBLT, emr, 8) + TEST_FIELD_ALIGN (EMRMASKBLT, emr, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, emr, 0) + TEST_FIELD_SIZE (EMRMASKBLT, rclBounds, 16) + TEST_FIELD_ALIGN (EMRMASKBLT, rclBounds, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, rclBounds, 8) + TEST_FIELD_SIZE (EMRMASKBLT, xDest, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, xDest, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, xDest, 24) + TEST_FIELD_SIZE (EMRMASKBLT, yDest, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, yDest, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, yDest, 28) + TEST_FIELD_SIZE (EMRMASKBLT, cxDest, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, cxDest, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, cxDest, 32) + TEST_FIELD_SIZE (EMRMASKBLT, cyDest, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, cyDest, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, cyDest, 36) + TEST_FIELD_SIZE (EMRMASKBLT, dwRop, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, dwRop, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, dwRop, 40) + TEST_FIELD_SIZE (EMRMASKBLT, xSrc, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, xSrc, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, xSrc, 44) + TEST_FIELD_SIZE (EMRMASKBLT, ySrc, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, ySrc, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, ySrc, 48) + TEST_FIELD_SIZE (EMRMASKBLT, xformSrc, 24) + TEST_FIELD_ALIGN (EMRMASKBLT, xformSrc, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, xformSrc, 52) + TEST_FIELD_SIZE (EMRMASKBLT, crBkColorSrc, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, crBkColorSrc, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, crBkColorSrc, 76) + TEST_FIELD_SIZE (EMRMASKBLT, iUsageSrc, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, iUsageSrc, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, iUsageSrc, 80) + TEST_FIELD_SIZE (EMRMASKBLT, offBmiSrc, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, offBmiSrc, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, offBmiSrc, 84) + TEST_FIELD_SIZE (EMRMASKBLT, cbBmiSrc, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, cbBmiSrc, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, cbBmiSrc, 88) + TEST_FIELD_SIZE (EMRMASKBLT, offBitsSrc, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, offBitsSrc, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, offBitsSrc, 92) + TEST_FIELD_SIZE (EMRMASKBLT, cbBitsSrc, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, cbBitsSrc, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, cbBitsSrc, 96) + TEST_FIELD_SIZE (EMRMASKBLT, xMask, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, xMask, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, xMask, 100) + TEST_FIELD_SIZE (EMRMASKBLT, yMask, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, yMask, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, yMask, 104) + TEST_FIELD_SIZE (EMRMASKBLT, iUsageMask, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, iUsageMask, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, iUsageMask, 108) + TEST_FIELD_SIZE (EMRMASKBLT, offBmiMask, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, offBmiMask, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, offBmiMask, 112) + TEST_FIELD_SIZE (EMRMASKBLT, cbBmiMask, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, cbBmiMask, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, cbBmiMask, 116) + TEST_FIELD_SIZE (EMRMASKBLT, offBitsMask, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, offBitsMask, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, offBitsMask, 120) + TEST_FIELD_SIZE (EMRMASKBLT, cbBitsMask, 4) + TEST_FIELD_ALIGN (EMRMASKBLT, cbBitsMask, 4) + TEST_FIELD_OFFSET(EMRMASKBLT, cbBitsMask, 124) +} + +static void test_pack_EMRMODIFYWORLDTRANSFORM(void) +{ + /* EMRMODIFYWORLDTRANSFORM */ + TEST_TYPE_SIZE (EMRMODIFYWORLDTRANSFORM, 36) + TEST_TYPE_ALIGN (EMRMODIFYWORLDTRANSFORM, 4) + TEST_FIELD_SIZE (EMRMODIFYWORLDTRANSFORM, emr, 8) + TEST_FIELD_ALIGN (EMRMODIFYWORLDTRANSFORM, emr, 4) + TEST_FIELD_OFFSET(EMRMODIFYWORLDTRANSFORM, emr, 0) + TEST_FIELD_SIZE (EMRMODIFYWORLDTRANSFORM, xform, 24) + TEST_FIELD_ALIGN (EMRMODIFYWORLDTRANSFORM, xform, 4) + TEST_FIELD_OFFSET(EMRMODIFYWORLDTRANSFORM, xform, 8) + TEST_FIELD_SIZE (EMRMODIFYWORLDTRANSFORM, iMode, 4) + TEST_FIELD_ALIGN (EMRMODIFYWORLDTRANSFORM, iMode, 4) + TEST_FIELD_OFFSET(EMRMODIFYWORLDTRANSFORM, iMode, 32) +} + +static void test_pack_EMRMOVETOEX(void) +{ + /* EMRMOVETOEX */ + TEST_TYPE_SIZE (EMRMOVETOEX, 16) + TEST_TYPE_ALIGN (EMRMOVETOEX, 4) + TEST_FIELD_SIZE (EMRMOVETOEX, emr, 8) + TEST_FIELD_ALIGN (EMRMOVETOEX, emr, 4) + TEST_FIELD_OFFSET(EMRMOVETOEX, emr, 0) + TEST_FIELD_SIZE (EMRMOVETOEX, ptl, 8) + TEST_FIELD_ALIGN (EMRMOVETOEX, ptl, 4) + TEST_FIELD_OFFSET(EMRMOVETOEX, ptl, 8) +} + +static void test_pack_EMROFFSETCLIPRGN(void) +{ + /* EMROFFSETCLIPRGN */ + TEST_TYPE_SIZE (EMROFFSETCLIPRGN, 16) + TEST_TYPE_ALIGN (EMROFFSETCLIPRGN, 4) + TEST_FIELD_SIZE (EMROFFSETCLIPRGN, emr, 8) + TEST_FIELD_ALIGN (EMROFFSETCLIPRGN, emr, 4) + TEST_FIELD_OFFSET(EMROFFSETCLIPRGN, emr, 0) + TEST_FIELD_SIZE (EMROFFSETCLIPRGN, ptlOffset, 8) + TEST_FIELD_ALIGN (EMROFFSETCLIPRGN, ptlOffset, 4) + TEST_FIELD_OFFSET(EMROFFSETCLIPRGN, ptlOffset, 8) +} + +static void test_pack_EMRPAINTRGN(void) +{ + /* EMRPAINTRGN */ + TEST_TYPE_SIZE (EMRPAINTRGN, 32) + TEST_TYPE_ALIGN (EMRPAINTRGN, 4) + TEST_FIELD_SIZE (EMRPAINTRGN, emr, 8) + TEST_FIELD_ALIGN (EMRPAINTRGN, emr, 4) + TEST_FIELD_OFFSET(EMRPAINTRGN, emr, 0) + TEST_FIELD_SIZE (EMRPAINTRGN, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPAINTRGN, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPAINTRGN, rclBounds, 8) + TEST_FIELD_SIZE (EMRPAINTRGN, cbRgnData, 4) + TEST_FIELD_ALIGN (EMRPAINTRGN, cbRgnData, 4) + TEST_FIELD_OFFSET(EMRPAINTRGN, cbRgnData, 24) + TEST_FIELD_SIZE (EMRPAINTRGN, RgnData, 1) + TEST_FIELD_ALIGN (EMRPAINTRGN, RgnData, 1) + TEST_FIELD_OFFSET(EMRPAINTRGN, RgnData, 28) +} + +static void test_pack_EMRPIE(void) +{ + /* EMRPIE */ + TEST_TYPE_SIZE (EMRPIE, 40) + TEST_TYPE_ALIGN (EMRPIE, 4) + TEST_FIELD_SIZE (EMRPIE, emr, 8) + TEST_FIELD_ALIGN (EMRPIE, emr, 4) + TEST_FIELD_OFFSET(EMRPIE, emr, 0) + TEST_FIELD_SIZE (EMRPIE, rclBox, 16) + TEST_FIELD_ALIGN (EMRPIE, rclBox, 4) + TEST_FIELD_OFFSET(EMRPIE, rclBox, 8) + TEST_FIELD_SIZE (EMRPIE, ptlStart, 8) + TEST_FIELD_ALIGN (EMRPIE, ptlStart, 4) + TEST_FIELD_OFFSET(EMRPIE, ptlStart, 24) + TEST_FIELD_SIZE (EMRPIE, ptlEnd, 8) + TEST_FIELD_ALIGN (EMRPIE, ptlEnd, 4) + TEST_FIELD_OFFSET(EMRPIE, ptlEnd, 32) +} + +static void test_pack_EMRPIXELFORMAT(void) +{ + /* EMRPIXELFORMAT */ + TEST_TYPE_SIZE (EMRPIXELFORMAT, 48) + TEST_TYPE_ALIGN (EMRPIXELFORMAT, 4) + TEST_FIELD_SIZE (EMRPIXELFORMAT, emr, 8) + TEST_FIELD_ALIGN (EMRPIXELFORMAT, emr, 4) + TEST_FIELD_OFFSET(EMRPIXELFORMAT, emr, 0) + TEST_FIELD_SIZE (EMRPIXELFORMAT, pfd, 40) + TEST_FIELD_ALIGN (EMRPIXELFORMAT, pfd, 4) + TEST_FIELD_OFFSET(EMRPIXELFORMAT, pfd, 8) +} + +static void test_pack_EMRPLGBLT(void) +{ + /* EMRPLGBLT */ + TEST_TYPE_SIZE (EMRPLGBLT, 140) + TEST_TYPE_ALIGN (EMRPLGBLT, 4) + TEST_FIELD_SIZE (EMRPLGBLT, emr, 8) + TEST_FIELD_ALIGN (EMRPLGBLT, emr, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, emr, 0) + TEST_FIELD_SIZE (EMRPLGBLT, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPLGBLT, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, rclBounds, 8) + TEST_FIELD_SIZE (EMRPLGBLT, aptlDest, 24) + TEST_FIELD_ALIGN (EMRPLGBLT, aptlDest, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, aptlDest, 24) + TEST_FIELD_SIZE (EMRPLGBLT, xSrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, xSrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, xSrc, 48) + TEST_FIELD_SIZE (EMRPLGBLT, ySrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, ySrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, ySrc, 52) + TEST_FIELD_SIZE (EMRPLGBLT, cxSrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, cxSrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, cxSrc, 56) + TEST_FIELD_SIZE (EMRPLGBLT, cySrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, cySrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, cySrc, 60) + TEST_FIELD_SIZE (EMRPLGBLT, xformSrc, 24) + TEST_FIELD_ALIGN (EMRPLGBLT, xformSrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, xformSrc, 64) + TEST_FIELD_SIZE (EMRPLGBLT, crBkColorSrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, crBkColorSrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, crBkColorSrc, 88) + TEST_FIELD_SIZE (EMRPLGBLT, iUsageSrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, iUsageSrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, iUsageSrc, 92) + TEST_FIELD_SIZE (EMRPLGBLT, offBmiSrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, offBmiSrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, offBmiSrc, 96) + TEST_FIELD_SIZE (EMRPLGBLT, cbBmiSrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, cbBmiSrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, cbBmiSrc, 100) + TEST_FIELD_SIZE (EMRPLGBLT, offBitsSrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, offBitsSrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, offBitsSrc, 104) + TEST_FIELD_SIZE (EMRPLGBLT, cbBitsSrc, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, cbBitsSrc, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, cbBitsSrc, 108) + TEST_FIELD_SIZE (EMRPLGBLT, xMask, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, xMask, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, xMask, 112) + TEST_FIELD_SIZE (EMRPLGBLT, yMask, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, yMask, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, yMask, 116) + TEST_FIELD_SIZE (EMRPLGBLT, iUsageMask, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, iUsageMask, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, iUsageMask, 120) + TEST_FIELD_SIZE (EMRPLGBLT, offBmiMask, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, offBmiMask, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, offBmiMask, 124) + TEST_FIELD_SIZE (EMRPLGBLT, cbBmiMask, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, cbBmiMask, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, cbBmiMask, 128) + TEST_FIELD_SIZE (EMRPLGBLT, offBitsMask, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, offBitsMask, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, offBitsMask, 132) + TEST_FIELD_SIZE (EMRPLGBLT, cbBitsMask, 4) + TEST_FIELD_ALIGN (EMRPLGBLT, cbBitsMask, 4) + TEST_FIELD_OFFSET(EMRPLGBLT, cbBitsMask, 136) +} + +static void test_pack_EMRPOLYBEZIER(void) +{ + /* EMRPOLYBEZIER */ + TEST_TYPE_SIZE (EMRPOLYBEZIER, 36) + TEST_TYPE_ALIGN (EMRPOLYBEZIER, 4) + TEST_FIELD_SIZE (EMRPOLYBEZIER, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYBEZIER, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIER, emr, 0) + TEST_FIELD_SIZE (EMRPOLYBEZIER, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYBEZIER, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIER, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYBEZIER, cptl, 4) + TEST_FIELD_ALIGN (EMRPOLYBEZIER, cptl, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIER, cptl, 24) + TEST_FIELD_SIZE (EMRPOLYBEZIER, aptl, 8) + TEST_FIELD_ALIGN (EMRPOLYBEZIER, aptl, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIER, aptl, 28) +} + +static void test_pack_EMRPOLYBEZIER16(void) +{ + /* EMRPOLYBEZIER16 */ + TEST_TYPE_SIZE (EMRPOLYBEZIER16, 32) + TEST_TYPE_ALIGN (EMRPOLYBEZIER16, 4) + TEST_FIELD_SIZE (EMRPOLYBEZIER16, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYBEZIER16, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIER16, emr, 0) + TEST_FIELD_SIZE (EMRPOLYBEZIER16, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYBEZIER16, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIER16, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYBEZIER16, cpts, 4) + TEST_FIELD_ALIGN (EMRPOLYBEZIER16, cpts, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIER16, cpts, 24) + TEST_FIELD_SIZE (EMRPOLYBEZIER16, apts, 4) + TEST_FIELD_ALIGN (EMRPOLYBEZIER16, apts, 2) + TEST_FIELD_OFFSET(EMRPOLYBEZIER16, apts, 28) +} + +static void test_pack_EMRPOLYBEZIERTO(void) +{ + /* EMRPOLYBEZIERTO */ + TEST_TYPE_SIZE (EMRPOLYBEZIERTO, 36) + TEST_TYPE_ALIGN (EMRPOLYBEZIERTO, 4) + TEST_FIELD_SIZE (EMRPOLYBEZIERTO, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYBEZIERTO, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIERTO, emr, 0) + TEST_FIELD_SIZE (EMRPOLYBEZIERTO, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYBEZIERTO, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIERTO, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYBEZIERTO, cptl, 4) + TEST_FIELD_ALIGN (EMRPOLYBEZIERTO, cptl, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIERTO, cptl, 24) + TEST_FIELD_SIZE (EMRPOLYBEZIERTO, aptl, 8) + TEST_FIELD_ALIGN (EMRPOLYBEZIERTO, aptl, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIERTO, aptl, 28) +} + +static void test_pack_EMRPOLYBEZIERTO16(void) +{ + /* EMRPOLYBEZIERTO16 */ + TEST_TYPE_SIZE (EMRPOLYBEZIERTO16, 32) + TEST_TYPE_ALIGN (EMRPOLYBEZIERTO16, 4) + TEST_FIELD_SIZE (EMRPOLYBEZIERTO16, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYBEZIERTO16, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIERTO16, emr, 0) + TEST_FIELD_SIZE (EMRPOLYBEZIERTO16, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYBEZIERTO16, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIERTO16, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYBEZIERTO16, cpts, 4) + TEST_FIELD_ALIGN (EMRPOLYBEZIERTO16, cpts, 4) + TEST_FIELD_OFFSET(EMRPOLYBEZIERTO16, cpts, 24) + TEST_FIELD_SIZE (EMRPOLYBEZIERTO16, apts, 4) + TEST_FIELD_ALIGN (EMRPOLYBEZIERTO16, apts, 2) + TEST_FIELD_OFFSET(EMRPOLYBEZIERTO16, apts, 28) +} + +static void test_pack_EMRPOLYDRAW(void) +{ + /* EMRPOLYDRAW */ + TEST_TYPE_SIZE (EMRPOLYDRAW, 40) + TEST_TYPE_ALIGN (EMRPOLYDRAW, 4) + TEST_FIELD_SIZE (EMRPOLYDRAW, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYDRAW, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYDRAW, emr, 0) + TEST_FIELD_SIZE (EMRPOLYDRAW, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYDRAW, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYDRAW, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYDRAW, cptl, 4) + TEST_FIELD_ALIGN (EMRPOLYDRAW, cptl, 4) + TEST_FIELD_OFFSET(EMRPOLYDRAW, cptl, 24) + TEST_FIELD_SIZE (EMRPOLYDRAW, aptl, 8) + TEST_FIELD_ALIGN (EMRPOLYDRAW, aptl, 4) + TEST_FIELD_OFFSET(EMRPOLYDRAW, aptl, 28) + TEST_FIELD_SIZE (EMRPOLYDRAW, abTypes, 1) + TEST_FIELD_ALIGN (EMRPOLYDRAW, abTypes, 1) + TEST_FIELD_OFFSET(EMRPOLYDRAW, abTypes, 36) +} + +static void test_pack_EMRPOLYDRAW16(void) +{ + /* EMRPOLYDRAW16 */ + TEST_TYPE_SIZE (EMRPOLYDRAW16, 36) + TEST_TYPE_ALIGN (EMRPOLYDRAW16, 4) + TEST_FIELD_SIZE (EMRPOLYDRAW16, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYDRAW16, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYDRAW16, emr, 0) + TEST_FIELD_SIZE (EMRPOLYDRAW16, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYDRAW16, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYDRAW16, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYDRAW16, cpts, 4) + TEST_FIELD_ALIGN (EMRPOLYDRAW16, cpts, 4) + TEST_FIELD_OFFSET(EMRPOLYDRAW16, cpts, 24) + TEST_FIELD_SIZE (EMRPOLYDRAW16, apts, 4) + TEST_FIELD_ALIGN (EMRPOLYDRAW16, apts, 2) + TEST_FIELD_OFFSET(EMRPOLYDRAW16, apts, 28) + TEST_FIELD_SIZE (EMRPOLYDRAW16, abTypes, 1) + TEST_FIELD_ALIGN (EMRPOLYDRAW16, abTypes, 1) + TEST_FIELD_OFFSET(EMRPOLYDRAW16, abTypes, 32) +} + +static void test_pack_EMRPOLYGON(void) +{ + /* EMRPOLYGON */ + TEST_TYPE_SIZE (EMRPOLYGON, 36) + TEST_TYPE_ALIGN (EMRPOLYGON, 4) + TEST_FIELD_SIZE (EMRPOLYGON, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYGON, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYGON, emr, 0) + TEST_FIELD_SIZE (EMRPOLYGON, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYGON, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYGON, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYGON, cptl, 4) + TEST_FIELD_ALIGN (EMRPOLYGON, cptl, 4) + TEST_FIELD_OFFSET(EMRPOLYGON, cptl, 24) + TEST_FIELD_SIZE (EMRPOLYGON, aptl, 8) + TEST_FIELD_ALIGN (EMRPOLYGON, aptl, 4) + TEST_FIELD_OFFSET(EMRPOLYGON, aptl, 28) +} + +static void test_pack_EMRPOLYGON16(void) +{ + /* EMRPOLYGON16 */ + TEST_TYPE_SIZE (EMRPOLYGON16, 32) + TEST_TYPE_ALIGN (EMRPOLYGON16, 4) + TEST_FIELD_SIZE (EMRPOLYGON16, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYGON16, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYGON16, emr, 0) + TEST_FIELD_SIZE (EMRPOLYGON16, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYGON16, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYGON16, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYGON16, cpts, 4) + TEST_FIELD_ALIGN (EMRPOLYGON16, cpts, 4) + TEST_FIELD_OFFSET(EMRPOLYGON16, cpts, 24) + TEST_FIELD_SIZE (EMRPOLYGON16, apts, 4) + TEST_FIELD_ALIGN (EMRPOLYGON16, apts, 2) + TEST_FIELD_OFFSET(EMRPOLYGON16, apts, 28) +} + +static void test_pack_EMRPOLYLINE(void) +{ + /* EMRPOLYLINE */ + TEST_TYPE_SIZE (EMRPOLYLINE, 36) + TEST_TYPE_ALIGN (EMRPOLYLINE, 4) + TEST_FIELD_SIZE (EMRPOLYLINE, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYLINE, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYLINE, emr, 0) + TEST_FIELD_SIZE (EMRPOLYLINE, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYLINE, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYLINE, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYLINE, cptl, 4) + TEST_FIELD_ALIGN (EMRPOLYLINE, cptl, 4) + TEST_FIELD_OFFSET(EMRPOLYLINE, cptl, 24) + TEST_FIELD_SIZE (EMRPOLYLINE, aptl, 8) + TEST_FIELD_ALIGN (EMRPOLYLINE, aptl, 4) + TEST_FIELD_OFFSET(EMRPOLYLINE, aptl, 28) +} + +static void test_pack_EMRPOLYLINE16(void) +{ + /* EMRPOLYLINE16 */ + TEST_TYPE_SIZE (EMRPOLYLINE16, 32) + TEST_TYPE_ALIGN (EMRPOLYLINE16, 4) + TEST_FIELD_SIZE (EMRPOLYLINE16, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYLINE16, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYLINE16, emr, 0) + TEST_FIELD_SIZE (EMRPOLYLINE16, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYLINE16, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYLINE16, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYLINE16, cpts, 4) + TEST_FIELD_ALIGN (EMRPOLYLINE16, cpts, 4) + TEST_FIELD_OFFSET(EMRPOLYLINE16, cpts, 24) + TEST_FIELD_SIZE (EMRPOLYLINE16, apts, 4) + TEST_FIELD_ALIGN (EMRPOLYLINE16, apts, 2) + TEST_FIELD_OFFSET(EMRPOLYLINE16, apts, 28) +} + +static void test_pack_EMRPOLYLINETO(void) +{ + /* EMRPOLYLINETO */ + TEST_TYPE_SIZE (EMRPOLYLINETO, 36) + TEST_TYPE_ALIGN (EMRPOLYLINETO, 4) + TEST_FIELD_SIZE (EMRPOLYLINETO, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYLINETO, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYLINETO, emr, 0) + TEST_FIELD_SIZE (EMRPOLYLINETO, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYLINETO, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYLINETO, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYLINETO, cptl, 4) + TEST_FIELD_ALIGN (EMRPOLYLINETO, cptl, 4) + TEST_FIELD_OFFSET(EMRPOLYLINETO, cptl, 24) + TEST_FIELD_SIZE (EMRPOLYLINETO, aptl, 8) + TEST_FIELD_ALIGN (EMRPOLYLINETO, aptl, 4) + TEST_FIELD_OFFSET(EMRPOLYLINETO, aptl, 28) +} + +static void test_pack_EMRPOLYLINETO16(void) +{ + /* EMRPOLYLINETO16 */ + TEST_TYPE_SIZE (EMRPOLYLINETO16, 32) + TEST_TYPE_ALIGN (EMRPOLYLINETO16, 4) + TEST_FIELD_SIZE (EMRPOLYLINETO16, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYLINETO16, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYLINETO16, emr, 0) + TEST_FIELD_SIZE (EMRPOLYLINETO16, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYLINETO16, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYLINETO16, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYLINETO16, cpts, 4) + TEST_FIELD_ALIGN (EMRPOLYLINETO16, cpts, 4) + TEST_FIELD_OFFSET(EMRPOLYLINETO16, cpts, 24) + TEST_FIELD_SIZE (EMRPOLYLINETO16, apts, 4) + TEST_FIELD_ALIGN (EMRPOLYLINETO16, apts, 2) + TEST_FIELD_OFFSET(EMRPOLYLINETO16, apts, 28) +} + +static void test_pack_EMRPOLYPOLYGON(void) +{ + /* EMRPOLYPOLYGON */ + TEST_TYPE_SIZE (EMRPOLYPOLYGON, 44) + TEST_TYPE_ALIGN (EMRPOLYPOLYGON, 4) + TEST_FIELD_SIZE (EMRPOLYPOLYGON, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON, emr, 0) + TEST_FIELD_SIZE (EMRPOLYPOLYGON, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYPOLYGON, nPolys, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON, nPolys, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON, nPolys, 24) + TEST_FIELD_SIZE (EMRPOLYPOLYGON, cptl, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON, cptl, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON, cptl, 28) + TEST_FIELD_SIZE (EMRPOLYPOLYGON, aPolyCounts, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON, aPolyCounts, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON, aPolyCounts, 32) + TEST_FIELD_SIZE (EMRPOLYPOLYGON, aptl, 8) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON, aptl, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON, aptl, 36) +} + +static void test_pack_EMRPOLYPOLYGON16(void) +{ + /* EMRPOLYPOLYGON16 */ + TEST_TYPE_SIZE (EMRPOLYPOLYGON16, 40) + TEST_TYPE_ALIGN (EMRPOLYPOLYGON16, 4) + TEST_FIELD_SIZE (EMRPOLYPOLYGON16, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON16, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON16, emr, 0) + TEST_FIELD_SIZE (EMRPOLYPOLYGON16, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON16, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON16, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYPOLYGON16, nPolys, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON16, nPolys, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON16, nPolys, 24) + TEST_FIELD_SIZE (EMRPOLYPOLYGON16, cpts, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON16, cpts, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON16, cpts, 28) + TEST_FIELD_SIZE (EMRPOLYPOLYGON16, aPolyCounts, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON16, aPolyCounts, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON16, aPolyCounts, 32) + TEST_FIELD_SIZE (EMRPOLYPOLYGON16, apts, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYGON16, apts, 2) + TEST_FIELD_OFFSET(EMRPOLYPOLYGON16, apts, 36) +} + +static void test_pack_EMRPOLYPOLYLINE(void) +{ + /* EMRPOLYPOLYLINE */ + TEST_TYPE_SIZE (EMRPOLYPOLYLINE, 44) + TEST_TYPE_ALIGN (EMRPOLYPOLYLINE, 4) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE, emr, 0) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE, nPolys, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE, nPolys, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE, nPolys, 24) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE, cptl, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE, cptl, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE, cptl, 28) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE, aPolyCounts, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE, aPolyCounts, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE, aPolyCounts, 32) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE, aptl, 8) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE, aptl, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE, aptl, 36) +} + +static void test_pack_EMRPOLYPOLYLINE16(void) +{ + /* EMRPOLYPOLYLINE16 */ + TEST_TYPE_SIZE (EMRPOLYPOLYLINE16, 40) + TEST_TYPE_ALIGN (EMRPOLYPOLYLINE16, 4) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE16, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE16, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE16, emr, 0) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE16, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE16, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE16, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE16, nPolys, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE16, nPolys, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE16, nPolys, 24) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE16, cpts, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE16, cpts, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE16, cpts, 28) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE16, aPolyCounts, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE16, aPolyCounts, 4) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE16, aPolyCounts, 32) + TEST_FIELD_SIZE (EMRPOLYPOLYLINE16, apts, 4) + TEST_FIELD_ALIGN (EMRPOLYPOLYLINE16, apts, 2) + TEST_FIELD_OFFSET(EMRPOLYPOLYLINE16, apts, 36) +} + +static void test_pack_EMRPOLYTEXTOUTA(void) +{ + /* EMRPOLYTEXTOUTA */ + TEST_TYPE_SIZE (EMRPOLYTEXTOUTA, 80) + TEST_TYPE_ALIGN (EMRPOLYTEXTOUTA, 4) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTA, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTA, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTA, emr, 0) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTA, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTA, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTA, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTA, iGraphicsMode, 4) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTA, iGraphicsMode, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTA, iGraphicsMode, 24) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTA, exScale, 4) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTA, exScale, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTA, exScale, 28) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTA, eyScale, 4) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTA, eyScale, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTA, eyScale, 32) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTA, cStrings, 4) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTA, cStrings, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTA, cStrings, 36) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTA, aemrtext, 40) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTA, aemrtext, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTA, aemrtext, 40) +} + +static void test_pack_EMRPOLYTEXTOUTW(void) +{ + /* EMRPOLYTEXTOUTW */ + TEST_TYPE_SIZE (EMRPOLYTEXTOUTW, 80) + TEST_TYPE_ALIGN (EMRPOLYTEXTOUTW, 4) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTW, emr, 8) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTW, emr, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTW, emr, 0) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTW, rclBounds, 16) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTW, rclBounds, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTW, rclBounds, 8) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTW, iGraphicsMode, 4) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTW, iGraphicsMode, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTW, iGraphicsMode, 24) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTW, exScale, 4) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTW, exScale, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTW, exScale, 28) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTW, eyScale, 4) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTW, eyScale, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTW, eyScale, 32) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTW, cStrings, 4) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTW, cStrings, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTW, cStrings, 36) + TEST_FIELD_SIZE (EMRPOLYTEXTOUTW, aemrtext, 40) + TEST_FIELD_ALIGN (EMRPOLYTEXTOUTW, aemrtext, 4) + TEST_FIELD_OFFSET(EMRPOLYTEXTOUTW, aemrtext, 40) +} + +static void test_pack_EMRREALIZEPALETTE(void) +{ + /* EMRREALIZEPALETTE */ + TEST_TYPE_SIZE (EMRREALIZEPALETTE, 8) + TEST_TYPE_ALIGN (EMRREALIZEPALETTE, 4) + TEST_FIELD_SIZE (EMRREALIZEPALETTE, emr, 8) + TEST_FIELD_ALIGN (EMRREALIZEPALETTE, emr, 4) + TEST_FIELD_OFFSET(EMRREALIZEPALETTE, emr, 0) +} + +static void test_pack_EMRRECTANGLE(void) +{ + /* EMRRECTANGLE */ + TEST_TYPE_SIZE (EMRRECTANGLE, 24) + TEST_TYPE_ALIGN (EMRRECTANGLE, 4) + TEST_FIELD_SIZE (EMRRECTANGLE, emr, 8) + TEST_FIELD_ALIGN (EMRRECTANGLE, emr, 4) + TEST_FIELD_OFFSET(EMRRECTANGLE, emr, 0) + TEST_FIELD_SIZE (EMRRECTANGLE, rclBox, 16) + TEST_FIELD_ALIGN (EMRRECTANGLE, rclBox, 4) + TEST_FIELD_OFFSET(EMRRECTANGLE, rclBox, 8) +} + +static void test_pack_EMRRESIZEPALETTE(void) +{ + /* EMRRESIZEPALETTE */ + TEST_TYPE_SIZE (EMRRESIZEPALETTE, 16) + TEST_TYPE_ALIGN (EMRRESIZEPALETTE, 4) + TEST_FIELD_SIZE (EMRRESIZEPALETTE, emr, 8) + TEST_FIELD_ALIGN (EMRRESIZEPALETTE, emr, 4) + TEST_FIELD_OFFSET(EMRRESIZEPALETTE, emr, 0) + TEST_FIELD_SIZE (EMRRESIZEPALETTE, ihPal, 4) + TEST_FIELD_ALIGN (EMRRESIZEPALETTE, ihPal, 4) + TEST_FIELD_OFFSET(EMRRESIZEPALETTE, ihPal, 8) + TEST_FIELD_SIZE (EMRRESIZEPALETTE, cEntries, 4) + TEST_FIELD_ALIGN (EMRRESIZEPALETTE, cEntries, 4) + TEST_FIELD_OFFSET(EMRRESIZEPALETTE, cEntries, 12) +} + +static void test_pack_EMRRESTOREDC(void) +{ + /* EMRRESTOREDC */ + TEST_TYPE_SIZE (EMRRESTOREDC, 12) + TEST_TYPE_ALIGN (EMRRESTOREDC, 4) + TEST_FIELD_SIZE (EMRRESTOREDC, emr, 8) + TEST_FIELD_ALIGN (EMRRESTOREDC, emr, 4) + TEST_FIELD_OFFSET(EMRRESTOREDC, emr, 0) + TEST_FIELD_SIZE (EMRRESTOREDC, iRelative, 4) + TEST_FIELD_ALIGN (EMRRESTOREDC, iRelative, 4) + TEST_FIELD_OFFSET(EMRRESTOREDC, iRelative, 8) +} + +static void test_pack_EMRROUNDRECT(void) +{ + /* EMRROUNDRECT */ + TEST_TYPE_SIZE (EMRROUNDRECT, 32) + TEST_TYPE_ALIGN (EMRROUNDRECT, 4) + TEST_FIELD_SIZE (EMRROUNDRECT, emr, 8) + TEST_FIELD_ALIGN (EMRROUNDRECT, emr, 4) + TEST_FIELD_OFFSET(EMRROUNDRECT, emr, 0) + TEST_FIELD_SIZE (EMRROUNDRECT, rclBox, 16) + TEST_FIELD_ALIGN (EMRROUNDRECT, rclBox, 4) + TEST_FIELD_OFFSET(EMRROUNDRECT, rclBox, 8) + TEST_FIELD_SIZE (EMRROUNDRECT, szlCorner, 8) + TEST_FIELD_ALIGN (EMRROUNDRECT, szlCorner, 4) + TEST_FIELD_OFFSET(EMRROUNDRECT, szlCorner, 24) +} + +static void test_pack_EMRSAVEDC(void) +{ + /* EMRSAVEDC */ + TEST_TYPE_SIZE (EMRSAVEDC, 8) + TEST_TYPE_ALIGN (EMRSAVEDC, 4) + TEST_FIELD_SIZE (EMRSAVEDC, emr, 8) + TEST_FIELD_ALIGN (EMRSAVEDC, emr, 4) + TEST_FIELD_OFFSET(EMRSAVEDC, emr, 0) +} + +static void test_pack_EMRSCALEVIEWPORTEXTEX(void) +{ + /* EMRSCALEVIEWPORTEXTEX */ + TEST_TYPE_SIZE (EMRSCALEVIEWPORTEXTEX, 24) + TEST_TYPE_ALIGN (EMRSCALEVIEWPORTEXTEX, 4) + TEST_FIELD_SIZE (EMRSCALEVIEWPORTEXTEX, emr, 8) + TEST_FIELD_ALIGN (EMRSCALEVIEWPORTEXTEX, emr, 4) + TEST_FIELD_OFFSET(EMRSCALEVIEWPORTEXTEX, emr, 0) + TEST_FIELD_SIZE (EMRSCALEVIEWPORTEXTEX, xNum, 4) + TEST_FIELD_ALIGN (EMRSCALEVIEWPORTEXTEX, xNum, 4) + TEST_FIELD_OFFSET(EMRSCALEVIEWPORTEXTEX, xNum, 8) + TEST_FIELD_SIZE (EMRSCALEVIEWPORTEXTEX, xDenom, 4) + TEST_FIELD_ALIGN (EMRSCALEVIEWPORTEXTEX, xDenom, 4) + TEST_FIELD_OFFSET(EMRSCALEVIEWPORTEXTEX, xDenom, 12) + TEST_FIELD_SIZE (EMRSCALEVIEWPORTEXTEX, yNum, 4) + TEST_FIELD_ALIGN (EMRSCALEVIEWPORTEXTEX, yNum, 4) + TEST_FIELD_OFFSET(EMRSCALEVIEWPORTEXTEX, yNum, 16) + TEST_FIELD_SIZE (EMRSCALEVIEWPORTEXTEX, yDenom, 4) + TEST_FIELD_ALIGN (EMRSCALEVIEWPORTEXTEX, yDenom, 4) + TEST_FIELD_OFFSET(EMRSCALEVIEWPORTEXTEX, yDenom, 20) +} + +static void test_pack_EMRSCALEWINDOWEXTEX(void) +{ + /* EMRSCALEWINDOWEXTEX */ + TEST_TYPE_SIZE (EMRSCALEWINDOWEXTEX, 24) + TEST_TYPE_ALIGN (EMRSCALEWINDOWEXTEX, 4) + TEST_FIELD_SIZE (EMRSCALEWINDOWEXTEX, emr, 8) + TEST_FIELD_ALIGN (EMRSCALEWINDOWEXTEX, emr, 4) + TEST_FIELD_OFFSET(EMRSCALEWINDOWEXTEX, emr, 0) + TEST_FIELD_SIZE (EMRSCALEWINDOWEXTEX, xNum, 4) + TEST_FIELD_ALIGN (EMRSCALEWINDOWEXTEX, xNum, 4) + TEST_FIELD_OFFSET(EMRSCALEWINDOWEXTEX, xNum, 8) + TEST_FIELD_SIZE (EMRSCALEWINDOWEXTEX, xDenom, 4) + TEST_FIELD_ALIGN (EMRSCALEWINDOWEXTEX, xDenom, 4) + TEST_FIELD_OFFSET(EMRSCALEWINDOWEXTEX, xDenom, 12) + TEST_FIELD_SIZE (EMRSCALEWINDOWEXTEX, yNum, 4) + TEST_FIELD_ALIGN (EMRSCALEWINDOWEXTEX, yNum, 4) + TEST_FIELD_OFFSET(EMRSCALEWINDOWEXTEX, yNum, 16) + TEST_FIELD_SIZE (EMRSCALEWINDOWEXTEX, yDenom, 4) + TEST_FIELD_ALIGN (EMRSCALEWINDOWEXTEX, yDenom, 4) + TEST_FIELD_OFFSET(EMRSCALEWINDOWEXTEX, yDenom, 20) +} + +static void test_pack_EMRSELECTCLIPPATH(void) +{ + /* EMRSELECTCLIPPATH */ + TEST_TYPE_SIZE (EMRSELECTCLIPPATH, 12) + TEST_TYPE_ALIGN (EMRSELECTCLIPPATH, 4) + TEST_FIELD_SIZE (EMRSELECTCLIPPATH, emr, 8) + TEST_FIELD_ALIGN (EMRSELECTCLIPPATH, emr, 4) + TEST_FIELD_OFFSET(EMRSELECTCLIPPATH, emr, 0) + TEST_FIELD_SIZE (EMRSELECTCLIPPATH, iMode, 4) + TEST_FIELD_ALIGN (EMRSELECTCLIPPATH, iMode, 4) + TEST_FIELD_OFFSET(EMRSELECTCLIPPATH, iMode, 8) +} + +static void test_pack_EMRSELECTCOLORSPACE(void) +{ + /* EMRSELECTCOLORSPACE */ + TEST_TYPE_SIZE (EMRSELECTCOLORSPACE, 12) + TEST_TYPE_ALIGN (EMRSELECTCOLORSPACE, 4) + TEST_FIELD_SIZE (EMRSELECTCOLORSPACE, emr, 8) + TEST_FIELD_ALIGN (EMRSELECTCOLORSPACE, emr, 4) + TEST_FIELD_OFFSET(EMRSELECTCOLORSPACE, emr, 0) + TEST_FIELD_SIZE (EMRSELECTCOLORSPACE, ihCS, 4) + TEST_FIELD_ALIGN (EMRSELECTCOLORSPACE, ihCS, 4) + TEST_FIELD_OFFSET(EMRSELECTCOLORSPACE, ihCS, 8) +} + +static void test_pack_EMRSELECTOBJECT(void) +{ + /* EMRSELECTOBJECT */ + TEST_TYPE_SIZE (EMRSELECTOBJECT, 12) + TEST_TYPE_ALIGN (EMRSELECTOBJECT, 4) + TEST_FIELD_SIZE (EMRSELECTOBJECT, emr, 8) + TEST_FIELD_ALIGN (EMRSELECTOBJECT, emr, 4) + TEST_FIELD_OFFSET(EMRSELECTOBJECT, emr, 0) + TEST_FIELD_SIZE (EMRSELECTOBJECT, ihObject, 4) + TEST_FIELD_ALIGN (EMRSELECTOBJECT, ihObject, 4) + TEST_FIELD_OFFSET(EMRSELECTOBJECT, ihObject, 8) +} + +static void test_pack_EMRSELECTPALETTE(void) +{ + /* EMRSELECTPALETTE */ + TEST_TYPE_SIZE (EMRSELECTPALETTE, 12) + TEST_TYPE_ALIGN (EMRSELECTPALETTE, 4) + TEST_FIELD_SIZE (EMRSELECTPALETTE, emr, 8) + TEST_FIELD_ALIGN (EMRSELECTPALETTE, emr, 4) + TEST_FIELD_OFFSET(EMRSELECTPALETTE, emr, 0) + TEST_FIELD_SIZE (EMRSELECTPALETTE, ihPal, 4) + TEST_FIELD_ALIGN (EMRSELECTPALETTE, ihPal, 4) + TEST_FIELD_OFFSET(EMRSELECTPALETTE, ihPal, 8) +} + +static void test_pack_EMRSETARCDIRECTION(void) +{ + /* EMRSETARCDIRECTION */ + TEST_TYPE_SIZE (EMRSETARCDIRECTION, 12) + TEST_TYPE_ALIGN (EMRSETARCDIRECTION, 4) + TEST_FIELD_SIZE (EMRSETARCDIRECTION, emr, 8) + TEST_FIELD_ALIGN (EMRSETARCDIRECTION, emr, 4) + TEST_FIELD_OFFSET(EMRSETARCDIRECTION, emr, 0) + TEST_FIELD_SIZE (EMRSETARCDIRECTION, iArcDirection, 4) + TEST_FIELD_ALIGN (EMRSETARCDIRECTION, iArcDirection, 4) + TEST_FIELD_OFFSET(EMRSETARCDIRECTION, iArcDirection, 8) +} + +static void test_pack_EMRSETBKCOLOR(void) +{ + /* EMRSETBKCOLOR */ + TEST_TYPE_SIZE (EMRSETBKCOLOR, 12) + TEST_TYPE_ALIGN (EMRSETBKCOLOR, 4) + TEST_FIELD_SIZE (EMRSETBKCOLOR, emr, 8) + TEST_FIELD_ALIGN (EMRSETBKCOLOR, emr, 4) + TEST_FIELD_OFFSET(EMRSETBKCOLOR, emr, 0) + TEST_FIELD_SIZE (EMRSETBKCOLOR, crColor, 4) + TEST_FIELD_ALIGN (EMRSETBKCOLOR, crColor, 4) + TEST_FIELD_OFFSET(EMRSETBKCOLOR, crColor, 8) +} + +static void test_pack_EMRSETBKMODE(void) +{ + /* EMRSETBKMODE */ + TEST_TYPE_SIZE (EMRSETBKMODE, 12) + TEST_TYPE_ALIGN (EMRSETBKMODE, 4) + TEST_FIELD_SIZE (EMRSETBKMODE, emr, 8) + TEST_FIELD_ALIGN (EMRSETBKMODE, emr, 4) + TEST_FIELD_OFFSET(EMRSETBKMODE, emr, 0) + TEST_FIELD_SIZE (EMRSETBKMODE, iMode, 4) + TEST_FIELD_ALIGN (EMRSETBKMODE, iMode, 4) + TEST_FIELD_OFFSET(EMRSETBKMODE, iMode, 8) +} + +static void test_pack_EMRSETBRUSHORGEX(void) +{ + /* EMRSETBRUSHORGEX */ + TEST_TYPE_SIZE (EMRSETBRUSHORGEX, 16) + TEST_TYPE_ALIGN (EMRSETBRUSHORGEX, 4) + TEST_FIELD_SIZE (EMRSETBRUSHORGEX, emr, 8) + TEST_FIELD_ALIGN (EMRSETBRUSHORGEX, emr, 4) + TEST_FIELD_OFFSET(EMRSETBRUSHORGEX, emr, 0) + TEST_FIELD_SIZE (EMRSETBRUSHORGEX, ptlOrigin, 8) + TEST_FIELD_ALIGN (EMRSETBRUSHORGEX, ptlOrigin, 4) + TEST_FIELD_OFFSET(EMRSETBRUSHORGEX, ptlOrigin, 8) +} + +static void test_pack_EMRSETCOLORADJUSTMENT(void) +{ + /* EMRSETCOLORADJUSTMENT */ + TEST_TYPE_SIZE (EMRSETCOLORADJUSTMENT, 32) + TEST_TYPE_ALIGN (EMRSETCOLORADJUSTMENT, 4) + TEST_FIELD_SIZE (EMRSETCOLORADJUSTMENT, emr, 8) + TEST_FIELD_ALIGN (EMRSETCOLORADJUSTMENT, emr, 4) + TEST_FIELD_OFFSET(EMRSETCOLORADJUSTMENT, emr, 0) + TEST_FIELD_SIZE (EMRSETCOLORADJUSTMENT, ColorAdjustment, 24) + TEST_FIELD_ALIGN (EMRSETCOLORADJUSTMENT, ColorAdjustment, 2) + TEST_FIELD_OFFSET(EMRSETCOLORADJUSTMENT, ColorAdjustment, 8) +} + +static void test_pack_EMRSETCOLORSPACE(void) +{ + /* EMRSETCOLORSPACE */ + TEST_TYPE_SIZE (EMRSETCOLORSPACE, 12) + TEST_TYPE_ALIGN (EMRSETCOLORSPACE, 4) + TEST_FIELD_SIZE (EMRSETCOLORSPACE, emr, 8) + TEST_FIELD_ALIGN (EMRSETCOLORSPACE, emr, 4) + TEST_FIELD_OFFSET(EMRSETCOLORSPACE, emr, 0) + TEST_FIELD_SIZE (EMRSETCOLORSPACE, ihCS, 4) + TEST_FIELD_ALIGN (EMRSETCOLORSPACE, ihCS, 4) + TEST_FIELD_OFFSET(EMRSETCOLORSPACE, ihCS, 8) +} + +static void test_pack_EMRSETDIBITSTODEVICE(void) +{ + /* EMRSETDIBITSTODEVICE */ + TEST_TYPE_SIZE (EMRSETDIBITSTODEVICE, 76) + TEST_TYPE_ALIGN (EMRSETDIBITSTODEVICE, 4) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, emr, 8) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, emr, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, emr, 0) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, rclBounds, 16) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, rclBounds, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, rclBounds, 8) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, xDest, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, xDest, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, xDest, 24) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, yDest, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, yDest, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, yDest, 28) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, xSrc, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, xSrc, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, xSrc, 32) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, ySrc, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, ySrc, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, ySrc, 36) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, cxSrc, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, cxSrc, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, cxSrc, 40) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, cySrc, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, cySrc, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, cySrc, 44) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, offBmiSrc, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, offBmiSrc, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, offBmiSrc, 48) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, cbBmiSrc, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, cbBmiSrc, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, cbBmiSrc, 52) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, offBitsSrc, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, offBitsSrc, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, offBitsSrc, 56) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, cbBitsSrc, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, cbBitsSrc, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, cbBitsSrc, 60) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, iUsageSrc, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, iUsageSrc, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, iUsageSrc, 64) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, iStartScan, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, iStartScan, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, iStartScan, 68) + TEST_FIELD_SIZE (EMRSETDIBITSTODEVICE, cScans, 4) + TEST_FIELD_ALIGN (EMRSETDIBITSTODEVICE, cScans, 4) + TEST_FIELD_OFFSET(EMRSETDIBITSTODEVICE, cScans, 72) +} + +static void test_pack_EMRSETICMMODE(void) +{ + /* EMRSETICMMODE */ + TEST_TYPE_SIZE (EMRSETICMMODE, 12) + TEST_TYPE_ALIGN (EMRSETICMMODE, 4) + TEST_FIELD_SIZE (EMRSETICMMODE, emr, 8) + TEST_FIELD_ALIGN (EMRSETICMMODE, emr, 4) + TEST_FIELD_OFFSET(EMRSETICMMODE, emr, 0) + TEST_FIELD_SIZE (EMRSETICMMODE, iMode, 4) + TEST_FIELD_ALIGN (EMRSETICMMODE, iMode, 4) + TEST_FIELD_OFFSET(EMRSETICMMODE, iMode, 8) +} + +static void test_pack_EMRSETLAYOUT(void) +{ + /* EMRSETLAYOUT */ + TEST_TYPE_SIZE (EMRSETLAYOUT, 12) + TEST_TYPE_ALIGN (EMRSETLAYOUT, 4) + TEST_FIELD_SIZE (EMRSETLAYOUT, emr, 8) + TEST_FIELD_ALIGN (EMRSETLAYOUT, emr, 4) + TEST_FIELD_OFFSET(EMRSETLAYOUT, emr, 0) + TEST_FIELD_SIZE (EMRSETLAYOUT, iMode, 4) + TEST_FIELD_ALIGN (EMRSETLAYOUT, iMode, 4) + TEST_FIELD_OFFSET(EMRSETLAYOUT, iMode, 8) +} + +static void test_pack_EMRSETMAPMODE(void) +{ + /* EMRSETMAPMODE */ + TEST_TYPE_SIZE (EMRSETMAPMODE, 12) + TEST_TYPE_ALIGN (EMRSETMAPMODE, 4) + TEST_FIELD_SIZE (EMRSETMAPMODE, emr, 8) + TEST_FIELD_ALIGN (EMRSETMAPMODE, emr, 4) + TEST_FIELD_OFFSET(EMRSETMAPMODE, emr, 0) + TEST_FIELD_SIZE (EMRSETMAPMODE, iMode, 4) + TEST_FIELD_ALIGN (EMRSETMAPMODE, iMode, 4) + TEST_FIELD_OFFSET(EMRSETMAPMODE, iMode, 8) +} + +static void test_pack_EMRSETMAPPERFLAGS(void) +{ + /* EMRSETMAPPERFLAGS */ + TEST_TYPE_SIZE (EMRSETMAPPERFLAGS, 12) + TEST_TYPE_ALIGN (EMRSETMAPPERFLAGS, 4) + TEST_FIELD_SIZE (EMRSETMAPPERFLAGS, emr, 8) + TEST_FIELD_ALIGN (EMRSETMAPPERFLAGS, emr, 4) + TEST_FIELD_OFFSET(EMRSETMAPPERFLAGS, emr, 0) + TEST_FIELD_SIZE (EMRSETMAPPERFLAGS, dwFlags, 4) + TEST_FIELD_ALIGN (EMRSETMAPPERFLAGS, dwFlags, 4) + TEST_FIELD_OFFSET(EMRSETMAPPERFLAGS, dwFlags, 8) +} + +static void test_pack_EMRSETMETARGN(void) +{ + /* EMRSETMETARGN */ + TEST_TYPE_SIZE (EMRSETMETARGN, 8) + TEST_TYPE_ALIGN (EMRSETMETARGN, 4) + TEST_FIELD_SIZE (EMRSETMETARGN, emr, 8) + TEST_FIELD_ALIGN (EMRSETMETARGN, emr, 4) + TEST_FIELD_OFFSET(EMRSETMETARGN, emr, 0) +} + +static void test_pack_EMRSETMITERLIMIT(void) +{ + /* EMRSETMITERLIMIT */ + TEST_TYPE_SIZE (EMRSETMITERLIMIT, 12) + TEST_TYPE_ALIGN (EMRSETMITERLIMIT, 4) + TEST_FIELD_SIZE (EMRSETMITERLIMIT, emr, 8) + TEST_FIELD_ALIGN (EMRSETMITERLIMIT, emr, 4) + TEST_FIELD_OFFSET(EMRSETMITERLIMIT, emr, 0) + TEST_FIELD_SIZE (EMRSETMITERLIMIT, eMiterLimit, 4) + TEST_FIELD_ALIGN (EMRSETMITERLIMIT, eMiterLimit, 4) + TEST_FIELD_OFFSET(EMRSETMITERLIMIT, eMiterLimit, 8) +} + +static void test_pack_EMRSETPIXELV(void) +{ + /* EMRSETPIXELV */ + TEST_TYPE_SIZE (EMRSETPIXELV, 20) + TEST_TYPE_ALIGN (EMRSETPIXELV, 4) + TEST_FIELD_SIZE (EMRSETPIXELV, emr, 8) + TEST_FIELD_ALIGN (EMRSETPIXELV, emr, 4) + TEST_FIELD_OFFSET(EMRSETPIXELV, emr, 0) + TEST_FIELD_SIZE (EMRSETPIXELV, ptlPixel, 8) + TEST_FIELD_ALIGN (EMRSETPIXELV, ptlPixel, 4) + TEST_FIELD_OFFSET(EMRSETPIXELV, ptlPixel, 8) + TEST_FIELD_SIZE (EMRSETPIXELV, crColor, 4) + TEST_FIELD_ALIGN (EMRSETPIXELV, crColor, 4) + TEST_FIELD_OFFSET(EMRSETPIXELV, crColor, 16) +} + +static void test_pack_EMRSETPOLYFILLMODE(void) +{ + /* EMRSETPOLYFILLMODE */ + TEST_TYPE_SIZE (EMRSETPOLYFILLMODE, 12) + TEST_TYPE_ALIGN (EMRSETPOLYFILLMODE, 4) + TEST_FIELD_SIZE (EMRSETPOLYFILLMODE, emr, 8) + TEST_FIELD_ALIGN (EMRSETPOLYFILLMODE, emr, 4) + TEST_FIELD_OFFSET(EMRSETPOLYFILLMODE, emr, 0) + TEST_FIELD_SIZE (EMRSETPOLYFILLMODE, iMode, 4) + TEST_FIELD_ALIGN (EMRSETPOLYFILLMODE, iMode, 4) + TEST_FIELD_OFFSET(EMRSETPOLYFILLMODE, iMode, 8) +} + +static void test_pack_EMRSETROP2(void) +{ + /* EMRSETROP2 */ + TEST_TYPE_SIZE (EMRSETROP2, 12) + TEST_TYPE_ALIGN (EMRSETROP2, 4) + TEST_FIELD_SIZE (EMRSETROP2, emr, 8) + TEST_FIELD_ALIGN (EMRSETROP2, emr, 4) + TEST_FIELD_OFFSET(EMRSETROP2, emr, 0) + TEST_FIELD_SIZE (EMRSETROP2, iMode, 4) + TEST_FIELD_ALIGN (EMRSETROP2, iMode, 4) + TEST_FIELD_OFFSET(EMRSETROP2, iMode, 8) +} + +static void test_pack_EMRSETSTRETCHBLTMODE(void) +{ + /* EMRSETSTRETCHBLTMODE */ + TEST_TYPE_SIZE (EMRSETSTRETCHBLTMODE, 12) + TEST_TYPE_ALIGN (EMRSETSTRETCHBLTMODE, 4) + TEST_FIELD_SIZE (EMRSETSTRETCHBLTMODE, emr, 8) + TEST_FIELD_ALIGN (EMRSETSTRETCHBLTMODE, emr, 4) + TEST_FIELD_OFFSET(EMRSETSTRETCHBLTMODE, emr, 0) + TEST_FIELD_SIZE (EMRSETSTRETCHBLTMODE, iMode, 4) + TEST_FIELD_ALIGN (EMRSETSTRETCHBLTMODE, iMode, 4) + TEST_FIELD_OFFSET(EMRSETSTRETCHBLTMODE, iMode, 8) +} + +static void test_pack_EMRSETTEXTALIGN(void) +{ + /* EMRSETTEXTALIGN */ + TEST_TYPE_SIZE (EMRSETTEXTALIGN, 12) + TEST_TYPE_ALIGN (EMRSETTEXTALIGN, 4) + TEST_FIELD_SIZE (EMRSETTEXTALIGN, emr, 8) + TEST_FIELD_ALIGN (EMRSETTEXTALIGN, emr, 4) + TEST_FIELD_OFFSET(EMRSETTEXTALIGN, emr, 0) + TEST_FIELD_SIZE (EMRSETTEXTALIGN, iMode, 4) + TEST_FIELD_ALIGN (EMRSETTEXTALIGN, iMode, 4) + TEST_FIELD_OFFSET(EMRSETTEXTALIGN, iMode, 8) +} + +static void test_pack_EMRSETTEXTCOLOR(void) +{ + /* EMRSETTEXTCOLOR */ + TEST_TYPE_SIZE (EMRSETTEXTCOLOR, 12) + TEST_TYPE_ALIGN (EMRSETTEXTCOLOR, 4) + TEST_FIELD_SIZE (EMRSETTEXTCOLOR, emr, 8) + TEST_FIELD_ALIGN (EMRSETTEXTCOLOR, emr, 4) + TEST_FIELD_OFFSET(EMRSETTEXTCOLOR, emr, 0) + TEST_FIELD_SIZE (EMRSETTEXTCOLOR, crColor, 4) + TEST_FIELD_ALIGN (EMRSETTEXTCOLOR, crColor, 4) + TEST_FIELD_OFFSET(EMRSETTEXTCOLOR, crColor, 8) +} + +static void test_pack_EMRSETVIEWPORTEXTEX(void) +{ + /* EMRSETVIEWPORTEXTEX */ + TEST_TYPE_SIZE (EMRSETVIEWPORTEXTEX, 16) + TEST_TYPE_ALIGN (EMRSETVIEWPORTEXTEX, 4) + TEST_FIELD_SIZE (EMRSETVIEWPORTEXTEX, emr, 8) + TEST_FIELD_ALIGN (EMRSETVIEWPORTEXTEX, emr, 4) + TEST_FIELD_OFFSET(EMRSETVIEWPORTEXTEX, emr, 0) + TEST_FIELD_SIZE (EMRSETVIEWPORTEXTEX, szlExtent, 8) + TEST_FIELD_ALIGN (EMRSETVIEWPORTEXTEX, szlExtent, 4) + TEST_FIELD_OFFSET(EMRSETVIEWPORTEXTEX, szlExtent, 8) +} + +static void test_pack_EMRSETVIEWPORTORGEX(void) +{ + /* EMRSETVIEWPORTORGEX */ + TEST_TYPE_SIZE (EMRSETVIEWPORTORGEX, 16) + TEST_TYPE_ALIGN (EMRSETVIEWPORTORGEX, 4) + TEST_FIELD_SIZE (EMRSETVIEWPORTORGEX, emr, 8) + TEST_FIELD_ALIGN (EMRSETVIEWPORTORGEX, emr, 4) + TEST_FIELD_OFFSET(EMRSETVIEWPORTORGEX, emr, 0) + TEST_FIELD_SIZE (EMRSETVIEWPORTORGEX, ptlOrigin, 8) + TEST_FIELD_ALIGN (EMRSETVIEWPORTORGEX, ptlOrigin, 4) + TEST_FIELD_OFFSET(EMRSETVIEWPORTORGEX, ptlOrigin, 8) +} + +static void test_pack_EMRSETWINDOWEXTEX(void) +{ + /* EMRSETWINDOWEXTEX */ + TEST_TYPE_SIZE (EMRSETWINDOWEXTEX, 16) + TEST_TYPE_ALIGN (EMRSETWINDOWEXTEX, 4) + TEST_FIELD_SIZE (EMRSETWINDOWEXTEX, emr, 8) + TEST_FIELD_ALIGN (EMRSETWINDOWEXTEX, emr, 4) + TEST_FIELD_OFFSET(EMRSETWINDOWEXTEX, emr, 0) + TEST_FIELD_SIZE (EMRSETWINDOWEXTEX, szlExtent, 8) + TEST_FIELD_ALIGN (EMRSETWINDOWEXTEX, szlExtent, 4) + TEST_FIELD_OFFSET(EMRSETWINDOWEXTEX, szlExtent, 8) +} + +static void test_pack_EMRSETWINDOWORGEX(void) +{ + /* EMRSETWINDOWORGEX */ + TEST_TYPE_SIZE (EMRSETWINDOWORGEX, 16) + TEST_TYPE_ALIGN (EMRSETWINDOWORGEX, 4) + TEST_FIELD_SIZE (EMRSETWINDOWORGEX, emr, 8) + TEST_FIELD_ALIGN (EMRSETWINDOWORGEX, emr, 4) + TEST_FIELD_OFFSET(EMRSETWINDOWORGEX, emr, 0) + TEST_FIELD_SIZE (EMRSETWINDOWORGEX, ptlOrigin, 8) + TEST_FIELD_ALIGN (EMRSETWINDOWORGEX, ptlOrigin, 4) + TEST_FIELD_OFFSET(EMRSETWINDOWORGEX, ptlOrigin, 8) +} + +static void test_pack_EMRSETWORLDTRANSFORM(void) +{ + /* EMRSETWORLDTRANSFORM */ + TEST_TYPE_SIZE (EMRSETWORLDTRANSFORM, 32) + TEST_TYPE_ALIGN (EMRSETWORLDTRANSFORM, 4) + TEST_FIELD_SIZE (EMRSETWORLDTRANSFORM, emr, 8) + TEST_FIELD_ALIGN (EMRSETWORLDTRANSFORM, emr, 4) + TEST_FIELD_OFFSET(EMRSETWORLDTRANSFORM, emr, 0) + TEST_FIELD_SIZE (EMRSETWORLDTRANSFORM, xform, 24) + TEST_FIELD_ALIGN (EMRSETWORLDTRANSFORM, xform, 4) + TEST_FIELD_OFFSET(EMRSETWORLDTRANSFORM, xform, 8) +} + +static void test_pack_EMRSTRETCHBLT(void) +{ + /* EMRSTRETCHBLT */ + TEST_TYPE_SIZE (EMRSTRETCHBLT, 108) + TEST_TYPE_ALIGN (EMRSTRETCHBLT, 4) + TEST_FIELD_SIZE (EMRSTRETCHBLT, emr, 8) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, emr, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, emr, 0) + TEST_FIELD_SIZE (EMRSTRETCHBLT, rclBounds, 16) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, rclBounds, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, rclBounds, 8) + TEST_FIELD_SIZE (EMRSTRETCHBLT, xDest, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, xDest, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, xDest, 24) + TEST_FIELD_SIZE (EMRSTRETCHBLT, yDest, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, yDest, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, yDest, 28) + TEST_FIELD_SIZE (EMRSTRETCHBLT, cxDest, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, cxDest, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, cxDest, 32) + TEST_FIELD_SIZE (EMRSTRETCHBLT, cyDest, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, cyDest, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, cyDest, 36) + TEST_FIELD_SIZE (EMRSTRETCHBLT, dwRop, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, dwRop, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, dwRop, 40) + TEST_FIELD_SIZE (EMRSTRETCHBLT, xSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, xSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, xSrc, 44) + TEST_FIELD_SIZE (EMRSTRETCHBLT, ySrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, ySrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, ySrc, 48) + TEST_FIELD_SIZE (EMRSTRETCHBLT, xformSrc, 24) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, xformSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, xformSrc, 52) + TEST_FIELD_SIZE (EMRSTRETCHBLT, crBkColorSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, crBkColorSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, crBkColorSrc, 76) + TEST_FIELD_SIZE (EMRSTRETCHBLT, iUsageSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, iUsageSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, iUsageSrc, 80) + TEST_FIELD_SIZE (EMRSTRETCHBLT, offBmiSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, offBmiSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, offBmiSrc, 84) + TEST_FIELD_SIZE (EMRSTRETCHBLT, cbBmiSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, cbBmiSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, cbBmiSrc, 88) + TEST_FIELD_SIZE (EMRSTRETCHBLT, offBitsSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, offBitsSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, offBitsSrc, 92) + TEST_FIELD_SIZE (EMRSTRETCHBLT, cbBitsSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, cbBitsSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, cbBitsSrc, 96) + TEST_FIELD_SIZE (EMRSTRETCHBLT, cxSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, cxSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, cxSrc, 100) + TEST_FIELD_SIZE (EMRSTRETCHBLT, cySrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHBLT, cySrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHBLT, cySrc, 104) +} + +static void test_pack_EMRSTRETCHDIBITS(void) +{ + /* EMRSTRETCHDIBITS */ + TEST_TYPE_SIZE (EMRSTRETCHDIBITS, 80) + TEST_TYPE_ALIGN (EMRSTRETCHDIBITS, 4) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, emr, 8) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, emr, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, emr, 0) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, rclBounds, 16) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, rclBounds, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, rclBounds, 8) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, xDest, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, xDest, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, xDest, 24) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, yDest, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, yDest, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, yDest, 28) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, xSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, xSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, xSrc, 32) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, ySrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, ySrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, ySrc, 36) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, cxSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, cxSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, cxSrc, 40) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, cySrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, cySrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, cySrc, 44) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, offBmiSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, offBmiSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, offBmiSrc, 48) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, cbBmiSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, cbBmiSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, cbBmiSrc, 52) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, offBitsSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, offBitsSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, offBitsSrc, 56) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, cbBitsSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, cbBitsSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, cbBitsSrc, 60) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, iUsageSrc, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, iUsageSrc, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, iUsageSrc, 64) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, dwRop, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, dwRop, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, dwRop, 68) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, cxDest, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, cxDest, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, cxDest, 72) + TEST_FIELD_SIZE (EMRSTRETCHDIBITS, cyDest, 4) + TEST_FIELD_ALIGN (EMRSTRETCHDIBITS, cyDest, 4) + TEST_FIELD_OFFSET(EMRSTRETCHDIBITS, cyDest, 76) +} + +static void test_pack_EMRSTROKEANDFILLPATH(void) +{ + /* EMRSTROKEANDFILLPATH */ + TEST_TYPE_SIZE (EMRSTROKEANDFILLPATH, 24) + TEST_TYPE_ALIGN (EMRSTROKEANDFILLPATH, 4) + TEST_FIELD_SIZE (EMRSTROKEANDFILLPATH, emr, 8) + TEST_FIELD_ALIGN (EMRSTROKEANDFILLPATH, emr, 4) + TEST_FIELD_OFFSET(EMRSTROKEANDFILLPATH, emr, 0) + TEST_FIELD_SIZE (EMRSTROKEANDFILLPATH, rclBounds, 16) + TEST_FIELD_ALIGN (EMRSTROKEANDFILLPATH, rclBounds, 4) + TEST_FIELD_OFFSET(EMRSTROKEANDFILLPATH, rclBounds, 8) +} + +static void test_pack_EMRSTROKEPATH(void) +{ + /* EMRSTROKEPATH */ + TEST_TYPE_SIZE (EMRSTROKEPATH, 24) + TEST_TYPE_ALIGN (EMRSTROKEPATH, 4) + TEST_FIELD_SIZE (EMRSTROKEPATH, emr, 8) + TEST_FIELD_ALIGN (EMRSTROKEPATH, emr, 4) + TEST_FIELD_OFFSET(EMRSTROKEPATH, emr, 0) + TEST_FIELD_SIZE (EMRSTROKEPATH, rclBounds, 16) + TEST_FIELD_ALIGN (EMRSTROKEPATH, rclBounds, 4) + TEST_FIELD_OFFSET(EMRSTROKEPATH, rclBounds, 8) +} + +static void test_pack_EMRTEXT(void) +{ + /* EMRTEXT */ + TEST_TYPE_SIZE (EMRTEXT, 40) + TEST_TYPE_ALIGN (EMRTEXT, 4) + TEST_FIELD_SIZE (EMRTEXT, ptlReference, 8) + TEST_FIELD_ALIGN (EMRTEXT, ptlReference, 4) + TEST_FIELD_OFFSET(EMRTEXT, ptlReference, 0) + TEST_FIELD_SIZE (EMRTEXT, nChars, 4) + TEST_FIELD_ALIGN (EMRTEXT, nChars, 4) + TEST_FIELD_OFFSET(EMRTEXT, nChars, 8) + TEST_FIELD_SIZE (EMRTEXT, offString, 4) + TEST_FIELD_ALIGN (EMRTEXT, offString, 4) + TEST_FIELD_OFFSET(EMRTEXT, offString, 12) + TEST_FIELD_SIZE (EMRTEXT, fOptions, 4) + TEST_FIELD_ALIGN (EMRTEXT, fOptions, 4) + TEST_FIELD_OFFSET(EMRTEXT, fOptions, 16) + TEST_FIELD_SIZE (EMRTEXT, rcl, 16) + TEST_FIELD_ALIGN (EMRTEXT, rcl, 4) + TEST_FIELD_OFFSET(EMRTEXT, rcl, 20) + TEST_FIELD_SIZE (EMRTEXT, offDx, 4) + TEST_FIELD_ALIGN (EMRTEXT, offDx, 4) + TEST_FIELD_OFFSET(EMRTEXT, offDx, 36) +} + +static void test_pack_EMRWIDENPATH(void) +{ + /* EMRWIDENPATH */ + TEST_TYPE_SIZE (EMRWIDENPATH, 8) + TEST_TYPE_ALIGN (EMRWIDENPATH, 4) + TEST_FIELD_SIZE (EMRWIDENPATH, emr, 8) + TEST_FIELD_ALIGN (EMRWIDENPATH, emr, 4) + TEST_FIELD_OFFSET(EMRWIDENPATH, emr, 0) +} + +static void test_pack_ENHMETAHEADER(void) +{ + /* ENHMETAHEADER */ + TEST_TYPE_SIZE (ENHMETAHEADER, 108) + TEST_TYPE_ALIGN (ENHMETAHEADER, 4) + TEST_FIELD_SIZE (ENHMETAHEADER, iType, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, iType, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, iType, 0) + TEST_FIELD_SIZE (ENHMETAHEADER, nSize, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, nSize, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, nSize, 4) + TEST_FIELD_SIZE (ENHMETAHEADER, rclBounds, 16) + TEST_FIELD_ALIGN (ENHMETAHEADER, rclBounds, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, rclBounds, 8) + TEST_FIELD_SIZE (ENHMETAHEADER, rclFrame, 16) + TEST_FIELD_ALIGN (ENHMETAHEADER, rclFrame, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, rclFrame, 24) + TEST_FIELD_SIZE (ENHMETAHEADER, dSignature, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, dSignature, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, dSignature, 40) + TEST_FIELD_SIZE (ENHMETAHEADER, nVersion, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, nVersion, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, nVersion, 44) + TEST_FIELD_SIZE (ENHMETAHEADER, nBytes, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, nBytes, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, nBytes, 48) + TEST_FIELD_SIZE (ENHMETAHEADER, nRecords, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, nRecords, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, nRecords, 52) + TEST_FIELD_SIZE (ENHMETAHEADER, nHandles, 2) + TEST_FIELD_ALIGN (ENHMETAHEADER, nHandles, 2) + TEST_FIELD_OFFSET(ENHMETAHEADER, nHandles, 56) + TEST_FIELD_SIZE (ENHMETAHEADER, sReserved, 2) + TEST_FIELD_ALIGN (ENHMETAHEADER, sReserved, 2) + TEST_FIELD_OFFSET(ENHMETAHEADER, sReserved, 58) + TEST_FIELD_SIZE (ENHMETAHEADER, nDescription, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, nDescription, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, nDescription, 60) + TEST_FIELD_SIZE (ENHMETAHEADER, offDescription, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, offDescription, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, offDescription, 64) + TEST_FIELD_SIZE (ENHMETAHEADER, nPalEntries, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, nPalEntries, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, nPalEntries, 68) + TEST_FIELD_SIZE (ENHMETAHEADER, szlDevice, 8) + TEST_FIELD_ALIGN (ENHMETAHEADER, szlDevice, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, szlDevice, 72) + TEST_FIELD_SIZE (ENHMETAHEADER, szlMillimeters, 8) + TEST_FIELD_ALIGN (ENHMETAHEADER, szlMillimeters, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, szlMillimeters, 80) + TEST_FIELD_SIZE (ENHMETAHEADER, cbPixelFormat, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, cbPixelFormat, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, cbPixelFormat, 88) + TEST_FIELD_SIZE (ENHMETAHEADER, offPixelFormat, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, offPixelFormat, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, offPixelFormat, 92) + TEST_FIELD_SIZE (ENHMETAHEADER, bOpenGL, 4) + TEST_FIELD_ALIGN (ENHMETAHEADER, bOpenGL, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, bOpenGL, 96) + TEST_FIELD_SIZE (ENHMETAHEADER, szlMicrometers, 8) + TEST_FIELD_ALIGN (ENHMETAHEADER, szlMicrometers, 4) + TEST_FIELD_OFFSET(ENHMETAHEADER, szlMicrometers, 100) +} + +static void test_pack_ENHMETARECORD(void) +{ + /* ENHMETARECORD */ + TEST_TYPE_SIZE (ENHMETARECORD, 12) + TEST_TYPE_ALIGN (ENHMETARECORD, 4) + TEST_FIELD_SIZE (ENHMETARECORD, iType, 4) + TEST_FIELD_ALIGN (ENHMETARECORD, iType, 4) + TEST_FIELD_OFFSET(ENHMETARECORD, iType, 0) + TEST_FIELD_SIZE (ENHMETARECORD, nSize, 4) + TEST_FIELD_ALIGN (ENHMETARECORD, nSize, 4) + TEST_FIELD_OFFSET(ENHMETARECORD, nSize, 4) + TEST_FIELD_SIZE (ENHMETARECORD, dParm, 4) + TEST_FIELD_ALIGN (ENHMETARECORD, dParm, 4) + TEST_FIELD_OFFSET(ENHMETARECORD, dParm, 8) +} + +static void test_pack_ENHMFENUMPROC(void) +{ + /* ENHMFENUMPROC */ + TEST_TYPE_SIZE (ENHMFENUMPROC, 4) + TEST_TYPE_ALIGN (ENHMFENUMPROC, 4) +} + +static void test_pack_ENUMLOGFONTA(void) +{ + /* ENUMLOGFONTA */ + TEST_TYPE_SIZE (ENUMLOGFONTA, 156) + TEST_TYPE_ALIGN (ENUMLOGFONTA, 4) + TEST_FIELD_SIZE (ENUMLOGFONTA, elfLogFont, 60) + TEST_FIELD_ALIGN (ENUMLOGFONTA, elfLogFont, 4) + TEST_FIELD_OFFSET(ENUMLOGFONTA, elfLogFont, 0) + TEST_FIELD_SIZE (ENUMLOGFONTA, elfFullName, 64) + TEST_FIELD_ALIGN (ENUMLOGFONTA, elfFullName, 1) + TEST_FIELD_OFFSET(ENUMLOGFONTA, elfFullName, 60) + TEST_FIELD_SIZE (ENUMLOGFONTA, elfStyle, 32) + TEST_FIELD_ALIGN (ENUMLOGFONTA, elfStyle, 1) + TEST_FIELD_OFFSET(ENUMLOGFONTA, elfStyle, 124) +} + +static void test_pack_ENUMLOGFONTEXA(void) +{ + /* ENUMLOGFONTEXA */ + TEST_TYPE_SIZE (ENUMLOGFONTEXA, 188) + TEST_TYPE_ALIGN (ENUMLOGFONTEXA, 4) + TEST_FIELD_SIZE (ENUMLOGFONTEXA, elfLogFont, 60) + TEST_FIELD_ALIGN (ENUMLOGFONTEXA, elfLogFont, 4) + TEST_FIELD_OFFSET(ENUMLOGFONTEXA, elfLogFont, 0) + TEST_FIELD_SIZE (ENUMLOGFONTEXA, elfFullName, 64) + TEST_FIELD_ALIGN (ENUMLOGFONTEXA, elfFullName, 1) + TEST_FIELD_OFFSET(ENUMLOGFONTEXA, elfFullName, 60) + TEST_FIELD_SIZE (ENUMLOGFONTEXA, elfStyle, 32) + TEST_FIELD_ALIGN (ENUMLOGFONTEXA, elfStyle, 1) + TEST_FIELD_OFFSET(ENUMLOGFONTEXA, elfStyle, 124) + TEST_FIELD_SIZE (ENUMLOGFONTEXA, elfScript, 32) + TEST_FIELD_ALIGN (ENUMLOGFONTEXA, elfScript, 1) + TEST_FIELD_OFFSET(ENUMLOGFONTEXA, elfScript, 156) +} + +static void test_pack_ENUMLOGFONTEXW(void) +{ + /* ENUMLOGFONTEXW */ + TEST_TYPE_SIZE (ENUMLOGFONTEXW, 348) + TEST_TYPE_ALIGN (ENUMLOGFONTEXW, 4) + TEST_FIELD_SIZE (ENUMLOGFONTEXW, elfLogFont, 92) + TEST_FIELD_ALIGN (ENUMLOGFONTEXW, elfLogFont, 4) + TEST_FIELD_OFFSET(ENUMLOGFONTEXW, elfLogFont, 0) + TEST_FIELD_SIZE (ENUMLOGFONTEXW, elfFullName, 128) + TEST_FIELD_ALIGN (ENUMLOGFONTEXW, elfFullName, 2) + TEST_FIELD_OFFSET(ENUMLOGFONTEXW, elfFullName, 92) + TEST_FIELD_SIZE (ENUMLOGFONTEXW, elfStyle, 64) + TEST_FIELD_ALIGN (ENUMLOGFONTEXW, elfStyle, 2) + TEST_FIELD_OFFSET(ENUMLOGFONTEXW, elfStyle, 220) + TEST_FIELD_SIZE (ENUMLOGFONTEXW, elfScript, 64) + TEST_FIELD_ALIGN (ENUMLOGFONTEXW, elfScript, 2) + TEST_FIELD_OFFSET(ENUMLOGFONTEXW, elfScript, 284) +} + +static void test_pack_ENUMLOGFONTW(void) +{ + /* ENUMLOGFONTW */ + TEST_TYPE_SIZE (ENUMLOGFONTW, 284) + TEST_TYPE_ALIGN (ENUMLOGFONTW, 4) + TEST_FIELD_SIZE (ENUMLOGFONTW, elfLogFont, 92) + TEST_FIELD_ALIGN (ENUMLOGFONTW, elfLogFont, 4) + TEST_FIELD_OFFSET(ENUMLOGFONTW, elfLogFont, 0) + TEST_FIELD_SIZE (ENUMLOGFONTW, elfFullName, 128) + TEST_FIELD_ALIGN (ENUMLOGFONTW, elfFullName, 2) + TEST_FIELD_OFFSET(ENUMLOGFONTW, elfFullName, 92) + TEST_FIELD_SIZE (ENUMLOGFONTW, elfStyle, 64) + TEST_FIELD_ALIGN (ENUMLOGFONTW, elfStyle, 2) + TEST_FIELD_OFFSET(ENUMLOGFONTW, elfStyle, 220) +} + +static void test_pack_EXTLOGFONTA(void) +{ + /* EXTLOGFONTA */ + TEST_TYPE_SIZE (EXTLOGFONTA, 192) + TEST_TYPE_ALIGN (EXTLOGFONTA, 4) + TEST_FIELD_SIZE (EXTLOGFONTA, elfLogFont, 60) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfLogFont, 4) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfLogFont, 0) + TEST_FIELD_SIZE (EXTLOGFONTA, elfFullName, 64) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfFullName, 1) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfFullName, 60) + TEST_FIELD_SIZE (EXTLOGFONTA, elfStyle, 32) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfStyle, 1) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfStyle, 124) + TEST_FIELD_SIZE (EXTLOGFONTA, elfVersion, 4) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfVersion, 4) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfVersion, 156) + TEST_FIELD_SIZE (EXTLOGFONTA, elfStyleSize, 4) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfStyleSize, 4) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfStyleSize, 160) + TEST_FIELD_SIZE (EXTLOGFONTA, elfMatch, 4) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfMatch, 4) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfMatch, 164) + TEST_FIELD_SIZE (EXTLOGFONTA, elfReserved, 4) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfReserved, 4) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfReserved, 168) + TEST_FIELD_SIZE (EXTLOGFONTA, elfVendorId, 4) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfVendorId, 1) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfVendorId, 172) + TEST_FIELD_SIZE (EXTLOGFONTA, elfCulture, 4) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfCulture, 4) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfCulture, 176) + TEST_FIELD_SIZE (EXTLOGFONTA, elfPanose, 10) + TEST_FIELD_ALIGN (EXTLOGFONTA, elfPanose, 1) + TEST_FIELD_OFFSET(EXTLOGFONTA, elfPanose, 180) +} + +static void test_pack_EXTLOGFONTW(void) +{ + /* EXTLOGFONTW */ + TEST_TYPE_SIZE (EXTLOGFONTW, 320) + TEST_TYPE_ALIGN (EXTLOGFONTW, 4) + TEST_FIELD_SIZE (EXTLOGFONTW, elfLogFont, 92) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfLogFont, 4) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfLogFont, 0) + TEST_FIELD_SIZE (EXTLOGFONTW, elfFullName, 128) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfFullName, 2) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfFullName, 92) + TEST_FIELD_SIZE (EXTLOGFONTW, elfStyle, 64) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfStyle, 2) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfStyle, 220) + TEST_FIELD_SIZE (EXTLOGFONTW, elfVersion, 4) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfVersion, 4) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfVersion, 284) + TEST_FIELD_SIZE (EXTLOGFONTW, elfStyleSize, 4) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfStyleSize, 4) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfStyleSize, 288) + TEST_FIELD_SIZE (EXTLOGFONTW, elfMatch, 4) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfMatch, 4) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfMatch, 292) + TEST_FIELD_SIZE (EXTLOGFONTW, elfReserved, 4) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfReserved, 4) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfReserved, 296) + TEST_FIELD_SIZE (EXTLOGFONTW, elfVendorId, 4) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfVendorId, 1) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfVendorId, 300) + TEST_FIELD_SIZE (EXTLOGFONTW, elfCulture, 4) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfCulture, 4) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfCulture, 304) + TEST_FIELD_SIZE (EXTLOGFONTW, elfPanose, 10) + TEST_FIELD_ALIGN (EXTLOGFONTW, elfPanose, 1) + TEST_FIELD_OFFSET(EXTLOGFONTW, elfPanose, 308) +} + +static void test_pack_EXTLOGPEN(void) +{ + /* EXTLOGPEN */ TEST_TYPE_SIZE (EXTLOGPEN, 28) TEST_TYPE_ALIGN (EXTLOGPEN, 4) TEST_FIELD_SIZE (EXTLOGPEN, elpPenStyle, 4) @@ -2985,7 +9505,7 @@ static void test_pack_EXTLOGPEN(void) static void test_pack_FIXED(void) { - /* FIXED (pack 4) */ + /* FIXED */ TEST_TYPE_SIZE (FIXED, 4) TEST_TYPE_ALIGN (FIXED, 2) TEST_FIELD_SIZE (FIXED, fract, 2) @@ -3012,7 +9532,7 @@ static void test_pack_FONTENUMPROCW(void) static void test_pack_FONTSIGNATURE(void) { - /* FONTSIGNATURE (pack 4) */ + /* FONTSIGNATURE */ TEST_TYPE_SIZE (FONTSIGNATURE, 24) TEST_TYPE_ALIGN (FONTSIGNATURE, 4) TEST_FIELD_SIZE (FONTSIGNATURE, fsUsb, 16) @@ -3039,7 +9559,7 @@ static void test_pack_FXPT2DOT30(void) static void test_pack_GCP_RESULTSA(void) { - /* GCP_RESULTSA (pack 4) */ + /* GCP_RESULTSA */ TEST_TYPE_SIZE (GCP_RESULTSA, 36) TEST_TYPE_ALIGN (GCP_RESULTSA, 4) TEST_FIELD_SIZE (GCP_RESULTSA, lStructSize, 4) @@ -3073,7 +9593,7 @@ static void test_pack_GCP_RESULTSA(void) static void test_pack_GCP_RESULTSW(void) { - /* GCP_RESULTSW (pack 4) */ + /* GCP_RESULTSW */ TEST_TYPE_SIZE (GCP_RESULTSW, 36) TEST_TYPE_ALIGN (GCP_RESULTSW, 4) TEST_FIELD_SIZE (GCP_RESULTSW, lStructSize, 4) @@ -3107,7 +9627,7 @@ static void test_pack_GCP_RESULTSW(void) static void test_pack_GLYPHMETRICS(void) { - /* GLYPHMETRICS (pack 4) */ + /* GLYPHMETRICS */ TEST_TYPE_SIZE (GLYPHMETRICS, 20) TEST_TYPE_ALIGN (GLYPHMETRICS, 4) TEST_FIELD_SIZE (GLYPHMETRICS, gmBlackBoxX, 4) @@ -3129,7 +9649,7 @@ static void test_pack_GLYPHMETRICS(void) static void test_pack_GLYPHMETRICSFLOAT(void) { - /* GLYPHMETRICSFLOAT (pack 4) */ + /* GLYPHMETRICSFLOAT */ TEST_TYPE_SIZE (GLYPHMETRICSFLOAT, 24) TEST_TYPE_ALIGN (GLYPHMETRICSFLOAT, 4) TEST_FIELD_SIZE (GLYPHMETRICSFLOAT, gmfBlackBoxX, 4) @@ -3158,7 +9678,7 @@ static void test_pack_GOBJENUMPROC(void) static void test_pack_GRADIENT_RECT(void) { - /* GRADIENT_RECT (pack 4) */ + /* GRADIENT_RECT */ TEST_TYPE_SIZE (GRADIENT_RECT, 8) TEST_TYPE_ALIGN (GRADIENT_RECT, 4) TEST_FIELD_SIZE (GRADIENT_RECT, UpperLeft, 4) @@ -3171,7 +9691,7 @@ static void test_pack_GRADIENT_RECT(void) static void test_pack_GRADIENT_TRIANGLE(void) { - /* GRADIENT_TRIANGLE (pack 4) */ + /* GRADIENT_TRIANGLE */ TEST_TYPE_SIZE (GRADIENT_TRIANGLE, 12) TEST_TYPE_ALIGN (GRADIENT_TRIANGLE, 4) TEST_FIELD_SIZE (GRADIENT_TRIANGLE, Vertex1, 4) @@ -3187,7 +9707,7 @@ static void test_pack_GRADIENT_TRIANGLE(void) static void test_pack_HANDLETABLE(void) { - /* HANDLETABLE (pack 4) */ + /* HANDLETABLE */ TEST_TYPE_SIZE (HANDLETABLE, 4) TEST_TYPE_ALIGN (HANDLETABLE, 4) TEST_FIELD_SIZE (HANDLETABLE, objectHandle, 4) @@ -3211,7 +9731,7 @@ static void test_pack_ICMENUMPROCW(void) static void test_pack_KERNINGPAIR(void) { - /* KERNINGPAIR (pack 4) */ + /* KERNINGPAIR */ TEST_TYPE_SIZE (KERNINGPAIR, 8) TEST_TYPE_ALIGN (KERNINGPAIR, 4) TEST_FIELD_SIZE (KERNINGPAIR, wFirst, 2) @@ -3227,7 +9747,7 @@ static void test_pack_KERNINGPAIR(void) static void test_pack_LAYERPLANEDESCRIPTOR(void) { - /* LAYERPLANEDESCRIPTOR (pack 4) */ + /* LAYERPLANEDESCRIPTOR */ TEST_TYPE_SIZE (LAYERPLANEDESCRIPTOR, 32) TEST_TYPE_ALIGN (LAYERPLANEDESCRIPTOR, 4) TEST_FIELD_SIZE (LAYERPLANEDESCRIPTOR, nSize, 2) @@ -3327,7 +9847,7 @@ static void test_pack_LINEDDAPROC(void) static void test_pack_LOCALESIGNATURE(void) { - /* LOCALESIGNATURE (pack 4) */ + /* LOCALESIGNATURE */ TEST_TYPE_SIZE (LOCALESIGNATURE, 32) TEST_TYPE_ALIGN (LOCALESIGNATURE, 4) TEST_FIELD_SIZE (LOCALESIGNATURE, lsUsb, 16) @@ -3343,7 +9863,7 @@ static void test_pack_LOCALESIGNATURE(void) static void test_pack_LOGBRUSH(void) { - /* LOGBRUSH (pack 4) */ + /* LOGBRUSH */ TEST_TYPE_SIZE (LOGBRUSH, 12) TEST_TYPE_ALIGN (LOGBRUSH, 4) TEST_FIELD_SIZE (LOGBRUSH, lbStyle, 4) @@ -3359,7 +9879,7 @@ static void test_pack_LOGBRUSH(void) static void test_pack_LOGCOLORSPACEA(void) { - /* LOGCOLORSPACEA (pack 4) */ + /* LOGCOLORSPACEA */ TEST_TYPE_SIZE (LOGCOLORSPACEA, 328) TEST_TYPE_ALIGN (LOGCOLORSPACEA, 4) TEST_FIELD_SIZE (LOGCOLORSPACEA, lcsSignature, 4) @@ -3396,7 +9916,7 @@ static void test_pack_LOGCOLORSPACEA(void) static void test_pack_LOGCOLORSPACEW(void) { - /* LOGCOLORSPACEW (pack 4) */ + /* LOGCOLORSPACEW */ TEST_TYPE_SIZE (LOGCOLORSPACEW, 588) TEST_TYPE_ALIGN (LOGCOLORSPACEW, 4) TEST_FIELD_SIZE (LOGCOLORSPACEW, lcsSignature, 4) @@ -3433,7 +9953,7 @@ static void test_pack_LOGCOLORSPACEW(void) static void test_pack_LOGFONTA(void) { - /* LOGFONTA (pack 4) */ + /* LOGFONTA */ TEST_TYPE_SIZE (LOGFONTA, 60) TEST_TYPE_ALIGN (LOGFONTA, 4) TEST_FIELD_SIZE (LOGFONTA, lfHeight, 4) @@ -3482,7 +10002,7 @@ static void test_pack_LOGFONTA(void) static void test_pack_LOGFONTW(void) { - /* LOGFONTW (pack 4) */ + /* LOGFONTW */ TEST_TYPE_SIZE (LOGFONTW, 92) TEST_TYPE_ALIGN (LOGFONTW, 4) TEST_FIELD_SIZE (LOGFONTW, lfHeight, 4) @@ -3531,7 +10051,7 @@ static void test_pack_LOGFONTW(void) static void test_pack_LOGPEN(void) { - /* LOGPEN (pack 4) */ + /* LOGPEN */ TEST_TYPE_SIZE (LOGPEN, 16) TEST_TYPE_ALIGN (LOGPEN, 4) TEST_FIELD_SIZE (LOGPEN, lopnStyle, 4) @@ -4164,7 +10684,7 @@ static void test_pack_LPXFORM(void) static void test_pack_MAT2(void) { - /* MAT2 (pack 4) */ + /* MAT2 */ TEST_TYPE_SIZE (MAT2, 16) TEST_TYPE_ALIGN (MAT2, 2) TEST_FIELD_SIZE (MAT2, eM11, 4) @@ -4183,7 +10703,7 @@ static void test_pack_MAT2(void) static void test_pack_METAFILEPICT(void) { - /* METAFILEPICT (pack 4) */ + /* METAFILEPICT */ TEST_TYPE_SIZE (METAFILEPICT, 16) TEST_TYPE_ALIGN (METAFILEPICT, 4) TEST_FIELD_SIZE (METAFILEPICT, mm, 4) @@ -4230,7 +10750,7 @@ static void test_pack_METAHEADER(void) static void test_pack_METARECORD(void) { - /* METARECORD (pack 4) */ + /* METARECORD */ TEST_TYPE_SIZE (METARECORD, 8) TEST_TYPE_ALIGN (METARECORD, 4) TEST_FIELD_SIZE (METARECORD, rdSize, 4) @@ -4253,7 +10773,7 @@ static void test_pack_MFENUMPROC(void) static void test_pack_NEWTEXTMETRICA(void) { - /* NEWTEXTMETRICA (pack 4) */ + /* NEWTEXTMETRICA */ TEST_TYPE_SIZE (NEWTEXTMETRICA, 72) TEST_TYPE_ALIGN (NEWTEXTMETRICA, 4) TEST_FIELD_SIZE (NEWTEXTMETRICA, tmHeight, 4) @@ -4332,7 +10852,7 @@ static void test_pack_NEWTEXTMETRICA(void) static void test_pack_NEWTEXTMETRICEXA(void) { - /* NEWTEXTMETRICEXA (pack 4) */ + /* NEWTEXTMETRICEXA */ TEST_TYPE_SIZE (NEWTEXTMETRICEXA, 96) TEST_TYPE_ALIGN (NEWTEXTMETRICEXA, 4) TEST_FIELD_SIZE (NEWTEXTMETRICEXA, ntmTm, 72) @@ -4345,7 +10865,7 @@ static void test_pack_NEWTEXTMETRICEXA(void) static void test_pack_NEWTEXTMETRICEXW(void) { - /* NEWTEXTMETRICEXW (pack 4) */ + /* NEWTEXTMETRICEXW */ TEST_TYPE_SIZE (NEWTEXTMETRICEXW, 100) TEST_TYPE_ALIGN (NEWTEXTMETRICEXW, 4) TEST_FIELD_SIZE (NEWTEXTMETRICEXW, ntmTm, 76) @@ -4358,7 +10878,7 @@ static void test_pack_NEWTEXTMETRICEXW(void) static void test_pack_NEWTEXTMETRICW(void) { - /* NEWTEXTMETRICW (pack 4) */ + /* NEWTEXTMETRICW */ TEST_TYPE_SIZE (NEWTEXTMETRICW, 76) TEST_TYPE_ALIGN (NEWTEXTMETRICW, 4) TEST_FIELD_SIZE (NEWTEXTMETRICW, tmHeight, 4) @@ -4467,7 +10987,7 @@ static void test_pack_OLDFONTENUMPROCW(void) static void test_pack_OUTLINETEXTMETRICA(void) { - /* OUTLINETEXTMETRICA (pack 4) */ + /* OUTLINETEXTMETRICA */ TEST_TYPE_SIZE (OUTLINETEXTMETRICA, 212) TEST_TYPE_ALIGN (OUTLINETEXTMETRICA, 4) TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmSize, 4) @@ -4570,7 +11090,7 @@ static void test_pack_OUTLINETEXTMETRICA(void) static void test_pack_OUTLINETEXTMETRICW(void) { - /* OUTLINETEXTMETRICW (pack 4) */ + /* OUTLINETEXTMETRICW */ TEST_TYPE_SIZE (OUTLINETEXTMETRICW, 216) TEST_TYPE_ALIGN (OUTLINETEXTMETRICW, 4) TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmSize, 4) @@ -4691,7 +11211,7 @@ static void test_pack_PABCFLOAT(void) static void test_pack_PANOSE(void) { - /* PANOSE (pack 4) */ + /* PANOSE */ TEST_TYPE_SIZE (PANOSE, 10) TEST_TYPE_ALIGN (PANOSE, 1) TEST_FIELD_SIZE (PANOSE, bFamilyType, 1) @@ -4875,7 +11395,7 @@ static void test_pack_PDISPLAY_DEVICEW(void) static void test_pack_PELARRAY(void) { - /* PELARRAY (pack 4) */ + /* PELARRAY */ TEST_TYPE_SIZE (PELARRAY, 20) TEST_TYPE_ALIGN (PELARRAY, 4) TEST_FIELD_SIZE (PELARRAY, paXCount, 4) @@ -5950,7 +12470,7 @@ static void test_pack_PHANDLETABLE(void) static void test_pack_PIXELFORMATDESCRIPTOR(void) { - /* PIXELFORMATDESCRIPTOR (pack 4) */ + /* PIXELFORMATDESCRIPTOR */ TEST_TYPE_SIZE (PIXELFORMATDESCRIPTOR, 40) TEST_TYPE_ALIGN (PIXELFORMATDESCRIPTOR, 4) TEST_FIELD_SIZE (PIXELFORMATDESCRIPTOR, nSize, 2) @@ -6116,7 +12636,7 @@ static void test_pack_PNEWTEXTMETRICW(void) static void test_pack_POINTFLOAT(void) { - /* POINTFLOAT (pack 4) */ + /* POINTFLOAT */ TEST_TYPE_SIZE (POINTFLOAT, 8) TEST_TYPE_ALIGN (POINTFLOAT, 4) TEST_FIELD_SIZE (POINTFLOAT, x, 4) @@ -6129,7 +12649,7 @@ static void test_pack_POINTFLOAT(void) static void test_pack_POINTFX(void) { - /* POINTFX (pack 4) */ + /* POINTFX */ TEST_TYPE_SIZE (POINTFX, 8) TEST_TYPE_ALIGN (POINTFX, 2) TEST_FIELD_SIZE (POINTFX, x, 4) @@ -6142,7 +12662,7 @@ static void test_pack_POINTFX(void) static void test_pack_POLYTEXTA(void) { - /* POLYTEXTA (pack 4) */ + /* POLYTEXTA */ TEST_TYPE_SIZE (POLYTEXTA, 40) TEST_TYPE_ALIGN (POLYTEXTA, 4) TEST_FIELD_SIZE (POLYTEXTA, x, 4) @@ -6170,7 +12690,7 @@ static void test_pack_POLYTEXTA(void) static void test_pack_POLYTEXTW(void) { - /* POLYTEXTW (pack 4) */ + /* POLYTEXTW */ TEST_TYPE_SIZE (POLYTEXTW, 40) TEST_TYPE_ALIGN (POLYTEXTW, 4) TEST_FIELD_SIZE (POLYTEXTW, x, 4) @@ -6315,7 +12835,7 @@ static void test_pack_PXFORM(void) static void test_pack_RASTERIZER_STATUS(void) { - /* RASTERIZER_STATUS (pack 4) */ + /* RASTERIZER_STATUS */ TEST_TYPE_SIZE (RASTERIZER_STATUS, 6) TEST_TYPE_ALIGN (RASTERIZER_STATUS, 2) TEST_FIELD_SIZE (RASTERIZER_STATUS, nSize, 2) @@ -6331,7 +12851,7 @@ static void test_pack_RASTERIZER_STATUS(void) static void test_pack_RGBQUAD(void) { - /* RGBQUAD (pack 4) */ + /* RGBQUAD */ TEST_TYPE_SIZE (RGBQUAD, 4) TEST_TYPE_ALIGN (RGBQUAD, 1) TEST_FIELD_SIZE (RGBQUAD, rgbBlue, 1) @@ -6350,7 +12870,7 @@ static void test_pack_RGBQUAD(void) static void test_pack_RGBTRIPLE(void) { - /* RGBTRIPLE (pack 4) */ + /* RGBTRIPLE */ TEST_TYPE_SIZE (RGBTRIPLE, 3) TEST_TYPE_ALIGN (RGBTRIPLE, 1) TEST_FIELD_SIZE (RGBTRIPLE, rgbtBlue, 1) @@ -6366,7 +12886,7 @@ static void test_pack_RGBTRIPLE(void) static void test_pack_RGNDATA(void) { - /* RGNDATA (pack 4) */ + /* RGNDATA */ TEST_TYPE_SIZE (RGNDATA, 36) TEST_TYPE_ALIGN (RGNDATA, 4) TEST_FIELD_SIZE (RGNDATA, rdh, 32) @@ -6379,7 +12899,7 @@ static void test_pack_RGNDATA(void) static void test_pack_RGNDATAHEADER(void) { - /* RGNDATAHEADER (pack 4) */ + /* RGNDATAHEADER */ TEST_TYPE_SIZE (RGNDATAHEADER, 32) TEST_TYPE_ALIGN (RGNDATAHEADER, 4) TEST_FIELD_SIZE (RGNDATAHEADER, dwSize, 4) @@ -6401,7 +12921,7 @@ static void test_pack_RGNDATAHEADER(void) static void test_pack_TEXTMETRICA(void) { - /* TEXTMETRICA (pack 4) */ + /* TEXTMETRICA */ TEST_TYPE_SIZE (TEXTMETRICA, 56) TEST_TYPE_ALIGN (TEXTMETRICA, 4) TEST_FIELD_SIZE (TEXTMETRICA, tmHeight, 4) @@ -6468,7 +12988,7 @@ static void test_pack_TEXTMETRICA(void) static void test_pack_TEXTMETRICW(void) { - /* TEXTMETRICW (pack 4) */ + /* TEXTMETRICW */ TEST_TYPE_SIZE (TEXTMETRICW, 60) TEST_TYPE_ALIGN (TEXTMETRICW, 4) TEST_FIELD_SIZE (TEXTMETRICW, tmHeight, 4) @@ -6535,7 +13055,7 @@ static void test_pack_TEXTMETRICW(void) static void test_pack_TRIVERTEX(void) { - /* TRIVERTEX (pack 4) */ + /* TRIVERTEX */ TEST_TYPE_SIZE (TRIVERTEX, 16) TEST_TYPE_ALIGN (TRIVERTEX, 4) TEST_FIELD_SIZE (TRIVERTEX, x, 4) @@ -6560,7 +13080,7 @@ static void test_pack_TRIVERTEX(void) static void test_pack_TTPOLYCURVE(void) { - /* TTPOLYCURVE (pack 4) */ + /* TTPOLYCURVE */ TEST_TYPE_SIZE (TTPOLYCURVE, 12) TEST_TYPE_ALIGN (TTPOLYCURVE, 2) TEST_FIELD_SIZE (TTPOLYCURVE, wType, 2) @@ -6576,7 +13096,7 @@ static void test_pack_TTPOLYCURVE(void) static void test_pack_TTPOLYGONHEADER(void) { - /* TTPOLYGONHEADER (pack 4) */ + /* TTPOLYGONHEADER */ TEST_TYPE_SIZE (TTPOLYGONHEADER, 16) TEST_TYPE_ALIGN (TTPOLYGONHEADER, 4) TEST_FIELD_SIZE (TTPOLYGONHEADER, cb, 4) @@ -6592,7 +13112,7 @@ static void test_pack_TTPOLYGONHEADER(void) static void test_pack_XFORM(void) { - /* XFORM (pack 4) */ + /* XFORM */ TEST_TYPE_SIZE (XFORM, 24) TEST_TYPE_ALIGN (XFORM, 4) TEST_FIELD_SIZE (XFORM, eM11, 4) @@ -6615,6 +13135,8 @@ static void test_pack_XFORM(void) TEST_FIELD_OFFSET(XFORM, eDy, 20) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_ABC(); @@ -7049,9 +13571,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/gdi32/metafile.c b/rostests/winetests/gdi32/metafile.c index 792e64708fc..9ce3ece13dc 100755 --- a/rostests/winetests/gdi32/metafile.c +++ b/rostests/winetests/gdi32/metafile.c @@ -1427,11 +1427,10 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits, const ENHMETARECORD *emr1 = (const ENHMETARECORD *)(bits + offset1); const ENHMETARECORD *emr2 = (const ENHMETARECORD *)(buf + offset2); - skip("skipping match_emf_record(), bug 5392\n"); -// trace("%s: EMF record %u, size %u/record %u, size %u\n", -// desc, emr1->iType, emr1->nSize, emr2->iType, emr2->nSize); + trace("%s: EMF record %u, size %u/record %u, size %u\n", + desc, emr1->iType, emr1->nSize, emr2->iType, emr2->nSize); -// if (!match_emf_record(emr1, emr2, desc, ignore_scaling)) return -1; + if (!match_emf_record(emr1, emr2, desc, ignore_scaling)) return -1; /* We have already bailed out if iType or nSize don't match */ offset1 += emr1->nSize; diff --git a/rostests/winetests/gdi32/path.c b/rostests/winetests/gdi32/path.c index 4a8ea6d4743..9fe6f43e912 100644 --- a/rostests/winetests/gdi32/path.c +++ b/rostests/winetests/gdi32/path.c @@ -37,13 +37,12 @@ static void test_widenpath(void) { HDC hdc = GetDC(0); HPEN greenPen, narrowPen; - HPEN oldPen; POINT pnt[6]; INT nSize, ret; /* Create a pen to be used in WidenPath */ greenPen = CreatePen(PS_SOLID, 10, RGB(0,0,0)); - oldPen = SelectObject(hdc, greenPen); + SelectObject(hdc, greenPen); /* Prepare a path */ pnt[0].x = 100; @@ -85,7 +84,7 @@ static void test_widenpath(void) /* Test when the pen width is equal to 1. The path should change too */ narrowPen = CreatePen(PS_SOLID, 1, RGB(0,0,0)); - oldPen = SelectObject(hdc, narrowPen); + SelectObject(hdc, narrowPen); BeginPath(hdc); Polyline(hdc, pnt, 6); EndPath(hdc); @@ -260,9 +259,9 @@ static const path_test_t anglearc_path[] = { {245, 200, PT_BEZIERTO, 0, 0}, /* 5 */ {200, 245, PT_BEZIERTO, 0, 0}, /* 6 */ {200, 300, PT_BEZIERTO, 0, 0}, /* 7 */ - {200, 300, PT_BEZIERTO, 0, 2}, /* 8 */ - {200, 300, PT_BEZIERTO, 0, 2}, /* 9 */ - {200, 300, PT_BEZIERTO, 0, 2}, /* 10 */ + {200, 300, PT_BEZIERTO, 0, 0}, /* 8 */ + {200, 300, PT_BEZIERTO, 0, 0}, /* 9 */ + {200, 300, PT_BEZIERTO, 0, 0}, /* 10 */ {231, 260, PT_LINETO, 0, 0}, /* 11 */ {245, 235, PT_BEZIERTO, 0, 0}, /* 12 */ {271, 220, PT_BEZIERTO, 0, 0}, /* 13 */ @@ -289,7 +288,7 @@ static void test_anglearc(void) CloseFigure(hdc); EndPath(hdc); - ok_path(hdc, "anglearc_path", anglearc_path, sizeof(anglearc_path)/sizeof(path_test_t), 1); + ok_path(hdc, "anglearc_path", anglearc_path, sizeof(anglearc_path)/sizeof(path_test_t), 0); done: ReleaseDC(0, hdc); } @@ -393,7 +392,6 @@ done: } static void test_closefigure(void) { - BOOL retb; int nSize, nSizeWitness; HDC hdc = GetDC(0); @@ -402,7 +400,7 @@ static void test_closefigure(void) { LineTo(hdc, 95, 0); LineTo(hdc, 0, 95); - retb = CloseFigure(hdc); + CloseFigure(hdc); EndPath(hdc); nSize = GetPath(hdc, NULL, NULL, 0); diff --git a/rostests/winetests/gdiplus/graphics.c b/rostests/winetests/gdiplus/graphics.c index 91e95bf1940..57ce638093c 100644 --- a/rostests/winetests/gdiplus/graphics.c +++ b/rostests/winetests/gdiplus/graphics.c @@ -2353,8 +2353,7 @@ static void test_GdipGetNearestColor(void) expect(Ok, status); expect(0xdeadbeef, color); GdipDeleteGraphics(graphics); - skip("skipping GdipDisposeImage, see bug 5395\n"); - //GdipDisposeImage((GpImage*)bitmap); + GdipDisposeImage((GpImage*)bitmap); status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppARGB, NULL, &bitmap); expect(Ok, status); @@ -2364,8 +2363,7 @@ static void test_GdipGetNearestColor(void) expect(Ok, status); expect(0xdeadbeef, color); GdipDeleteGraphics(graphics); - skip("skipping GdipDisposeImage, see bug 5395\n"); - //GdipDisposeImage((GpImage*)bitmap); + GdipDisposeImage((GpImage*)bitmap); status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppPARGB, NULL, &bitmap); expect(Ok, status); @@ -2375,8 +2373,7 @@ static void test_GdipGetNearestColor(void) expect(Ok, status); expect(0xdeadbeef, color); GdipDeleteGraphics(graphics); - skip("skipping GdipDisposeImage, see bug 5395\n"); - //GdipDisposeImage((GpImage*)bitmap); + GdipDisposeImage((GpImage*)bitmap); status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat16bppRGB565, NULL, &bitmap); expect(Ok, status); diff --git a/rostests/winetests/gdiplus/graphicspath.c b/rostests/winetests/gdiplus/graphicspath.c index 5f4a92eb719..2343e9cf7a8 100644 --- a/rostests/winetests/gdiplus/graphicspath.c +++ b/rostests/winetests/gdiplus/graphicspath.c @@ -560,12 +560,6 @@ static void test_linei(void) { GpStatus status; GpPath *path; - GpPointF points[2]; - - points[0].X = 7.0; - points[0].Y = 11.0; - points[1].X = 13.0; - points[1].Y = 17.0; GdipCreatePath(FillModeAlternate, &path); status = GdipAddPathLineI(path, 5.0, 5.0, 6.0, 8.0); diff --git a/rostests/winetests/gdiplus/image.c b/rostests/winetests/gdiplus/image.c index 74e6ee1db23..0e33049a5b7 100644 --- a/rostests/winetests/gdiplus/image.c +++ b/rostests/winetests/gdiplus/image.c @@ -158,6 +158,117 @@ static void test_Scan0(void) ok( !bm, "expected null bitmap\n" ); } +static void test_FromGdiDib(void) +{ + GpBitmap *bm; + GpStatus stat; + BYTE buff[400]; + BYTE rbmi[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)]; + BITMAPINFO *bmi = (BITMAPINFO*)rbmi; + PixelFormat format; + + bm = NULL; + + memset(rbmi, 0, sizeof(rbmi)); + + bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi->bmiHeader.biWidth = 10; + bmi->bmiHeader.biHeight = 10; + bmi->bmiHeader.biPlanes = 1; + bmi->bmiHeader.biBitCount = 32; + bmi->bmiHeader.biCompression = BI_RGB; + + stat = GdipCreateBitmapFromGdiDib(NULL, buff, &bm); + expect(InvalidParameter, stat); + + stat = GdipCreateBitmapFromGdiDib(bmi, NULL, &bm); + expect(InvalidParameter, stat); + + stat = GdipCreateBitmapFromGdiDib(bmi, buff, NULL); + expect(InvalidParameter, stat); + + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(Ok, stat); + ok(NULL != bm, "Expected bitmap to be initialized\n"); + if (stat == Ok) + { + stat = GdipGetImagePixelFormat((GpImage*)bm, &format); + expect(Ok, stat); + expect(PixelFormat32bppRGB, format); + + GdipDisposeImage((GpImage*)bm); + } + + bmi->bmiHeader.biBitCount = 24; + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(Ok, stat); + ok(NULL != bm, "Expected bitmap to be initialized\n"); + if (stat == Ok) + { + stat = GdipGetImagePixelFormat((GpImage*)bm, &format); + expect(Ok, stat); + expect(PixelFormat24bppRGB, format); + + GdipDisposeImage((GpImage*)bm); + } + + bmi->bmiHeader.biBitCount = 16; + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(Ok, stat); + ok(NULL != bm, "Expected bitmap to be initialized\n"); + if (stat == Ok) + { + stat = GdipGetImagePixelFormat((GpImage*)bm, &format); + expect(Ok, stat); + expect(PixelFormat16bppRGB555, format); + + GdipDisposeImage((GpImage*)bm); + } + + bmi->bmiHeader.biBitCount = 8; + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(Ok, stat); + ok(NULL != bm, "Expected bitmap to be initialized\n"); + if (stat == Ok) + { + stat = GdipGetImagePixelFormat((GpImage*)bm, &format); + expect(Ok, stat); + expect(PixelFormat8bppIndexed, format); + + GdipDisposeImage((GpImage*)bm); + } + + bmi->bmiHeader.biBitCount = 4; + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(Ok, stat); + ok(NULL != bm, "Expected bitmap to be initialized\n"); + if (stat == Ok) + { + stat = GdipGetImagePixelFormat((GpImage*)bm, &format); + expect(Ok, stat); + expect(PixelFormat4bppIndexed, format); + + GdipDisposeImage((GpImage*)bm); + } + + bmi->bmiHeader.biBitCount = 1; + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(Ok, stat); + ok(NULL != bm, "Expected bitmap to be initialized\n"); + if (stat == Ok) + { + stat = GdipGetImagePixelFormat((GpImage*)bm, &format); + expect(Ok, stat); + expect(PixelFormat1bppIndexed, format); + + GdipDisposeImage((GpImage*)bm); + } + + bmi->bmiHeader.biBitCount = 0; + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(InvalidParameter, stat); +} + static void test_GetImageDimension(void) { GpBitmap *bm; @@ -1101,6 +1212,78 @@ static void test_createhbitmap(void) expect(Ok, stat); } +static void test_getthumbnail(void) +{ + GpStatus stat; + GpImage *bitmap1, *bitmap2; + UINT width, height; + + stat = GdipGetImageThumbnail(NULL, 0, 0, &bitmap2, NULL, NULL); + expect(InvalidParameter, stat); + + stat = GdipCreateBitmapFromScan0(128, 128, 0, PixelFormat32bppRGB, NULL, (GpBitmap**)&bitmap1); + expect(Ok, stat); + + stat = GdipGetImageThumbnail(bitmap1, 0, 0, NULL, NULL, NULL); + expect(InvalidParameter, stat); + + stat = GdipGetImageThumbnail(bitmap1, 0, 0, &bitmap2, NULL, NULL); + expect(Ok, stat); + + if (stat == Ok) + { + stat = GdipGetImageWidth(bitmap2, &width); + expect(Ok, stat); + expect(120, width); + + stat = GdipGetImageHeight(bitmap2, &height); + expect(Ok, stat); + expect(120, height); + + GdipDisposeImage(bitmap2); + } + + GdipDisposeImage(bitmap1); + + + stat = GdipCreateBitmapFromScan0(64, 128, 0, PixelFormat32bppRGB, NULL, (GpBitmap**)&bitmap1); + expect(Ok, stat); + + stat = GdipGetImageThumbnail(bitmap1, 32, 32, &bitmap2, NULL, NULL); + expect(Ok, stat); + + if (stat == Ok) + { + stat = GdipGetImageWidth(bitmap2, &width); + expect(Ok, stat); + expect(32, width); + + stat = GdipGetImageHeight(bitmap2, &height); + expect(Ok, stat); + expect(32, height); + + GdipDisposeImage(bitmap2); + } + + stat = GdipGetImageThumbnail(bitmap1, 0, 0, &bitmap2, NULL, NULL); + expect(Ok, stat); + + if (stat == Ok) + { + stat = GdipGetImageWidth(bitmap2, &width); + expect(Ok, stat); + expect(120, width); + + stat = GdipGetImageHeight(bitmap2, &height); + expect(Ok, stat); + expect(120, height); + + GdipDisposeImage(bitmap2); + } + + GdipDisposeImage(bitmap1); +} + static void test_getsetpixel(void) { GpStatus stat; @@ -1888,6 +2071,76 @@ static void test_remaptable(void) GdipFree(map); } +static void test_colorkey(void) +{ + GpStatus stat; + GpImageAttributes *imageattr; + GpBitmap *bitmap1, *bitmap2; + GpGraphics *graphics; + ARGB color; + + stat = GdipSetImageAttributesColorKeys(NULL, ColorAdjustTypeDefault, TRUE, 0xff405060, 0xff708090); + expect(InvalidParameter, stat); + + stat = GdipCreateImageAttributes(&imageattr); + expect(Ok, stat); + + stat = GdipSetImageAttributesColorKeys(imageattr, ColorAdjustTypeCount, TRUE, 0xff405060, 0xff708090); + expect(InvalidParameter, stat); + + stat = GdipSetImageAttributesColorKeys(imageattr, ColorAdjustTypeAny, TRUE, 0xff405060, 0xff708090); + expect(InvalidParameter, stat); + + stat = GdipSetImageAttributesColorKeys(imageattr, ColorAdjustTypeDefault, TRUE, 0xff405060, 0xff708090); + expect(Ok, stat); + + stat = GdipCreateBitmapFromScan0(2, 2, 0, PixelFormat32bppARGB, NULL, &bitmap1); + expect(Ok, stat); + + stat = GdipCreateBitmapFromScan0(2, 2, 0, PixelFormat32bppARGB, NULL, &bitmap2); + expect(Ok, stat); + + stat = GdipBitmapSetPixel(bitmap1, 0, 0, 0x20405060); + expect(Ok, stat); + + stat = GdipBitmapSetPixel(bitmap1, 0, 1, 0x40506070); + expect(Ok, stat); + + stat = GdipBitmapSetPixel(bitmap1, 1, 0, 0x60708090); + expect(Ok, stat); + + stat = GdipBitmapSetPixel(bitmap1, 1, 1, 0xffffffff); + expect(Ok, stat); + + stat = GdipGetImageGraphicsContext((GpImage*)bitmap2, &graphics); + expect(Ok, stat); + + stat = GdipDrawImageRectRectI(graphics, (GpImage*)bitmap1, 0,0,2,2, 0,0,2,2, + UnitPixel, imageattr, NULL, NULL); + expect(Ok, stat); + + stat = GdipBitmapGetPixel(bitmap2, 0, 0, &color); + expect(Ok, stat); + ok(color_match(0x00000000, color, 1), "Expected ffff00ff, got %.8x\n", color); + + stat = GdipBitmapGetPixel(bitmap2, 0, 1, &color); + expect(Ok, stat); + ok(color_match(0x00000000, color, 1), "Expected ffff00ff, got %.8x\n", color); + + stat = GdipBitmapGetPixel(bitmap2, 1, 0, &color); + expect(Ok, stat); + ok(color_match(0x00000000, color, 1), "Expected ffff00ff, got %.8x\n", color); + + stat = GdipBitmapGetPixel(bitmap2, 1, 1, &color); + expect(Ok, stat); + ok(color_match(0xffffffff, color, 1), "Expected ffff00ff, got %.8x\n", color); + + GdipDeleteGraphics(graphics); + GdipDisposeImage((GpImage*)bitmap1); + GdipDisposeImage((GpImage*)bitmap2); + GdipDisposeImageAttributes(imageattr); +} + START_TEST(image) { struct GdiplusStartupInput gdiplusStartupInput; @@ -1901,6 +2154,7 @@ START_TEST(image) GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); test_Scan0(); + test_FromGdiDib(); test_GetImageDimension(); test_GdipImageGetFrameDimensionsCount(); test_LoadingImages(); @@ -1917,6 +2171,7 @@ START_TEST(image) test_createfromwmf(); test_resolution(); test_createhbitmap(); + test_getthumbnail(); test_getsetpixel(); test_palette(); test_colormatrix(); @@ -1924,6 +2179,7 @@ START_TEST(image) test_multiframegif(); test_rotateflip(); test_remaptable(); + test_colorkey(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/hlink/browse_ctx.c b/rostests/winetests/hlink/browse_ctx.c index a9b26e72fb7..e25333d849c 100644 --- a/rostests/winetests/hlink/browse_ctx.c +++ b/rostests/winetests/hlink/browse_ctx.c @@ -80,11 +80,58 @@ static void test_SetInitialHlink(void) IMoniker_Release(dummy); } +static void test_BrowseWindowInfo(void) +{ + IHlinkBrowseContext *bc; + HLBWINFO bwinfo_set, bwinfo_get; + HRESULT hres; + + hres = HlinkCreateBrowseContext(NULL, &IID_IHlinkBrowseContext, (void**)&bc); + ok(hres == S_OK, "HlinkCreateBrowseContext failed: 0x%08x\n", hres); + + hres = IHlinkBrowseContext_GetBrowseWindowInfo(bc, NULL); + ok(hres == E_INVALIDARG, "GetBrowseWindow failed with wrong code: 0x%08x\n", hres); + + hres = IHlinkBrowseContext_SetBrowseWindowInfo(bc, NULL); + ok(hres == E_INVALIDARG, "SetBrowseWindow failed with wrong code: 0x%08x\n", hres); + + memset(&bwinfo_get, -1, sizeof(HLBWINFO)); + + hres = IHlinkBrowseContext_GetBrowseWindowInfo(bc, &bwinfo_get); + ok(hres == S_OK, "GetBrowseWindowInfo failed: 0x%08x\n", hres); + ok(bwinfo_get.cbSize == 0, "Got wrong size: %x\n", bwinfo_get.cbSize); + + bwinfo_set.cbSize = sizeof(HLBWINFO); + bwinfo_set.grfHLBWIF = HLBWIF_WEBTOOLBARHIDDEN; + bwinfo_set.rcFramePos.left = 1; + bwinfo_set.rcFramePos.right = 2; + bwinfo_set.rcFramePos.top = 3; + bwinfo_set.rcFramePos.bottom = 4; + bwinfo_set.rcDocPos.left = 5; + bwinfo_set.rcDocPos.right = 6; + bwinfo_set.rcDocPos.top = 7; + bwinfo_set.rcDocPos.bottom = 8; + bwinfo_set.hltbinfo.uDockType = 4321; + bwinfo_set.hltbinfo.rcTbPos.left = 9; + bwinfo_set.hltbinfo.rcTbPos.right = 10; + bwinfo_set.hltbinfo.rcTbPos.top = 11; + bwinfo_set.hltbinfo.rcTbPos.bottom = 12; + hres = IHlinkBrowseContext_SetBrowseWindowInfo(bc, &bwinfo_set); + ok(hres == S_OK, "SetBrowseWindowInfo failed: 0x%08x\n", hres); + + memset(&bwinfo_get, 0, sizeof(HLBWINFO)); + + hres = IHlinkBrowseContext_GetBrowseWindowInfo(bc, &bwinfo_get); + ok(hres == S_OK, "GetBrowseWindowInfo failed: 0x%08x\n", hres); + ok(!memcmp(&bwinfo_set, &bwinfo_get, sizeof(HLBWINFO)), "Set and Get differ\n"); +} + START_TEST(browse_ctx) { CoInitialize(NULL); test_SetInitialHlink(); + test_BrowseWindowInfo(); CoUninitialize(); } diff --git a/rostests/winetests/hlink/hlink.c b/rostests/winetests/hlink/hlink.c index 30b06f093b3..cf031f5c9c7 100644 --- a/rostests/winetests/hlink/hlink.c +++ b/rostests/winetests/hlink/hlink.c @@ -1093,7 +1093,8 @@ static void test_HlinkGetSetMonikerReference(void) /* invalid HLINKSETF flags */ hres = IHlink_SetMonikerReference(hlink, 12, dummy2, two); - ok(hres == 12, "IHlink_SetMonikerReference should've failed with 0x%08x, failed with 0x%08x\n", 12, hres); + /* Windows returns garbage; on 32-bit it returns the flags probably because the compiler happened to store them in %eax at some point */ + if (0) ok(hres == 12, "IHlink_SetMonikerReference should've failed with 0x%08x, failed with 0x%08x\n", 12, hres); hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc); ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt); @@ -1244,10 +1245,11 @@ static void test_HlinkGetSetStringReference(void) CoTaskMemFree(fnd_loc); hres = IHlink_SetStringReference(link, 4, NULL, NULL); - ok(hres == 4, "IHlink_SetStringReference should have failed with 0x4, instead: 0x%08x\n", hres); + /* Windows returns garbage; on 32-bit it returns the flags probably because the compiler happened to store them in %eax at some point */ + if (0) ok(hres == 4, "IHlink_SetStringReference should have failed with 0x4, instead: 0x%08x\n", hres); hres = IHlink_SetStringReference(link, -4, NULL, NULL); - ok(hres == -4, "IHlink_SetStringReference should have failed with 0xFFFFFFFC, instead: 0x%08x\n", hres); + if (0) ok(hres == -4, "IHlink_SetStringReference should have failed with 0xFFFFFFFC, instead: 0x%08x\n", hres); IHlink_Release(link); } @@ -1272,12 +1274,12 @@ static void r_getStringRef(unsigned line, IHlink *hlink, const WCHAR *exp_tgt, c if(exp_tgt) ok_(__FILE__,line) (!lstrcmpW(fnd_tgt, exp_tgt), "Found string target should have been %s, was: %s\n", wine_dbgstr_w(exp_tgt), wine_dbgstr_w(fnd_tgt)); else - ok_(__FILE__,line) (exp_tgt == NULL, "Found string target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt)); + ok_(__FILE__,line) (fnd_tgt == NULL, "Found string target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt)); if(exp_loc) ok_(__FILE__,line) (!lstrcmpW(fnd_loc, exp_loc), "Found string location should have been %s, was: %s\n", wine_dbgstr_w(exp_loc), wine_dbgstr_w(fnd_loc)); else - ok_(__FILE__,line) (exp_loc == NULL, "Found string location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc)); + ok_(__FILE__,line) (fnd_loc == NULL, "Found string location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc)); CoTaskMemFree(fnd_tgt); CoTaskMemFree(fnd_loc); @@ -1305,7 +1307,7 @@ static IMoniker *r_getMonikerRef(unsigned line, IHlink *hlink, IMoniker *exp_tgt if(exp_loc) ok_(__FILE__,line) (!lstrcmpW(fnd_loc, exp_loc), "Found string location should have been %s, was: %s\n", wine_dbgstr_w(exp_loc), wine_dbgstr_w(fnd_loc)); else - ok_(__FILE__,line) (exp_loc == NULL, "Found string location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc)); + ok_(__FILE__,line) (fnd_loc == NULL, "Found string location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc)); CoTaskMemFree(fnd_loc); @@ -1363,6 +1365,83 @@ static void test_HlinkMoniker(void) IHlink_Release(hlink); } +static void test_HashLink(void) +{ + IHlink *hlink; + IMoniker *pmk; + const WCHAR hash_targetW[] = {'a','f','i','l','e','#','a','n','a','n','c','h','o','r',0}; + const WCHAR two_hash_targetW[] = {'a','f','i','l','e','#','a','n','a','n','c','h','o','r','#','a','n','o','t','h','e','r',0}; + const WCHAR hash_no_tgtW[] = {'#','a','n','a','n','c','h','o','r',0}; + const WCHAR tgt_partW[] = {'a','f','i','l','e',0}; + const WCHAR loc_partW[] = {'a','n','a','n','c','h','o','r',0}; + const WCHAR two_hash_loc_partW[] = {'a','n','a','n','c','h','o','r','#','a','n','o','t','h','e','r',0}; + const WCHAR test_locW[] = {'t','e','s','t','l','o','c',0}; + HRESULT hres; + + /* simple single hash test */ + hres = HlinkCreateFromString(hash_targetW, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (void*)&hlink); + ok(hres == S_OK, "HlinkCreateFromString failed: 0x%08x\n", hres); + ok(hlink != NULL, "Didn't get an hlink\n"); + + if(hlink){ + getStringRef(hlink, tgt_partW, loc_partW); + pmk = getMonikerRef(hlink, (IMoniker*)0xFFFFFFFF, loc_partW); + ok(pmk != NULL, "Found moniker should not be NULL\n"); + if(pmk) + IMoniker_Release(pmk); + + setStringRef(hlink, HLINKSETF_TARGET, hash_targetW, NULL); + getStringRef(hlink, hash_targetW, loc_partW); + + IHlink_Release(hlink); + } + + /* two hashes in the target */ + hres = HlinkCreateFromString(two_hash_targetW, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (void*)&hlink); + ok(hres == S_OK, "HlinkCreateFromString failed: 0x%08x\n", hres); + ok(hlink != NULL, "Didn't get an hlink\n"); + + if(hlink){ + getStringRef(hlink, tgt_partW, two_hash_loc_partW); + pmk = getMonikerRef(hlink, (IMoniker*)0xFFFFFFFF, two_hash_loc_partW); + ok(pmk != NULL, "Found moniker should not be NULL\n"); + if(pmk) + IMoniker_Release(pmk); + + IHlink_Release(hlink); + } + + /* target with hash plus a location string */ + hres = HlinkCreateFromString(hash_targetW, test_locW, NULL, NULL, 0, NULL, &IID_IHlink, (void*)&hlink); + ok(hres == S_OK, "HlinkCreateFromString failed: 0x%08x\n", hres); + ok(hlink != NULL, "Didn't get an hlink\n"); + + if(hlink){ + getStringRef(hlink, tgt_partW, test_locW); + pmk = getMonikerRef(hlink, (IMoniker*)0xFFFFFFFF, test_locW); + ok(pmk != NULL, "Found moniker should not be NULL\n"); + if(pmk) + IMoniker_Release(pmk); + + IHlink_Release(hlink); + } + + /* target with hash containing no "target part" */ + hres = HlinkCreateFromString(hash_no_tgtW, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (void*)&hlink); + ok(hres == S_OK, "HlinkCreateFromString failed: 0x%08x\n", hres); + ok(hlink != NULL, "Didn't get an hlink\n"); + + if(hlink){ + getStringRef(hlink, NULL, loc_partW); + pmk = getMonikerRef(hlink, (IMoniker*)0xFFFFFFFF, loc_partW); + ok(pmk == NULL, "Found moniker should be NULL\n"); + if(pmk) + IMoniker_Release(pmk); + + IHlink_Release(hlink); + } +} + START_TEST(hlink) { CoInitialize(NULL); @@ -1377,6 +1456,7 @@ START_TEST(hlink) test_HlinkGetSetMonikerReference(); test_HlinkGetSetStringReference(); test_HlinkMoniker(); + test_HashLink(); CoUninitialize(); } diff --git a/rostests/winetests/imm32/imm32.c b/rostests/winetests/imm32/imm32.c index 7e7f752d466..e35ef89a33c 100644 --- a/rostests/winetests/imm32/imm32.c +++ b/rostests/winetests/imm32/imm32.c @@ -26,6 +26,8 @@ #define NUMELEMS(array) (sizeof((array))/sizeof((array)[0])) +static BOOL (WINAPI *pImmAssociateContextEx)(HWND,HIMC,DWORD); + /* * msgspy - record and analyse message traces sent to a certain window */ @@ -90,7 +92,7 @@ static void msg_spy_flush_msgs(void) { } static CWPSTRUCT* msg_spy_find_msg(UINT message) { - int i; + UINT i; msg_spy_pump_msg_queue(); @@ -118,7 +120,7 @@ static void msg_spy_init(HWND hwnd) { msg_spy_flush_msgs(); } -static void msg_spy_cleanup() { +static void msg_spy_cleanup(void) { if (msg_spy.get_msg_hook) UnhookWindowsHookEx(msg_spy.get_msg_hook); if (msg_spy.call_wnd_proc_hook) @@ -133,9 +135,13 @@ static void msg_spy_cleanup() { static const char wndcls[] = "winetest_imm32_wndcls"; static HWND hwnd; -static int init(void) { +static BOOL init(void) { WNDCLASSEX wc; HIMC imc; + HMODULE hmod; + + hmod = GetModuleHandleA("imm32.dll"); + pImmAssociateContextEx = (void*)GetProcAddress(hmod, "ImmAssociateContextEx"); wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; @@ -151,19 +157,19 @@ static int init(void) { wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassExA(&wc)) - return 0; + return FALSE; hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, GetModuleHandle(0), NULL); if (!hwnd) - return 0; + return FALSE; imc = ImmGetContext(hwnd); if (!imc) { win_skip("IME support not implemented\n"); - return 0; + return FALSE; } ImmReleaseContext(hwnd, imc); @@ -172,7 +178,7 @@ static int init(void) { msg_spy_init(hwnd); - return 1; + return TRUE; } static void cleanup(void) { @@ -191,11 +197,10 @@ static void test_ImmNotifyIME(void) { imc = ImmGetContext(hwnd); msg_spy_flush_msgs(); - todo_wine - { - ok(!ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0), "Canceling an " - "empty composition string should fail.\n"); - } + ret = ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0); + ok(broken(!ret) || + ret, /* Vista+ */ + "Canceling an empty composition string should succeed.\n"); ok(!msg_spy_find_msg(WM_IME_COMPOSITION), "Windows does not post " "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " "the composition string being canceled is empty.\n"); @@ -210,15 +215,14 @@ static void test_ImmNotifyIME(void) { /* behavior differs between win9x and NT */ ret = ImmGetCompositionString(imc, GCS_COMPSTR, resstr, sizeof(resstr)); - ok(ret || !ret, "You'll never read this.\n"); + ok(!ret, "After being cancelled the composition string is empty.\n"); msg_spy_flush_msgs(); - todo_wine - { - ok(!ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0), "Canceling an " - "empty composition string should fail.\n"); - } + ret = ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0); + ok(broken(!ret) || + ret, /* Vista+ */ + "Canceling an empty composition string should succeed.\n"); ok(!msg_spy_find_msg(WM_IME_COMPOSITION), "Windows does not post " "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " "the composition string being canceled is empty.\n"); @@ -263,22 +267,24 @@ static void test_ImmSetCompositionString(void) return; ret = ImmSetCompositionStringW(imc, SCS_SETSTR, NULL, 0, NULL, 0); - todo_wine - ok(!ret, "ImmSetCompositionStringW() succeeded.\n"); + ok(broken(!ret) || + ret, /* Vista+ */ + "ImmSetCompositionStringW() failed.\n"); ret = ImmSetCompositionStringW(imc, SCS_SETSTR | SCS_CHANGEATTR, NULL, 0, NULL, 0); - todo_wine ok(!ret, "ImmSetCompositionStringW() succeeded.\n"); ret = ImmSetCompositionStringW(imc, SCS_SETSTR | SCS_CHANGECLAUSE, NULL, 0, NULL, 0); - todo_wine ok(!ret, "ImmSetCompositionStringW() succeeded.\n"); ret = ImmSetCompositionStringW(imc, SCS_CHANGEATTR | SCS_CHANGECLAUSE, NULL, 0, NULL, 0); - todo_wine + ok(!ret, "ImmSetCompositionStringW() succeeded.\n"); + + ret = ImmSetCompositionStringW(imc, SCS_SETSTR | SCS_CHANGEATTR | SCS_CHANGECLAUSE, + NULL, 0, NULL, 0); ok(!ret, "ImmSetCompositionStringW() succeeded.\n"); ImmReleaseContext(hwnd, imc); @@ -300,6 +306,45 @@ static void test_ImmIME(void) ImmReleaseContext(hwnd,imc); } +static void test_ImmAssociateContextEx(void) +{ + HIMC imc; + BOOL rc; + + if (!pImmAssociateContextEx) return; + + imc = ImmGetContext(hwnd); + if (imc) + { + HIMC retimc, newimc; + + newimc = ImmCreateContext(); + ok(newimc != imc, "handles should not be the same\n"); + rc = pImmAssociateContextEx(NULL, NULL, 0); + ok(!rc, "ImmAssociateContextEx succeeded\n"); + rc = pImmAssociateContextEx(hwnd, NULL, 0); + ok(rc, "ImmAssociateContextEx failed\n"); + rc = pImmAssociateContextEx(NULL, imc, 0); + ok(!rc, "ImmAssociateContextEx succeeded\n"); + + rc = pImmAssociateContextEx(hwnd, imc, 0); + ok(rc, "ImmAssociateContextEx failed\n"); + retimc = ImmGetContext(hwnd); + ok(retimc == imc, "handles should be the same\n"); + ImmReleaseContext(hwnd,retimc); + + rc = pImmAssociateContextEx(hwnd, newimc, 0); + ok(rc, "ImmAssociateContextEx failed\n"); + retimc = ImmGetContext(hwnd); + ok(retimc == newimc, "handles should be the same\n"); + ImmReleaseContext(hwnd,retimc); + + rc = pImmAssociateContextEx(hwnd, NULL, IACE_DEFAULT); + ok(rc, "ImmAssociateContextEx failed\n"); + } + ImmReleaseContext(hwnd,imc); +} + START_TEST(imm32) { if (init()) { @@ -307,6 +352,7 @@ START_TEST(imm32) { test_ImmGetCompositionString(); test_ImmSetCompositionString(); test_ImmIME(); + test_ImmAssociateContextEx(); } cleanup(); } diff --git a/rostests/winetests/jscript/api.js b/rostests/winetests/jscript/api.js index 2fba2520de5..2ccad3dacd7 100644 --- a/rostests/winetests/jscript/api.js +++ b/rostests/winetests/jscript/api.js @@ -2129,7 +2129,7 @@ ok(ActiveXObject.length == 1, "ActiveXObject.length = " + ActiveXObject.length); ok(Array.length == 1, "Array.length = " + Array.length); ok(Boolean.length == 1, "Boolean.length = " + Boolean.length); ok(CollectGarbage.length == 0, "CollectGarbage.length = " + CollectGarbage.length); -//ok(Date.length == 7, "Date.length = " + Date.length); +ok(Date.length == 7, "Date.length = " + Date.length); ok(Enumerator.length == 7, "Enumerator.length = " + Enumerator.length); ok(Error.length == 1, "Error.length = " + Error.length); ok(EvalError.length == 1, "EvalError.length = " + EvalError.length); @@ -2147,7 +2147,7 @@ ok(ScriptEngineMajorVersion.length == 0, "ScriptEngineMajorVersion.length = " + ScriptEngineMajorVersion.length); ok(ScriptEngineMinorVersion.length == 0, "ScriptEngineMinorVersion.length = " + ScriptEngineMinorVersion.length); -//ok(String.length == 1, "String.length = " + String.length); +ok(String.length == 1, "String.length = " + String.length); ok(SyntaxError.length == 1, "SyntaxError.length = " + SyntaxError.length); ok(TypeError.length == 1, "TypeError.length = " + TypeError.length); ok(URIError.length == 1, "URIError.length = " + URIError.length); @@ -2164,4 +2164,7 @@ ok(parseFloat.length == 1, "parseFloat.length = " + parseFloat.length); ok(parseInt.length == 2, "parseInt.length = " + parseInt.length); ok(unescape.length == 1, "unescape.length = " + unescape.length); +String.length = 3; +ok(String.length == 1, "String.length = " + String.length); + reportSuccess(); diff --git a/rostests/winetests/jscript/lang.js b/rostests/winetests/jscript/lang.js index 495762ee599..36a75f5b701 100644 --- a/rostests/winetests/jscript/lang.js +++ b/rostests/winetests/jscript/lang.js @@ -263,7 +263,9 @@ ok(tmp === 7, "2*3.5 !== 7"); ok(getVT(tmp) === "VT_I4", "getVT(2*3.5) !== VT_I4"); tmp = 2.5*3.5; -ok(tmp === 8.75, "2.5*3.5 !== 8.75"); +/* FIXME: the parser loses precision */ +/* ok(tmp === 8.75, "2.5*3.5 !== 8.75"); */ +ok(tmp > 8.749999 && tmp < 8.750001, "2.5*3.5 !== 8.75"); ok(getVT(tmp) === "VT_R8", "getVT(2.5*3.5) !== VT_R8"); tmp = 4/2; diff --git a/rostests/winetests/jscript/regexp.js b/rostests/winetests/jscript/regexp.js index 7b74cb11421..26919f9974b 100644 --- a/rostests/winetests/jscript/regexp.js +++ b/rostests/winetests/jscript/regexp.js @@ -19,6 +19,10 @@ var m, re, b, i, obj; +ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext); +RegExp.leftContext = "abc"; +ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext); + re = /a+/; ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex); @@ -28,6 +32,8 @@ ok(m.index === 1, "m.index = " + m.index); ok(m.input === " aabaaa", "m.input = " + m.input); ok(m.length === 1, "m.length = " + m.length); ok(m[0] === "aa", "m[0] = " + m[0]); +ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "baaa", "RegExp.rightContext = " + RegExp.rightContext); m = re.exec(" aabaaa"); ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex); @@ -35,6 +41,8 @@ ok(m.index === 1, "m.index = " + m.index); ok(m.input === " aabaaa", "m.input = " + m.input); ok(m.length === 1, "m.length = " + m.length); ok(m[0] === "aa", "m[0] = " + m[0]); +ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "baaa", "RegExp.rightContext = " + RegExp.rightContext); re = /a+/g; ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex); @@ -59,6 +67,9 @@ ok(m === null, "m is not null"); re.exec(" a"); ok(re.lastIndex === 16, "re.lastIndex = " + re.lastIndex); +ok(RegExp.leftContext === " ", + "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "", "RegExp.rightContext = " + RegExp.rightContext); m = re.exec(" a"); ok(m === null, "m is not null"); @@ -79,10 +90,14 @@ ok(m[2] === "", "m[2] = " + m[2]); b = re.test(" a "); ok(b === true, "re.test(' a ') returned " + b); ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex); +ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === " ", "RegExp.rightContext = " + RegExp.rightContext); b = re.test(" a "); ok(b === false, "re.test(' a ') returned " + b); ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex); +ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === " ", "RegExp.rightContext = " + RegExp.rightContext); re = /\[([^\[]+)\]/g; m = re.exec(" [test] "); @@ -95,6 +110,18 @@ ok(m[1] === "test", "m[1] = " + m[1]); b = /a*/.test(); ok(b === true, "/a*/.test() returned " + b); +ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "undefined", "RegExp.rightContext = " + RegExp.rightContext); + +b = /f/.test(); +ok(b === true, "/f/.test() returned " + b); +ok(RegExp.leftContext === "unde", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "ined", "RegExp.rightContext = " + RegExp.rightContext); + +b = /abc/.test(); +ok(b === false, "/abc/.test() returned " + b); +ok(RegExp.leftContext === "unde", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "ined", "RegExp.rightContext = " + RegExp.rightContext); m = "abcabc".match(re = /ca/); ok(typeof(m) === "object", "typeof m is not object"); @@ -102,11 +129,15 @@ ok(m.length === 1, "m.length is not 1"); ok(m["0"] === "ca", "m[0] is not \"ca\""); ok(m.constructor === Array, "unexpected m.constructor"); ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex); +ok(RegExp.leftContext === "ab", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "bc", "RegExp.rightContext = " + RegExp.rightContext); m = "abcabc".match(/ab/); ok(typeof(m) === "object", "typeof m is not object"); ok(m.length === 1, "m.length is not 1"); ok(m["0"] === "ab", "m[0] is not \"ab\""); +ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "cabc", "RegExp.rightContext = " + RegExp.rightContext); m = "abcabc".match(/ab/g); ok(typeof(m) === "object", "typeof m is not object"); @@ -124,6 +155,8 @@ ok(typeof(m) === "object", "typeof m is not object"); ok(m.length === 2, "m.length is not 2"); ok(m["0"] === "ab", "m[0] is not \"ab\""); ok(m["1"] === "ab", "m[1] is not \"ab\""); +ok(RegExp.leftContext === "abc", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "c", "RegExp.rightContext = " + RegExp.rightContext); m = "aaabcabc".match(/a+b/g); ok(typeof(m) === "object", "typeof m is not object"); @@ -147,6 +180,8 @@ ok(typeof(m) === "object", "typeof m is not object"); ok(m.length === 2, "m.length is not 2"); ok(m["0"] === "ab", "m[0] is not \"ab\""); ok(m["1"] === "ab", "m[1] is not \"ab\""); +ok(RegExp.leftContext === "abc", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "c", "RegExp.rightContext = " + RegExp.rightContext); m = "abcabc".match(new RegExp(/ab/g)); ok(typeof(m) === "object", "typeof m is not object"); @@ -164,9 +199,13 @@ m = "abcabcg".match("ab", "g"); ok(typeof(m) === "object", "typeof m is not object"); ok(m.length === 1, "m.length is not 1"); ok(m["0"] === "ab", "m[0] is not \"ab\""); +ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "cabcg", "RegExp.rightContext = " + RegExp.rightContext); m = "abcabc".match(); ok(m === null, "m is not null"); +ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "cabcg", "RegExp.rightContext = " + RegExp.rightContext); m = "abcabc".match(/(a)(b)cabc/); ok(typeof(m) === "object", "typeof m is not object"); @@ -197,9 +236,15 @@ ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex); r = "- [test] -".replace(re = /\[([^\[]+)\]/g, "success"); ok(r === "- success -", "r = " + r + " expected '- success -'"); ok(re.lastIndex === 8, "re.lastIndex = " + re.lastIndex); +ok(RegExp.leftContext === "- ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === " -", "RegExp.rightContext = " + RegExp.rightContext); r = "[test] [test]".replace(/\[([^\[]+)\]/g, "aa"); ok(r === "aa aa", "r = " + r + "aa aa"); +ok(RegExp.leftContext === "[test] ", + "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "", + "RegExp.rightContext = " + RegExp.rightContext); r = "[test] [test]".replace(/\[([^\[]+)\]/, "aa"); ok(r === "aa [test]", "r = " + r + " expected 'aa [test]'"); @@ -212,6 +257,8 @@ ok(r === "- true -", "r = " + r + " expected '- true -'"); r = "- [test] -".replace(/\[([^\[]+)\]/g, true, "test"); ok(r === "- true -", "r = " + r + " expected '- true -'"); +ok(RegExp.leftContext === "- ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === " -", "RegExp.rightContext = " + RegExp.rightContext); var tmp = 0; @@ -222,10 +269,18 @@ function replaceFunc1(m, off, str) { case 0: ok(m === "[test1]", "m = " + m + " expected [test1]"); ok(off === 0, "off = " + off + " expected 0"); + ok(RegExp.leftContext === "- ", + "RegExp.leftContext = " + RegExp.leftContext); + ok(RegExp.rightContext === " -", + "RegExp.rightContext = " + RegExp.rightContext); break; case 1: ok(m === "[test2]", "m = " + m + " expected [test2]"); ok(off === 8, "off = " + off + " expected 8"); + ok(RegExp.leftContext === "- ", + "RegExp.leftContext = " + RegExp.leftContext); + ok(RegExp.rightContext === " -", + "RegExp.rightContext = " + RegExp.rightContext); break; default: ok(false, "unexpected call"); @@ -237,6 +292,8 @@ function replaceFunc1(m, off, str) { r = "[test1] [test2]".replace(/\[[^\[]+\]/g, replaceFunc1); ok(r === "r0 r1", "r = " + r + " expected 'r0 r1'"); +ok(RegExp.leftContext === "[test1] ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "", "RegExp.rightContext = " + RegExp.rightContext); tmp = 0; @@ -267,9 +324,13 @@ ok(r === "r0 r1", "r = '" + r + "' expected 'r0 r1'"); r = "$1,$2".replace(/(\$(\d))/g, "$$1-$1$2"); ok(r === "$1-$11,$1-$22", "r = '" + r + "' expected '$1-$11,$1-$22'"); +ok(RegExp.leftContext === "$1,", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "", "RegExp.rightContext = " + RegExp.rightContext); r = "abc &1 123".replace(/(\&(\d))/g, "$&"); ok(r === "abc &1 123", "r = '" + r + "' expected 'abc &1 123'"); +ok(RegExp.leftContext === "abc ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === " 123", "RegExp.rightContext = " + RegExp.rightContext); r = "abc &1 123".replace(/(\&(\d))/g, "$'"); ok(r === "abc 123 123", "r = '" + r + "' expected 'abc 123 123'"); @@ -292,8 +353,11 @@ ok(r === "abc &11 123", "r = '" + r + "' expected 'abc &11 123'"); r = "abc &1 123".replace(/(\&(\d))/g, "$0"); ok(r === "abc $0 123", "r = '" + r + "' expected 'abc $0 123'"); +/a/.test("a"); r = "1 2 3".replace("2", "$&"); ok(r === "1 $& 3", "r = '" + r + "' expected '1 $& 3'"); +ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "", "RegExp.rightContext = " + RegExp.rightContext); r = "1 2 3".replace("2", "$'"); ok(r === "1 $' 3", "r = '" + r + "' expected '1 $' 3'"); @@ -303,6 +367,8 @@ ok(r.length === 3, "r.length = " + r.length); ok(r[0] === "1", "r[0] = " + r[0]); ok(r[1] === "2", "r[1] = " + r[1]); ok(r[2] === "3", "r[2] = " + r[2]); +ok(RegExp.leftContext === "1,,2", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "3", "RegExp.rightContext = " + RegExp.rightContext); r = "1,,2,3".split(/,+/); ok(r.length === 3, "r.length = " + r.length); @@ -341,6 +407,8 @@ ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex); r = "1 12 \t3".split(re = /(\s)+/g).join(";"); ok(r === "1;12;3", "r = " + r); ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex); +ok(RegExp.leftContext === "1 12", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "3", "RegExp.rightContext = " + RegExp.rightContext); re = /,+/; re.lastIndex = 4; @@ -374,6 +442,8 @@ ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0"); m = re.exec(" a "); ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 2"); ok(m.index === 1, "m.index = " + m.index + " expected 1"); +ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === " ", "RegExp.rightContext = " + RegExp.rightContext); m = re.exec(" a "); ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0"); @@ -443,6 +513,8 @@ ok(re.lastIndex === -3, "re.lastIndex = " + re.lastIndex + " expected -3"); m = re.exec(" a a "); ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 0"); ok(m.index === 1, "m = " + m + " expected 1"); +ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === " a ", "RegExp.rightContext = " + RegExp.rightContext); re.lastIndex = -1; ok(re.lastIndex === -1, "re.lastIndex = " + re.lastIndex + " expected -1"); @@ -454,6 +526,8 @@ re = /aa/g; i = 'baacd'.search(re); ok(i === 1, "'baacd'.search(re) = " + i); ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex); +ok(RegExp.leftContext === "b", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "cd", "RegExp.rightContext = " + RegExp.rightContext); re.lastIndex = 2; i = 'baacdaa'.search(re); @@ -469,12 +543,16 @@ re.lastIndex = 2; i = 'baacdaa'.search(re); ok(i === 1, "'baacd'.search(re) = " + i); ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex); +ok(RegExp.leftContext === "b", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "cdaa", "RegExp.rightContext = " + RegExp.rightContext); re = /d/g; re.lastIndex = 1; i = 'abc'.search(re); ok(i === -1, "'abc'.search(/d/g) = " + i); ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex); +ok(RegExp.leftContext === "b", "RegExp.leftContext = " + RegExp.leftContext); +ok(RegExp.rightContext === "cdaa", "RegExp.rightContext = " + RegExp.rightContext); i = 'abcdde'.search(/[df]/); ok(i === 3, "'abc'.search(/[df]/) = " + i); diff --git a/rostests/winetests/kernel32/debugger.c b/rostests/winetests/kernel32/debugger.c index ff091e939ef..060ea7e6d45 100644 --- a/rostests/winetests/kernel32/debugger.c +++ b/rostests/winetests/kernel32/debugger.c @@ -144,7 +144,9 @@ static int load_blackbox(const char* logfile, void* blackbox, int size) ok(0, "unable to open '%s'\n", logfile); return 0; } + SetLastError(0xdeadbeef); ret=ReadFile(hFile, blackbox, size, &read, NULL); + ok(ret, "ReadFile failed: %d\n", GetLastError()); ok(read == size, "wrong size for '%s': read=%d\n", logfile, read); CloseHandle(hFile); return 1; diff --git a/rostests/winetests/kernel32/file.c b/rostests/winetests/kernel32/file.c index b6f066e26bb..c0a36c75fc5 100755 --- a/rostests/winetests/kernel32/file.c +++ b/rostests/winetests/kernel32/file.c @@ -591,6 +591,11 @@ static void test_CopyFileA(void) ret = MoveFileA(source, source); todo_wine ok(ret, "MoveFileA: failed, error %d\n", GetLastError()); + /* copying a file to itself must fail */ + retok = CopyFileA(source, source, FALSE); + ok( !retok && (GetLastError() == ERROR_SHARING_VIOLATION || broken(GetLastError() == ERROR_FILE_EXISTS) /* Win 9x */), + "copying a file to itself didn't fail (ret=%d, err=%d)\n", retok, GetLastError()); + /* make the source have not zero size */ hfile = CreateFileA(source, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0 ); ok(hfile != INVALID_HANDLE_VALUE, "failed to open source file\n"); @@ -618,6 +623,70 @@ static void test_CopyFileA(void) ret = CopyFileA(source, dest, FALSE); ok(ret, "CopyFileA: error %d\n", GetLastError()); + /* copying from a read-locked source fails */ + hfile = CreateFileA(source, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); + ok(hfile != INVALID_HANDLE_VALUE, "failed to open source file, error %d\n", GetLastError()); + retok = CopyFileA(source, dest, FALSE); + ok(!retok && GetLastError() == ERROR_SHARING_VIOLATION, + "copying from a read-locked file succeeded when it shouldn't have\n"); + /* in addition, the source is opened before the destination */ + retok = CopyFileA("25f99d3b-4ba4-4f66-88f5-2906886993cc", dest, FALSE); + ok(!retok && GetLastError() == ERROR_FILE_NOT_FOUND, + "copying from a file that doesn't exist failed in an unexpected way (ret=%d, err=%d)\n", retok, GetLastError()); + CloseHandle(hfile); + + /* copying from a r+w opened, r shared source succeeds */ + hfile = CreateFileA(source, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); + ok(hfile != INVALID_HANDLE_VALUE, "failed to open source file, error %d\n", GetLastError()); + retok = CopyFileA(source, dest, FALSE); + ok(retok, + "copying from an r+w opened and r shared file failed (ret=%d, err=%d)\n", retok, GetLastError()); + CloseHandle(hfile); + + /* copying from a delete-locked source is unreliable */ + hfile = CreateFileA(source, DELETE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); + ok(hfile != INVALID_HANDLE_VALUE, "failed to open source file, error %d\n", GetLastError()); + retok = CopyFileA(source, dest, FALSE); + ok((!retok && GetLastError() == ERROR_SHARING_VIOLATION) || broken(retok) /* 98, Vista, 2k8, 7 */, + "copying from a delete-locked file failed (ret=%d, err=%d)\n", retok, GetLastError()); + CloseHandle(hfile); + + /* copying to a write-locked destination fails */ + hfile = CreateFileA(dest, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); + ok(hfile != INVALID_HANDLE_VALUE, "failed to open destination file, error %d\n", GetLastError()); + retok = CopyFileA(source, dest, FALSE); + ok(!retok && GetLastError() == ERROR_SHARING_VIOLATION, + "copying to a write-locked file didn't fail (ret=%d, err=%d)\n", retok, GetLastError()); + CloseHandle(hfile); + + /* copying to a r+w opened, w shared destination mostly succeeds */ + hfile = CreateFileA(dest, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); + ok(hfile != INVALID_HANDLE_VALUE, "failed to open destination file, error %d\n", GetLastError()); + retok = CopyFileA(source, dest, FALSE); + ok(retok || broken(!retok && GetLastError() == ERROR_SHARING_VIOLATION) /* Win 9x */, + "copying to a r+w opened and w shared file failed (ret=%d, err=%d)\n", retok, GetLastError()); + CloseHandle(hfile); + + /* copying to a delete-locked destination fails, even when the destination is delete-shared */ + hfile = CreateFileA(dest, DELETE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, 0); + ok(hfile != INVALID_HANDLE_VALUE || broken(GetLastError() == ERROR_INVALID_PARAMETER) /* Win 9x */, + "failed to open destination file, error %d\n", GetLastError()); + if (hfile != INVALID_HANDLE_VALUE) + { + retok = CopyFileA(source, dest, FALSE); + ok(!retok && GetLastError() == ERROR_SHARING_VIOLATION, + "copying to a delete-locked shared file didn't fail (ret=%d, err=%d)\n", retok, GetLastError()); + CloseHandle(hfile); + } + + /* copy to a file that's opened the way Wine opens the source */ + hfile = CreateFileA(dest, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); + ok(hfile != INVALID_HANDLE_VALUE, "failed to open destination file, error %d\n", GetLastError()); + retok = CopyFileA(source, dest, FALSE); + ok(retok || broken(GetLastError() == ERROR_SHARING_VIOLATION) /* Win 9x */, + "copying to a file opened the way Wine opens the source failed (ret=%d, err=%d)\n", retok, GetLastError()); + CloseHandle(hfile); + /* make sure that destination has correct size */ hfile = CreateFileA(dest, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); ok(hfile != INVALID_HANDLE_VALUE, "failed to open destination file\n"); diff --git a/rostests/winetests/kernel32/format_msg.c b/rostests/winetests/kernel32/format_msg.c index 228f4d07682..1c4dd76c5e0 100755 --- a/rostests/winetests/kernel32/format_msg.c +++ b/rostests/winetests/kernel32/format_msg.c @@ -24,8 +24,6 @@ #include "winbase.h" #include "winnls.h" -/* #define ok(cond,failstr) if(!(cond)) {printf("line %d : %s\n",__LINE__,failstr);exit(1);} */ - static DWORD __cdecl doit(DWORD flags, LPCVOID src, DWORD msg_id, DWORD lang_id, LPSTR out, DWORD outsize, ... ) { @@ -55,11 +53,14 @@ static DWORD __cdecl doitW(DWORD flags, LPCVOID src, DWORD msg_id, DWORD lang_id static void test_message_from_string_wide(void) { static const WCHAR test[] = {'t','e','s','t',0}; + static const WCHAR empty[] = {0}; static const WCHAR te[] = {'t','e',0}; static const WCHAR st[] = {'s','t',0}; static const WCHAR t[] = {'t',0}; static const WCHAR e[] = {'e',0}; static const WCHAR s[] = {'s',0}; + static const WCHAR fmt_null[] = {'%',0}; + static const WCHAR fmt_tnull[] = {'t','e','s','t','%',0}; static const WCHAR fmt_1[] = {'%','1',0}; static const WCHAR fmt_12[] = {'%','1','%','2',0}; static const WCHAR fmt_123[] = {'%','1','%','3','%','2','%','1',0}; @@ -83,6 +84,7 @@ static void test_message_from_string_wide(void) static const WCHAR fmt_t0t[] = {'t','e','s','t','%','0','t','e','s','t',0}; static const WCHAR fmt_yah[] = {'y','a','h','%','!','%','0',' ',' ',' ',0}; static const WCHAR fmt_space[] = {'%',' ','%',' ',' ',' ',0}; + static const WCHAR fmt_nrt[] = {'%','n','%','r','%','t',0}; static const WCHAR fmt_hi_lf[] = {'h','i','\n',0}; static const WCHAR fmt_hi_crlf[] = {'h','i','\r','\n',0}; static const WCHAR fmt_cr[] = {'\r',0}; @@ -107,6 +109,7 @@ static void test_message_from_string_wide(void) static const WCHAR s_2dot147[] = {' ','.','.',' ',' ','4','2','7',0}; static const WCHAR s_yah[] = {'y','a','h','!',0}; static const WCHAR s_space[] = {' ',' ',' ',' ',0}; + static const WCHAR s_nrt[] = {'\r','\n','\r','\t',0}; static const WCHAR s_hi_crlf[] = {'h','i','\r','\n',0}; static const WCHAR s_crlf[] = {'\r','\n',0}; static const WCHAR s_crlfcrlf[] = {'\r','\n','\r','\n',0}; @@ -123,24 +126,81 @@ static void test_message_from_string_wide(void) static const WCHAR s_sp002sp003[] = {' ',' ','0','0','0','2',',',' ','0','0','0','0','3',0}; static const WCHAR s_sp001004[] = {' ',' ','0','0','1',',','0','0','0','0','0','4',0}; + static const WCHAR init_buf[] = {'x', 'x', 'x', 'x', 'x', 'x'}; + static const WCHAR broken_buf[] = {'t','e','s','t','x','x'}; + WCHAR out[0x100] = {0}; DWORD r, error; - SetLastError(0xdeadbeef); - r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, NULL, 0, 0, NULL, 0, NULL); - error = GetLastError(); - if (!r && error == ERROR_CALL_NOT_IMPLEMENTED) - { - win_skip("FormatMessageW is not implemented\n"); - return; - } - /* the basics */ r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL); ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out)); ok(r==4, "failed: r=%d\n", r); + /* null string, crashes on Windows */ + if (0) + { + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, NULL, 0, + 0, out, sizeof(out)/sizeof(WCHAR), NULL); + } + + /* empty string */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, empty, 0, + 0, out, sizeof(out)/sizeof(WCHAR), NULL); + error = GetLastError(); + ok(!lstrcmpW(empty, out), "failed out=%s\n", wine_dbgstr_w(out)); + ok(r==0, "succeeded: r=%d\n", r); + ok(error==0xdeadbeef, "last error %u\n", error); + + /* format placeholder with no specifier */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, fmt_null, 0, + 0, out, sizeof(out)/sizeof(WCHAR), NULL); + error = GetLastError(); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the buffer to be unchanged\n"); + ok(r==0, "succeeded: r=%d\n", r); + ok(error==ERROR_INVALID_PARAMETER, "last error %u\n", error); + + /* test string with format placeholder with no specifier */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, fmt_tnull, 0, + 0, out, sizeof(out)/sizeof(WCHAR), NULL); + error = GetLastError(); + ok(!memcmp(out, init_buf, sizeof(init_buf)) || + broken(!memcmp(out, broken_buf, sizeof(broken_buf))), /* W2K3+ */ + "Expected the buffer to be unchanged\n"); + ok(r==0, "succeeded: r=%d\n", r); + ok(error==ERROR_INVALID_PARAMETER, "last error %u\n", error); + + /* insertion with no variadic arguments */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, fmt_1, 0, + 0, out, sizeof(out)/sizeof(WCHAR), NULL); + error = GetLastError(); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the buffer to be unchanged\n"); + ok(r==0, "succeeded: r=%d\n", r); + ok(error==ERROR_INVALID_PARAMETER, "last error %u\n", error); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, fmt_1, 0, + 0, out, sizeof(out)/sizeof(WCHAR), NULL); + error = GetLastError(); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the buffer to be unchanged\n"); + ok(r==0, "succeeded: r=%d\n", r); + ok(error==ERROR_INVALID_PARAMETER, "last error %u\n", error); + /* using the format feature */ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1s, 0, 0, out, sizeof(out)/sizeof(WCHAR), test); @@ -290,6 +350,12 @@ static void test_message_from_string_wide(void) ok(!lstrcmpW(s_space, out), "failed out=%s\n", wine_dbgstr_w(out)); ok(r==4,"failed: r=%d\n", r); + /* %n yields \r\n, %r yields \r, %t yields \t */ + r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_nrt, 0, + 0, out, sizeof(out)/sizeof(WCHAR)); + ok(!lstrcmpW(s_nrt, out), "failed out=%s\n", wine_dbgstr_w(out)); + ok(r==4,"failed: r=%d\n", r); + /* line feed */ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_hi_lf, 0, 0, out, sizeof(out)/sizeof(WCHAR)); @@ -338,7 +404,8 @@ static void test_message_from_string_wide(void) ok(r==11,"failed: r=%d\n",r); r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1oou3oou, 0, 0, out, sizeof(out)/sizeof(WCHAR), 5, 3, 1, 6, 4, 2 ); - ok(!lstrcmpW( s_sp001sp002, out) || broken(!lstrcmpW(s_sp001004, out)), + ok(!lstrcmpW( s_sp001sp002, out) || + broken(!lstrcmpW(s_sp001004, out)), /* NT4/Win2k */ "failed out=[%s]\n", wine_dbgstr_w(out)); ok(r==12,"failed: r=%d\n",r); /* args are not counted the same way with an argument array */ @@ -359,8 +426,8 @@ static void test_message_from_string_wide(void) /* line feed */ r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_lf, 0, 0, out, sizeof(out)/sizeof(WCHAR)); - ok(!lstrcmpW(s_hi_sp, out) || !lstrcmpW(s_hi_crlf, out), "failed out=%s\n", wine_dbgstr_w(out)); - ok(r==3 || r==4,"failed: r=%d\n", r); + ok(!lstrcmpW(s_hi_sp, out), "failed out=%s\n", wine_dbgstr_w(out)); + ok(r==3,"failed: r=%d\n", r); /* carriage return line feed */ r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_crlf, 0, @@ -385,6 +452,7 @@ static void test_message_from_string(void) { CHAR out[0x100] = {0}; DWORD r; + static const char init_buf[] = {'x', 'x', 'x', 'x', 'x', 'x'}; static const WCHAR szwTest[] = { 't','e','s','t',0}; /* the basics */ @@ -393,6 +461,78 @@ static void test_message_from_string(void) ok(!strcmp("test", out),"failed out=[%s]\n",out); ok(r==4,"failed: r=%d\n",r); + /* null string, crashes on Windows */ + if (0) + { + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, NULL, 0, + 0, out, sizeof(out)/sizeof(CHAR), NULL); + } + + /* empty string */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "", 0, + 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(!memcmp(out, init_buf, sizeof(init_buf)) || + broken(!strcmp("", out)), /* Win9x */ + "Expected the buffer to be untouched\n"); + ok(r==0, "succeeded: r=%d\n", r); + ok(GetLastError()==0xdeadbeef, + "last error %u\n", GetLastError()); + + /* format placeholder with no specifier */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "%", 0, + 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the buffer to be untouched\n"); + ok(r==0, "succeeded: r=%d\n", r); + ok(GetLastError()==ERROR_INVALID_PARAMETER, + "last error %u\n", GetLastError()); + + /* test string with format placeholder with no specifier */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test%", 0, + 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the buffer to be untouched\n"); + ok(r==0, "succeeded: r=%d\n", r); + ok(GetLastError()==ERROR_INVALID_PARAMETER, + "last error %u\n", GetLastError()); + + /* insertion with no variadic arguments */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "%1", 0, + 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(!memcmp(out, init_buf, sizeof(init_buf)) || + broken(!strcmp("%1", out)), /* Win9x */ + "Expected the buffer to be untouched\n"); + ok(r==0 || + broken(r==2), /* Win9x */ + "succeeded: r=%d\n", r); + ok(GetLastError()==ERROR_INVALID_PARAMETER || + broken(GetLastError()==0xdeadbeef), /* Win9x */ + "last error %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, "%1", 0, + 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(!memcmp(out, init_buf, sizeof(init_buf)) || + broken(!strcmp("%1", out)), /* Win9x */ + "Expected the buffer to be untouched\n"); + ok(r==0 || + broken(r==2), /* Win9x */ + "succeeded: r=%d\n", r); + ok(GetLastError()==ERROR_INVALID_PARAMETER || + broken(GetLastError()==0xdeadbeef), /* Win9x */ + "last error %u\n", GetLastError()); + /* using the format feature */ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!s!", 0, 0, out, sizeof(out)/sizeof(CHAR), "test"); @@ -543,6 +683,12 @@ static void test_message_from_string(void) ok(!strcmp(" ", out),"failed out=[%s]\n",out); ok(r==4,"failed: r=%d\n",r); + /* %n yields \r\n, %r yields \r, %t yields \t */ + r = doit(FORMAT_MESSAGE_FROM_STRING, "%n%r%t", 0, + 0, out, sizeof(out)/sizeof(CHAR)); + ok(!strcmp("\r\n\r\t", out),"failed out=[%s]\n",out); + ok(r==4,"failed: r=%d\n",r); + /* line feed */ r = doit(FORMAT_MESSAGE_FROM_STRING, "hi\n", 0, 0, out, sizeof(out)/sizeof(CHAR)); @@ -596,7 +742,8 @@ static void test_message_from_string(void) 0, 0, out, sizeof(out), 5, 3, 1, 6, 4, 2 ); /* older Win versions marked as broken even though this is arguably the correct behavior */ /* but the new (brain-damaged) behavior is specified on MSDN */ - ok(!strcmp( " 001, 0002", out) || broken(!strcmp(" 001,000004", out)), + ok(!strcmp( " 001, 0002", out) || + broken(!strcmp(" 001,000004", out)), /* NT4/Win2k */ "failed out=[%s]\n",out); ok(r==12,"failed: r=%d\n",r); /* args are not counted the same way with an argument array */ @@ -618,8 +765,12 @@ static void test_message_from_string(void) /* line feed */ r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\n", 0, 0, out, sizeof(out)/sizeof(CHAR)); - ok(!strcmp("hi ", out) || !strcmp("hi\r\n", out),"failed out=[%s]\n",out); - ok(r==3 || r==4,"failed: r=%d\n",r); + ok(!strcmp("hi ", out) || + broken(!strcmp("hi\r\n", out)), /* Win9x */ + "failed out=[%s]\n",out); + ok(r==3 || + broken(r==4), /* Win9x */ + "failed: r=%d\n",r); /* carriage return line feed */ r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\r\n", 0, @@ -640,10 +791,340 @@ static void test_message_from_string(void) ok(r==2,"failed: r=%d\n",r); } +static void test_message_ignore_inserts(void) +{ + static const char init_buf[] = {'x', 'x', 'x', 'x', 'x'}; + + DWORD ret; + CHAR out[256]; + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "test", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret); + ok(!strcmp("test", out), "Expected output string \"test\", got %s\n", out); + + /* The %0 escape sequence is handled. */ + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "test%0", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret); + ok(!strcmp("test", out), "Expected output string \"test\", got %s\n", out); + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "test%0test", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret); + ok(!strcmp("test", out), "Expected output string \"test\", got %s\n", out); + + /* While FormatMessageA returns 0 in this case, no last error code is set. */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "%0test", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %d\n", ret); + ok(!memcmp(out, init_buf, sizeof(init_buf)) || + broken(!strcmp("", out)), /* Win9x */ + "Expected the output buffer to be untouched\n"); + ok(GetLastError() == 0xdeadbeef, "Expected GetLastError() to return 0xdeadbeef, got %u\n", GetLastError()); + + /* Insert sequences are ignored. */ + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "test%1%2!*.*s!%99", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 17, "Expected FormatMessageA to return 17, got %d\n", ret); + ok(!strcmp("test%1%2!*.*s!%99", out), "Expected output string \"test%%1%%2!*.*s!%%99\", got %s\n", out); + + /* Only the "%n", "%r", and "%t" escape sequences are processed. */ + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "%%% %.%!", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 8 || + broken(ret == 7) /* Win9x */, + "Expected FormatMessageA to return 8, got %d\n", ret); + ok(!strcmp("%%% %.%!", out) || + broken(!strcmp("%%% %.!", out)) /* Win9x */, + "Expected output string \"%%%%%% %%.%%!\", got %s\n", out); + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "%n%r%t", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret); + ok(!strcmp("\r\n\r\t", out), "Expected output string \"\\r\\n\\r\\t\", got %s\n", out); + + /* CRLF characters are processed normally. */ + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "hi\n", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret); + ok(!strcmp("hi\r\n", out), "Expected output string \"hi\\r\\n\", got %s\n", out); + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "hi\r\n", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret); + ok(!strcmp("hi\r\n", out), "Expected output string \"hi\\r\\n\", got %s\n", out); + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "\r", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 2, "Expected FormatMessageA to return 2, got %d\n", ret); + ok(!strcmp("\r\n", out), "Expected output string \"\\r\\n\", got %s\n", out); + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "\r\r\n", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret); + ok(!strcmp("\r\n\r\n", out), "Expected output string \"\\r\\n\\r\\n\", got %s\n", out); + + /* The width parameter is handled the same also. */ + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\n", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(!strcmp("hi ", out) || + broken(!strcmp("hi\r\n", out)), /* Win9x */ + "Expected output string \"hi \", got %s\n", out); + ok(ret == 3 || + broken(ret == 4), /* Win9x */ + "Expected FormatMessageA to return 3, got %d\n", ret); + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\r\n", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 3, "Expected FormatMessageA to return 3, got %d\n", ret); + ok(!strcmp("hi ", out), "Expected output string \"hi \", got %s\n", out); + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 1, "Expected FormatMessageA to return 1, got %d\n", ret); + ok(!strcmp(" ", out), "Expected output string \" \", got %s\n", out); + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r\r\n", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 2, "Expected FormatMessageA to return 2, got %d\n", ret); + ok(!strcmp(" ", out), "Expected output string \" \", got %s\n", out); +} + +static void test_message_ignore_inserts_wide(void) +{ + static const WCHAR test[] = {'t','e','s','t',0}; + static const WCHAR empty[] = {0}; + static const WCHAR fmt_t0[] = {'t','e','s','t','%','0',0}; + static const WCHAR fmt_t0t[] = {'t','e','s','t','%','0','t','e','s','t',0}; + static const WCHAR fmt_0t[] = {'%','0','t','e','s','t',0}; + static const WCHAR fmt_t12oos99[] = {'t','e','s','t','%','1','%','2','!','*','.','*','s','!','%','9','9',0}; + static const WCHAR fmt_pctspacedot[] = {'%','%','%',' ','%','.','%','!',0}; + static const WCHAR fmt_nrt[] = {'%','n','%','r','%','t',0}; + static const WCHAR fmt_hi_lf[] = {'h','i','\n',0}; + static const WCHAR fmt_hi_crlf[] = {'h','i','\r','\n',0}; + static const WCHAR fmt_cr[] = {'\r',0}; + static const WCHAR fmt_crcrlf[] = {'\r','\r','\n',0}; + + static const WCHAR s_nrt[] = {'\r','\n','\r','\t',0}; + static const WCHAR s_hi_crlf[] = {'h','i','\r','\n',0}; + static const WCHAR s_crlf[] = {'\r','\n',0}; + static const WCHAR s_crlfcrlf[] = {'\r','\n','\r','\n',0}; + static const WCHAR s_hi_sp[] = {'h','i',' ',0}; + static const WCHAR s_sp[] = {' ',0}; + static const WCHAR s_2sp[] = {' ',' ',0}; + + DWORD ret; + WCHAR out[256]; + + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, test, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret); + ok(!lstrcmpW(test, out), "Expected output string \"test\", got %s\n", wine_dbgstr_w(out)); + + /* The %0 escape sequence is handled. */ + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_t0, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret); + ok(!lstrcmpW(test, out), "Expected output string \"test\", got %s\n", wine_dbgstr_w(out)); + + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_t0t, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret); + ok(!lstrcmpW(test, out), "Expected output string \"test\", got %s\n", wine_dbgstr_w(out)); + + /* While FormatMessageA returns 0 in this case, no last error code is set. */ + SetLastError(0xdeadbeef); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_0t, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 0, "Expected FormatMessageW to return 0, got %d\n", ret); + ok(!lstrcmpW(empty, out), "Expected the output buffer to be the empty string, got %s\n", wine_dbgstr_w(out)); + ok(GetLastError() == 0xdeadbeef, "Expected GetLastError() to return 0xdeadbeef, got %u\n", GetLastError()); + + /* Insert sequences are ignored. */ + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_t12oos99, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 17, "Expected FormatMessageW to return 17, got %d\n", ret); + ok(!lstrcmpW(fmt_t12oos99, out), "Expected output string \"test%%1%%2!*.*s!%%99\", got %s\n", wine_dbgstr_w(out)); + + /* Only the "%n", "%r", and "%t" escape sequences are processed. */ + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_pctspacedot, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 8, "Expected FormatMessageW to return 8, got %d\n", ret); + ok(!lstrcmpW(fmt_pctspacedot, out), "Expected output string \"%%%%%% %%.%%!\", got %s\n", wine_dbgstr_w(out)); + + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_nrt, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret); + ok(!lstrcmpW(s_nrt, out), "Expected output string \"\\r\\n\\r\\t\", got %s\n", wine_dbgstr_w(out)); + + /* CRLF characters are processed normally. */ + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_hi_lf, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret); + ok(!lstrcmpW(s_hi_crlf, out), "Expected output string \"hi\\r\\n\", got %s\n", wine_dbgstr_w(out)); + + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_hi_crlf, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret); + ok(!lstrcmpW(s_hi_crlf, out), "Expected output string \"hi\\r\\n\", got %s\n", wine_dbgstr_w(out)); + + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_cr, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 2, "Expected FormatMessageW to return 2, got %d\n", ret); + ok(!lstrcmpW(s_crlf, out), "Expected output string \"\\r\\n\", got %s\n", wine_dbgstr_w(out)); + + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_crcrlf, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret); + ok(!lstrcmpW(s_crlfcrlf, out), "Expected output string \"\\r\\n\\r\\n\", got %s\n", wine_dbgstr_w(out)); + + /* The width parameter is handled the same also. */ + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_lf, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 3, "Expected FormatMessageW to return 3, got %d\n", ret); + ok(!lstrcmpW(s_hi_sp, out), "Expected output string \"hi \", got %s\n", wine_dbgstr_w(out)); + + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_crlf, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 3, "Expected FormatMessageW to return 3, got %d\n", ret); + ok(!lstrcmpW(s_hi_sp, out), "Expected output string \"hi \", got %s\n", wine_dbgstr_w(out)); + + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_cr, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 1, "Expected FormatMessageW to return 1, got %d\n", ret); + ok(!lstrcmpW(s_sp, out), "Expected output string \" \", got %s\n", wine_dbgstr_w(out)); + + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_crcrlf, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 2, "Expected FormatMessageW to return 2, got %d\n", ret); + ok(!lstrcmpW(s_2sp, out), "Expected output string \" \", got %s\n", wine_dbgstr_w(out)); +} + +static void test_message_insufficient_buffer(void) +{ + static const char init_buf[] = {'x', 'x', 'x', 'x', 'x'}; + static const char expected_buf[] = {'x', 'x', 'x', 'x', 'x'}; + DWORD ret; + CHAR out[5]; + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test", 0, 0, out, 0, NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %u\n", + GetLastError()); + ok(!memcmp(expected_buf, out, sizeof(expected_buf)), + "Expected the buffer to be untouched\n"); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test", 0, 0, out, 1, NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %u\n", + GetLastError()); + ok(!memcmp(expected_buf, out, sizeof(expected_buf)), + "Expected the buffer to be untouched\n"); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test", 0, 0, out, sizeof(out)/sizeof(out[0]) - 1, NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %u\n", + GetLastError()); + ok(!memcmp(expected_buf, out, sizeof(expected_buf)), + "Expected the buffer to be untouched\n"); +} + +static void test_message_insufficient_buffer_wide(void) +{ + static const WCHAR test[] = {'t','e','s','t',0}; + static const WCHAR init_buf[] = {'x', 'x', 'x', 'x', 'x'}; + static const WCHAR expected_buf[] = {'x', 'x', 'x', 'x', 'x'}; + static const WCHAR broken_buf[] = {0, 'x', 'x', 'x', 'x'}; + static const WCHAR broken2_buf[] = {'t','e','s',0,'x'}; + + DWORD ret; + WCHAR out[5]; + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, test, 0, 0, out, 0, NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %u\n", + GetLastError()); + ok(!memcmp(expected_buf, out, sizeof(expected_buf)), + "Expected the buffer to be untouched\n"); + + /* Windows Server 2003 and newer report failure but copy a + * truncated string to the buffer for non-zero buffer sizes. */ + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, test, 0, 0, out, 1, NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %u\n", + GetLastError()); + ok(!memcmp(expected_buf, out, sizeof(expected_buf)) || + broken(!memcmp(broken_buf, out, sizeof(broken_buf))), /* W2K3+ */ + "Expected the buffer to be untouched\n"); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, test, 0, 0, out, sizeof(out)/sizeof(out[0]) - 1, NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %u\n", + GetLastError()); + ok(!memcmp(expected_buf, out, sizeof(expected_buf)) || + broken(!memcmp(broken2_buf, out, sizeof(broken2_buf))), /* W2K3+ */ + "Expected the buffer to be untouched\n"); +} + static void test_message_null_buffer(void) { DWORD ret, error; + /* Without FORMAT_MESSAGE_ALLOCATE_BUFFER, only the specified buffer size is checked. */ + SetLastError(0xdeadbeef); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 0, 0, NULL, 0, NULL); + error = GetLastError(); + ok(!ret, "FormatMessageA returned %u\n", ret); + ok(error == ERROR_INSUFFICIENT_BUFFER || + error == ERROR_INVALID_PARAMETER, /* win9x */ + "last error %u\n", error); + + SetLastError(0xdeadbeef); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 0, 0, NULL, 1, NULL); + error = GetLastError(); + ok(!ret, "FormatMessageA returned %u\n", ret); + ok(error == ERROR_INSUFFICIENT_BUFFER || + error == ERROR_INVALID_PARAMETER, /* win9x */ + "last error %u\n", error); + + if (0) /* crashes on Windows */ + { + SetLastError(0xdeadbeef); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 0, 0, NULL, 256, NULL); + error = GetLastError(); + ok(!ret, "FormatMessageA returned %u\n", ret); + trace("last error %u\n", error); + } + SetLastError(0xdeadbeef); ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, 0, 0, NULL, 0, NULL); error = GetLastError(); @@ -653,16 +1134,245 @@ static void test_message_null_buffer(void) "last error %u\n", error); SetLastError(0xdeadbeef); - ret = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, 0, 0, NULL, 0, NULL); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, 0, 0, NULL, 1, NULL); error = GetLastError(); - if (!ret && error == ERROR_CALL_NOT_IMPLEMENTED) - { - win_skip("FormatMessageW is not implemented\n"); - return; - } + ok(!ret, "FormatMessageA returned %u\n", ret); + ok(error == ERROR_NOT_ENOUGH_MEMORY || + error == ERROR_INVALID_PARAMETER, /* win9x */ + "last error %u\n", error); + SetLastError(0xdeadbeef); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, 0, 0, NULL, 256, NULL); + error = GetLastError(); + ok(!ret, "FormatMessageA returned %u\n", ret); + ok(error == ERROR_NOT_ENOUGH_MEMORY || + error == ERROR_INVALID_PARAMETER, /* win9x */ + "last error %u\n", error); +} + +static void test_message_null_buffer_wide(void) +{ + DWORD ret, error; + + SetLastError(0xdeadbeef); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 0, 0, NULL, 0, NULL); + error = GetLastError(); ok(!ret, "FormatMessageW returned %u\n", ret); ok(error == ERROR_INVALID_PARAMETER, "last error %u\n", error); + + SetLastError(0xdeadbeef); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 0, 0, NULL, 1, NULL); + error = GetLastError(); + ok(!ret, "FormatMessageW returned %u\n", ret); + ok(error == ERROR_INVALID_PARAMETER, "last error %u\n", error); + + SetLastError(0xdeadbeef); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 0, 0, NULL, 256, NULL); + error = GetLastError(); + ok(!ret, "FormatMessageW returned %u\n", ret); + ok(error == ERROR_INVALID_PARAMETER, "last error %u\n", error); + + SetLastError(0xdeadbeef); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, 0, 0, NULL, 0, NULL); + error = GetLastError(); + ok(!ret, "FormatMessageW returned %u\n", ret); + ok(error == ERROR_INVALID_PARAMETER, "last error %u\n", error); + + SetLastError(0xdeadbeef); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, 0, 0, NULL, 1, NULL); + error = GetLastError(); + ok(!ret, "FormatMessageW returned %u\n", ret); + ok(error == ERROR_INVALID_PARAMETER, "last error %u\n", error); + + SetLastError(0xdeadbeef); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, 0, 0, NULL, 256, NULL); + error = GetLastError(); + ok(!ret, "FormatMessageW returned %u\n", ret); + ok(error == ERROR_INVALID_PARAMETER, "last error %u\n", error); +} + +static void test_message_allocate_buffer(void) +{ + DWORD ret; + char *buf; + + /* While MSDN suggests that FormatMessageA allocates a buffer whose size is + * the larger of the output string and the requested buffer size, the tests + * will not try to determine the actual size of the buffer allocated, as + * the return value of LocalSize cannot be trusted for the purpose, and it should + * in any case be safe for FormatMessageA to allocate in the manner that + * MSDN suggests. */ + + SetLastError(0xdeadbeef); + buf = (char *)0xdeadbeef; + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + "", 0, 0, (char *)&buf, 0, NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(buf == NULL, "Expected output buffer pointer to be NULL\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected last error to be untouched, got %u\n", GetLastError()); + + buf = (char *)0xdeadbeef; + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + "test", 0, 0, (char *)&buf, 0, NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (char *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (char *)0xdeadbeef) + { + ok(!strcmp("test", buf), + "Expected buffer to contain \"test\", got %s\n", buf); + LocalFree(buf); + } + + buf = (char *)0xdeadbeef; + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + "test", 0, 0, (char *)&buf, strlen("test"), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (char *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (char *)0xdeadbeef) + { + ok(!strcmp("test", buf), + "Expected buffer to contain \"test\", got %s\n", buf); + LocalFree(buf); + } + + buf = (char *)0xdeadbeef; + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + "test", 0, 0, (char *)&buf, strlen("test") + 1, NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (char *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (char *)0xdeadbeef) + { + ok(!strcmp("test", buf), + "Expected buffer to contain \"test\", got %s\n", buf); + LocalFree(buf); + } + + buf = (char *)0xdeadbeef; + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + "test", 0, 0, (char *)&buf, strlen("test") + 2, NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (char *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (char *)0xdeadbeef) + { + ok(!strcmp("test", buf), + "Expected buffer to contain \"test\", got %s\n", buf); + LocalFree(buf); + } + + buf = (char *)0xdeadbeef; + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + "test", 0, 0, (char *)&buf, 1024, NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (char *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (char *)0xdeadbeef) + { + ok(!strcmp("test", buf), + "Expected buffer to contain \"test\", got %s\n", buf); + LocalFree(buf); + } +} + +static void test_message_allocate_buffer_wide(void) +{ + static const WCHAR empty[] = {0}; + static const WCHAR test[] = {'t','e','s','t',0}; + + DWORD ret; + WCHAR *buf; + + /* While MSDN suggests that FormatMessageW allocates a buffer whose size is + * the larger of the output string and the requested buffer size, the tests + * will not try to determine the actual size of the buffer allocated, as + * the return value of LocalSize cannot be trusted for the purpose, and it should + * in any case be safe for FormatMessageW to allocate in the manner that + * MSDN suggests. */ + + if (0) /* crashes on Windows */ + { + buf = (WCHAR *)0xdeadbeef; + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, 0, 0, (WCHAR *)&buf, 0, NULL); + } + + SetLastError(0xdeadbeef); + buf = (WCHAR *)0xdeadbeef; + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + empty, 0, 0, (WCHAR *)&buf, 0, NULL); + ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret); + ok(buf == NULL, "Expected output buffer pointer to be NULL\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected last error to be untouched, got %u\n", GetLastError()); + + buf = (WCHAR *)0xdeadbeef; + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + test, 0, 0, (WCHAR *)&buf, 0, NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (WCHAR *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (WCHAR *)0xdeadbeef) + { + ok(!lstrcmpW(test, buf), + "Expected buffer to contain \"test\", got %s\n", wine_dbgstr_w(buf)); + LocalFree(buf); + } + + buf = (WCHAR *)0xdeadbeef; + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + test, 0, 0, (WCHAR *)&buf, sizeof(test)/sizeof(WCHAR) - 1, NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (WCHAR *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (WCHAR *)0xdeadbeef) + { + ok(!lstrcmpW(test, buf), + "Expected buffer to contain \"test\", got %s\n", wine_dbgstr_w(buf)); + LocalFree(buf); + } + + buf = (WCHAR *)0xdeadbeef; + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + test, 0, 0, (WCHAR *)&buf, sizeof(test)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (WCHAR *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (WCHAR *)0xdeadbeef) + { + ok(!lstrcmpW(test, buf), + "Expected buffer to contain \"test\", got %s\n", wine_dbgstr_w(buf)); + LocalFree(buf); + } + + buf = (WCHAR *)0xdeadbeef; + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + test, 0, 0, (WCHAR *)&buf, sizeof(test)/sizeof(WCHAR) + 1, NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (WCHAR *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (WCHAR *)0xdeadbeef) + { + ok(!lstrcmpW(test, buf), + "Expected buffer to contain \"test\", got %s\n", wine_dbgstr_w(buf)); + LocalFree(buf); + } + + buf = (WCHAR *)0xdeadbeef; + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + test, 0, 0, (WCHAR *)&buf, 1024, NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(buf != NULL && buf != (WCHAR *)0xdeadbeef, + "Expected output buffer pointer to be valid\n"); + if (buf != NULL && buf != (WCHAR *)0xdeadbeef) + { + ok(!lstrcmpW(test, buf), + "Expected buffer to contain \"test\", got %s\n", wine_dbgstr_w(buf)); + LocalFree(buf); + } } static void test_message_from_hmodule(void) @@ -680,6 +1390,20 @@ static void test_message_from_hmodule(void) MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL); ok(ret != 0, "FormatMessageA returned 0\n"); + /* Test a message string with an insertion without passing any variadic arguments. */ + ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 193 /* ERROR_BAD_EXE_FORMAT */, + MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 0 || + broken(ret != 0), /* Win9x */ + "FormatMessageA returned non-zero\n"); + + ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE | + FORMAT_MESSAGE_ARGUMENT_ARRAY, h, 193 /* ERROR_BAD_EXE_FORMAT */, + MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 0 || + broken(ret != 0), /* Win9x */ + "FormatMessageA returned non-zero\n"); + /*Test nonexistent messageID with varying language ID's Note: FormatMessageW behaves the same*/ SetLastError(0xdeadbeef); ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 3044, @@ -725,10 +1449,201 @@ static void test_message_from_hmodule(void) "last error %u\n", error); } +static void test_message_invalid_flags(void) +{ + static const char init_buf[] = {'x', 'x', 'x', 'x', 'x'}; + + DWORD ret; + CHAR out[5]; + char *ptr; + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(0, "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the output buffer to be untouched\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ptr = (char *)0xdeadbeef; + ret = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER, "test", 0, 0, (char *)&ptr, 0, NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(ptr == NULL || + broken(ptr == (char *)0xdeadbeef), /* Win9x */ + "Expected output pointer to be initialized to NULL, got %p\n", ptr); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS, "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the output buffer to be untouched\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_ARGUMENT_ARRAY, "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the output buffer to be untouched\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_MAX_WIDTH_MASK, "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the output buffer to be untouched\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + /* Simultaneously setting FORMAT_MESSAGE_FROM_STRING with other source + * flags is apparently permissible, and FORMAT_MESSAGE_FROM_STRING takes + * precedence in this case. */ + + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_SYSTEM, + "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(!strcmp("test", out), + "Expected the output buffer to be untouched\n"); + + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_HMODULE, + "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(!strcmp("test", out), + "Expected the output buffer to be untouched\n"); + + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_HMODULE | + FORMAT_MESSAGE_FROM_SYSTEM, "test", 0, 0, out, + sizeof(out)/sizeof(CHAR), NULL); + ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret); + ok(!strcmp("test", out), + "Expected the output buffer to be untouched\n"); +} + +static void test_message_invalid_flags_wide(void) +{ + static const WCHAR init_buf[] = {'x', 'x', 'x', 'x', 'x'}; + static const WCHAR test[] = {'t','e','s','t',0}; + + DWORD ret; + WCHAR out[5]; + WCHAR *ptr; + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(0, test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the output buffer to be untouched\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ptr = (WCHAR *)0xdeadbeef; + ret = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER, test, 0, 0, (WCHAR *)&ptr, 0, NULL); + ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret); + ok(ptr == NULL, "Expected output pointer to be initialized to NULL, got %p\n", ptr); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS, test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the output buffer to be untouched\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(FORMAT_MESSAGE_ARGUMENT_ARRAY, test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the output buffer to be untouched\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(FORMAT_MESSAGE_MAX_WIDTH_MASK, test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret); + ok(!memcmp(out, init_buf, sizeof(init_buf)), + "Expected the output buffer to be untouched\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + /* Simultaneously setting FORMAT_MESSAGE_FROM_STRING with other source + * flags is apparently permissible, and FORMAT_MESSAGE_FROM_STRING takes + * precedence in this case. */ + + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_SYSTEM, + test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %u\n", ret); + ok(!lstrcmpW(test, out), + "Expected the output buffer to be untouched\n"); + + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_HMODULE, + test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %u\n", ret); + ok(!lstrcmpW(test, out), + "Expected the output buffer to be untouched\n"); + + memcpy(out, init_buf, sizeof(init_buf)); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_HMODULE | + FORMAT_MESSAGE_FROM_SYSTEM, test, 0, 0, out, + sizeof(out)/sizeof(WCHAR), NULL); + ok(ret == 4, "Expected FormatMessageW to return 4, got %u\n", ret); + ok(!lstrcmpW(test, out), + "Expected the output buffer to be untouched\n"); +} + START_TEST(format_msg) { + DWORD ret; + test_message_from_string(); - test_message_from_string_wide(); + test_message_ignore_inserts(); + test_message_insufficient_buffer(); test_message_null_buffer(); + test_message_allocate_buffer(); test_message_from_hmodule(); + test_message_invalid_flags(); + + SetLastError(0xdeadbeef); + ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, NULL, 0, 0, NULL, 0, NULL); + if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("FormatMessageW is not implemented\n"); + return; + } + + test_message_from_string_wide(); + test_message_ignore_inserts_wide(); + test_message_insufficient_buffer_wide(); + test_message_null_buffer_wide(); + test_message_allocate_buffer_wide(); + test_message_invalid_flags_wide(); } diff --git a/rostests/winetests/kernel32/heap.c b/rostests/winetests/kernel32/heap.c index 1d49def44d8..9c306936ee9 100755 --- a/rostests/winetests/kernel32/heap.c +++ b/rostests/winetests/kernel32/heap.c @@ -27,7 +27,6 @@ #include #define NTOS_MODE_USER #include - #include "wine/test.h" #define MAGIC_DEAD 0xdeadbeef @@ -250,14 +249,27 @@ static void test_heap(void) res = GlobalUnlock(gbl); ok(res == 1 || - res == 0, /* win9x */ + broken(res == 0), /* win9x */ "Expected 1 or 0, got %d\n", res); res = GlobalUnlock(gbl); ok(res == 1 || - res == 0, /* win9x */ + broken(res == 0), /* win9x */ "Expected 1 or 0, got %d\n", res); + GlobalFree(gbl); + + gbl = GlobalAlloc(GMEM_FIXED, 100); + + SetLastError(0xdeadbeef); + res = GlobalUnlock(gbl); + ok(res == 1 || + broken(res == 0), /* win9x */ + "Expected 1 or 0, got %d\n", res); + ok(GetLastError() == 0xdeadbeef, "got %d\n", GetLastError()); + + GlobalFree(gbl); + /* GlobalSize on an invalid handle */ if (sizeof(void *) != 8) /* crashes on 64-bit Vista */ { @@ -269,8 +281,6 @@ static void test_heap(void) "Expected ERROR_INVALID_HANDLE or ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); } - GlobalFree(gbl); - /* ####################################### */ /* Local*() functions */ gbl = LocalAlloc(LMEM_MOVEABLE, 0); @@ -372,6 +382,15 @@ static void test_heap(void) "returned %d with %d (expected '0' with ERROR_INVALID_HANDLE)\n", res, GetLastError()); + /* trying to unlock pointer from LocalAlloc */ + gbl = LocalAlloc(LMEM_FIXED, 100); + SetLastError(0xdeadbeef); + res = LocalUnlock(gbl); + ok(res == 0, "Expected 0, got %d\n", res); + ok(GetLastError() == ERROR_NOT_LOCKED || + broken(GetLastError() == 0xdeadbeef) /* win9x */, "got %d\n", GetLastError()); + LocalFree(gbl); + /* trying to lock empty memory should give an error */ gbl = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,0); ok(gbl != NULL, "returned NULL\n"); diff --git a/rostests/winetests/kernel32/locale.c b/rostests/winetests/kernel32/locale.c index a462a142857..f37d503da63 100755 --- a/rostests/winetests/kernel32/locale.c +++ b/rostests/winetests/kernel32/locale.c @@ -1347,6 +1347,9 @@ static void test_CompareStringA(void) ret = CompareStringA(lcid, NORM_IGNORECASE | LOCALE_USE_CP_ACP, "#", -1, ".", -1); todo_wine ok(ret == CSTR_LESS_THAN, "\"#\" vs \".\" expected CSTR_LESS_THAN, got %d\n", ret); + ret = CompareStringA(lcid, NORM_IGNORECASE, "_", -1, ".", -1); + todo_wine ok(ret == CSTR_GREATER_THAN, "\"_\" vs \".\" expected CSTR_GREATER_THAN, got %d\n", ret); + ret = lstrcmpi("#", "."); todo_wine ok(ret == -1, "\"#\" vs \".\" expected -1, got %d\n", ret); } diff --git a/rostests/winetests/kernel32/path.c b/rostests/winetests/kernel32/path.c index c418ef245ea..e6d7e56ba48 100755 --- a/rostests/winetests/kernel32/path.c +++ b/rostests/winetests/kernel32/path.c @@ -1569,6 +1569,120 @@ if (0) "Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError()); } +static void test_GetFullPathNameA(void) +{ + char output[MAX_PATH], *filepart; + DWORD ret; + int is_win9x, i; + + const struct + { + LPCSTR name; + DWORD len; + LPSTR buffer; + LPSTR *lastpart; + int win9x_crash; + } invalid_parameters[] = + { + {NULL, 0, NULL, NULL, 1}, + {NULL, MAX_PATH, NULL, NULL, 1}, + {NULL, MAX_PATH, output, NULL, 1}, + {NULL, MAX_PATH, output, &filepart, 1}, + {"", 0, NULL, NULL}, + {"", MAX_PATH, NULL, NULL}, + {"", MAX_PATH, output, NULL}, + {"", MAX_PATH, output, &filepart}, + }; + + SetLastError(0xdeadbeef); + ret = GetFullPathNameW(NULL, 0, NULL, NULL); + is_win9x = !ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED; + + if (is_win9x) + win_skip("Skipping some tests that cause GetFullPathNameA to crash on Win9x\n"); + + for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++) + { + if (is_win9x && invalid_parameters[i].win9x_crash) + continue; + + SetLastError(0xdeadbeef); + strcpy(output, "deadbeef"); + filepart = (char *)0xdeadbeef; + ret = GetFullPathNameA(invalid_parameters[i].name, + invalid_parameters[i].len, + invalid_parameters[i].buffer, + invalid_parameters[i].lastpart); + ok(!ret, "[%d] Expected GetFullPathNameA to return 0, got %u\n", i, ret); + ok(!strcmp(output, "deadbeef"), "[%d] Expected the output buffer to be unchanged, got \"%s\"\n", i, output); + ok(filepart == (char *)0xdeadbeef, "[%d] Expected output file part pointer to be untouched, got %p\n", i, filepart); + ok(GetLastError() == 0xdeadbeef || + GetLastError() == ERROR_BAD_PATHNAME || /* Win9x */ + GetLastError() == ERROR_INVALID_NAME, /* Win7 */ + "[%d] Expected GetLastError() to return 0xdeadbeef, got %u\n", + i, GetLastError()); + } +} + +static void test_GetFullPathNameW(void) +{ + static const WCHAR emptyW[] = {0}; + static const WCHAR deadbeefW[] = {'d','e','a','d','b','e','e','f',0}; + + WCHAR output[MAX_PATH], *filepart; + DWORD ret; + int i; + + const struct + { + LPCWSTR name; + DWORD len; + LPWSTR buffer; + LPWSTR *lastpart; + int win7_expect; + } invalid_parameters[] = + { + {NULL, 0, NULL, NULL}, + {NULL, 0, NULL, &filepart, 1}, + {NULL, MAX_PATH, NULL, NULL}, + {NULL, MAX_PATH, output, NULL}, + {NULL, MAX_PATH, output, &filepart, 1}, + {emptyW, 0, NULL, NULL}, + {emptyW, 0, NULL, &filepart, 1}, + {emptyW, MAX_PATH, NULL, NULL}, + {emptyW, MAX_PATH, output, NULL}, + {emptyW, MAX_PATH, output, &filepart, 1}, + }; + + SetLastError(0xdeadbeef); + ret = GetFullPathNameW(NULL, 0, NULL, NULL); + if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("GetFullPathNameW is not available\n"); + return; + } + + for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++) + { + SetLastError(0xdeadbeef); + lstrcpyW(output, deadbeefW); + filepart = (WCHAR *)0xdeadbeef; + ret = GetFullPathNameW(invalid_parameters[i].name, + invalid_parameters[i].len, + invalid_parameters[i].buffer, + invalid_parameters[i].lastpart); + ok(!ret, "[%d] Expected GetFullPathNameW to return 0, got %u\n", i, ret); + ok(!lstrcmpW(output, deadbeefW), "[%d] Expected the output buffer to be unchanged, got %s\n", i, wine_dbgstr_w(output)); + ok(filepart == (WCHAR *)0xdeadbeef || + (invalid_parameters[i].win7_expect && filepart == NULL), + "[%d] Expected output file part pointer to be untouched, got %p\n", i, filepart); + ok(GetLastError() == 0xdeadbeef || + GetLastError() == ERROR_INVALID_NAME, /* Win7 */ + "[%d] Expected GetLastError() to return 0xdeadbeef, got %u\n", + i, GetLastError()); + } +} + static void init_pointers(void) { HMODULE hKernel32 = GetModuleHandleA("kernel32.dll"); @@ -1601,8 +1715,7 @@ START_TEST(path) test_CleanupPathA(origdir,curdir); test_GetTempPath(); test_GetLongPathNameA(); - skip("skipping test_GetLongPathNameW(), bug 5370\n"); - //test_GetLongPathNameW(); + test_GetLongPathNameW(); test_GetShortPathNameW(); test_GetSystemDirectory(); test_GetWindowsDirectory(); @@ -1611,4 +1724,6 @@ START_TEST(path) test_drive_letter_case(); test_SearchPathA(); test_SearchPathW(); + test_GetFullPathNameA(); + test_GetFullPathNameW(); } diff --git a/rostests/winetests/kernel32/pipe.c b/rostests/winetests/kernel32/pipe.c index 948c704e99e..f5a56c6d1ea 100755 --- a/rostests/winetests/kernel32/pipe.c +++ b/rostests/winetests/kernel32/pipe.c @@ -547,28 +547,36 @@ static DWORD CALLBACK serverThreadMain3(LPVOID arg) oOverlap.hEvent = hEvent; /* Wait for client to connect */ - trace("Server calling overlapped ConnectNamedPipe...\n"); - success = ConnectNamedPipe(hnp, &oOverlap); - err = GetLastError(); - ok(!success && (err == ERROR_IO_PENDING || err == ERROR_PIPE_CONNECTED), "overlapped ConnectNamedPipe\n"); - trace("overlapped ConnectNamedPipe returned.\n"); - if (!success && (err == ERROR_IO_PENDING)) { - if (letWFSOEwait) - { - DWORD ret; - do { - ret = WaitForSingleObjectEx(hEvent, INFINITE, TRUE); - } while (ret == WAIT_IO_COMPLETION); - ok(ret == 0, "wait ConnectNamedPipe returned %x\n", ret); - } - success = GetOverlappedResult(hnp, &oOverlap, &dummy, letGORwait); - if (!letGORwait && !letWFSOEwait && !success) { - ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n"); - success = GetOverlappedResult(hnp, &oOverlap, &dummy, TRUE); + if (i == 0) { + trace("Server calling non-overlapped ConnectNamedPipe on overlapped pipe...\n"); + success = ConnectNamedPipe(hnp, NULL); + err = GetLastError(); + ok(success || (err == ERROR_PIPE_CONNECTED), "ConnectNamedPipe failed: %d\n", err); + trace("ConnectNamedPipe operation complete.\n"); + } else { + trace("Server calling overlapped ConnectNamedPipe...\n"); + success = ConnectNamedPipe(hnp, &oOverlap); + err = GetLastError(); + ok(!success && (err == ERROR_IO_PENDING || err == ERROR_PIPE_CONNECTED), "overlapped ConnectNamedPipe\n"); + trace("overlapped ConnectNamedPipe returned.\n"); + if (!success && (err == ERROR_IO_PENDING)) { + if (letWFSOEwait) + { + DWORD ret; + do { + ret = WaitForSingleObjectEx(hEvent, INFINITE, TRUE); + } while (ret == WAIT_IO_COMPLETION); + ok(ret == 0, "wait ConnectNamedPipe returned %x\n", ret); + } + success = GetOverlappedResult(hnp, &oOverlap, &dummy, letGORwait); + if (!letGORwait && !letWFSOEwait && !success) { + ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n"); + success = GetOverlappedResult(hnp, &oOverlap, &dummy, TRUE); + } } + ok(success || (err == ERROR_PIPE_CONNECTED), "GetOverlappedResult ConnectNamedPipe\n"); + trace("overlapped ConnectNamedPipe operation complete.\n"); } - ok(success || (err == ERROR_PIPE_CONNECTED), "GetOverlappedResult ConnectNamedPipe\n"); - trace("overlapped ConnectNamedPipe operation complete.\n"); /* Echo bytes once */ memset(buf, 0, sizeof(buf)); @@ -794,33 +802,39 @@ static void test_NamedPipe_2(void) DWORD alarmThreadId; trace("test_NamedPipe_2 starting\n"); - /* Set up a ten second timeout */ + /* Set up a twenty second timeout */ alarm_event = CreateEvent( NULL, TRUE, FALSE, NULL ); - alarmThread = CreateThread(NULL, 0, alarmThreadMain, (void *) 10000, 0, &alarmThreadId); + SetLastError(0xdeadbeef); + alarmThread = CreateThread(NULL, 0, alarmThreadMain, (void *) 20000, 0, &alarmThreadId); + ok(alarmThread != NULL, "CreateThread failed: %d\n", GetLastError()); - /* The servers we're about to exercize do try to clean up carefully, - * but to reduce the change of a test failure due to a pipe handle + /* The servers we're about to exercise do try to clean up carefully, + * but to reduce the chance of a test failure due to a pipe handle * leak in the test code, we'll use a different pipe name for each server. */ /* Try server #1 */ + SetLastError(0xdeadbeef); serverThread = CreateThread(NULL, 0, serverThreadMain1, (void *)8, 0, &serverThreadId); - ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); + ok(serverThread != NULL, "CreateThread failed: %d\n", GetLastError()); exercizeServer(PIPENAME "serverThreadMain1", serverThread); /* Try server #2 */ + SetLastError(0xdeadbeef); serverThread = CreateThread(NULL, 0, serverThreadMain2, 0, 0, &serverThreadId); - ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); + ok(serverThread != NULL, "CreateThread failed: %d\n", GetLastError()); exercizeServer(PIPENAME "serverThreadMain2", serverThread); /* Try server #3 */ + SetLastError(0xdeadbeef); serverThread = CreateThread(NULL, 0, serverThreadMain3, 0, 0, &serverThreadId); - ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); + ok(serverThread != NULL, "CreateThread failed: %d\n", GetLastError()); exercizeServer(PIPENAME "serverThreadMain3", serverThread); /* Try server #4 */ + SetLastError(0xdeadbeef); serverThread = CreateThread(NULL, 0, serverThreadMain4, 0, 0, &serverThreadId); - ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); + ok(serverThread != NULL, "CreateThread failed: %d\n", GetLastError()); exercizeServer(PIPENAME "serverThreadMain4", serverThread); ok(SetEvent( alarm_event ), "SetEvent\n"); diff --git a/rostests/winetests/kernel32/process.c b/rostests/winetests/kernel32/process.c index 7b5ac757dd2..b4a048a14ac 100755 --- a/rostests/winetests/kernel32/process.c +++ b/rostests/winetests/kernel32/process.c @@ -55,6 +55,8 @@ } while (0) static HINSTANCE hkernel32; +static void (WINAPI *pGetNativeSystemInfo)(LPSYSTEM_INFO); +static BOOL (WINAPI *pIsWow64Process)(HANDLE,PBOOL); static LPVOID (WINAPI *pVirtualAllocEx)(HANDLE, LPVOID, SIZE_T, DWORD, DWORD); static BOOL (WINAPI *pVirtualFreeEx)(HANDLE, LPVOID, SIZE_T, DWORD); static BOOL (WINAPI *pQueryFullProcessImageNameA)(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize); @@ -194,6 +196,8 @@ static int init(void) if ((p = strrchr(exename, '/')) != NULL) exename = p + 1; hkernel32 = GetModuleHandleA("kernel32"); + pGetNativeSystemInfo = (void *) GetProcAddress(hkernel32, "GetNativeSystemInfo"); + pIsWow64Process = (void *) GetProcAddress(hkernel32, "IsWow64Process"); pVirtualAllocEx = (void *) GetProcAddress(hkernel32, "VirtualAllocEx"); pVirtualFreeEx = (void *) GetProcAddress(hkernel32, "VirtualFreeEx"); pQueryFullProcessImageNameA = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameA"); @@ -523,6 +527,7 @@ static void test_Startup(void) char buffer[MAX_PATH]; PROCESS_INFORMATION info; STARTUPINFOA startup,si; + char *result; static CHAR title[] = "I'm the title string", desktop[] = "winsta0\\default", empty[] = ""; @@ -656,7 +661,7 @@ static void test_Startup(void) WritePrivateProfileStringA(NULL, NULL, NULL, resfile); okChildInt("StartupInfoA", "cb", startup.cb); - todo_wine okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); okChildString("StartupInfoA", "lpTitle", startup.lpTitle); okChildInt("StartupInfoA", "dwX", startup.dwX); okChildInt("StartupInfoA", "dwY", startup.dwY); @@ -695,8 +700,9 @@ static void test_Startup(void) okChildInt("StartupInfoA", "cb", startup.cb); okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); - ok (startup.lpTitle == NULL || !strcmp(startup.lpTitle, selfname), - "StartupInfoA:lpTitle expected '%s' or null, got '%s'\n", selfname, startup.lpTitle); + result = getChildString( "StartupInfoA", "lpTitle" ); + ok( broken(!result) || (result && !strCmp( result, selfname, 0 )), + "expected '%s' or null, got '%s'\n", selfname, result ); okChildInt("StartupInfoA", "dwX", startup.dwX); okChildInt("StartupInfoA", "dwY", startup.dwY); okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); @@ -734,7 +740,7 @@ static void test_Startup(void) okChildInt("StartupInfoA", "cb", startup.cb); okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); - todo_wine okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildString("StartupInfoA", "lpTitle", startup.lpTitle); okChildInt("StartupInfoA", "dwX", startup.dwX); okChildInt("StartupInfoA", "dwY", startup.dwY); okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); @@ -771,8 +777,8 @@ static void test_Startup(void) WritePrivateProfileStringA(NULL, NULL, NULL, resfile); okChildInt("StartupInfoA", "cb", startup.cb); - todo_wine okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); - todo_wine okChildString("StartupInfoA", "lpTitle", startup.lpTitle); + okChildString("StartupInfoA", "lpDesktop", startup.lpDesktop); + okChildString("StartupInfoA", "lpTitle", startup.lpTitle); okChildInt("StartupInfoA", "dwX", startup.dwX); okChildInt("StartupInfoA", "dwY", startup.dwY); okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); @@ -794,7 +800,6 @@ static void test_CommandLine(void) char buffer2[MAX_PATH]; PROCESS_INFORMATION info; STARTUPINFOA startup; - DWORD len; BOOL ret; memset(&startup, 0, sizeof(startup)); @@ -873,7 +878,7 @@ static void test_CommandLine(void) assert(DeleteFileA(resfile) != 0); get_file_name(resfile); - len = GetFullPathNameA(selfname, MAX_PATH, fullpath, &lpFilePart); + GetFullPathNameA(selfname, MAX_PATH, fullpath, &lpFilePart); assert ( lpFilePart != 0); *(lpFilePart -1 ) = 0; p = strrchr(fullpath, '\\'); @@ -895,7 +900,7 @@ static void test_CommandLine(void) /* Using AppName */ get_file_name(resfile); - len = GetFullPathNameA(selfname, MAX_PATH, fullpath, &lpFilePart); + GetFullPathNameA(selfname, MAX_PATH, fullpath, &lpFilePart); assert ( lpFilePart != 0); *(lpFilePart -1 ) = 0; p = strrchr(fullpath, '\\'); @@ -1182,6 +1187,7 @@ static void test_SuspendFlag(void) PROCESS_INFORMATION info; STARTUPINFOA startup, us; DWORD exit_status; + char *result; /* let's start simplistic */ memset(&startup, 0, sizeof(startup)); @@ -1207,8 +1213,9 @@ static void test_SuspendFlag(void) okChildInt("StartupInfoA", "cb", startup.cb); okChildString("StartupInfoA", "lpDesktop", us.lpDesktop); - ok (startup.lpTitle == NULL || !strcmp(startup.lpTitle, selfname), - "StartupInfoA:lpTitle expected '%s' or null, got '%s'\n", selfname, startup.lpTitle); + result = getChildString( "StartupInfoA", "lpTitle" ); + ok( broken(!result) || (result && !strCmp( result, selfname, 0 )), + "expected '%s' or null, got '%s'\n", selfname, result ); okChildInt("StartupInfoA", "dwX", startup.dwX); okChildInt("StartupInfoA", "dwY", startup.dwY); okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); @@ -1230,6 +1237,7 @@ static void test_DebuggingFlag(void) STARTUPINFOA startup, us; DEBUG_EVENT de; unsigned dbg = 0; + char *result; /* let's start simplistic */ memset(&startup, 0, sizeof(startup)); @@ -1267,8 +1275,9 @@ static void test_DebuggingFlag(void) okChildInt("StartupInfoA", "cb", startup.cb); okChildString("StartupInfoA", "lpDesktop", us.lpDesktop); - ok (startup.lpTitle == NULL || !strcmp(startup.lpTitle, selfname), - "StartupInfoA:lpTitle expected '%s' or null, got '%s'\n", selfname, startup.lpTitle); + result = getChildString( "StartupInfoA", "lpTitle" ); + ok( broken(!result) || (result && !strCmp( result, selfname, 0 )), + "expected '%s' or null, got '%s'\n", selfname, result ); okChildInt("StartupInfoA", "dwX", startup.dwX); okChildInt("StartupInfoA", "dwY", startup.dwY); okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); @@ -1301,6 +1310,7 @@ static void test_Console(void) const char* msg = "This is a std-handle inheritance test."; unsigned msg_len; BOOL run_tests = TRUE; + char *result; memset(&startup, 0, sizeof(startup)); startup.cb = sizeof(startup); @@ -1378,8 +1388,9 @@ static void test_Console(void) okChildInt("StartupInfoA", "cb", startup.cb); okChildString("StartupInfoA", "lpDesktop", us.lpDesktop); - ok (startup.lpTitle == NULL || !strcmp(startup.lpTitle, selfname), - "StartupInfoA:lpTitle expected '%s' or null, got '%s'\n", selfname, startup.lpTitle); + result = getChildString( "StartupInfoA", "lpTitle" ); + ok( broken(!result) || (result && !strCmp( result, selfname, 0 )), + "expected '%s' or null, got '%s'\n", selfname, result ); okChildInt("StartupInfoA", "dwX", startup.dwX); okChildInt("StartupInfoA", "dwY", startup.dwY); okChildInt("StartupInfoA", "dwXSize", startup.dwXSize); @@ -1739,6 +1750,7 @@ static void test_ProcessName(void) static void test_Handles(void) { HANDLE handle = GetCurrentProcess(); + HANDLE h2, h3; BOOL ret; DWORD code; @@ -1766,6 +1778,57 @@ static void test_Handles(void) ok( !ret, "GetExitCodeProcess succeeded for %p\n", handle ); ok( GetLastError() == ERROR_INVALID_HANDLE, "wrong error %u\n", GetLastError() ); #endif + + handle = GetStdHandle( STD_ERROR_HANDLE ); + ok( handle != 0, "handle %p\n", handle ); + DuplicateHandle( GetCurrentProcess(), handle, GetCurrentProcess(), &h3, + 0, TRUE, DUPLICATE_SAME_ACCESS ); + SetStdHandle( STD_ERROR_HANDLE, h3 ); + CloseHandle( (HANDLE)STD_ERROR_HANDLE ); + h2 = GetStdHandle( STD_ERROR_HANDLE ); + ok( h2 == 0 || + broken( h2 == h3) || /* nt4, w2k */ + broken( h2 == INVALID_HANDLE_VALUE), /* win9x */ + "wrong handle %p/%p\n", h2, h3 ); + SetStdHandle( STD_ERROR_HANDLE, handle ); +} + +static void test_SystemInfo(void) +{ + SYSTEM_INFO si, nsi; + BOOL is_wow64; + + if (!pGetNativeSystemInfo) + { + win_skip("GetNativeSystemInfo is not available\n"); + return; + } + + if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE; + + GetSystemInfo(&si); + pGetNativeSystemInfo(&nsi); + if (is_wow64) + { + if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) + { + ok(nsi.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64, + "Expected PROCESSOR_ARCHITECTURE_AMD64, got %d\n", + nsi.wProcessorArchitecture); + ok(nsi.dwProcessorType == PROCESSOR_AMD_X8664, + "Expected PROCESSOR_AMD_X8664, got %d\n", + nsi.dwProcessorType); + } + } + else + { + ok(si.wProcessorArchitecture == nsi.wProcessorArchitecture, + "Expected no difference for wProcessorArchitecture, got %d and %d\n", + si.wProcessorArchitecture, nsi.wProcessorArchitecture); + ok(si.dwProcessorType == nsi.dwProcessorType, + "Expected no difference for dwProcessorType, got %d and %d\n", + si.dwProcessorType, nsi.dwProcessorType); + } } START_TEST(process) @@ -1792,6 +1855,7 @@ START_TEST(process) test_ProcessNameA(); test_ProcessName(); test_Handles(); + test_SystemInfo(); /* things that can be tested: * lookup: check the way program to be executed is searched * handles: check the handle inheritance stuff (+sec options) diff --git a/rostests/winetests/kernel32/thread.c b/rostests/winetests/kernel32/thread.c index 4c4e764939d..3da29a2c6c7 100755 --- a/rostests/winetests/kernel32/thread.c +++ b/rostests/winetests/kernel32/thread.c @@ -1329,6 +1329,89 @@ static void test_ThreadErrorMode(void) pSetThreadErrorMode(oldmode, NULL); } +void _fpreset(void) {} /* override the mingw fpu init code */ + +static inline void set_fpu_cw(WORD cw) +{ +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + __asm__ volatile ("fnclex; fldcw %0" : : "m" (cw)); +#endif +} + +static inline WORD get_fpu_cw(void) +{ + WORD cw = 0; +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + __asm__ volatile ("fnstcw %0" : "=m" (cw)); +#endif + return cw; +} + +struct fpu_thread_ctx +{ + WORD cw; + HANDLE finished; +}; + +static DWORD WINAPI fpu_thread(void *param) +{ + struct fpu_thread_ctx *ctx = param; + BOOL ret; + + ctx->cw = get_fpu_cw(); + + ret = SetEvent(ctx->finished); + ok(ret, "SetEvent failed, last error %#x.\n", GetLastError()); + + return 0; +} + +static WORD get_thread_fpu_cw(void) +{ + struct fpu_thread_ctx ctx; + DWORD tid, res; + HANDLE thread; + + ctx.finished = CreateEvent(NULL, FALSE, FALSE, NULL); + ok(!!ctx.finished, "Failed to create event, last error %#x.\n", GetLastError()); + + thread = CreateThread(NULL, 0, fpu_thread, &ctx, 0, &tid); + ok(!!thread, "Failed to create thread, last error %#x.\n", GetLastError()); + + res = WaitForSingleObject(ctx.finished, INFINITE); + ok(res == WAIT_OBJECT_0, "Wait failed (%#x), last error %#x.\n", res, GetLastError()); + + res = CloseHandle(ctx.finished); + ok(!!res, "Failed to close event handle, last error %#x.\n", GetLastError()); + + return ctx.cw; +} + +static void test_thread_fpu_cw(void) +{ + WORD initial_cw, cw; + + initial_cw = get_fpu_cw(); + ok(initial_cw == 0x27f, "Expected FPU control word 0x27f, got %#x.\n", initial_cw); + + cw = get_thread_fpu_cw(); + ok(cw == 0x27f, "Expected FPU control word 0x27f, got %#x.\n", cw); + + set_fpu_cw(0xf60); + cw = get_fpu_cw(); + ok(cw == 0xf60, "Expected FPU control word 0xf60, got %#x.\n", cw); + + cw = get_thread_fpu_cw(); + ok(cw == 0x27f, "Expected FPU control word 0x27f, got %#x.\n", cw); + + cw = get_fpu_cw(); + ok(cw == 0xf60, "Expected FPU control word 0xf60, got %#x.\n", cw); + + set_fpu_cw(initial_cw); + cw = get_fpu_cw(); + ok(cw == initial_cw, "Expected FPU control word %#x, got %#x.\n", initial_cw, cw); +} + START_TEST(thread) { HINSTANCE lib; @@ -1401,4 +1484,7 @@ START_TEST(thread) test_RegisterWaitForSingleObject(); test_TLS(); test_ThreadErrorMode(); +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + test_thread_fpu_cw(); +#endif } diff --git a/rostests/winetests/kernel32/version.c b/rostests/winetests/kernel32/version.c index 5805e32f6e2..5151170665c 100644 --- a/rostests/winetests/kernel32/version.c +++ b/rostests/winetests/kernel32/version.c @@ -101,9 +101,9 @@ static void test_GetVersionEx(void) static void test_VerifyVersionInfo(void) { - OSVERSIONINFOEX info = { sizeof(info) }; + OSVERSIONINFOEX info; BOOL ret; - DWORD servicepack; + DWORD servicepack, error; if(!pVerifyVersionInfoA || !pVerSetConditionMask) { @@ -114,21 +114,24 @@ static void test_VerifyVersionInfo(void) /* Before we start doing some tests we should check what the version of * the ServicePack is. Tests on a box with no ServicePack will fail otherwise. */ - GetVersionEx((OSVERSIONINFO *)&info); + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + GetVersionExA((OSVERSIONINFO *)&info); servicepack = info.wServicePackMajor; memset(&info, 0, sizeof(info)); - info.dwOSVersionInfoSize = sizeof(info); ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION, pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)); ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + SetLastError(0xdeadbeef); ret = pVerifyVersionInfoA(&info, VER_BUILDNUMBER | VER_MAJORVERSION | VER_MINORVERSION/* | VER_PLATFORMID | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR | VER_SUITENAME | VER_PRODUCT_TYPE */, pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)); - ok(!ret && (GetLastError() == ERROR_OLD_WIN_VERSION), - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); + error = GetLastError(); + ok(!ret, "VerifyVersionInfoA succeeded\n"); + ok(error == ERROR_OLD_WIN_VERSION, + "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); /* tests special handling of VER_SUITENAME */ @@ -163,22 +166,17 @@ static void test_VerifyVersionInfo(void) ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL), VER_MAJORVERSION, VER_GREATER_EQUAL)); - if (servicepack == 0) - { - ok(!ret || broken(ret), /* win2k3 */ - "VerifyVersionInfoA should have failed\n"); - ok(GetLastError() == ERROR_OLD_WIN_VERSION, - "Expected ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); - } - else - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.wServicePackMinor++; + SetLastError(0xdeadbeef); ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(!ret && (GetLastError() == ERROR_OLD_WIN_VERSION), - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); + error = GetLastError(); + ok(!ret, "VerifyVersionInfoA succeeded\n"); + ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some wink2 */, + "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); if (servicepack == 0) { @@ -186,83 +184,107 @@ static void test_VerifyVersionInfo(void) } else { + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.wServicePackMajor--; ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.wServicePackMajor--; ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); } + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.wServicePackMajor++; ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.wServicePackMajor++; ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS_EQUAL)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.wServicePackMajor--; + SetLastError(0xdeadbeef); ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL)); - ok(!ret && (GetLastError() == ERROR_OLD_WIN_VERSION), - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); + error = GetLastError(); + ok(!ret, "VerifyVersionInfoA succeeded\n"); + ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, + "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); /* test the failure hierarchy for the four version fields */ + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.wServicePackMajor++; + SetLastError(0xdeadbeef); ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(!ret && (GetLastError() == ERROR_OLD_WIN_VERSION), - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); + error = GetLastError(); + ok(!ret, "VerifyVersionInfoA succeeded\n"); + ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, + "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.dwMinorVersion++; + SetLastError(0xdeadbeef); ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(!ret && (GetLastError() == ERROR_OLD_WIN_VERSION), - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); + error = GetLastError(); + ok(!ret, "VerifyVersionInfoA succeeded\n"); + ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, + "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.dwMajorVersion++; + SetLastError(0xdeadbeef); ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(!ret && (GetLastError() == ERROR_OLD_WIN_VERSION), - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); + error = GetLastError(); + ok(!ret, "VerifyVersionInfoA succeeded\n"); + ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, + "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); - + ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.dwBuildNumber++; + SetLastError(0xdeadbeef); ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(!ret && (GetLastError() == ERROR_OLD_WIN_VERSION), - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); + error = GetLastError(); + ok(!ret, "VerifyVersionInfoA succeeded\n"); + ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, + "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); /* test bad dwOSVersionInfoSize */ + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&info); info.dwOSVersionInfoSize = 0; ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); } START_TEST(version) diff --git a/rostests/winetests/localspl/localmon.c b/rostests/winetests/localspl/localmon.c index 23a3608d649..413a95ab6a1 100644 --- a/rostests/winetests/localspl/localmon.c +++ b/rostests/winetests/localspl/localmon.c @@ -777,7 +777,6 @@ static void test_XcvDataPort_AddPort(void) { DWORD res; - /* * The following tests crash with native localspl.dll on w2k and xp, * but it works, when the native dll (w2k and xp) is used in wine. @@ -791,18 +790,17 @@ static void test_XcvDataPort_AddPort(void) /* create a Port for a normal, writable file */ SetLastError(0xdeadbeef); res = pXcvDataPort(hXcv, cmd_AddPortW, (PBYTE) tempfileW, (lstrlenW(tempfileW) + 1) * sizeof(WCHAR), NULL, 0, NULL); + ok( res == ERROR_SUCCESS, "returned %d with %u (expected ERROR_SUCCESS)\n", res, GetLastError()); /* add our testport again */ SetLastError(0xdeadbeef); res = pXcvDataPort(hXcv, cmd_AddPortW, (PBYTE) tempfileW, (lstrlenW(tempfileW) + 1) * sizeof(WCHAR), NULL, 0, NULL); + ok( res == ERROR_ALREADY_EXISTS, "returned %d with %u (expected ERROR_ALREADY_EXISTS)\n", res, GetLastError()); /* create a well-known Port */ SetLastError(0xdeadbeef); res = pXcvDataPort(hXcv, cmd_AddPortW, (PBYTE) portname_lpt1W, (lstrlenW(portname_lpt1W) + 1) * sizeof(WCHAR), NULL, 0, NULL); - - SetLastError(0xdeadbeef); - res = pXcvDataPort(hXcv, cmd_AddPortW, (PBYTE) portname_lpt1W, (lstrlenW(portname_lpt1W) + 1) * sizeof(WCHAR), NULL, 0, NULL); - /* native localspl.dll on wine: ERROR_ALREADY_EXISTS */ + ok( res == ERROR_ALREADY_EXISTS, "returned %d with %u (expected ERROR_ALREADY_EXISTS)\n", res, GetLastError()); /* ERROR_ALREADY_EXISTS is also returned from native localspl.dll on wine, when "RPT1:" was already installed for redmonnt.dll: @@ -812,6 +810,7 @@ static void test_XcvDataPort_AddPort(void) /* cleanup */ SetLastError(0xdeadbeef); res = pXcvDataPort(hXcv, cmd_DeletePortW, (PBYTE) tempfileW, (lstrlenW(tempfileW) + 1) * sizeof(WCHAR), NULL, 0, NULL); + ok( res == ERROR_SUCCESS, "returned %d with %u (expected ERROR_SUCCESS)\n", res, GetLastError()); } } diff --git a/rostests/winetests/msacm32/msacm.c b/rostests/winetests/msacm32/msacm.c index b68ff8c2aa7..a961067d71a 100644 --- a/rostests/winetests/msacm32/msacm.c +++ b/rostests/winetests/msacm32/msacm.c @@ -423,7 +423,7 @@ static const char * get_metric(UINT uMetric) return "UNKNOWN"; } -static DWORD check_count(UINT uMetric) +static void check_count(UINT uMetric) { DWORD dwMetric; MMRESULT rc; @@ -452,14 +452,11 @@ static DWORD check_count(UINT uMetric) if (rc == MMSYSERR_NOERROR && winetest_interactive) trace("%s: %u\n", get_metric(uMetric), dwMetric); - - return dwMetric; } static void msacm_tests(void) { MMRESULT rc; - DWORD dwCount; DWORD dwACMVersion = acmGetVersion(); if (winetest_interactive) { @@ -470,17 +467,17 @@ static void msacm_tests(void) LOWORD(dwACMVersion) == 0 ? " (Retail)" : ""); } - dwCount = check_count(ACM_METRIC_COUNT_CODECS); - dwCount = check_count(ACM_METRIC_COUNT_CONVERTERS); - dwCount = check_count(ACM_METRIC_COUNT_DISABLED); - dwCount = check_count(ACM_METRIC_COUNT_DRIVERS); - dwCount = check_count(ACM_METRIC_COUNT_FILTERS); - dwCount = check_count(ACM_METRIC_COUNT_HARDWARE); - dwCount = check_count(ACM_METRIC_COUNT_LOCAL_CODECS); - dwCount = check_count(ACM_METRIC_COUNT_LOCAL_CONVERTERS); - dwCount = check_count(ACM_METRIC_COUNT_LOCAL_DISABLED); - dwCount = check_count(ACM_METRIC_COUNT_LOCAL_DRIVERS); - dwCount = check_count(ACM_METRIC_COUNT_LOCAL_FILTERS); + check_count(ACM_METRIC_COUNT_CODECS); + check_count(ACM_METRIC_COUNT_CONVERTERS); + check_count(ACM_METRIC_COUNT_DISABLED); + check_count(ACM_METRIC_COUNT_DRIVERS); + check_count(ACM_METRIC_COUNT_FILTERS); + check_count(ACM_METRIC_COUNT_HARDWARE); + check_count(ACM_METRIC_COUNT_LOCAL_CODECS); + check_count(ACM_METRIC_COUNT_LOCAL_CONVERTERS); + check_count(ACM_METRIC_COUNT_LOCAL_DISABLED); + check_count(ACM_METRIC_COUNT_LOCAL_DRIVERS); + check_count(ACM_METRIC_COUNT_LOCAL_FILTERS); if (winetest_interactive) trace("enabled drivers:\n"); diff --git a/rostests/winetests/mscms/profile.c b/rostests/winetests/mscms/profile.c index 100c15c4f1f..91ae97a0912 100644 --- a/rostests/winetests/mscms/profile.c +++ b/rostests/winetests/mscms/profile.c @@ -453,148 +453,7 @@ static void test_GetCountColorProfileElements(void) } } -typedef struct colorspace_description_struct { - DWORD dwID; - const char *szName; - BOOL registered; - char filename[MAX_PATH]; -} colorspace_descr; - -#define describe_colorspace(id) {id, #id, FALSE, ""} - -colorspace_descr known_colorspaces[] = { - describe_colorspace(SPACE_XYZ), - describe_colorspace(SPACE_Lab), - describe_colorspace(SPACE_Luv), - describe_colorspace(SPACE_YCbCr), - describe_colorspace(SPACE_Yxy), - describe_colorspace(SPACE_RGB), - describe_colorspace(SPACE_GRAY), - describe_colorspace(SPACE_HSV), - describe_colorspace(SPACE_HLS), - describe_colorspace(SPACE_CMYK), - describe_colorspace(SPACE_CMY), - describe_colorspace(SPACE_2_CHANNEL), - describe_colorspace(SPACE_3_CHANNEL), - describe_colorspace(SPACE_4_CHANNEL), - describe_colorspace(SPACE_5_CHANNEL), - describe_colorspace(SPACE_6_CHANNEL), - describe_colorspace(SPACE_7_CHANNEL), - describe_colorspace(SPACE_8_CHANNEL) -}; - -static void enum_registered_color_profiles(void) -{ - BOOL ret; - DWORD size, count, i, present; - CHAR profile[MAX_PATH]; - - size = sizeof(profile); - count = sizeof(known_colorspaces)/sizeof(known_colorspaces[0]); - - present = 0; - trace("\n"); - trace("Querying registered standard colorspace profiles via GetStandardColorSpaceProfileA():\n"); - for (i=0; i #include #include +#include #include "wine/test.h" @@ -56,6 +57,8 @@ static const char *mstfile = "winetest.mst"; static CHAR CURR_DIR[MAX_PATH]; static CHAR PROG_FILES_DIR[MAX_PATH]; static CHAR COMMON_FILES_DIR[MAX_PATH]; +static CHAR APP_DATA_DIR[MAX_PATH]; +static CHAR WINDOWS_DIR[MAX_PATH]; /* msi database data */ @@ -209,6 +212,28 @@ static const CHAR aup2_property_dat[] = "Property\tValue\n" "SERVNAME\tTestService\n" "SERVDISP\tTestServiceDisp\n"; +static const CHAR icon_property_dat[] = "Property\tValue\n" + "s72\tl0\n" + "Property\tProperty\n" + "DefaultUIFont\tDlgFont8\n" + "HASUIRUN\t0\n" + "INSTALLLEVEL\t3\n" + "InstallMode\tTypical\n" + "Manufacturer\tWine\n" + "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" + "ProductCode\t{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}\n" + "ProductID\tnone\n" + "ProductLanguage\t1033\n" + "ProductName\tMSITEST\n" + "ProductVersion\t1.1.1\n" + "PROMPTROLLBACKCOST\tP\n" + "Setup\tSetup\n" + "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" + "AdminProperties\tPOSTADMIN\n" + "ROOTDRIVE\tC:\\\n" + "SERVNAME\tTestService\n" + "SERVDISP\tTestServiceDisp\n"; + static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n" "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n" "Shortcut\tShortcut\n" @@ -1310,9 +1335,14 @@ static const CHAR odbc_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "CostFinalize\t\t1000\n" "InstallValidate\t\t1400\n" "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" "InstallODBC\t\t3000\n" "RemoveODBC\t\t3100\n" + "RemoveFiles\t\t3900\n" "InstallFiles\t\t4000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" "InstallFinalize\t\t6000\n"; static const CHAR odbc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" @@ -1408,6 +1438,63 @@ static const CHAR crs_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "PublishProduct\t\t5200\n" "InstallFinalize\t\t6000\n"; +static const CHAR fo_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "override.txt\toverride\toverride.txt\t1000\t\t\t8192\t1\n" + "preselected.txt\tpreselected\tpreselected.txt\t1000\t\t\t8192\t2\n" + "notpreselected.txt\tnotpreselected\tnotpreselected.txt\t1000\t\t\t8192\t3\n"; + +static const CHAR fo_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "override\t\t\toverride feature\t1\t1\tMSITESTDIR\t0\n" + "preselected\t\t\tpreselected feature\t1\t1\tMSITESTDIR\t0\n" + "notpreselected\t\t\tnotpreselected feature\t1\t1\tMSITESTDIR\t0\n"; + +static const CHAR fo_condition_dat[] = "Feature_\tLevel\tCondition\n" + "s38\ti2\tS255\n" + "Condition\tFeature_\tLevel\n" + "preselected\t0\tPreselected\n" + "notpreselected\t0\tNOT Preselected\n"; + +static const CHAR fo_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "override\toverride\n" + "preselected\tpreselected\n" + "notpreselected\tnotpreselected\n"; + +static const CHAR fo_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "override\t{0A00FB1D-97B0-4B42-ADF0-BB8913416623}\tMSITESTDIR\t0\t\toverride.txt\n" + "preselected\t{44E1DB75-605A-43DD-8CF5-CAB17F1BBD60}\tMSITESTDIR\t0\t\tpreselected.txt\n" + "notpreselected\t{E1647733-5E75-400A-A92E-5E60B4D4EF9F}\tMSITESTDIR\t0\t\tnotpreselected.txt\n"; + +static const CHAR fo_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" + "s72\ti2\tS64\tS0\tS255\n" + "CustomAction\tAction\n" + "SetPreselected\t51\tPreselected\t1\t\n"; + +static const CHAR fo_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "SetPreselected\tpreselect=1\t200\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + static const CHAR pub_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" "File\tFile\n" @@ -1452,6 +1539,409 @@ static const CHAR pub_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "PublishProduct\t\t5200\n" "InstallFinalize\t\t6000\n"; +static const CHAR rd_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "original.txt\tduplicate\toriginal.txt\t1000\t\t\t8192\t1\n" + "original2.txt\tduplicate\toriginal2.txt\t1000\t\t\t8192\t2\n" + "original3.txt\tduplicate2\toriginal3.txt\t1000\t\t\t8192\t3\n"; + +static const CHAR rd_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "duplicate\t\t\tduplicate feature\t1\t2\tMSITESTDIR\t0\n"; + +static const CHAR rd_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "duplicate\tduplicate\n"; + +static const CHAR rd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "duplicate\t{EB45D06A-ADFE-44E3-8D41-B7DE150E41AD}\tMSITESTDIR\t0\t\toriginal.txt\n" + "duplicate2\t{B8BA60E0-B2E9-488E-9D0E-E60F25F04F97}\tMSITESTDIR\t0\tDUPLICATE2=1\toriginal3.txt\n"; + +static const CHAR rd_duplicate_file_dat[] = "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n" + "s72\ts72\ts72\tS255\tS72\n" + "DuplicateFile\tFileKey\n" + "duplicate\tduplicate\toriginal.txt\tduplicate.txt\t\n" + "duplicate2\tduplicate\toriginal2.txt\t\tMSITESTDIR\n" + "duplicate3\tduplicate2\toriginal3.txt\tduplicate2.txt\t\n"; + +static const CHAR rd_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveDuplicateFiles\t\t1900\n" + "InstallFiles\t\t2000\n" + "DuplicateFiles\t\t2100\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const CHAR rrv_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "registry.txt\tregistry\tregistry.txt\t1000\t\t\t8192\t1\n"; + +static const CHAR rrv_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "registry\t\t\tregistry feature\t1\t2\tMSITESTDIR\t0\n"; + +static const CHAR rrv_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "registry\tregistry\n"; + +static const CHAR rrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "registry\t{DA97585B-962D-45EB-AD32-DA15E60CA9EE}\tMSITESTDIR\t0\t\tregistry.txt\n"; + +static const CHAR rrv_registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n" + "s72\ti2\tl255\tL255\tL0\ts72\n" + "Registry\tRegistry\n" + "reg1\t2\tSOFTWARE\\Wine\\keyA\t\tA\tregistry\n" + "reg2\t2\tSOFTWARE\\Wine\\keyA\tvalueA\tA\tregistry\n" + "reg3\t2\tSOFTWARE\\Wine\\key1\t-\t\tregistry\n"; + +static const CHAR rrv_remove_registry_dat[] = "RemoveRegistry\tRoot\tKey\tName\tComponent_\n" + "s72\ti2\tl255\tL255\ts72\n" + "RemoveRegistry\tRemoveRegistry\n" + "reg1\t2\tSOFTWARE\\Wine\\keyB\t\tregistry\n" + "reg2\t2\tSOFTWARE\\Wine\\keyB\tValueB\tregistry\n" + "reg3\t2\tSOFTWARE\\Wine\\key2\t-\tregistry\n"; + +static const CHAR rrv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RemoveRegistryValues\t\t3000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const CHAR frp_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "product.txt\tproduct\tproduct.txt\t1000\t\t\t8192\t1\n"; + +static const CHAR frp_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "product\t\t\tproduct feature\t1\t2\tMSITESTDIR\t0\n"; + +static const CHAR frp_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "product\tproduct\n"; + +static const CHAR frp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "product\t{44725EE0-EEA8-40BD-8162-A48224A2FEA1}\tMSITESTDIR\t0\t\tproduct.txt\n"; + +static const CHAR frp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" + "s72\ti2\tS64\tS0\tS255\n" + "CustomAction\tAction\n" + "TestProp\t19\t\t\tPROP set\n"; + +static const CHAR frp_upgrade_dat[] = "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n" + "s38\tS20\tS20\tS255\ti4\tS255\ts72\n" + "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n" + "{4C0EAA15-0264-4E5A-8758-609EF142B92D}\t1.1.1\t2.2.2\t\t768\t\tPROP\n"; + +static const CHAR frp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "FindRelatedProducts\t\t50\n" + "TestProp\tPROP AND NOT REMOVE\t51\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const CHAR riv_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "inifile.txt\tinifile\tinifile.txt\t1000\t\t\t8192\t1\n"; + +static const CHAR riv_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "inifile\t\t\tinifile feature\t1\t2\tMSITESTDIR\t0\n"; + +static const CHAR riv_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "inifile\tinifile\n"; + +static const CHAR riv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "inifile\t{A0F15705-4F57-4437-88C4-6C8B37ACC6DE}\tMSITESTDIR\t0\t\tinifile.txt\n"; + +static const CHAR riv_ini_file_dat[] = "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n" + "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n" + "IniFile\tIniFile\n" + "inifile1\ttest.ini\tMSITESTDIR\tsection1\tkey1\tvalue1\t0\tinifile\n"; + +static const CHAR riv_remove_ini_file_dat[] = "RemoveIniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n" + "s72\tl255\tS72\tl96\tl128\tL255\ti2\ts72\n" + "RemoveIniFile\tRemoveIniFile\n" + "inifile1\ttest.ini\tMSITESTDIR\tsectionA\tkeyA\tvalueA\t2\tinifile\n"; + +static const CHAR riv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RemoveIniValues\t\t3000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const CHAR res_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "envvar.txt\tenvvar\tenvvar.txt\t1000\t\t\t8192\t1\n"; + +static const CHAR res_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "envvar\t\t\tenvvar feature\t1\t2\tMSITESTDIR\t0\n"; + +static const CHAR res_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "envvar\tenvvar\n"; + +static const CHAR res_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "envvar\t{45EE9AF4-E5D1-445F-8BB7-B22D4EEBD29E}\tMSITESTDIR\t0\t\tenvvar.txt\n"; + +static const CHAR res_environment_dat[] = "Environment\tName\tValue\tComponent_\n" + "s72\tl255\tL255\ts72\n" + "Environment\tEnvironment\n" + "var1\t=-MSITESTVAR1\t1\tenvvar\n" + "var2\t=+-MSITESTVAR2\t1\tenvvar\n" + "var3\t=MSITESTVAR3\t1\tenvvar\n" + "var4\t=-MSITESTVAR4\t\tenvvar\n" + "var5\t=MSITESTVAR5\t\tenvvar\n"; + +static const CHAR res_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RemoveEnvironmentStrings\t\t3000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const CHAR rci_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "class.txt\tclass\tclass.txt\t1000\t\t\t8192\t1\n"; + +static const CHAR rci_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "class\t\t\tclass feature\t1\t2\tMSITESTDIR\t0\n"; + +static const CHAR rci_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "class\tclass\n"; + +static const CHAR rci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "class\t{89A98345-F8A1-422E-A48B-0250B5809F2D}\tMSITESTDIR\t0\t\tclass.txt\n"; + +static const CHAR rci_appid_dat[] = "AppId\tRemoteServerName\tLocalService\tServiceParameters\tDllSurrogate\tActivateAtStorage\tRunAsInteractiveUser\n" + "s38\tS255\tS255\tS255\tS255\tI2\tI2\n" + "AppId\tAppId\n" + "{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\t\t\t\t\t\t\n"; + +static const CHAR rci_class_dat[] = "CLSID\tContext\tComponent_\tProgId_Default\tDescription\tAppId_\tFileTypeMask\tIcon_\tIconIndex\tDefInprocHandler\tArgument\tFeature_\tAttributes\n" + "s38\ts32\ts72\tS255\tL255\tS38\tS255\tS72\tI2\tS32\tS255\ts38\tI2\n" + "Class\tCLSID\tContext\tComponent_\n" + "{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tLocalServer\tclass\t\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tclass\t\n"; + +static const CHAR rci_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "UnregisterClassInfo\t\t3000\n" + "RegisterClassInfo\t\t4000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const CHAR rei_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "extension.txt\textension\textension.txt\t1000\t\t\t8192\t1\n"; + +static const CHAR rei_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "extension\t\t\textension feature\t1\t2\tMSITESTDIR\t0\n"; + +static const CHAR rei_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "extension\textension\n"; + +static const CHAR rei_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "extension\t{9A3060D4-60BA-4A82-AB55-9FB148AD013C}\tMSITESTDIR\t0\t\textension.txt\n"; + +static const CHAR rei_extension_dat[] = "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n" + "s255\ts72\tS255\tS64\ts38\n" + "Extension\tExtension\tComponent_\n" + "extension\textension\tProg.Id.1\t\textension\n"; + +static const CHAR rei_verb_dat[] = "Extension_\tVerb\tSequence\tCommand\tArgument\n" + "s255\ts32\tI2\tL255\tL255\n" + "Verb\tExtension_\tVerb\n" + "extension\tOpen\t1\t&Open\t/argument\n"; + +static const CHAR rei_progid_dat[] = "ProgId\tProgId_Parent\tClass_\tDescription\tIcon_\tIconIndex\n" + "s255\tS255\tS38\tL255\tS72\tI2\n" + "ProgId\tProgId\n" + "Prog.Id.1\t\t\tdescription\t\t\n"; + +static const CHAR rei_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "UnregisterExtensionInfo\t\t3000\n" + "RegisterExtensionInfo\t\t4000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const CHAR rmi_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "mime.txt\tmime\tmime.txt\t1000\t\t\t8192\t1\n"; + +static const CHAR rmi_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "mime\t\t\tmime feature\t1\t2\tMSITESTDIR\t0\n"; + +static const CHAR rmi_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "mime\tmime\n"; + +static const CHAR rmi_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "mime\t{A1D630CE-13A7-4882-AFDD-148E2BBAFC6D}\tMSITESTDIR\t0\t\tmime.txt\n"; + +static const CHAR rmi_extension_dat[] = "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n" + "s255\ts72\tS255\tS64\ts38\n" + "Extension\tExtension\tComponent_\n" + "mime\tmime\t\tmime/type\tmime\n"; + +static const CHAR rmi_verb_dat[] = "Extension_\tVerb\tSequence\tCommand\tArgument\n" + "s255\ts32\tI2\tL255\tL255\n" + "Verb\tExtension_\tVerb\n" + "mime\tOpen\t1\t&Open\t/argument\n"; + +static const CHAR rmi_mime_dat[] = "ContentType\tExtension_\tCLSID\n" + "s64\ts255\tS38\n" + "MIME\tContentType\n" + "mime/type\tmime\t\n"; + +static const CHAR rmi_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "UnregisterExtensionInfo\t\t3000\n" + "UnregisterMIMEInfo\t\t3500\n" + "RegisterExtensionInfo\t\t4000\n" + "RegisterMIMEInfo\t\t4500\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + typedef struct _msi_table { const CHAR *filename; @@ -2302,6 +2792,144 @@ static const msi_table pub_tables[] = ADD_TABLE(property) }; +static const msi_table rd_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rd_component), + ADD_TABLE(rd_feature), + ADD_TABLE(rd_feature_comp), + ADD_TABLE(rd_file), + ADD_TABLE(rd_duplicate_file), + ADD_TABLE(rd_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rrv_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rrv_component), + ADD_TABLE(rrv_feature), + ADD_TABLE(rrv_feature_comp), + ADD_TABLE(rrv_file), + ADD_TABLE(rrv_registry), + ADD_TABLE(rrv_remove_registry), + ADD_TABLE(rrv_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table frp_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(frp_component), + ADD_TABLE(frp_feature), + ADD_TABLE(frp_feature_comp), + ADD_TABLE(frp_file), + ADD_TABLE(frp_upgrade), + ADD_TABLE(frp_custom_action), + ADD_TABLE(frp_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table riv_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(riv_component), + ADD_TABLE(riv_feature), + ADD_TABLE(riv_feature_comp), + ADD_TABLE(riv_file), + ADD_TABLE(riv_ini_file), + ADD_TABLE(riv_remove_ini_file), + ADD_TABLE(riv_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table res_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(res_component), + ADD_TABLE(res_feature), + ADD_TABLE(res_feature_comp), + ADD_TABLE(res_file), + ADD_TABLE(res_environment), + ADD_TABLE(res_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rci_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rci_component), + ADD_TABLE(rci_feature), + ADD_TABLE(rci_feature_comp), + ADD_TABLE(rci_file), + ADD_TABLE(rci_appid), + ADD_TABLE(rci_class), + ADD_TABLE(rci_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rei_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rei_component), + ADD_TABLE(rei_feature), + ADD_TABLE(rei_feature_comp), + ADD_TABLE(rei_file), + ADD_TABLE(rei_extension), + ADD_TABLE(rei_verb), + ADD_TABLE(rei_progid), + ADD_TABLE(rei_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rmi_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rmi_component), + ADD_TABLE(rmi_feature), + ADD_TABLE(rmi_feature_comp), + ADD_TABLE(rmi_file), + ADD_TABLE(rmi_extension), + ADD_TABLE(rmi_verb), + ADD_TABLE(rmi_mime), + ADD_TABLE(rmi_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table fo_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(fo_file), + ADD_TABLE(fo_component), + ADD_TABLE(fo_feature), + ADD_TABLE(fo_condition), + ADD_TABLE(fo_feature_comp), + ADD_TABLE(fo_custom_action), + ADD_TABLE(fo_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table icon_base_tables[] = +{ + ADD_TABLE(ci_component), + ADD_TABLE(directory), + ADD_TABLE(rof_feature), + ADD_TABLE(rof_feature_comp), + ADD_TABLE(rof_file), + ADD_TABLE(pp_install_exec_seq), + ADD_TABLE(rof_media), + ADD_TABLE(icon_property), +}; + /* cabinet definitions */ /* make the max size large so there is only one cab file */ @@ -2588,7 +3216,27 @@ static void create_cab_file(const CHAR *name, DWORD max_size, const CHAR *files) ok(res, "Failed to destroy the cabinet\n"); } -static BOOL get_program_files_dir(LPSTR buf, LPSTR buf2) +static BOOL get_user_dirs(void) +{ + HKEY hkey; + DWORD type, size; + + if(RegOpenKey(HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", + &hkey)) + return FALSE; + + size = MAX_PATH; + if(RegQueryValueExA(hkey, "AppData", 0, &type, (LPBYTE)APP_DATA_DIR, &size)){ + RegCloseKey(hkey); + return FALSE; + } + + RegCloseKey(hkey); + return TRUE; +} + +static BOOL get_system_dirs(void) { HKEY hkey; DWORD type, size; @@ -2598,18 +3246,22 @@ static BOOL get_program_files_dir(LPSTR buf, LPSTR buf2) return FALSE; size = MAX_PATH; - if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)buf, &size)) { + if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR, &size)) { RegCloseKey(hkey); return FALSE; } size = MAX_PATH; - if (RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)buf2, &size)) { + if (RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size)) { RegCloseKey(hkey); return FALSE; } RegCloseKey(hkey); + + if(GetWindowsDirectoryA(WINDOWS_DIR, MAX_PATH) != ERROR_SUCCESS) + return FALSE; + return TRUE; } @@ -3329,10 +3981,7 @@ static void test_caborder(void) ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n"); ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n"); - todo_wine - { - ok(!delete_pf("msitest", FALSE), "File is installed\n"); - } + ok(!delete_pf("msitest", FALSE), "File is installed\n"); delete_cab_files(); DeleteFile(msifile); @@ -3358,9 +4007,9 @@ static void test_caborder(void) r = MsiInstallProductA(msifile, NULL); ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n"); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); todo_wine { - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n"); ok(!delete_pf("msitest", FALSE), "File is installed\n"); @@ -4260,6 +4909,7 @@ static void test_publish_publishproduct(void) CHAR keypath[MAX_PATH]; CHAR temp[MAX_PATH]; CHAR path[MAX_PATH]; + BOOL old_installer = FALSE; static const CHAR prodpath[] = "Software\\Microsoft\\Windows\\CurrentVersion" "\\Installer\\UserData\\%s\\Products" @@ -4297,6 +4947,22 @@ static void test_publish_publishproduct(void) sprintf(keypath, prodpath, usersid); res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey); + if (res == ERROR_FILE_NOT_FOUND) + { + res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey); + if (res == ERROR_SUCCESS) + { + win_skip("Windows Installer < 3.0 detected\n"); + RegCloseKey(hkey); + old_installer = TRUE; + goto currentuser; + } + else + { + win_skip("Install failed, no need to continue\n"); + return; + } + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegOpenKeyA(hkey, "InstallProperties", &props); @@ -4315,6 +4981,7 @@ static void test_publish_publishproduct(void) RegDeleteKeyA(hkey, ""); RegCloseKey(hkey); +currentuser: res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); @@ -4322,7 +4989,8 @@ static void test_publish_publishproduct(void) CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052c94DA02821EECD05F2F"); CHECK_DEL_REG_DWORD(hkey, "Language", 1033); CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); - CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0); + if (!old_installer) + CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0); CHECK_DEL_REG_DWORD(hkey, "Assignment", 0); CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184); CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0); @@ -4366,6 +5034,8 @@ static void test_publish_publishproduct(void) /* PublishProduct, machine */ r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1"); + if (old_installer) + goto machprod; ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); @@ -4393,6 +5063,7 @@ static void test_publish_publishproduct(void) RegDeleteKeyA(hkey, ""); RegCloseKey(hkey); +machprod: res = RegOpenKeyA(HKEY_CLASSES_ROOT, machprod, &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); @@ -4400,7 +5071,8 @@ static void test_publish_publishproduct(void) CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052c94DA02821EECD05F2F"); CHECK_DEL_REG_DWORD(hkey, "Language", 1033); CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); - CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0); + if (!old_installer) + CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0); todo_wine CHECK_DEL_REG_DWORD(hkey, "Assignment", 1); CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184); CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0); @@ -5012,11 +5684,8 @@ static void test_publish(void) /* no UnpublishFeatures */ r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!pf_exists("msitest\\maximus"), "File deleted\n"); - todo_wine - { - ok(!pf_exists("msitest"), "File deleted\n"); - } + ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); + ok(!pf_exists("msitest"), "Directory not deleted\n"); state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); @@ -5091,7 +5760,7 @@ static void test_publish(void) r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); todo_wine ok(pf_exists("msitest\\maximus"), "File deleted\n"); - ok(pf_exists("msitest"), "File deleted\n"); + todo_wine ok(pf_exists("msitest"), "Directory deleted\n"); state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); @@ -5195,10 +5864,7 @@ static void test_publish(void) r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); - todo_wine - { - ok(!pf_exists("msitest"), "File not deleted\n"); - } + ok(!pf_exists("msitest"), "Directory not deleted\n"); state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); @@ -5273,10 +5939,7 @@ static void test_publish(void) r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); - todo_wine - { - ok(!pf_exists("msitest"), "File not deleted\n"); - } + ok(!pf_exists("msitest"), "Directory not deleted\n"); state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); @@ -5490,10 +6153,7 @@ static void test_publishsourcelist(void) r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); - todo_wine - { - ok(!pf_exists("msitest"), "File not deleted\n"); - } + ok(!pf_exists("msitest"), "Directory not deleted\n"); /* make sure 'Program Files\msitest' is removed */ delete_pfmsitest_files(); @@ -6676,7 +7336,7 @@ static DWORD get_pf_file_size(LPCSTR file) hfile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (hfile == INVALID_HANDLE_VALUE) - return 0; + return INVALID_FILE_SIZE; size = GetFileSize(hfile, NULL); CloseHandle(hfile); @@ -6850,10 +7510,7 @@ static void test_MsiConfigureProductEx(void) ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n"); - todo_wine - { - ok(!delete_pf("msitest", FALSE), "File not removed\n"); - } + ok(!delete_pf("msitest", FALSE), "Directory not removed\n"); /* product has been removed */ r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", @@ -6878,10 +7535,7 @@ static void test_MsiConfigureProductEx(void) ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n"); - todo_wine - { - ok(!delete_pf("msitest", FALSE), "File not removed\n"); - } + ok(!delete_pf("msitest", FALSE), "Directory not removed\n"); /* product has been removed */ r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", @@ -6908,10 +7562,7 @@ static void test_MsiConfigureProductEx(void) ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n"); - todo_wine - { - ok(!delete_pf("msitest", FALSE), "File not removed\n"); - } + ok(!delete_pf("msitest", FALSE), "Directory not removed\n"); create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table)); @@ -6958,10 +7609,7 @@ static void test_MsiConfigureProductEx(void) ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n"); - todo_wine - { - ok(!delete_pf("msitest", FALSE), "File not removed\n"); - } + ok(!delete_pf("msitest", FALSE), "Directory not removed\n"); /* install the product, machine */ r = MsiInstallProductA(msifile, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42"); @@ -7022,10 +7670,7 @@ static void test_MsiConfigureProductEx(void) ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n"); - todo_wine - { - ok(!delete_pf("msitest", FALSE), "File not removed\n"); - } + ok(!delete_pf("msitest", FALSE), "File not removed\n"); DeleteFileA(msifile); RegCloseKey(source); @@ -7064,10 +7709,7 @@ static void test_missingcomponent(void) ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n"); ok(!pf_exists("msitest\\beryllium"), "File installed\n"); - todo_wine - { - ok(!delete_pf("msitest", FALSE), "File not removed\n"); - } + ok(!delete_pf("msitest", FALSE), "Directory not removed\n"); DeleteFileA(msifile); DeleteFileA("msitest\\hydrogen"); @@ -7733,6 +8375,7 @@ static void test_file_in_use(void) r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + DeleteFileA("msitest\\maximus"); delete_test_files(); } @@ -7870,24 +8513,59 @@ static void test_feature_override(void) UINT r; create_test_files(); - create_database(msifile, tables, sizeof(tables) / sizeof(msi_table)); + create_file("msitest\\override.txt", 1000); + create_file("msitest\\preselected.txt", 1000); + create_file("msitest\\notpreselected.txt", 1000); + create_database(msifile, fo_tables, sizeof(fo_tables) / sizeof(msi_table)); - r = MsiInstallProductA(msifile, "ADDLOCAL=One"); + r = MsiInstallProductA(msifile, "ADDLOCAL=override"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout\\new", FALSE), "File installed\n"); - ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout", FALSE), "File installed\n"); - ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\changed", FALSE), "File installed\n"); - ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\first", FALSE), "File installed\n"); - ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); - ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); - ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(pf_exists("msitest\\override.txt"), "file not installed\n"); + ok(!pf_exists("msitest\\preselected.txt"), "file installed\n"); + ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n"); + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\override.txt", TRUE), "file not removed\n"); + + r = MsiInstallProductA(msifile, "preselect=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(pf_exists("msitest\\override.txt"), "file not installed\n"); + ok(pf_exists("msitest\\preselected.txt"), "file not installed\n"); + ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\override.txt", TRUE), "file not removed\n"); + todo_wine { + ok(delete_pf("msitest\\preselected.txt", TRUE), "file removed\n"); + ok(delete_pf("msitest", FALSE), "directory removed\n"); + } + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(pf_exists("msitest\\override.txt"), "file not installed\n"); + ok(pf_exists("msitest\\preselected.txt"), "file not installed\n"); + ok(!pf_exists("msitest\\notpreselected.txt"), "file installed\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\override.txt", TRUE), "file not removed\n"); + todo_wine { + ok(delete_pf("msitest\\preselected.txt", TRUE), "file removed\n"); + ok(delete_pf("msitest", FALSE), "directory removed\n"); + } + + DeleteFileA("msitest\\override.txt"); + DeleteFileA("msitest\\preselected.txt"); + DeleteFileA("msitest\\notpreselected.txt"); + RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest"); delete_test_files(); } @@ -8141,13 +8819,14 @@ static void test_register_font(void) r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); ret = RegQueryValueExA(key, "msi test font", NULL, NULL, NULL, NULL); ok(ret == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", ret); RegDeleteValueA(key, "msi test font"); RegCloseKey(key); + DeleteFileA("msitest\\font.ttf"); delete_test_files(); } @@ -8205,13 +8884,27 @@ static void test_install_remove_odbc(void) r = MsiInstallProductA(msifile, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(delete_pf("msitest\\ODBCdriver.dll", TRUE), "file not created\n"); - ok(delete_pf("msitest\\ODBCdriver2.dll", TRUE), "file not created\n"); - ok(delete_pf("msitest\\ODBCtranslator.dll", TRUE), "file not created\n"); - ok(delete_pf("msitest\\ODBCtranslator2.dll", TRUE), "file not created\n"); - ok(delete_pf("msitest\\ODBCsetup.dll", TRUE), "file not created\n"); - ok(delete_pf("msitest", FALSE), "directory not created\n"); + ok(pf_exists("msitest\\ODBCdriver.dll"), "file not created\n"); + ok(pf_exists("msitest\\ODBCdriver2.dll"), "file not created\n"); + ok(pf_exists("msitest\\ODBCtranslator.dll"), "file not created\n"); + ok(pf_exists("msitest\\ODBCtranslator2.dll"), "file not created\n"); + ok(pf_exists("msitest\\ODBCsetup.dll"), "file not created\n"); + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\ODBCdriver.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\ODBCdriver2.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\ODBCtranslator.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\ODBCtranslator2.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\ODBCsetup.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\ODBCdriver.dll"); + DeleteFileA("msitest\\ODBCdriver2.dll"); + DeleteFileA("msitest\\ODBCtranslator.dll"); + DeleteFileA("msitest\\ODBCtranslator2.dll"); + DeleteFileA("msitest\\ODBCsetup.dll"); delete_test_files(); } @@ -8235,8 +8928,9 @@ static void test_register_typelib(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(!delete_pf("msitest\\typelib.dll", TRUE), "file not removed\n"); - todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + DeleteFileA("msitest\\typelib.dll"); delete_test_files(); } @@ -8263,6 +8957,7 @@ static void test_create_remove_shortcut(void) ok(!delete_pf("msitest\\target.txt", TRUE), "file not removed\n"); todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + DeleteFileA("msitest\\target.txt"); delete_test_files(); } @@ -8298,10 +8993,515 @@ static void test_publish_components(void) ok(res == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", res); ok(!delete_pf("msitest\\english.txt", TRUE), "file not removed\n"); - todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\english.txt"); delete_test_files(); } +static void test_remove_duplicate_files(void) +{ + UINT r; + + create_test_files(); + create_file("msitest\\original.txt", 1000); + create_file("msitest\\original2.txt", 1000); + create_file("msitest\\original3.txt", 1000); + create_database(msifile, rd_tables, sizeof(rd_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(pf_exists("msitest\\original.txt"), "file not created\n"); + ok(pf_exists("msitest\\original2.txt"), "file not created\n"); + ok(!pf_exists("msitest\\original3.txt"), "file created\n"); + ok(pf_exists("msitest\\duplicate.txt"), "file not created\n"); + ok(!pf_exists("msitest\\duplicate2.txt"), "file created\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\original.txt", TRUE), "file removed\n"); + ok(!delete_pf("msitest\\original2.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\original3.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\duplicate.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\duplicate2.txt", TRUE), "file not removed\n"); + ok(delete_pf("msitest", FALSE), "directory removed\n"); + + DeleteFileA("msitest\\original.txt"); + DeleteFileA("msitest\\original2.txt"); + DeleteFileA("msitest\\original3.txt"); + delete_test_files(); +} + +static void test_remove_registry_values(void) +{ + UINT r; + LONG res; + HKEY key; + + create_test_files(); + create_file("msitest\\registry.txt", 1000); + create_database(msifile, rrv_tables, sizeof(rrv_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", &key); + RegSetValueExA(key, "value1", 0, REG_SZ, (const BYTE *)"1", 2); + RegCloseKey(key); + + RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", &key); + RegSetValueExA(key, "value2", 0, REG_SZ, (const BYTE *)"2", 2); + RegCloseKey(key); + + RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", &key); + RegSetValueExA(key, "", 0, REG_SZ, (const BYTE *)"default", 8); + RegSetValueExA(key, "valueA", 0, REG_SZ, (const BYTE *)"A", 2); + RegSetValueExA(key, "valueB", 0, REG_SZ, (const BYTE *)"B", 2); + RegCloseKey(key); + + RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", &key); + RegSetValueExA(key, "", 0, REG_SZ, (const BYTE *)"default", 8); + RegSetValueExA(key, "valueB", 0, REG_SZ, (const BYTE *)"B", 2); + RegCloseKey(key); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", &key); + ok(res == ERROR_SUCCESS, "key removed\n"); + RegCloseKey(key); + + res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", &key); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + res = RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", &key); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegCloseKey(key); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", &key); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", &key); + ok(res == ERROR_SUCCESS, "key removed\n"); + RegCloseKey(key); + + res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", &key); + ok(res == ERROR_SUCCESS, "key removed\n"); + RegCloseKey(key); + + res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", &key); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA"); + RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2"); + RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine"); + + ok(!delete_pf("msitest\\registry.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\registry.txt"); + delete_test_files(); +} + +static void test_find_related_products(void) +{ + UINT r; + + create_test_files(); + create_file("msitest\\product.txt", 1000); + create_database(msifile, frp_tables, sizeof(frp_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + /* install again, so it finds the upgrade code */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\product.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\product.txt"); + delete_test_files(); +} + +static void test_remove_ini_values(void) +{ + UINT r; + DWORD len; + char inifile[MAX_PATH], buf[0x10]; + HANDLE file; + BOOL ret; + + create_test_files(); + create_file("msitest\\inifile.txt", 1000); + create_database(msifile, riv_tables, sizeof(riv_tables) / sizeof(msi_table)); + + lstrcpyA(inifile, PROG_FILES_DIR); + lstrcatA(inifile, "\\msitest"); + CreateDirectoryA(inifile, NULL); + lstrcatA(inifile, "\\test.ini"); + file = CreateFileA(inifile, GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, 0, NULL); + CloseHandle(file); + + ret = WritePrivateProfileStringA("section1", "key1", "value1", inifile); + ok(ret, "failed to write profile string %u\n", GetLastError()); + + ret = WritePrivateProfileStringA("sectionA", "keyA", "valueA", inifile); + ok(ret, "failed to write profile string %u\n", GetLastError()); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + len = GetPrivateProfileStringA("section1", "key1", NULL, buf, sizeof(buf), inifile); + ok(len == 6, "got %u expected 6\n", len); + + len = GetPrivateProfileStringA("sectionA", "keyA", NULL, buf, sizeof(buf), inifile); + ok(!len, "got %u expected 0\n", len); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + len = GetPrivateProfileStringA("section1", "key1", NULL, buf, sizeof(buf), inifile); + ok(!len, "got %u expected 0\n", len); + + len = GetPrivateProfileStringA("sectionA", "keyA", NULL, buf, sizeof(buf), inifile); + ok(!len, "got %u expected 0\n", len); + + todo_wine ok(!delete_pf("msitest\\test.ini", TRUE), "file removed\n"); + ok(!delete_pf("msitest\\inifile.txt", TRUE), "file not removed\n"); + ok(delete_pf("msitest", FALSE), "directory removed\n"); + + DeleteFileA("msitest\\inifile.txt"); + delete_test_files(); +} + +static void test_remove_env_strings(void) +{ + UINT r; + LONG res; + HKEY key; + DWORD type, size; + char buffer[0x10]; + + if (on_win9x) + { + win_skip("Environment variables are handled differently on win9x and winme\n"); + return; + } + + create_test_files(); + create_file("msitest\\envvar.txt", 1000); + create_database(msifile, res_tables, sizeof(res_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + res = RegOpenKeyA(HKEY_CURRENT_USER, "Environment", &key); + ok(!res, "failed to open environment key %d\n", res); + + RegSetValueExA(key, "MSITESTVAR1", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR3", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR4", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR5", 0, REG_SZ, (const BYTE *)"1", 2); + + RegCloseKey(key); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CURRENT_USER, "Environment", &key); + ok(!res, "failed to open environment key %d\n", res); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR1", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR2", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR3", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR4", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR5", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + RegCloseKey(key); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CURRENT_USER, "Environment", &key); + ok(!res, "failed to open environment key %d\n", res); + + res = RegQueryValueExA(key, "MSITESTVAR1", NULL, NULL, NULL, NULL); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegQueryValueExA(key, "MSITESTVAR2", NULL, NULL, NULL, NULL); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR3", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + RegDeleteValueA(key, "MSITESTVAR3"); + + res = RegQueryValueExA(key, "MSITESTVAR4", NULL, NULL, NULL, NULL); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR5", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + RegDeleteValueA(key, "MSITESTVAR5"); + + RegCloseKey(key); + + ok(!delete_pf("msitest\\envvar.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\envvar.txt"); + delete_test_files(); +} + +static void test_register_class_info(void) +{ + UINT r; + LONG res; + HKEY hkey; + + create_test_files(); + create_file("msitest\\class.txt", 1000); + create_database(msifile, rci_tables, sizeof(rci_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "FileType\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "AppID\\{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "FileType\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "AppID\\{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + ok(!delete_pf("msitest\\class.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\class.txt"); + delete_test_files(); +} + +static void test_register_extension_info(void) +{ + UINT r; + LONG res; + HKEY hkey; + + create_test_files(); + create_file("msitest\\extension.txt", 1000); + create_database(msifile, rei_tables, sizeof(rei_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, ".extension", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Prog.Id.1\\shell\\Open\\command", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, ".extension", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Prog.Id.1", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + ok(!delete_pf("msitest\\extension.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\extension.txt"); + delete_test_files(); +} + +static void test_register_mime_info(void) +{ + UINT r; + LONG res; + HKEY hkey; + + create_test_files(); + create_file("msitest\\mime.txt", 1000); + create_database(msifile, rmi_tables, sizeof(rmi_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "MIME\\Database\\Content Type\\mime/type", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "MIME\\Database\\Content Type\\mime/type", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + ok(!delete_pf("msitest\\mime.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\mime.txt"); + delete_test_files(); +} + +static void test_icon_table(void) +{ + MSIHANDLE hdb = 0, record; + LPCSTR query; + UINT res; + CHAR path[MAX_PATH], win9xpath[MAX_PATH]; + static const char prodcode[] = "{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}"; + + create_database(msifile, icon_base_tables, sizeof(icon_base_tables) / sizeof(msi_table)); + + res = MsiOpenDatabase(msifile, MSIDBOPEN_TRANSACT, &hdb); + ok(res == ERROR_SUCCESS, "failed to open db: %d\n", res); + + query = "CREATE TABLE `Icon` (`Name` CHAR(72) NOT NULL, `Data` OBJECT NOT NULL PRIMARY KEY `Name`)"; + res = run_query( hdb, 0, query ); + ok(res == ERROR_SUCCESS, "Can't create Icon table: %d\n", res); + + create_file("icon.ico", 100); + record = MsiCreateRecord(1); + res = MsiRecordSetStream(record, 1, "icon.ico"); + ok(res == ERROR_SUCCESS, "Failed to add stream data to record: %d\n", res); + DeleteFile("icon.ico"); + + query = "INSERT INTO `Icon` (`Name`, `Data`) VALUES ('testicon', ?)"; + res = run_query(hdb, record, query); + ok(res == ERROR_SUCCESS, "Insert into Icon table failed: %d\n", res); + + res = MsiCloseHandle(record); + ok(res == ERROR_SUCCESS, "Failed to close record handle: %d\n", res); + res = MsiDatabaseCommit(hdb); + ok(res == ERROR_SUCCESS, "Failed to commit database: %d\n", res); + res = MsiCloseHandle(hdb); + ok(res == ERROR_SUCCESS, "Failed to close database: %d\n", res); + + /* per-user */ + res = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1"); + ok(res == ERROR_SUCCESS, "Failed to do per-user install: %d\n", res); + + lstrcpyA(path, APP_DATA_DIR); + lstrcatA(path, "\\"); + lstrcatA(path, "Microsoft\\Installer\\"); + lstrcatA(path, prodcode); + lstrcatA(path, "\\testicon"); + ok(file_exists(path), "Per-user icon file isn't where it's expected (%s)\n", path); + + res = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(res == ERROR_SUCCESS, "Failed to uninstall per-user\n"); + + /* system-wide */ + res = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1"); + ok(res == ERROR_SUCCESS, "Failed to system-wide install: %d\n", res); + + /* win9x with MSI 2.0 installs the icon to a different folder, same as above */ + lstrcpyA(win9xpath, APP_DATA_DIR); + lstrcatA(path, "\\"); + lstrcatA(path, "Microsoft\\Installer\\"); + lstrcatA(path, prodcode); + lstrcatA(path, "\\testicon"); + + lstrcpyA(path, WINDOWS_DIR); + lstrcatA(path, "\\"); + lstrcatA(path, "Installer\\"); + lstrcatA(path, prodcode); + lstrcatA(path, "\\testicon"); + ok(file_exists(path) || file_exists(win9xpath), + "System-wide icon file isn't where it's expected (%s)\n", path); + + res = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(res == ERROR_SUCCESS, "Failed to uninstall system-wide\n"); + + delete_pfmsitest_files(); + + DeleteFile(msifile); +} + START_TEST(install) { DWORD len; @@ -8323,7 +9523,8 @@ START_TEST(install) if(len && (CURR_DIR[len - 1] == '\\')) CURR_DIR[len - 1] = 0; - get_program_files_dir(PROG_FILES_DIR, COMMON_FILES_DIR); + get_system_dirs(); + get_user_dirs(); /* Create a restore point ourselves so we circumvent the multitude of restore points * that would have been created by all the installation and removal tests. @@ -8404,6 +9605,15 @@ START_TEST(install) test_register_typelib(); test_create_remove_shortcut(); test_publish_components(); + test_remove_duplicate_files(); + test_remove_registry_values(); + test_find_related_products(); + test_remove_ini_values(); + test_remove_env_strings(); + test_register_class_info(); + test_register_extension_info(); + test_register_mime_info(); + test_icon_table(); DeleteFileA(log_file); diff --git a/rostests/winetests/msi/msi.c b/rostests/winetests/msi/msi.c index 2995adbe56b..90a357b705b 100644 --- a/rostests/winetests/msi/msi.c +++ b/rostests/winetests/msi/msi.c @@ -247,10 +247,10 @@ static void test_null(void) r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", NULL, 0); ok( r == ERROR_INVALID_PARAMETER, "wrong error\n"); - r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", "foo", 0); + r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000001}", "foo", 0); ok( r == ERROR_INVALID_PARAMETER, "wrong error %d\n", r); - r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000000}", "foo", INSTALLSTATE_DEFAULT); + r = MsiConfigureFeatureA("{00000000-0000-0000-0000-000000000002}", "foo", INSTALLSTATE_DEFAULT); ok( r == ERROR_UNKNOWN_PRODUCT, "wrong error %d\n", r); /* make sure empty string to MsiGetProductInfo is not a handle to default registry value, saving and restoring the @@ -467,7 +467,7 @@ static BOOL squash_guid(LPCWSTR in, LPWSTR out) DWORD i,n=1; GUID guid; - if (FAILED(CLSIDFromString((LPOLESTR)in, &guid))) + if (FAILED(CLSIDFromString((LPCOLESTR)in, &guid))) return FALSE; for(i=0; i<8; i++) @@ -1555,24 +1555,44 @@ static void test_MsiGetComponentPath(void) ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(NULL, path, &size); + ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + /* NULL lpPathBuf */ size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, NULL, &size); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, NULL, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + /* NULL pcchBuf */ size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, NULL); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, NULL); + ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + /* all params valid */ size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Components\\"); lstrcatA(keypath, comp_squashed); @@ -1586,16 +1606,29 @@ static void test_MsiGetComponentPath(void) ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"C:\\imapath", 10); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* product value exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); @@ -1609,21 +1642,37 @@ static void test_MsiGetComponentPath(void) ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* install properties key exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + create_file("C:\\imapath", "C:\\imapath", 11); /* file exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + RegDeleteValueA(compkey, prod_squashed); RegDeleteKeyA(compkey, ""); RegDeleteValueA(installprop, "WindowsInstaller"); @@ -1647,16 +1696,29 @@ static void test_MsiGetComponentPath(void) ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"C:\\imapath", 10); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* product value exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); @@ -1670,21 +1732,37 @@ static void test_MsiGetComponentPath(void) ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* install properties key exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + create_file("C:\\imapath", "C:\\imapath", 11); /* file exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + RegDeleteValueA(compkey, prod_squashed); RegDeleteKeyA(compkey, ""); RegDeleteValueA(installprop, "WindowsInstaller"); @@ -1708,6 +1786,11 @@ static void test_MsiGetComponentPath(void) ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\"); lstrcatA(keypath, usersid); @@ -1723,16 +1806,29 @@ static void test_MsiGetComponentPath(void) ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"C:\\imapath", 10); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* product value exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); @@ -1746,21 +1842,37 @@ static void test_MsiGetComponentPath(void) ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* install properties key exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + create_file("C:\\imapath", "C:\\imapath", 11); /* file exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + RegDeleteValueA(compkey, prod_squashed); RegDeleteKeyA(prodkey, ""); RegDeleteKeyA(compkey, ""); @@ -1783,6 +1895,11 @@ static void test_MsiGetComponentPath(void) ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\"); lstrcatA(keypath, usersid); @@ -1798,25 +1915,46 @@ static void test_MsiGetComponentPath(void) ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"C:\\imapath", 10); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* product value exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + create_file("C:\\imapath", "C:\\imapath", 11); /* file exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + RegDeleteValueA(compkey, prod_squashed); RegDeleteKeyA(prodkey, ""); RegDeleteKeyA(compkey, ""); @@ -1836,6 +1974,11 @@ static void test_MsiGetComponentPath(void) ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Components\\"); lstrcatA(keypath, comp_squashed); @@ -1849,25 +1992,46 @@ static void test_MsiGetComponentPath(void) ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"C:\\imapath", 10); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* product value exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + create_file("C:\\imapath", "C:\\imapath", 11); /* file exists */ + path[0] = 0; size = MAX_PATH; state = MsiGetComponentPathA(prodcode, component, path, &size); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); ok(size == 10, "Expected 10, got %d\n", size); + path[0] = 0; + size = MAX_PATH; + state = MsiLocateComponentA(component, path, &size); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(!lstrcmpA(path, "C:\\imapath"), "Expected C:\\imapath, got %s\n", path); + ok(size == 10, "Expected 10, got %d\n", size); + RegDeleteValueA(compkey, prod_squashed); RegDeleteKeyA(prodkey, ""); RegDeleteKeyA(compkey, ""); @@ -8221,7 +8385,9 @@ static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expecteds r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_APPLIED, 0, patchcode, targetprod, &context, targetsid, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_BAD_CONFIGURATION), /* Windows Installer 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(patchcode, "apple"), "Expected patchcode to be unchanged, got %s\n", patchcode); ok(!lstrcmpA(targetprod, "banana"), @@ -8245,7 +8411,9 @@ static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expecteds r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_APPLIED, 0, patchcode, targetprod, &context, targetsid, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_BAD_CONFIGURATION), /* Windows Installer 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(patchcode, "apple"), "Expected patchcode to be unchanged, got %s\n", patchcode); ok(!lstrcmpA(targetprod, "banana"), @@ -9352,7 +9520,9 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_FILE_NOT_FOUND), /* Windows Installer < 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(patch, "apple"), "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); ok(!lstrcmpA(transforms, "banana"), @@ -9369,7 +9539,8 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_BAD_CONFIGURATION, + ok(r == ERROR_BAD_CONFIGURATION || + broken(r == ERROR_SUCCESS), /* Windows Installer < 3.0 */ "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); ok(!lstrcmpA(patch, "apple"), "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); @@ -9405,8 +9576,11 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); - ok(!lstrcmpA(patch, "apple"), + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_FILE_NOT_FOUND), /* Windows Installer < 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(!lstrcmpA(patch, "apple") || + broken(!lstrcmpA(patch, patchcode)), /* Windows Installer < 3.0 */ "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); ok(!lstrcmpA(transforms, "banana"), "Expected lpTransformsBuf to be unchanged, got \"%s\"\n", transforms); @@ -9467,7 +9641,8 @@ static void test_MsiEnumPatches(void) ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); ok(!lstrcmpA(patch, patchcode), "Expected \"%s\", got \"%s\"\n", patchcode, patch); - ok(!lstrcmpA(transforms, "whate"), + ok(!lstrcmpA(transforms, "whate") || + broken(!lstrcmpA(transforms, "banana")), /* Windows Installer < 3.0 */ "Expected \"whate\", got \"%s\"\n", transforms); ok(size == 8 || size == 16, "Expected 8 or 16, got %d\n", size); @@ -9541,7 +9716,9 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_FILE_NOT_FOUND), /* Windows Installer < 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(patch, "apple"), "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); ok(!lstrcmpA(transforms, "banana"), @@ -9558,7 +9735,8 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_BAD_CONFIGURATION, + ok(r == ERROR_BAD_CONFIGURATION || + broken(r == ERROR_SUCCESS), /* Windows Installer < 3.0 */ "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); ok(!lstrcmpA(patch, "apple"), "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); @@ -9594,8 +9772,11 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); - ok(!lstrcmpA(patch, "apple"), + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_FILE_NOT_FOUND), /* Windows Installer < 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(!lstrcmpA(patch, "apple") || + broken(!lstrcmpA(patch, patchcode)), /* Windows Installer < 3.0 */ "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); ok(!lstrcmpA(transforms, "banana"), "Expected lpTransformsBuf to be unchanged, got \"%s\"\n", transforms); @@ -9610,10 +9791,14 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); - ok(!lstrcmpA(patch, "apple"), + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_SUCCESS), /* Windows Installer < 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(!lstrcmpA(patch, "apple") || + broken(!lstrcmpA(patch, patchcode)), /* Windows Installer < 3.0 */ "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); - ok(!lstrcmpA(transforms, "banana"), + ok(!lstrcmpA(transforms, "banana") || + broken(!lstrcmpA(transforms, "whatever")), /* Windows Installer < 3.0 */ "Expected lpTransformsBuf to be unchanged, got \"%s\"\n", transforms); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); @@ -9686,7 +9871,9 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_FILE_NOT_FOUND), /* Windows Installer < 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(patch, "apple"), "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); ok(!lstrcmpA(transforms, "banana"), @@ -9703,7 +9890,8 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_BAD_CONFIGURATION, + ok(r == ERROR_BAD_CONFIGURATION || + broken(r == ERROR_SUCCESS), /* Windows Installer < 3.0 */ "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); ok(!lstrcmpA(patch, "apple"), "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); @@ -9739,8 +9927,11 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); - ok(!lstrcmpA(patch, "apple"), + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_FILE_NOT_FOUND), /* Windows Installer < 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(!lstrcmpA(patch, "apple") || + broken(!lstrcmpA(patch, patchcode)), /* Windows Installer < 3.0 */ "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); ok(!lstrcmpA(transforms, "banana"), "Expected lpTransformsBuf to be unchanged, got \"%s\"\n", transforms); @@ -9804,10 +9995,14 @@ static void test_MsiEnumPatches(void) lstrcpyA(patch, "apple"); lstrcpyA(transforms, "banana"); r = MsiEnumPatchesA(prodcode, 0, patch, transforms, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); - ok(!lstrcmpA(patch, "apple"), + ok(r == ERROR_NO_MORE_ITEMS || + broken(r == ERROR_SUCCESS), /* Windows Installer < 3.0 */ + "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(!lstrcmpA(patch, "apple") || + broken(!lstrcmpA(patch, patchcode)), /* Windows Installer < 3.0 */ "Expected lpPatchBuf to be unchanged, got \"%s\"\n", patch); - ok(!lstrcmpA(transforms, "banana"), + ok(!lstrcmpA(transforms, "banana") || + broken(!lstrcmpA(transforms, "whatever")), /* Windows Installer < 3.0 */ "Expected lpTransformsBuf to be unchanged, got \"%s\"\n", transforms); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); @@ -9841,7 +10036,8 @@ static void test_MsiEnumPatches(void) WideCharToMultiByte( CP_ACP, 0, transformsW, -1, transforms, MAX_PATH, NULL, NULL ); ok(!lstrcmpA(patch, patchcode), "Expected \"%s\", got \"%s\"\n", patchcode, patch); - ok(!lstrcmpA(transforms, "whate"), + ok(!lstrcmpA(transforms, "whate") || + broken(!lstrcmpA(transforms, "banana")), /* Windows Installer < 3.0 */ "Expected \"whate\", got \"%s\"\n", transforms); ok(size == 8, "Expected 8, got %d\n", size); diff --git a/rostests/winetests/msi/msi.rbuild b/rostests/winetests/msi/msi.rbuild index 2e9a6d6215e..67a8c078752 100644 --- a/rostests/winetests/msi/msi.rbuild +++ b/rostests/winetests/msi/msi.rbuild @@ -10,6 +10,7 @@ install.c msi.c package.c + patch.c record.c source.c suminfo.c diff --git a/rostests/winetests/msi/package.c b/rostests/winetests/msi/package.c index ddb3522e94d..d2514ce5a7f 100644 --- a/rostests/winetests/msi/package.c +++ b/rostests/winetests/msi/package.c @@ -153,7 +153,7 @@ static BOOL squash_guid(LPCWSTR in, LPWSTR out) DWORD i,n=1; GUID guid; - if (FAILED(CLSIDFromString((LPOLESTR)in, &guid))) + if (FAILED(CLSIDFromString((LPCOLESTR)in, &guid))) return FALSE; for(i=0; i<8; i++) @@ -2007,7 +2007,7 @@ static void test_property_table(void) const char *query; UINT r; MSIHANDLE hpkg, hdb, hrec; - char buffer[MAX_PATH]; + char buffer[MAX_PATH], package[10]; DWORD sz; BOOL found; @@ -2050,15 +2050,14 @@ static void test_property_table(void) r = run_query(hdb, query); ok(r == ERROR_SUCCESS, "failed to add column\n"); - hpkg = package_from_db(hdb); - todo_wine - { - ok(!hpkg, "package should not be created\n"); - } + sprintf(package, "#%i", hdb); + r = MsiOpenPackage(package, &hpkg); + todo_wine ok(r != ERROR_SUCCESS, "MsiOpenPackage succeeded\n"); + if (r == ERROR_SUCCESS) + MsiCloseHandle(hpkg); - MsiCloseHandle(hdb); - MsiCloseHandle(hpkg); - DeleteFile(msifile); + r = MsiCloseHandle(hdb); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed %u\n", r); hdb = create_package_db(); ok (hdb, "failed to create package database\n"); @@ -8743,6 +8742,9 @@ static void test_appsearch_drlocator(void) r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = add_appsearch_entry(hdb, "'SIGPROP13', 'NewSignature13'"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = create_drlocator_table(hdb); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -8801,6 +8803,18 @@ static void test_appsearch_drlocator(void) r = add_drlocator_entry(hdb, path); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = create_reglocator_table(hdb); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* parent */ + r = add_reglocator_entry(hdb, "'NewSignature12', 2, 'htmlfile\\shell\\open\\nonexistent', '', 1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* parent is in RegLocator, no path, depth 0, no signature */ + sprintf(path, "'NewSignature13', 'NewSignature12', '', 0"); + r = add_drlocator_entry(hdb, path); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = create_signature_table(hdb); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -8907,6 +8921,12 @@ static void test_appsearch_drlocator(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpiA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop); + size = MAX_PATH; + strcpy(path, "c:\\"); + r = MsiGetPropertyA(hpkg, "SIGPROP13", prop, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!prop[0], "Expected \"\", got \"%s\"\n", prop); + DeleteFileA("FileName1"); DeleteFileA("FileName3.dll"); DeleteFileA("FileName4.dll"); diff --git a/rostests/winetests/msi/patch.c b/rostests/winetests/msi/patch.c new file mode 100644 index 00000000000..3a35e3544eb --- /dev/null +++ b/rostests/winetests/msi/patch.c @@ -0,0 +1,1178 @@ +/* + * Copyright 2010 Hans Leidekker for CodeWeavers + * + * A test program for patching MSI products. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define _WIN32_MSI 300 +#define COBJMACROS + +#include + +#include +#include +#include +#include + +#include "wine/test.h" + +static UINT (WINAPI *pMsiApplyPatchA)( LPCSTR, LPCSTR, INSTALLTYPE, LPCSTR ); +static UINT (WINAPI *pMsiGetPatchInfoExA)( LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, + LPCSTR, LPSTR, DWORD * ); +static UINT (WINAPI *pMsiEnumPatchesExA)( LPCSTR, LPCSTR, DWORD, DWORD, DWORD, LPSTR, + LPSTR, MSIINSTALLCONTEXT *, LPSTR, LPDWORD ); + +static const char *msifile = "winetest-patch.msi"; +static const char *mspfile = "winetest-patch.msp"; + +static char CURR_DIR[MAX_PATH]; +static char PROG_FILES_DIR[MAX_PATH]; +static char COMMON_FILES_DIR[MAX_PATH]; + +/* msi database data */ + +static const char property_dat[] = + "Property\tValue\n" + "s72\tl0\n" + "Property\tProperty\n" + "Manufacturer\tWineHQ\n" + "ProductCode\t{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}\n" + "UpgradeCode\t{A2E3D643-4E2C-477F-A309-F76F552D5F43}\n" + "ProductLanguage\t1033\n" + "ProductName\tmsitest\n" + "ProductVersion\t1.1.1\n" + "PATCHNEWSUMMARYSUBJECT\tInstaller Database\n"; + +static const char media_dat[] = + "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" + "i2\ti4\tL64\tS255\tS32\tS72\n" + "Media\tDiskId\n" + "1\t1\t\t\tDISK1\t\n"; + +static const char file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "patch.txt\tpatch\tpatch.txt\t1000\t\t\t0\t1\n"; + +static const char directory_dat[] = + "Directory\tDirectory_Parent\tDefaultDir\n" + "s72\tS72\tl255\n" + "Directory\tDirectory\n" + "MSITESTDIR\tProgramFilesFolder\tmsitest\n" + "ProgramFilesFolder\tTARGETDIR\t.\n" + "TARGETDIR\t\tSourceDir"; + +static const char component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "patch\t{4B79D87E-6D28-4FD3-92D6-CD9B26AF64F1}\tMSITESTDIR\t0\t\tpatch.txt\n"; + +static const char feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "patch\t\t\tpatch feature\t1\t1\tMSITESTDIR\t0\n"; + +static const char feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "patch\tpatch\n"; + +static const char install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RegisterUser\t\t3000\n" + "RegisterProduct\t\t3100\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +struct msi_table +{ + const char *filename; + const char *data; + int size; +}; + +#define ADD_TABLE( x ) { #x".idt", x##_dat, sizeof(x##_dat) } + +static const struct msi_table tables[] = +{ + ADD_TABLE( directory ), + ADD_TABLE( file ), + ADD_TABLE( component ), + ADD_TABLE( feature ), + ADD_TABLE( feature_comp ), + ADD_TABLE( property ), + ADD_TABLE( install_exec_seq ), + ADD_TABLE( media ) +}; + +static void init_function_pointers( void ) +{ + HMODULE hmsi = GetModuleHandleA( "msi.dll" ); + +#define GET_PROC( mod, func ) \ + p ## func = (void *)GetProcAddress( mod, #func ); \ + if (!p ## func) \ + trace( "GetProcAddress(%s) failed\n", #func ); + + GET_PROC( hmsi, MsiApplyPatchA ); + GET_PROC( hmsi, MsiGetPatchInfoExA ); + GET_PROC( hmsi, MsiEnumPatchesExA ); +#undef GET_PROC +} + +static BOOL get_program_files_dir( char *buf, char *buf2 ) +{ + HKEY hkey; + DWORD type, size; + + if (RegOpenKey( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion", &hkey )) + return FALSE; + + size = MAX_PATH; + if (RegQueryValueExA( hkey, "ProgramFilesDir", 0, &type, (LPBYTE)buf, &size )) + { + RegCloseKey( hkey ); + return FALSE; + } + size = MAX_PATH; + if (RegQueryValueExA( hkey, "CommonFilesDir", 0, &type, (LPBYTE)buf2, &size )) + { + RegCloseKey( hkey ); + return FALSE; + } + RegCloseKey( hkey ); + return TRUE; +} + +static void create_file_data( const char *filename, const char *data, DWORD size ) +{ + HANDLE file; + DWORD written; + + file = CreateFileA( filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL ); + if (file == INVALID_HANDLE_VALUE) + return; + + WriteFile( file, data, strlen( data ), &written, NULL ); + if (size) + { + SetFilePointer( file, size, NULL, FILE_BEGIN ); + SetEndOfFile( file ); + } + CloseHandle( file ); +} + +#define create_file( name, size ) create_file_data( name, name, size ) + +static BOOL delete_pf( const char *rel_path, BOOL is_file ) +{ + char path[MAX_PATH]; + + strcpy( path, PROG_FILES_DIR ); + strcat( path, "\\" ); + strcat( path, rel_path ); + + if (is_file) + return DeleteFileA( path ); + else + return RemoveDirectoryA( path ); +} + +static DWORD get_pf_file_size( const char *filename ) +{ + char path[MAX_PATH]; + HANDLE file; + DWORD size; + + strcpy( path, PROG_FILES_DIR ); + strcat( path, "\\"); + strcat( path, filename ); + + file = CreateFileA( path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); + if (file == INVALID_HANDLE_VALUE) + return INVALID_FILE_SIZE; + + size = GetFileSize( file, NULL ); + CloseHandle( file ); + return size; +} + +static void write_file( const char *filename, const char *data, DWORD data_size ) +{ + DWORD size; + HANDLE file = CreateFile( filename, GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); + WriteFile( file, data, data_size, &size, NULL ); + CloseHandle( file ); +} + +static void set_suminfo( const char *filename ) +{ + UINT r; + MSIHANDLE hsi, hdb; + + r = MsiOpenDatabaseA( filename, MSIDBOPEN_DIRECT, &hdb ); + ok( r == ERROR_SUCCESS, "failed to open database %u\n", r ); + + r = MsiGetSummaryInformation( hdb, NULL, 7, &hsi ); + ok( r == ERROR_SUCCESS, "failed to open summaryinfo %u\n", r ); + + r = MsiSummaryInfoSetProperty( hsi, 2, VT_LPSTR, 0, NULL, "Installation Database" ); + ok( r == ERROR_SUCCESS, "failed to set summary info %u\n", r ); + + r = MsiSummaryInfoSetProperty( hsi, 3, VT_LPSTR, 0, NULL, "Installation Database" ); + ok( r == ERROR_SUCCESS, "failed to set summary info %u\n", r ); + + r = MsiSummaryInfoSetProperty( hsi, 4, VT_LPSTR, 0, NULL, "WineHQ" ); + ok( r == ERROR_SUCCESS, "failed to set summary info %u\n", r ); + + r = MsiSummaryInfoSetProperty( hsi, 7, VT_LPSTR, 0, NULL, ";1033" ); + ok( r == ERROR_SUCCESS, "failed to set summary info %u\n", r ); + + r = MsiSummaryInfoSetProperty( hsi, 9, VT_LPSTR, 0, NULL, "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}" ); + ok( r == ERROR_SUCCESS, "failed to set summary info %u\n", r ); + + r = MsiSummaryInfoSetProperty( hsi, 14, VT_I4, 100, NULL, NULL ); + ok( r == ERROR_SUCCESS, "failed to set summary info %u\n", r ); + + r = MsiSummaryInfoSetProperty( hsi, 15, VT_I4, 0, NULL, NULL ); + ok( r == ERROR_SUCCESS, "failed to set summary info %u\n", r ); + + r = MsiSummaryInfoPersist( hsi ); + ok( r == ERROR_SUCCESS, "failed to persist suminfo %u\n", r ); + + r = MsiCloseHandle( hsi ); + ok( r == ERROR_SUCCESS, "failed to close suminfo %u\n", r ); + + r = MsiCloseHandle( hdb ); + ok( r == ERROR_SUCCESS, "failed to close database %u\n", r ); +} + +static void create_database( const char *filename, const struct msi_table *tables, UINT num_tables ) +{ + MSIHANDLE hdb; + UINT r, i; + + r = MsiOpenDatabaseA( filename, MSIDBOPEN_CREATE, &hdb ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + /* import the tables into the database */ + for (i = 0; i < num_tables; i++) + { + const struct msi_table *table = &tables[i]; + + write_file( table->filename, table->data, (table->size - 1) * sizeof(char) ); + + r = MsiDatabaseImportA( hdb, CURR_DIR, table->filename ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + DeleteFileA( table->filename ); + } + + r = MsiDatabaseCommit( hdb ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + MsiCloseHandle( hdb ); + set_suminfo( filename ); +} + +/* data for generating a patch */ + +/* table names - encoded as in an msi database file */ +static const WCHAR p_name0[] = { 0x4840, 0x3b3f, 0x43f2, 0x4438, 0x45b1, 0 }; /* _Columns */ +static const WCHAR p_name1[] = { 0x4840, 0x3f7f, 0x4164, 0x422f, 0x4836, 0 }; /* _Tables */ +static const WCHAR p_name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */ +static const WCHAR p_name3[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */ +static const WCHAR p_name4[] = { 0x3a8c, 0x47cb, 0x45b0, 0x45ec, 0x45a8, 0x4837, 0}; /* CAB_msitest */ +static const WCHAR p_name5[] = { 0x4840, 0x4596, 0x3e6c, 0x45e4, 0x42e6, 0x421c, 0x4634, 0x4468, 0x4226, 0 }; /* MsiPatchSequence */ +static const WCHAR p_name6[] = { 0x0005, 0x0053, 0x0075, 0x006d, 0x006d, 0x0061, 0x0072, + 0x0079, 0x0049, 0x006e, 0x0066, 0x006f, 0x0072, 0x006d, + 0x0061, 0x0074, 0x0069, 0x006f, 0x006e, 0 }; /* SummaryInformation */ +/* substorage names */ +static const WCHAR p_name7[] = { 0x0074, 0x0061, 0x0072, 0x0067, 0x0065, 0x0074, 0x0054, 0x006f, 0x0075, 0x0070, + 0x0067, 0x0072, 0x0061, 0x0064, 0x0065, 0x0064, 0 }; /* targetToupgraded */ +static const WCHAR p_name8[] = { 0x0023, 0x0074, 0x0061, 0x0072, 0x0067, 0x0065, 0x0074, 0x0054, 0x006f, 0x0075, + 0x0070, 0x0067, 0x0072, 0x0061, 0x0064, 0x0065, 0x0064, 0 }; /* #targetToupgraded */ + +/* data in each table */ +static const WCHAR p_data0[] = { /* _Columns */ + 0x0001, 0x0001, 0x0001, 0x0001, 0x8001, 0x8002, 0x8003, 0x8004, + 0x0002, 0x0003, 0x0004, 0x0005, 0xad00, 0xbd26, 0x8d00, 0x9502 +}; +static const WCHAR p_data1[] = { /* _Tables */ + 0x0001 +}; +static const char p_data2[] = { /* _StringData */ + "MsiPatchSequencePatchFamilyProductCodeSequenceAttributes1.1.19388.37230913B8D18FBB64CACA239C74C11E3FA74" +}; +static const WCHAR p_data3[] = { /* _StringPool */ +/* len, refs */ + 0, 0, /* string 0 '' */ + 16, 5, /* string 1 'MsiPatchSequence' */ + 11, 1, /* string 2 'PatchFamily' */ + 11, 1, /* string 3 'ProductCode' */ + 8, 1, /* string 4 'Sequence' */ + 10, 1, /* string 5 'Attributes' */ + 15, 1, /* string 6 '1.1.19388.37230' */ + 32, 1, /* string 7 '913B8D18FBB64CACA239C74C11E3FA74' */ +}; +static const char p_data4[] = { /* CAB_msitest */ + 0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9e, + 0x03, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x12, + 0xea, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, + 0x3c, 0xd4, 0x80, 0x20, 0x00, 0x70, 0x61, 0x74, 0x63, 0x68, 0x2e, + 0x74, 0x78, 0x74, 0x00, 0x0b, 0x3c, 0xd6, 0xc1, 0x4a, 0x00, 0xea, + 0x03, 0x5b, 0x80, 0x80, 0x8d, 0x00, 0x10, 0xa1, 0x3e, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x40, 0x30, 0x0c, 0x43, 0xf8, 0xb4, 0x85, + 0x4d, 0x96, 0x08, 0x0a, 0x92, 0xf0, 0x52, 0xfb, 0xbb, 0x82, 0xf9, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x31, 0x7d, + 0x56, 0xdf, 0xf7, 0x48, 0x7c, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x80, 0xdf, 0xf7, 0xd8, 0x72, 0xbf, 0xb9, 0x63, + 0x91, 0x0e, 0x57, 0x1f, 0xfa, 0x1a, 0x66, 0x54, 0x55 +}; +static const WCHAR p_data5[] = { /* MsiPatchSequence */ + 0x0007, 0x0000, 0x0006, 0x8000 +}; +static const char p_data6[] = { /* SummaryInformation */ + 0xfe, 0xff, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x9f, 0xf2, 0xf9, + 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9, + 0x30, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x27, 0x00, 0x00, 0x00, 0x7b, 0x30, 0x46, 0x39, 0x36, 0x43, + 0x44, 0x43, 0x30, 0x2d, 0x34, 0x43, 0x44, 0x46, 0x2d, 0x34, 0x33, + 0x30, 0x34, 0x2d, 0x42, 0x32, 0x38, 0x33, 0x2d, 0x37, 0x42, 0x39, + 0x32, 0x36, 0x34, 0x38, 0x38, 0x39, 0x45, 0x46, 0x37, 0x7d, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x7b, 0x39, + 0x31, 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46, 0x42, 0x42, + 0x36, 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32, 0x33, 0x39, + 0x2d, 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33, 0x46, 0x41, + 0x37, 0x34, 0x7d, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x25, 0x00, + 0x00, 0x00, 0x3a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x6f, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x3b, 0x3a, 0x23, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x50, 0x61, 0x74, 0x63, 0x68, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 +}; + +struct table_data { + LPCWSTR name; + const void *data; + DWORD size; +}; + +static const struct table_data table_patch_data[] = { + { p_name0, p_data0, sizeof p_data0 }, + { p_name1, p_data1, sizeof p_data1 }, + { p_name2, p_data2, sizeof p_data2 - 1 }, + { p_name3, p_data3, sizeof p_data3 }, + { p_name4, p_data4, sizeof p_data4 }, + { p_name5, p_data5, sizeof p_data5 }, + { p_name6, p_data6, sizeof p_data6 } +}; + +#define NUM_PATCH_TABLES (sizeof table_patch_data/sizeof table_patch_data[0]) + +static const WCHAR t1_name0[] = { 0x4840, 0x430f, 0x422f, 0 }; /* File */ +static const WCHAR t1_name1[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */ +static const WCHAR t1_name2[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */ +static const WCHAR t1_name3[] = { 0x0005, 0x0053, 0x0075, 0x006d, 0x006d, 0x0061, 0x0072, + 0x0079, 0x0049, 0x006e, 0x0066, 0x006f, 0x0072, 0x006d, + 0x0061, 0x0074, 0x0069, 0x006f, 0x006e, 0 }; /* SummaryInformation */ + +static const WCHAR t1_data0[] = { /* File */ + 0x0008, 0x0001, 0x03ea, 0x8000 +}; +static const char t1_data1[] = { /* _StringData */ + "patch.txt" +}; +static const WCHAR t1_data2[] = { /* _StringPool */ +/* len, refs */ + 0, 0, /* string 0 '' */ + 9, 1, /* string 1 'patch.txt' */ +}; +static const char t1_data3[] = { /* SummaryInformation */ + 0xfe, 0xff, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x9f, 0xf2, 0xf9, + 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9, + 0x30, 0x00, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xa8, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0xd0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x04, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x8c, 0x01, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x57, 0x69, 0x6e, 0x65, 0x48, 0x51, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3b, 0x31, + 0x30, 0x33, 0x33, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x3b, 0x31, 0x30, 0x33, 0x33, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7b, 0x39, 0x31, + 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46, 0x42, 0x42, 0x36, + 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32, 0x33, 0x39, 0x2d, + 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33, 0x46, 0x41, 0x37, + 0x34, 0x7d, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x3b, 0x7b, 0x39, 0x31, + 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46, 0x42, 0x42, 0x36, + 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32, 0x33, 0x39, 0x2d, + 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33, 0x46, 0x41, 0x37, + 0x34, 0x7d, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x3b, 0x7b, 0x41, 0x32, + 0x45, 0x33, 0x44, 0x36, 0x34, 0x33, 0x2d, 0x34, 0x45, 0x32, 0x43, + 0x2d, 0x34, 0x37, 0x37, 0x46, 0x2d, 0x41, 0x33, 0x30, 0x39, 0x2d, + 0x46, 0x37, 0x36, 0x46, 0x35, 0x35, 0x32, 0x44, 0x35, 0x46, 0x34, + 0x33, 0x7d, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x22, 0x09 +}; + +static const struct table_data table_transform1_data[] = { + { t1_name0, t1_data0, sizeof t1_data0 }, + { t1_name1, t1_data1, sizeof t1_data1 - 1 }, + { t1_name2, t1_data2, sizeof t1_data2 }, + { t1_name3, t1_data3, sizeof t1_data3 } +}; + +#define NUM_TRANSFORM1_TABLES (sizeof table_transform1_data/sizeof table_transform1_data[0]) + +static const WCHAR t2_name0[] = { 0x4840, 0x430f, 0x422f, 0 }; /* File */ +static const WCHAR t2_name1[] = { 0x4840, 0x4216, 0x4327, 0x4824, 0 }; /* Media */ +static const WCHAR t2_name2[] = { 0x4840, 0x3b3f, 0x43f2, 0x4438, 0x45b1, 0 }; /* _Columns */ +static const WCHAR t2_name3[] = { 0x4840, 0x3f7f, 0x4164, 0x422f, 0x4836, 0 }; /* _Tables */ +static const WCHAR t2_name4[] = { 0x4840, 0x4559, 0x44f2, 0x4568, 0x4737, 0 }; /* Property */ +static const WCHAR t2_name5[] = { 0x4840, 0x4119, 0x41b7, 0x3e6b, 0x41a4, 0x412e, 0x422a, 0 }; /* PatchPackage */ +static const WCHAR t2_name6[] = { 0x4840, 0x4452, 0x45f6, 0x43e4, 0x3baf, 0x423b, 0x4626, + 0x4237, 0x421c, 0x4634, 0x4468, 0x4226, 0 }; /* InstallExecuteSequence */ +static const WCHAR t2_name7[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3b6a, 0x45e4, 0x4824, 0 }; /* _StringData */ +static const WCHAR t2_name8[] = { 0x4840, 0x3f3f, 0x4577, 0x446c, 0x3e6a, 0x44b2, 0x482f, 0 }; /* _StringPool */ +static const WCHAR t2_name9[] = { 0x0005, 0x0053, 0x0075, 0x006d, 0x006d, 0x0061, 0x0072, + 0x0079, 0x0049, 0x006e, 0x0066, 0x006f, 0x0072, 0x006d, + 0x0061, 0x0074, 0x0069, 0x006f, 0x006e, 0 }; /* SummaryInformation */ + +static const WCHAR t2_data0[] = { /* File */ + 0x00c0, 0x0001, 0x9000, 0x83e8 +}; +static const WCHAR t2_data1[] = { /* Media */ + 0x0601, 0x8002, 0x03e9, 0x8000, 0x0000, 0x0007, 0x0000, 0x0008 +}; +static const WCHAR t2_data2[] = { /* _Columns */ + 0x0401, 0x0009, 0x0000, 0x000a, 0xad48, 0x0401, 0x0009, 0x0000, /* 0x0401 = add row (1), 4 shorts */ + 0x000b, 0xa502, 0x0401, 0x0009, 0x0000, 0x000c, 0x8104, 0x0401, + 0x0009, 0x0000, 0x000d, 0x8502, 0x0401, 0x0009, 0x0000, 0x000e, + 0x9900, 0x0401, 0x0009, 0x0000, 0x000f, 0x9d48, 0x0401, 0x0010, + 0x0000, 0x0011, 0xad26, 0x0401, 0x0010, 0x0000, 0x0012, 0x8502, + 0x0401, 0x0014, 0x0000, 0x0015, 0xad26, 0x0401, 0x0014, 0x0000, + 0x000e, 0x8900 +}; +static const WCHAR t2_data3[] = { /* _Tables */ + 0x0101, 0x0009, 0x0101, 0x0010, 0x0101, 0x0014 +}; +static const WCHAR t2_data4[] = { /* Property */ + 0x0201, 0x0002, 0x0003, 0x0201, 0x0004, 0x0005 +}; +static const WCHAR t2_data5[] = { /* PatchPackage */ + 0x0201, 0x0013, 0x8002 +}; +static const WCHAR t2_data6[] = { /* InstallExecuteSequence */ + 0x0301, 0x0006, 0x0000, 0x87d1 +}; +static const char t2_data7[] = { /* _StringData */ + "patch.txtPATCHNEWSUMMARYSUBJECTInstallation DatabasePATCHNEWPACKAGECODE{42A14A82-12F8-4E6D-970E-1B4EE7BE28B0}" + "PatchFiles#CAB_msitestpropPatchFile_SequencePatchSizeAttributesHeaderStreamRef_PatchPackagePatchIdMedia_" + "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}MsiPatchHeadersStreamRef" +}; +static const WCHAR t2_data8[] = { /* _StringPool */ +/* len, refs */ + 0, 0, /* string 0 '' */ + 9, 1, /* string 1 'patch.txt' */ + 22, 1, /* string 2 'PATCHNEWSUMMARYSUBJECT' */ + 21, 1, /* string 3 'Installation Database' */ + 19, 1, /* string 4 'PATCHNEWPACKAGECODE' */ + 38, 1, /* string 5 '{42A14A82-12F8-4E6D-970E-1B4EE7BE28B0}' */ + 10, 1, /* string 6 'PatchFiles' */ + 12, 1, /* string 7 '#CAB_msitest' */ + 4, 1, /* string 8 'prop' */ + 5, 7, /* string 9 'Patch' */ + 5, 1, /* string 10 'File_' */ + 8, 1, /* string 11 'Sequence' */ + 9, 1, /* string 12 'PatchSize' */ + 10, 1, /* string 13 'Attributes' */ + 6, 2, /* string 14 'Header' */ + 10, 1, /* string 15 'StreamRef_' */ + 12, 3, /* string 16 'PatchPackage' */ + 7, 1, /* string 17 'PatchId' */ + 6, 1, /* string 18 'Media_' */ + 38, 1, /* string 19 '{0F96CDC0-4CDF-4304-B283-7B9264889EF7}' */ + 15, 3, /* string 20 'MsiPatchHeaders' */ + 9, 1 /* string 21 'StreamRef' */ +}; +static const char t2_data9[] = { /* SummaryInformation */ + 0xfe, 0xff, 0x00, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x9f, 0xf2, 0xf9, + 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9, + 0x30, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x9c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xa8, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x4c, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x54, 0x01, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3b, 0x31, 0x30, 0x33, 0x33, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7b, + 0x39, 0x31, 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46, 0x42, + 0x42, 0x36, 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32, 0x33, + 0x39, 0x2d, 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33, 0x46, + 0x41, 0x37, 0x34, 0x7d, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x3b, 0x7b, + 0x39, 0x31, 0x33, 0x42, 0x38, 0x44, 0x31, 0x38, 0x2d, 0x46, 0x42, + 0x42, 0x36, 0x2d, 0x34, 0x43, 0x41, 0x43, 0x2d, 0x41, 0x32, 0x33, + 0x39, 0x2d, 0x43, 0x37, 0x34, 0x43, 0x31, 0x31, 0x45, 0x33, 0x46, + 0x41, 0x37, 0x34, 0x7d, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x3b, 0x7b, + 0x41, 0x32, 0x45, 0x33, 0x44, 0x36, 0x34, 0x33, 0x2d, 0x34, 0x45, + 0x32, 0x43, 0x2d, 0x34, 0x37, 0x37, 0x46, 0x2d, 0x41, 0x33, 0x30, + 0x39, 0x2d, 0x46, 0x37, 0x36, 0x46, 0x35, 0x35, 0x32, 0x44, 0x35, + 0x46, 0x34, 0x33, 0x7d, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2d, + 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x27, 0x09 +}; + +static const struct table_data table_transform2_data[] = { + { t2_name0, t2_data0, sizeof t2_data0 }, + { t2_name1, t2_data1, sizeof t2_data1 }, + { t2_name2, t2_data2, sizeof t2_data2 }, + { t2_name3, t2_data3, sizeof t2_data3 }, + { t2_name4, t2_data4, sizeof t2_data4 }, + { t2_name5, t2_data5, sizeof t2_data5 }, + { t2_name6, t2_data6, sizeof t2_data6 }, + { t2_name7, t2_data7, sizeof t2_data7 - 1 }, + { t2_name8, t2_data8, sizeof t2_data8 }, + { t2_name9, t2_data9, sizeof t2_data9 } +}; + +#define NUM_TRANSFORM2_TABLES (sizeof table_transform2_data/sizeof table_transform2_data[0]) + +static void write_tables( IStorage *stg, const struct table_data *tables, UINT num_tables ) +{ + IStream *stm; + DWORD i, count; + HRESULT r; + + for (i = 0; i < num_tables; i++) + { + r = IStorage_CreateStream( stg, tables[i].name, STGM_WRITE|STGM_SHARE_EXCLUSIVE, 0, 0, &stm ); + if (FAILED( r )) + { + ok( 0, "failed to create stream 0x%08x\n", r ); + continue; + } + + r = IStream_Write( stm, tables[i].data, tables[i].size, &count ); + if (FAILED( r ) || count != tables[i].size) + ok( 0, "failed to write stream\n" ); + IStream_Release( stm ); + } +} + +static void create_patch( const char *filename ) +{ + IStorage *stg = NULL, *stg1 = NULL, *stg2 = NULL; + WCHAR *filenameW; + HRESULT r; + int len; + const DWORD mode = STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE; + + const CLSID CLSID_MsiPatch = {0xc1086, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}}; + const CLSID CLSID_MsiTransform = {0xc1082, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}}; + + len = MultiByteToWideChar( CP_ACP, 0, filename, -1, NULL, 0 ); + filenameW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, filename, -1, filenameW, len ); + + r = StgCreateDocfile( filenameW, mode, 0, &stg ); + HeapFree( GetProcessHeap(), 0, filenameW ); + ok( r == S_OK, "failed to create storage 0x%08x\n", r ); + if (!stg) + return; + + r = IStorage_SetClass( stg, &CLSID_MsiPatch ); + ok( r == S_OK, "failed to set storage type 0x%08x\n", r ); + + write_tables( stg, table_patch_data, NUM_PATCH_TABLES ); + + r = IStorage_CreateStorage( stg, p_name7, mode, 0, 0, &stg1 ); + ok( r == S_OK, "failed to create substorage 0x%08x\n", r ); + + r = IStorage_SetClass( stg1, &CLSID_MsiTransform ); + ok( r == S_OK, "failed to set storage type 0x%08x\n", r ); + + write_tables( stg1, table_transform1_data, NUM_TRANSFORM1_TABLES ); + IStorage_Release( stg1 ); + + r = IStorage_CreateStorage( stg, p_name8, mode, 0, 0, &stg2 ); + ok( r == S_OK, "failed to create substorage 0x%08x\n", r ); + + r = IStorage_SetClass( stg2, &CLSID_MsiTransform ); + ok( r == S_OK, "failed to set storage type 0x%08x\n", r ); + + write_tables( stg2, table_transform2_data, NUM_TRANSFORM2_TABLES ); + IStorage_Release( stg2 ); + IStorage_Release( stg ); +} + +static void test_simple_patch( void ) +{ + UINT r; + DWORD size; + char path[MAX_PATH], install_source[MAX_PATH]; + const char *query; + MSIHANDLE hpackage, hdb, hview, hrec; + + if (!pMsiApplyPatchA) + { + win_skip("MsiApplyPatchA is not available\n"); + return; + } + + CreateDirectoryA( "msitest", NULL ); + create_file( "msitest\\patch.txt", 1000 ); + + create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) ); + create_patch( mspfile ); + + MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); + + r = MsiInstallProductA( msifile, NULL ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + size = get_pf_file_size( "msitest\\patch.txt" ); + ok( size == 1000, "expected 1000, got %u\n", size ); + + size = sizeof(install_source); + r = MsiGetProductInfoA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + "InstallSource", install_source, &size ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + strcpy( path, CURR_DIR ); + strcat( path, "\\" ); + strcat( path, msifile ); + + r = MsiOpenPackageA( path, &hpackage ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + hdb = MsiGetActiveDatabase( hpackage ); + ok( hdb, "failed to get database handle\n" ); + + query = "SELECT * FROM `Property` where `Property` = 'PATCHNEWPACKAGECODE'"; + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); + + MsiCloseHandle( hrec ); + MsiViewClose( hview ); + MsiCloseHandle( hview ); + + query = "SELECT * FROM `Property` WHERE `Property` = 'PATCHNEWSUMMARYSUBJECT' " + "AND `Value` = 'Installer Database'"; + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + MsiCloseHandle( hrec ); + MsiViewClose( hview ); + MsiCloseHandle( hview ); + + MsiCloseHandle( hdb ); + MsiCloseHandle( hpackage ); + + r = MsiApplyPatchA( mspfile, NULL, INSTALLTYPE_DEFAULT, NULL ); + ok( r == ERROR_SUCCESS || broken( r == ERROR_PATCH_PACKAGE_INVALID ), /* version 2.0 */ + "expected ERROR_SUCCESS, got %u\n", r ); + + if (r == ERROR_PATCH_PACKAGE_INVALID) + { + win_skip("Windows Installer < 3.0 detected\n"); + return; + } + + size = get_pf_file_size( "msitest\\patch.txt" ); + ok( size == 1002, "expected 1002, got %u\n", size ); + + /* show that MsiOpenPackage applies registered patches */ + r = MsiOpenPackageA( path, &hpackage ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + hdb = MsiGetActiveDatabase( hpackage ); + ok( hdb, "failed to get database handle\n" ); + + query = "SELECT * FROM `Property` where `Property` = 'PATCHNEWPACKAGECODE'"; + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + MsiCloseHandle( hrec ); + MsiViewClose( hview ); + MsiCloseHandle( hview ); + + query = "SELECT * FROM `Property` WHERE `Property` = 'PATCHNEWSUMMARYSUBJECT' " + "AND `Value` = 'Installation Database'"; + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + MsiCloseHandle( hrec ); + MsiViewClose( hview ); + MsiCloseHandle( hview ); + + MsiCloseHandle( hdb ); + MsiCloseHandle( hpackage ); + + /* show that patches are not committed to the local package database */ + size = sizeof(path); + r = MsiGetProductInfoA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + "LocalPackage", path, &size ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiOpenDatabaseA( path, MSIDBOPEN_READONLY, &hdb ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); + + MsiCloseHandle( hrec ); + MsiViewClose( hview ); + MsiCloseHandle( hview ); + MsiCloseHandle( hdb ); + + size = sizeof(path); + r = MsiGetProductInfoA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + "InstallSource", path, &size ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + ok( !strcasecmp( path, install_source ), "wrong path %s\n", path ); + + r = MsiInstallProductA( msifile, "REMOVE=ALL" ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + ok( !delete_pf( "msitest\\patch.txt", TRUE ), "file not removed\n" ); + ok( !delete_pf( "msitest", FALSE ), "directory not removed\n" ); + + DeleteFileA( msifile ); + DeleteFileA( mspfile ); + RemoveDirectoryA( "msitest" ); +} + +static void test_MsiOpenDatabase( void ) +{ + UINT r; + MSIHANDLE hdb; + + r = MsiOpenDatabase( mspfile, MSIDBOPEN_CREATE, &hdb ); + ok(r == ERROR_SUCCESS, "failed to open database %u\n", r); + + r = MsiDatabaseCommit( hdb ); + ok(r == ERROR_SUCCESS, "failed to commit database %u\n", r); + MsiCloseHandle( hdb ); + + r = MsiOpenDatabase( mspfile, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &hdb ); + ok(r == ERROR_OPEN_FAILED, "expected ERROR_OPEN_FAILED, got %u\n", r); + DeleteFileA( mspfile ); + + r = MsiOpenDatabase( mspfile, MSIDBOPEN_CREATE + MSIDBOPEN_PATCHFILE, &hdb ); + ok(r == ERROR_SUCCESS , "failed to open database %u\n", r); + + r = MsiDatabaseCommit( hdb ); + ok(r == ERROR_SUCCESS, "failed to commit database %u\n", r); + MsiCloseHandle( hdb ); + + r = MsiOpenDatabase( mspfile, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &hdb ); + ok(r == ERROR_SUCCESS, "failed to open database %u\n", r); + MsiCloseHandle( hdb ); + DeleteFileA( mspfile ); + + create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) ); + create_patch( mspfile ); + + r = MsiOpenDatabase( msifile, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &hdb ); + ok(r == ERROR_OPEN_FAILED, "failed to open database %u\n", r ); + + r = MsiOpenDatabase( mspfile, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &hdb ); + ok(r == ERROR_SUCCESS, "failed to open database %u\n", r ); + MsiCloseHandle( hdb ); + + DeleteFileA( msifile ); + DeleteFileA( mspfile ); +} + +static UINT find_entry( MSIHANDLE hdb, const char *table, const char *entry ) +{ + static char fmt[] = "SELECT * FROM `%s` WHERE `Name` = '%s'"; + char query[0x100]; + UINT r; + MSIHANDLE hview, hrec; + + sprintf( query, fmt, table, entry ); + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + MsiViewClose( hview ); + MsiCloseHandle( hview ); + MsiCloseHandle( hrec ); + return r; +} + +static void test_system_tables( void ) +{ + UINT r; + const char *query; + MSIHANDLE hproduct, hdb, hview, hrec; + + if (!pMsiApplyPatchA) + { + win_skip("MsiApplyPatchA is not available\n"); + return; + } + + CreateDirectoryA( "msitest", NULL ); + create_file( "msitest\\patch.txt", 1000 ); + + create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) ); + create_patch( mspfile ); + + MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); + + r = MsiInstallProductA( msifile, NULL ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiOpenProductA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", &hproduct ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + hdb = MsiGetActiveDatabase( hproduct ); + ok( hdb, "failed to get database handle\n" ); + + r = find_entry( hdb, "_Streams", "\5SummaryInformation" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + query = "SELECT * FROM `_Storages`"; + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); + + r = find_entry( hdb, "_Tables", "Directory" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "File" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "Component" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "Feature" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "FeatureComponents" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "Property" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "InstallExecuteSequence" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "Media" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "_Property" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + MsiCloseHandle( hrec ); + MsiViewClose( hview ); + MsiCloseHandle( hview ); + MsiCloseHandle( hdb ); + MsiCloseHandle( hproduct ); + + r = MsiApplyPatchA( mspfile, NULL, INSTALLTYPE_DEFAULT, NULL ); + ok( r == ERROR_SUCCESS || broken( r == ERROR_PATCH_PACKAGE_INVALID ), /* version 2.0 */ + "expected ERROR_SUCCESS, got %u\n", r ); + + if (r == ERROR_PATCH_PACKAGE_INVALID) + { + win_skip("Windows Installer < 3.0 detected\n"); + return; + } + + r = MsiOpenProductA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", &hproduct ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + hdb = MsiGetActiveDatabase( hproduct ); + ok( hdb, "failed to get database handle\n" ); + + r = find_entry( hdb, "_Streams", "\5SummaryInformation" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + query = "SELECT * FROM `_Storages`"; + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); + + r = find_entry( hdb, "_Tables", "Directory" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "File" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "Component" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "Feature" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "FeatureComponents" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "Property" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "InstallExecuteSequence" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "Media" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "_Property" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "MsiPatchHeaders" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "Patch" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + r = find_entry( hdb, "_Tables", "PatchPackage" ); + ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + + MsiCloseHandle( hrec ); + MsiViewClose( hview ); + MsiCloseHandle( hview ); + MsiCloseHandle( hdb ); + MsiCloseHandle( hproduct ); + + r = MsiInstallProductA( msifile, "REMOVE=ALL" ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + DeleteFileA( msifile ); + DeleteFileA( mspfile ); + RemoveDirectoryA( "msitest" ); +} + +static void test_patch_registration( void ) +{ + UINT r, size; + char buffer[MAX_PATH], patch_code[39]; + + if (!pMsiApplyPatchA || !pMsiGetPatchInfoExA || !pMsiEnumPatchesExA) + { + win_skip("required functions not available\n"); + return; + } + + CreateDirectoryA( "msitest", NULL ); + create_file( "msitest\\patch.txt", 1000 ); + + create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) ); + create_patch( mspfile ); + + MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); + + r = MsiInstallProductA( msifile, NULL ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiApplyPatchA( mspfile, NULL, INSTALLTYPE_DEFAULT, NULL ); + ok( r == ERROR_SUCCESS || broken( r == ERROR_PATCH_PACKAGE_INVALID ), /* version 2.0 */ + "expected ERROR_SUCCESS, got %u\n", r ); + + if (r == ERROR_PATCH_PACKAGE_INVALID) + { + win_skip("Windows Installer < 3.0 detected\n"); + return; + } + + buffer[0] = 0; + size = sizeof(buffer); + r = pMsiGetPatchInfoExA( "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}", + "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + INSTALLPROPERTY_LOCALPACKAGE, buffer, &size ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + ok( buffer[0], "buffer empty\n" ); + + buffer[0] = 0; + size = sizeof(buffer); + r = pMsiGetPatchInfoExA( "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}", + "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + NULL, MSIINSTALLCONTEXT_MACHINE, + INSTALLPROPERTY_LOCALPACKAGE, buffer, &size ); + ok( r == ERROR_UNKNOWN_PRODUCT, "expected ERROR_UNKNOWN_PRODUCT, got %u\n", r ); + + buffer[0] = 0; + size = sizeof(buffer); + r = pMsiGetPatchInfoExA( "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}", + "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + NULL, MSIINSTALLCONTEXT_USERMANAGED, + INSTALLPROPERTY_LOCALPACKAGE, buffer, &size ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + ok( !buffer[0], "got %s\n", buffer ); + + r = pMsiEnumPatchesExA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_APPLIED, + 0, patch_code, NULL, NULL, NULL, NULL ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + ok( !strcmp( patch_code, "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}" ), "wrong patch code\n" ); + + r = pMsiEnumPatchesExA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + NULL, MSIINSTALLCONTEXT_MACHINE, MSIPATCHSTATE_APPLIED, + 0, patch_code, NULL, NULL, NULL, NULL ); + ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); + + r = pMsiEnumPatchesExA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + NULL, MSIINSTALLCONTEXT_USERMANAGED, MSIPATCHSTATE_APPLIED, + 0, patch_code, NULL, NULL, NULL, NULL ); + ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); + + r = MsiInstallProductA( msifile, "REMOVE=ALL" ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + buffer[0] = 0; + size = sizeof(buffer); + r = pMsiGetPatchInfoExA( "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}", + "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", + NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + INSTALLPROPERTY_LOCALPACKAGE, buffer, &size ); + ok( r == ERROR_UNKNOWN_PRODUCT, "expected ERROR_UNKNOWN_PRODUCT, got %u\n", r ); + + DeleteFileA( msifile ); + DeleteFileA( mspfile ); + RemoveDirectoryA( "msitest" ); +} + +START_TEST(patch) +{ + DWORD len; + char temp_path[MAX_PATH], prev_path[MAX_PATH]; + + init_function_pointers(); + + GetCurrentDirectoryA( MAX_PATH, prev_path ); + GetTempPath( MAX_PATH, temp_path ); + SetCurrentDirectoryA( temp_path ); + + strcpy( CURR_DIR, temp_path ); + len = strlen( CURR_DIR ); + + if (len && (CURR_DIR[len - 1] == '\\')) + CURR_DIR[len - 1] = 0; + + get_program_files_dir( PROG_FILES_DIR, COMMON_FILES_DIR ); + + test_simple_patch(); + test_MsiOpenDatabase(); + test_system_tables(); + test_patch_registration(); + + SetCurrentDirectoryA( prev_path ); +} diff --git a/rostests/winetests/msi/source.c b/rostests/winetests/msi/source.c index fd983ae50f0..1826f2175be 100644 --- a/rostests/winetests/msi/source.c +++ b/rostests/winetests/msi/source.c @@ -81,7 +81,7 @@ static BOOL squash_guid(LPCWSTR in, LPWSTR out) DWORD i,n=1; GUID guid; - if (FAILED(CLSIDFromString((LPOLESTR)in, &guid))) + if (FAILED(CLSIDFromString((LPCOLESTR)in, &guid))) return FALSE; for(i=0; i<8; i++) diff --git a/rostests/winetests/msi/testlist.c b/rostests/winetests/msi/testlist.c index f8d7679f0d4..0691e873085 100644 --- a/rostests/winetests/msi/testlist.c +++ b/rostests/winetests/msi/testlist.c @@ -12,10 +12,12 @@ extern void func_format(void); extern void func_install(void); extern void func_msi(void); extern void func_package(void); +extern void func_patch(void); extern void func_record(void); extern void func_source(void); extern void func_suminfo(void); + const struct test winetest_testlist[] = { { "automation", func_automation }, @@ -24,6 +26,7 @@ const struct test winetest_testlist[] = { "install", func_install }, { "msi", func_msi }, { "package", func_package }, + { "patch", func_patch }, { "record", func_record }, { "source", func_source }, { "suminfo", func_suminfo }, diff --git a/rostests/winetests/mstask/task.c b/rostests/winetests/mstask/task.c index b9dee3536cc..d1392070399 100644 --- a/rostests/winetests/mstask/task.c +++ b/rostests/winetests/mstask/task.c @@ -427,7 +427,7 @@ static void test_SetAccountInformation_GetAccountInformation(void) /* WinXP returns HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND): 0x80070002 but * Win2K returns SCHED_E_CANNOT_OPEN_TASK: 0x8004130d * Win9x doesn't support security services */ - if (hres == SCHED_E_NO_SECURITY_SERVICES) + if (hres == SCHED_E_NO_SECURITY_SERVICES || hres == SCHED_E_SERVICE_NOT_RUNNING) { win_skip("Security services are not supported\n"); cleanup_task(); @@ -445,7 +445,8 @@ static void test_SetAccountInformation_GetAccountInformation(void) hres = ITask_GetAccountInformation(test_task, &account_name); ok(hres == S_OK || broken(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || - hres == SCHED_E_CANNOT_OPEN_TASK), + hres == SCHED_E_CANNOT_OPEN_TASK || + hres == 0x200), /* win2k */ "GetAccountInformation failed: %08x\n", hres); if (hres == S_OK) { @@ -464,7 +465,8 @@ static void test_SetAccountInformation_GetAccountInformation(void) hres = ITask_GetAccountInformation(test_task, &account_name); ok(hres == S_OK || broken(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || - hres == SCHED_E_CANNOT_OPEN_TASK), + hres == SCHED_E_CANNOT_OPEN_TASK || + hres == 0x200), /* win2k */ "GetAccountInformation failed: %08x\n", hres); if (hres == S_OK) { @@ -480,7 +482,8 @@ static void test_SetAccountInformation_GetAccountInformation(void) hres = ITask_GetAccountInformation(test_task, &account_name); ok(hres == S_OK || broken(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || - hres == SCHED_E_CANNOT_OPEN_TASK), + hres == SCHED_E_CANNOT_OPEN_TASK || + hres == 0x200), /* win2k */ "GetAccountInformation failed: %08x\n", hres); if (hres == S_OK) { diff --git a/rostests/winetests/msvcrtd/debug.c b/rostests/winetests/msvcrtd/debug.c index 71f6e4c3966..40fceac05cd 100644 --- a/rostests/winetests/msvcrtd/debug.c +++ b/rostests/winetests/msvcrtd/debug.c @@ -60,6 +60,7 @@ static void test_new(void) mem = pMSVCRTD_operator_new_dbg(42, _NORMAL_BLOCK, __FILE__, __LINE__); ok(mem != NULL, "memory not allocated\n"); + HeapFree(GetProcessHeap(), 0, mem); } /**********************************************************************/ diff --git a/rostests/winetests/msxml3/domdoc.c b/rostests/winetests/msxml3/domdoc.c index a743e51d391..21e8178b7f4 100644 --- a/rostests/winetests/msxml3/domdoc.c +++ b/rostests/winetests/msxml3/domdoc.c @@ -90,6 +90,16 @@ static const WCHAR szComplete5[] = { '<','/','S',':','s','e','a','r','c','h','>',0 }; +static const WCHAR szComplete6[] = { + '<','?','x','m','l',' ','v','e','r','s','i','o','n','=','\'','1','.','0','\'',' ', + 'e','n','c','o','d','i','n','g','=','\'','W','i','n','d','o','w','s','-','1','2','5','2','\'','?','>','\n', + '<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0 +}; + +static const CHAR szNonUnicodeXML[] = +"\n" +"\n"; + static const CHAR szExampleXML[] = "\n" "\n" @@ -460,20 +470,8 @@ static void node_to_string(IXMLDOMNode *node, char *buf) } else { - int pos = get_node_position(node); - DOMNodeType parent_type = NODE_INVALID; r = IXMLDOMNode_get_parentNode(node, &new_node); - - /* currently wine doesn't create a node for the . To be able to test query - * results we "fix" it */ - if (r == S_OK) - ole_check(IXMLDOMNode_get_nodeType(new_node, &parent_type)); - if ((parent_type == NODE_DOCUMENT) && type != NODE_PROCESSING_INSTRUCTION && pos==1) - { - todo_wine ok(FALSE, "The first child of the document node in MSXML is the processing instruction\n"); - pos++; - } - wsprintf(buf, "%d", pos); + wsprintf(buf, "%d", get_node_position(node)); buf += strlen(buf); } @@ -537,8 +535,9 @@ static void test_domdoc( void ) LONG nLength = 0; WCHAR buff[100]; - r = CoCreateInstance( &CLSID_DOMDocument, NULL, + r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -552,11 +551,11 @@ if (0) /* try some stupid things */ r = IXMLDOMDocument_loadXML( doc, NULL, NULL ); - ok( r == S_FALSE, "loadXML failed\n"); + ok( r == S_FALSE, "loadXML succeeded\n"); b = VARIANT_TRUE; r = IXMLDOMDocument_loadXML( doc, NULL, &b ); - ok( r == S_FALSE, "loadXML failed\n"); + ok( r == S_FALSE, "loadXML succeeded\n"); ok( b == VARIANT_FALSE, "failed to load XML string\n"); /* try to load a document from a nonexistent file */ @@ -567,16 +566,16 @@ if (0) V_BSTR(&var) = str; r = IXMLDOMDocument_load( doc, var, &b); - ok( r == S_FALSE, "load (from file) failed\n"); - ok( b == VARIANT_FALSE, "failed to load XML file\n"); + ok( r == S_FALSE, "loadXML succeeded\n"); + ok( b == VARIANT_FALSE, "succeeded in loading XML string\n"); SysFreeString( str ); /* try load an empty document */ b = VARIANT_TRUE; str = SysAllocString( szEmpty ); r = IXMLDOMDocument_loadXML( doc, str, &b ); - ok( r == S_FALSE, "loadXML failed\n"); - ok( b == VARIANT_FALSE, "failed to load XML string\n"); + ok( r == S_FALSE, "loadXML succeeded\n"); + ok( b == VARIANT_FALSE, "succeeded in loading XML string\n"); SysFreeString( str ); r = IXMLDOMDocument_get_async( doc, &b ); @@ -598,8 +597,8 @@ if (0) b = VARIANT_TRUE; str = SysAllocString( szIncomplete ); r = IXMLDOMDocument_loadXML( doc, str, &b ); - ok( r == S_FALSE, "loadXML failed\n"); - ok( b == VARIANT_FALSE, "failed to load XML string\n"); + ok( r == S_FALSE, "loadXML succeeded\n"); + ok( b == VARIANT_FALSE, "succeeded in loading XML string\n"); SysFreeString( str ); /* check that there's no document element */ @@ -617,6 +616,22 @@ if (0) ok( r == S_OK, "loadXML failed\n"); ok( b == VARIANT_TRUE, "failed to load XML string\n"); + /* loadXML ignores the encoding attribute and always expects Unicode */ + b = VARIANT_FALSE; + str = SysAllocString( szComplete6 ); + r = IXMLDOMDocument_loadXML( doc, str, &b ); + ok( r == S_OK, "loadXML failed\n"); + ok( b == VARIANT_TRUE, "failed to load XML string\n"); + SysFreeString( str ); + + /* try a BSTR containing a Windows-1252 document */ + b = VARIANT_TRUE; + str = SysAllocStringByteLen( szNonUnicodeXML, sizeof(szNonUnicodeXML) - 1 ); + r = IXMLDOMDocument_loadXML( doc, str, &b ); + ok( r == S_FALSE, "loadXML succeeded\n"); + ok( b == VARIANT_FALSE, "succeeded in loading XML string\n"); + SysFreeString( str ); + /* try to load something valid */ b = VARIANT_FALSE; str = SysAllocString( szComplete1 ); @@ -629,6 +644,11 @@ if (0) r = IXMLDOMDocument_get_nodeName( doc, NULL ); ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code\n"); + str = (BSTR)0xdeadbeef; + r = IXMLDOMDocument_get_baseName( doc, &str ); + ok ( r == S_FALSE, "got 0x%08x\n", r); + ok (str == NULL, "got %p\n", str); + /* content doesn't matter here */ str = NULL; r = IXMLDOMDocument_get_nodeName( doc, &str ); @@ -1222,6 +1242,27 @@ if (0) free_bstrs(); } +static void test_persiststreaminit(void) +{ + IXMLDOMDocument *doc; + IPersistStreamInit *streaminit; + HRESULT hr; + + hr = CoCreateInstance( &CLSID_DOMDocument, NULL, + CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc ); + ok( hr == S_OK, "failed with 0x%08x\n", hr ); + if( hr != S_OK ) + return; + + hr = IXMLDOMDocument_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&streaminit); + ok( hr == S_OK, "failed with 0x%08x\n", hr ); + + hr = IPersistStreamInit_InitNew(streaminit); + ok( hr == S_OK, "failed with 0x%08x\n", hr ); + + IXMLDOMDocument_Release(doc); +} + static void test_domnode( void ) { HRESULT r; @@ -1237,14 +1278,11 @@ static void test_domnode( void ) VARIANT var; LONG count; - r = CoCreateInstance( &CLSID_DOMDocument, NULL, + r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; - if (!doc) { - ok( FALSE, "no document\n"); - return; - } b = FALSE; str = SysAllocString( szComplete4 ); @@ -1680,15 +1718,17 @@ static void test_refs(void) LONG ref; IUnknown *unk, *unk2; - r = CoCreateInstance( &CLSID_DOMDocument, NULL, + r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; ref = IXMLDOMDocument_Release(doc); ok( ref == 0, "ref %d\n", ref); - r = CoCreateInstance( &CLSID_DOMDocument, NULL, + r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -1784,8 +1824,9 @@ static void test_create(void) LONG ref; LONG num; - r = CoCreateInstance( &CLSID_DOMDocument, NULL, + r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -1988,6 +2029,17 @@ static void test_create(void) if( SUCCEEDED(r) ) IXMLDOMNode_Release( node ); SysFreeString(str); + /* a name is required for attribute, try a BSTR with first null wchar */ + V_VT(&var) = VT_I1; + V_I1(&var) = NODE_ATTRIBUTE; + str = SysAllocString( szstr1 ); + str[0] = 0; + node = (IXMLDOMNode*)0x1; + r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node ); + ok( r == E_FAIL, "returns %08x\n", r ); + ok( node == (void*)0x1, "expected same ptr, got %p\n", node); + SysFreeString(str); + /* NODE_PROCESSING_INSTRUCTION */ V_VT(&var) = VT_I1; V_I1(&var) = NODE_PROCESSING_INSTRUCTION; @@ -2224,8 +2276,9 @@ static void test_getElementsByTagName(void) IXMLDOMNodeList *node_list; LONG len; - r = CoCreateInstance( &CLSID_DOMDocument, NULL, + r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -2289,8 +2342,9 @@ static void test_get_text(void) IXMLDOMNamedNodeMap *node_map; LONG len; - r = CoCreateInstance( &CLSID_DOMDocument, NULL, + r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -2390,8 +2444,9 @@ static void test_get_childNodes(void) IXMLDOMNodeList *node_list, *node_list2; LONG len; - r = CoCreateInstance( &CLSID_DOMDocument, NULL, + r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -2431,6 +2486,40 @@ static void test_get_childNodes(void) IXMLDOMDocument_Release( doc ); } +static void test_get_firstChild(void) +{ + static WCHAR xmlW[] = {'x','m','l',0}; + IXMLDOMDocument *doc; + IXMLDOMNode *node; + VARIANT_BOOL b; + HRESULT r; + BSTR str; + + r = CoCreateInstance( &CLSID_DOMDocument, NULL, + CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc ); + ok( r == S_OK, "failed with 0x%08x\n", r ); + if( r != S_OK ) + return; + + str = SysAllocString( szComplete4 ); + r = IXMLDOMDocument_loadXML( doc, str, &b ); + ok( r == S_OK, "loadXML failed\n"); + ok( b == VARIANT_TRUE, "failed to load XML string\n"); + SysFreeString( str ); + + r = IXMLDOMDocument_get_firstChild( doc, &node ); + ok( r == S_OK, "ret %08x\n", r); + + r = IXMLDOMNode_get_nodeName( node, &str ); + ok( r == S_OK, "ret %08x\n", r); + + ok(memcmp(str, xmlW, sizeof(xmlW)) == 0, "expected \"xml\" node name\n"); + + SysFreeString(str); + IXMLDOMNode_Release( node ); + IXMLDOMDocument_Release( doc ); +} + static void test_removeChild(void) { HRESULT r; @@ -2441,8 +2530,9 @@ static void test_removeChild(void) IXMLDOMNode *fo_node, *ba_node, *removed_node, *temp_node, *lc_node; IXMLDOMNodeList *root_list, *fo_list; - r = CoCreateInstance( &CLSID_DOMDocument, NULL, + r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -2532,6 +2622,7 @@ static void test_replaceChild(void) r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -2642,6 +2733,7 @@ static void test_removeNamedItem(void) r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -2729,9 +2821,11 @@ static void test_XMLHTTP(void) HRESULT hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLHttpRequest, (void **)&pXMLHttpRequest); - ok(hr == S_OK, "CoCreateInstance(CLSID_XMLHTTPRequest) should have succeeded instead of failing with 0x%08x\n", hr); - if (hr != S_OK) + if (FAILED(hr)) + { + win_skip("IXMLHTTPRequest is not available (0x%08x)\n", hr); return; + } VariantInit(&dummy); V_VT(&dummy) = VT_ERROR; @@ -2785,6 +2879,7 @@ static void test_IXMLDOMDocument2(void) r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -2856,6 +2951,7 @@ static void test_XPath(void) r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -2916,6 +3012,8 @@ static void test_XPath(void) expect_list_and_release(list, ""); ole_check(IXMLDOMDocument_selectNodes(doc, _bstr_("//elem[4]"), &list)); expect_list_and_release(list, ""); + ole_check(IXMLDOMDocument_selectNodes(doc, _bstr_("root//elem[0]"), &list)); + expect_list_and_release(list, ""); /* foo undeclared in document node */ ole_expect(IXMLDOMDocument_selectNodes(doc, _bstr_("root//foo:c"), &list), E_FAIL); @@ -2980,6 +3078,7 @@ static void test_cloneNode(void ) static const WCHAR szSearch[] = { 'l', 'c', '/', 'p', 'r', 0 }; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); if( r != S_OK ) return; @@ -3141,6 +3240,7 @@ static void test_xmlTypes(void) LONG len = 0; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; @@ -4209,6 +4309,7 @@ static void test_nodeTypeTests( void ) HRESULT hr; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; @@ -4554,10 +4655,12 @@ static void test_DocumentSaveToDocument(void) HRESULT hr; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc2 ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) { IXMLDOMDocument_Release(doc); @@ -4609,6 +4712,7 @@ static void test_DocumentSaveToFile(void) HRESULT hr; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; @@ -4656,10 +4760,12 @@ static void test_testTransforms(void) HRESULT hr; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&docSS ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) { IXMLDOMDocument_Release(doc); @@ -4707,6 +4813,7 @@ static void test_Namespaces(void) ""; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; @@ -4762,6 +4869,7 @@ static void test_FormattingXML(void) static const CHAR szLinefeedRootXML[] = "\r\n\t\r\n"; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; @@ -4798,6 +4906,7 @@ static void test_NodeTypeValue(void) VARIANT v; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; @@ -5187,10 +5296,12 @@ static void test_TransformWithLoadingLocalFile(void) } hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&xsl ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) { IXMLDOMDocument2_Release(doc); @@ -5256,6 +5367,7 @@ static void test_put_nodeValue(void) VARIANT data, type; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; @@ -5357,6 +5469,7 @@ static void test_document_IObjectSafety(void) HRESULT hr; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + ok( hr == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", hr ); if( hr != S_OK ) return; @@ -5456,38 +5569,86 @@ static void test_document_IObjectSafety(void) IXMLDOMDocument_Release(doc); } +static void test_XSLPattern(void) +{ + IXMLDOMDocument2 *doc; + IXMLDOMNodeList *list; + VARIANT_BOOL b; + HRESULT r; + LONG len; + + r = CoCreateInstance( &CLSID_DOMDocument, NULL, + CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void**)&doc ); + ok( r == S_OK, "CoCreateInstance(CLSID_DOMDocument) should have succeeded instead of failing with 0x%08x\n", r ); + if( r != S_OK ) + return; + + ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szExampleXML), &b)); + ok(b == VARIANT_TRUE, "failed to load XML string\n"); + + /* switch to XPath */ + ole_check(IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"))); + + /* for XSLPattern start index is 0, for XPath it's 1 */ + ole_check(IXMLDOMDocument2_selectNodes(doc, _bstr_("root//elem[0]"), &list)); + len = 0; + ole_check(IXMLDOMNodeList_get_length(list, &len)); + todo_wine ok(len != 0, "expected filled list\n"); + if (len) + todo_wine expect_list_and_release(list, "E1.E2.D1"); + + IXMLDOMDocument2_Release(doc); + free_bstrs(); +} + START_TEST(domdoc) { + IXMLDOMDocument *doc; HRESULT r; r = CoInitialize( NULL ); ok( r == S_OK, "failed to init com\n"); + if (r != S_OK) + return; + + r = CoCreateInstance( &CLSID_DOMDocument, NULL, + CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); + if (SUCCEEDED(r)) + { + IXMLDOMDocument_Release(doc); + + test_domdoc(); + test_persiststreaminit(); + test_domnode(); + test_refs(); + test_create(); + test_getElementsByTagName(); + test_get_text(); + test_get_childNodes(); + test_get_firstChild(); + test_removeChild(); + test_replaceChild(); + test_removeNamedItem(); + test_IXMLDOMDocument2(); + test_XPath(); + test_XSLPattern(); + test_cloneNode(); + test_xmlTypes(); + test_nodeTypeTests(); + test_DocumentSaveToDocument(); + test_DocumentSaveToFile(); + test_testTransforms(); + test_Namespaces(); + test_FormattingXML(); + test_NodeTypeValue(); + test_TransformWithLoadingLocalFile(); + test_put_nodeValue(); + test_document_IObjectSafety(); + } + else + win_skip("IXMLDOMDocument is not available (0x%08x)\n", r); - test_domdoc(); - test_domnode(); - test_refs(); - test_create(); - test_getElementsByTagName(); - test_get_text(); - test_get_childNodes(); - test_removeChild(); - test_replaceChild(); - test_removeNamedItem(); test_XMLHTTP(); - test_IXMLDOMDocument2(); - test_XPath(); - test_cloneNode(); - test_xmlTypes(); - test_nodeTypeTests(); - test_DocumentSaveToDocument(); - test_DocumentSaveToFile(); - test_testTransforms(); - test_Namespaces(); - test_FormattingXML(); - test_NodeTypeValue(); - test_TransformWithLoadingLocalFile(); - test_put_nodeValue(); - test_document_IObjectSafety(); CoUninitialize(); } diff --git a/rostests/winetests/msxml3/xmlelem.c b/rostests/winetests/msxml3/xmlelem.c index 3304d5a59bd..f38d515c4e7 100644 --- a/rostests/winetests/msxml3/xmlelem.c +++ b/rostests/winetests/msxml3/xmlelem.c @@ -357,6 +357,16 @@ static void test_xmlelem_collection(void) ok(V_VT(&var) == VT_DISPATCH, "Expected VT_DISPATCH, got %d\n", V_VT(&var)); ok(num_vars == 1, "Expected 1, got %d\n", num_vars); + /* try advance further, no children left */ + hr = IEnumVARIANT_Next(enumVar, 1, &var, &num_vars); + ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + ok(V_VT(&var) == 0, "Expected 0, got %d\n", V_VT(&var)); + ok(num_vars == 0, "Expected 0, got %d\n", num_vars); + + hr = IEnumVARIANT_Next(enumVar, 1, &var, NULL); + ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + ok(V_VT(&var) == 0, "Expected 0, got %d\n", V_VT(&var)); + hr = IUnknown_QueryInterface(V_DISPATCH(&var), &IID_IXMLElement, (LPVOID *)&child); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(child != NULL, "Expected non-NULL child\n"); diff --git a/rostests/winetests/ntdll/atom.c b/rostests/winetests/ntdll/atom.c index 821054849b2..149078f34bf 100755 --- a/rostests/winetests/ntdll/atom.c +++ b/rostests/winetests/ntdll/atom.c @@ -479,6 +479,10 @@ START_TEST(atom) InitFunctionPtr(); if (pRtlCreateAtomTable) { + /* Global atom table seems to be available to GUI apps only in + Win7, so let's turn this app into a GUI app */ + GetDesktopWindow(); + test_NtAtom(); test_NtIntAtom(); test_NtRefPinAtom(); diff --git a/rostests/winetests/ntdll/error.c b/rostests/winetests/ntdll/error.c index ee8b9b27d73..01c165dfa90 100755 --- a/rostests/winetests/ntdll/error.c +++ b/rostests/winetests/ntdll/error.c @@ -33,15 +33,16 @@ #include "winternl.h" /* FIXME!!! this test checks only mappings, defined by MSDN - * It is necessary to add other mappings and to test them up to Windows XP. + * It is necessary to add other mappings and to test them + * up to the latest Windows platform. * * Some Windows platforms don't know about all the mappings, and in such * cases they return somewhat strange results (Win98) or a generic error * like ERROR_MR_MID_NOT_FOUND (NT4). Our tests have to know about these to * not fail, but we would very much prefer Wine not to return such garbage. - * To you can pass the 'strict' option to this test to force it to only check + * So you can pass the 'strict' option to this test to force it to only check * results against the first listed value. This test should pass in strict - * mode on the latest Windows platform (currently XP) and in Wine. + * mode on the latest Windows platform and in Wine. * (of course older Windows platforms will fail to pass the strict mode) */ @@ -167,6 +168,7 @@ static void run_error_tests(void) cmp(STATUS_INTEGER_OVERFLOW, ERROR_ARITHMETIC_OVERFLOW); cmp(STATUS_BUFFER_OVERFLOW, ERROR_MORE_DATA); cmp(STATUS_NO_MORE_FILES, ERROR_NO_MORE_FILES); + cmp2(STATUS_HANDLES_CLOSED, ERROR_HANDLES_CLOSED); cmp(STATUS_NO_INHERITANCE, ERROR_NO_INHERITANCE); cmp(STATUS_NO_MORE_EAS, ERROR_NO_MORE_ITEMS); cmp(STATUS_NO_MORE_ENTRIES, ERROR_NO_MORE_ITEMS); @@ -189,7 +191,7 @@ static void run_error_tests(void) cmp(STATUS_HANDLE_NOT_CLOSABLE, ERROR_INVALID_HANDLE); cmp(STATUS_NOT_COMMITTED, ERROR_INVALID_ADDRESS); cmp(STATUS_PARTIAL_COPY, ERROR_PARTIAL_COPY); - cmp3(STATUS_LPC_REPLY_LOST, ERROR_INTERNAL_ERROR, ERROR_CONNECTION_ABORTED); + cmp3(STATUS_LPC_REPLY_LOST, ERROR_CONNECTION_ABORTED, ERROR_INTERNAL_ERROR); cmp(STATUS_INVALID_PARAMETER, ERROR_INVALID_PARAMETER); cmp(STATUS_INVALID_PARAMETER_1, ERROR_INVALID_PARAMETER); cmp(STATUS_INVALID_PARAMETER_2, ERROR_INVALID_PARAMETER); @@ -738,8 +740,8 @@ static void run_error_tests(void) cmp(STATUS_LOGIN_WKSTA_RESTRICTION, ERROR_LOGIN_WKSTA_RESTRICTION); cmp(STATUS_LICENSE_QUOTA_EXCEEDED, ERROR_LICENSE_QUOTA_EXCEEDED); cmp(STATUS_RESOURCE_NOT_OWNED, ERROR_NOT_OWNER); - cmp3(STATUS_DUPLICATE_OBJECTID, STATUS_DUPLICATE_OBJECTID, ERROR_OBJECT_ALREADY_EXISTS); - cmp3(STATUS_OBJECTID_EXISTS, STATUS_OBJECTID_EXISTS, ERROR_OBJECT_ALREADY_EXISTS); + cmp3(STATUS_DUPLICATE_OBJECTID, ERROR_OBJECT_ALREADY_EXISTS, STATUS_DUPLICATE_OBJECTID); + cmp3(STATUS_OBJECTID_EXISTS, ERROR_OBJECT_ALREADY_EXISTS, STATUS_OBJECTID_EXISTS); cmp2(STATUS_OBJECTID_NOT_FOUND, ERROR_FILE_NOT_FOUND); cmp2(STATUS_MFT_TOO_FRAGMENTED, ERROR_DISK_TOO_FRAGMENTED); cmp(SEC_E_INSUFFICIENT_MEMORY, ERROR_NO_SYSTEM_RESOURCES); diff --git a/rostests/winetests/ntdll/exception.c b/rostests/winetests/ntdll/exception.c index 7f215ed9168..ad925458bd4 100644 --- a/rostests/winetests/ntdll/exception.c +++ b/rostests/winetests/ntdll/exception.c @@ -49,6 +49,7 @@ static NTSTATUS (WINAPI *pNtReadVirtualMemory)(HANDLE, const void*, void*, SIZE static NTSTATUS (WINAPI *pNtTerminateProcess)(HANDLE handle, LONG exit_code); static NTSTATUS (WINAPI *pNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG); static NTSTATUS (WINAPI *pNtSetInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG); +static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); #ifdef __i386__ @@ -63,6 +64,8 @@ static int my_argc; static char** my_argv; static int test_stage; +static BOOL is_wow64; + /* Test various instruction combinations that cause a protection fault on the i386, * and check what the resulting exception looks like. */ @@ -72,121 +75,134 @@ static const struct exception BYTE code[18]; /* asm code */ BYTE offset; /* offset of faulting instruction */ BYTE length; /* length of faulting instruction */ + BOOL wow64_broken; /* broken on Wow64, should be skipped */ NTSTATUS status; /* expected status code */ DWORD nb_params; /* expected number of parameters */ DWORD params[4]; /* expected parameters */ } exceptions[] = { +/* 0 */ /* test some privileged instructions */ { { 0xfb, 0xc3 }, /* 0: sti; ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x6c, 0xc3 }, /* 1: insb (%dx); ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x6d, 0xc3 }, /* 2: insl (%dx); ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x6e, 0xc3 }, /* 3: outsb (%dx); ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x6f, 0xc3 }, /* 4: outsl (%dx); ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, +/* 5 */ { { 0xe4, 0x11, 0xc3 }, /* 5: inb $0x11,%al; ret */ - 0, 2, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 2, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0xe5, 0x11, 0xc3 }, /* 6: inl $0x11,%eax; ret */ - 0, 2, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 2, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0xe6, 0x11, 0xc3 }, /* 7: outb %al,$0x11; ret */ - 0, 2, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 2, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0xe7, 0x11, 0xc3 }, /* 8: outl %eax,$0x11; ret */ - 0, 2, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 2, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0xed, 0xc3 }, /* 9: inl (%dx),%eax; ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, +/* 10 */ { { 0xee, 0xc3 }, /* 10: outb %al,(%dx); ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0xef, 0xc3 }, /* 11: outl %eax,(%dx); ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0xf4, 0xc3 }, /* 12: hlt; ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0xfa, 0xc3 }, /* 13: cli; ret */ - 0, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 1, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, /* test long jump to invalid selector */ { { 0xea, 0, 0, 0, 0, 0, 0, 0xc3 }, /* 14: ljmp $0,$0; ret */ - 0, 7, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, + 0, 7, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, +/* 15 */ /* test iret to invalid selector */ { { 0x6a, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0xcf, 0x83, 0xc4, 0x0c, 0xc3 }, /* 15: pushl $0; pushl $0; pushl $0; iret; addl $12,%esp; ret */ - 6, 1, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, + 6, 1, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, /* test loading an invalid selector */ { { 0xb8, 0xef, 0xbe, 0x00, 0x00, 0x8e, 0xe8, 0xc3 }, /* 16: mov $beef,%ax; mov %ax,%gs; ret */ - 5, 2, STATUS_ACCESS_VIOLATION, 2, { 0, 0xbee8 } }, /* 0xbee8 or 0xffffffff */ + 5, 2, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xbee8 } }, /* 0xbee8 or 0xffffffff */ - /* test accessing a zero selector */ + /* test accessing a zero selector (%es broken on Wow64) */ { { 0x06, 0x31, 0xc0, 0x8e, 0xc0, 0x26, 0xa1, 0, 0, 0, 0, 0x07, 0xc3 }, - /* 17: push %es; xor %eax,%eax; mov %ax,%es; mov %es:(0),%ax; pop %es; ret */ - 5, 6, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, + /* push %es; xor %eax,%eax; mov %ax,%es; mov %es:(0),%ax; pop %es; ret */ + 5, 6, TRUE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, + { { 0x0f, 0xa8, 0x31, 0xc0, 0x8e, 0xe8, 0x65, 0xa1, 0, 0, 0, 0, 0x0f, 0xa9, 0xc3 }, + /* push %gs; xor %eax,%eax; mov %ax,%gs; mov %gs:(0),%ax; pop %gs; ret */ + 6, 6, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, /* test moving %cs -> %ss */ { { 0x0e, 0x17, 0x58, 0xc3 }, /* 18: pushl %cs; popl %ss; popl %eax; ret */ - 1, 1, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, + 1, 1, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, - /* 19: test overlong instruction (limit is 15 bytes, 5 on Win7) */ +/* 20 */ + /* test overlong instruction (limit is 15 bytes, 5 on Win7) */ { { 0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0xfa,0xc3 }, - 0, 16, STATUS_ILLEGAL_INSTRUCTION, 0 }, + 0, 16, TRUE, STATUS_ILLEGAL_INSTRUCTION, 0 }, { { 0x64,0x64,0x64,0x64,0xfa,0xc3 }, - 0, 5, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 5, TRUE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, /* test invalid interrupt */ { { 0xcd, 0xff, 0xc3 }, /* 21: int $0xff; ret */ - 0, 2, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, + 0, 2, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, /* test moves to/from Crx */ { { 0x0f, 0x20, 0xc0, 0xc3 }, /* 22: movl %cr0,%eax; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x0f, 0x20, 0xe0, 0xc3 }, /* 23: movl %cr4,%eax; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, +/* 25 */ { { 0x0f, 0x22, 0xc0, 0xc3 }, /* 24: movl %eax,%cr0; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x0f, 0x22, 0xe0, 0xc3 }, /* 25: movl %eax,%cr4; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, /* test moves to/from Drx */ { { 0x0f, 0x21, 0xc0, 0xc3 }, /* 26: movl %dr0,%eax; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x0f, 0x21, 0xc8, 0xc3 }, /* 27: movl %dr1,%eax; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x0f, 0x21, 0xf8, 0xc3 }, /* 28: movl %dr7,%eax; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, +/* 30 */ { { 0x0f, 0x23, 0xc0, 0xc3 }, /* 29: movl %eax,%dr0; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x0f, 0x23, 0xc8, 0xc3 }, /* 30: movl %eax,%dr1; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, { { 0x0f, 0x23, 0xf8, 0xc3 }, /* 31: movl %eax,%dr7; ret */ - 0, 3, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 0, 3, FALSE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, /* test memory reads */ { { 0xa1, 0xfc, 0xff, 0xff, 0xff, 0xc3 }, /* 32: movl 0xfffffffc,%eax; ret */ - 0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xfffffffc } }, + 0, 5, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xfffffffc } }, { { 0xa1, 0xfd, 0xff, 0xff, 0xff, 0xc3 }, /* 33: movl 0xfffffffd,%eax; ret */ - 0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xfffffffd } }, + 0, 5, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xfffffffd } }, +/* 35 */ { { 0xa1, 0xfe, 0xff, 0xff, 0xff, 0xc3 }, /* 34: movl 0xfffffffe,%eax; ret */ - 0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xfffffffe } }, + 0, 5, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xfffffffe } }, { { 0xa1, 0xff, 0xff, 0xff, 0xff, 0xc3 }, /* 35: movl 0xffffffff,%eax; ret */ - 0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, + 0, 5, FALSE, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } }, /* test memory writes */ { { 0xa3, 0xfc, 0xff, 0xff, 0xff, 0xc3 }, /* 36: movl %eax,0xfffffffc; ret */ - 0, 5, STATUS_ACCESS_VIOLATION, 2, { 1, 0xfffffffc } }, + 0, 5, FALSE, STATUS_ACCESS_VIOLATION, 2, { 1, 0xfffffffc } }, { { 0xa3, 0xfd, 0xff, 0xff, 0xff, 0xc3 }, /* 37: movl %eax,0xfffffffd; ret */ - 0, 5, STATUS_ACCESS_VIOLATION, 2, { 1, 0xfffffffd } }, + 0, 5, FALSE, STATUS_ACCESS_VIOLATION, 2, { 1, 0xfffffffd } }, { { 0xa3, 0xfe, 0xff, 0xff, 0xff, 0xc3 }, /* 38: movl %eax,0xfffffffe; ret */ - 0, 5, STATUS_ACCESS_VIOLATION, 2, { 1, 0xfffffffe } }, + 0, 5, FALSE, STATUS_ACCESS_VIOLATION, 2, { 1, 0xfffffffe } }, +/* 40 */ { { 0xa3, 0xff, 0xff, 0xff, 0xff, 0xc3 }, /* 39: movl %eax,0xffffffff; ret */ - 0, 5, STATUS_ACCESS_VIOLATION, 2, { 1, 0xffffffff } }, + 0, 5, FALSE, STATUS_ACCESS_VIOLATION, 2, { 1, 0xffffffff } }, - /* 40: test exception with cleared %ds and %es */ + /* test exception with cleared %ds and %es (broken on Wow64) */ { { 0x1e, 0x06, 0x31, 0xc0, 0x8e, 0xd8, 0x8e, 0xc0, 0xfa, 0x07, 0x1f, 0xc3 }, /* push %ds; push %es; xorl %eax,%eax; mov %ax,%ds; mov %ax,%es; cli; pop %es; pop %ds; ret */ - 8, 1, STATUS_PRIVILEGED_INSTRUCTION, 0 }, + 8, 1, TRUE, STATUS_PRIVILEGED_INSTRUCTION, 0 }, }; static int got_exception; @@ -230,7 +246,9 @@ static LONG CALLBACK rtlraiseexception_vectored_handler(EXCEPTION_POINTERS *Exce rec->ExceptionAddress, (char *)code_mem + 0xb); if (pNtCurrentTeb()->Peb->BeingDebugged) - ok((void *)context->Eax == pRtlRaiseException, "debugger managed to modify Eax to %x should be %p\n", + ok((void *)context->Eax == pRtlRaiseException || + broken( is_wow64 && context->Eax == 0xf00f00f1 ), /* broken on vista */ + "debugger managed to modify Eax to %x should be %p\n", context->Eax, pRtlRaiseException); /* check that context.Eip is fixed up only for EXCEPTION_BREAKPOINT @@ -365,8 +383,8 @@ static DWORD handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *fram unsigned int i, entry = except - exceptions; got_exception++; - trace( "exception: %x flags:%x addr:%p\n", - rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress ); + trace( "exception %u: %x flags:%x addr:%p\n", + entry, rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress ); ok( rec->ExceptionCode == except->status, "%u: Wrong exception code %x/%x\n", entry, rec->ExceptionCode, except->status ); @@ -412,6 +430,11 @@ static void test_prot_fault(void) for (i = 0; i < sizeof(exceptions)/sizeof(exceptions[0]); i++) { + if (is_wow64 && exceptions[i].wow64_broken && !strcmp( winetest_platform, "windows" )) + { + skip( "Exception %u broken on Wow64\n", i ); + continue; + } got_exception = 0; run_exception_test(handler, &exceptions[i], &exceptions[i].code, sizeof(exceptions[i].code), 0); @@ -752,7 +775,9 @@ static void test_debugger(void) /* ctx.Eip is the same value the exception handler got */ if (de.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) { - ok((char *)ctx.Eip == (char *)code_mem_address + 0xa, "Eip at 0x%x instead of %p\n", + ok((char *)ctx.Eip == (char *)code_mem_address + 0xa || + broken(is_wow64 && (char *)ctx.Eip == (char *)code_mem_address + 0xb), + "Eip at 0x%x instead of %p\n", ctx.Eip, (char *)code_mem_address + 0xa); /* need to fixup Eip for debuggee */ if ((char *)ctx.Eip == (char *)code_mem_address + 0xa) @@ -803,7 +828,8 @@ static DWORD simd_fault_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_R ok( rec->ExceptionCode == STATUS_FLOAT_MULTIPLE_TRAPS, "exception code: %#x, should be %#x\n", rec->ExceptionCode, STATUS_FLOAT_MULTIPLE_TRAPS); - ok( rec->NumberParameters == 1, "# of params: %i, should be 1\n", + ok( rec->NumberParameters == 1 || broken(is_wow64 && rec->NumberParameters == 2), + "# of params: %i, should be 1\n", rec->NumberParameters); if( rec->NumberParameters == 1 ) ok( rec->ExceptionInformation[0] == 0, "param #1: %lx, should be 0\n", rec->ExceptionInformation[0]); @@ -924,14 +950,18 @@ static void test_fpu_exceptions(void) run_exception_test(fpu_exception_handler, &info, fpu_exception_test_ie, sizeof(fpu_exception_test_ie), 0); ok(info.exception_code == EXCEPTION_FLT_STACK_CHECK, "Got exception code %#x, expected EXCEPTION_FLT_STACK_CHECK\n", info.exception_code); - ok(info.exception_offset == 0x19, "Got exception offset %#x, expected 0x19\n", info.exception_offset); + ok(info.exception_offset == 0x19 || + broken( is_wow64 && info.exception_offset == info.eip_offset ), + "Got exception offset %#x, expected 0x19\n", info.exception_offset); ok(info.eip_offset == 0x1b, "Got EIP offset %#x, expected 0x1b\n", info.eip_offset); memset(&info, 0, sizeof(info)); run_exception_test(fpu_exception_handler, &info, fpu_exception_test_de, sizeof(fpu_exception_test_de), 0); ok(info.exception_code == EXCEPTION_FLT_DIVIDE_BY_ZERO, "Got exception code %#x, expected EXCEPTION_FLT_DIVIDE_BY_ZERO\n", info.exception_code); - ok(info.exception_offset == 0x17, "Got exception offset %#x, expected 0x17\n", info.exception_offset); + ok(info.exception_offset == 0x17 || + broken( is_wow64 && info.exception_offset == info.eip_offset ), + "Got exception offset %#x, expected 0x17\n", info.exception_offset); ok(info.eip_offset == 0x19, "Got EIP offset %#x, expected 0x19\n", info.eip_offset); } @@ -1379,6 +1409,7 @@ START_TEST(exception) "NtQueryInformationProcess" ); pNtSetInformationProcess = (void*)GetProcAddress( hntdll, "NtSetInformationProcess" ); + pIsWow64Process = (void *)GetProcAddress(GetModuleHandle("kernel32.dll"), "IsWow64Process"); #ifdef __i386__ if (!pNtCurrentTeb) @@ -1386,6 +1417,7 @@ START_TEST(exception) skip( "NtCurrentTeb not found\n" ); return; } + if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE; if (pRtlAddVectoredExceptionHandler && pRtlRemoveVectoredExceptionHandler) have_vectored_api = TRUE; diff --git a/rostests/winetests/ntdll/file.c b/rostests/winetests/ntdll/file.c index 32c8d184943..28287945f60 100644 --- a/rostests/winetests/ntdll/file.c +++ b/rostests/winetests/ntdll/file.c @@ -116,7 +116,7 @@ ULONG_PTR completionKey; IO_STATUS_BLOCK ioSb; ULONG_PTR completionValue; -static long get_pending_msgs(HANDLE h) +static ULONG get_pending_msgs(HANDLE h) { NTSTATUS res; ULONG a, req; @@ -163,9 +163,8 @@ static void create_file_test(void) OBJECT_ATTRIBUTES attr; IO_STATUS_BLOCK io; UNICODE_STRING nameW; - UINT len; - len = GetCurrentDirectoryW( MAX_PATH, path ); + GetCurrentDirectoryW( MAX_PATH, path ); pRtlDosPathNameToNtPathName_U( path, &nameW, NULL, NULL ); attr.Length = sizeof(attr); attr.RootDirectory = 0; @@ -247,7 +246,6 @@ static void create_file_test(void) todo_wine ok( status == STATUS_INVALID_PARAMETER, "open %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status ); - pRtlFreeUnicodeString( &nameW ); } static void open_file_test(void) @@ -255,7 +253,7 @@ static void open_file_test(void) NTSTATUS status; HANDLE dir, root, handle; WCHAR path[MAX_PATH]; - BYTE data[8192]; + BYTE data[1024]; OBJECT_ATTRIBUTES attr; IO_STATUS_BLOCK io; UNICODE_STRING nameW; @@ -270,8 +268,8 @@ static void open_file_test(void) attr.Attributes = OBJ_CASE_INSENSITIVE; attr.SecurityDescriptor = NULL; attr.SecurityQualityOfService = NULL; - status = pNtOpenFile( &dir, GENERIC_READ, &attr, &io, - FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_DIRECTORY_FILE ); + status = pNtOpenFile( &dir, SYNCHRONIZE|FILE_LIST_DIRECTORY, &attr, &io, + FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT ); ok( !status, "open %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status ); pRtlFreeUnicodeString( &nameW ); @@ -321,56 +319,61 @@ static void open_file_test(void) /* try open by file id */ while (!pNtQueryDirectoryFile( dir, NULL, NULL, NULL, &io, data, sizeof(data), - FileIdBothDirectoryInformation, FALSE, NULL, restart )) + FileIdBothDirectoryInformation, TRUE, NULL, restart )) { FILE_ID_BOTH_DIRECTORY_INFORMATION *info = (FILE_ID_BOTH_DIRECTORY_INFORMATION *)data; restart = FALSE; - for (;;) + + if (!info->FileId.QuadPart) continue; + + nameW.Buffer = (WCHAR *)&info->FileId; + nameW.Length = sizeof(info->FileId); + info->FileName[info->FileNameLength/sizeof(WCHAR)] = 0; + attr.RootDirectory = dir; + /* We skip 'open' files by not specifying FILE_SHARE_WRITE */ + status = pNtOpenFile( &handle, GENERIC_READ, &attr, &io, + FILE_SHARE_READ, + FILE_OPEN_BY_FILE_ID | + ((info->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? FILE_DIRECTORY_FILE : 0) ); + ok( status == STATUS_SUCCESS || status == STATUS_ACCESS_DENIED || status == STATUS_NOT_IMPLEMENTED || status == STATUS_SHARING_VIOLATION, + "open %s failed %x\n", wine_dbgstr_w(info->FileName), status ); + if (status == STATUS_NOT_IMPLEMENTED) { - if (!info->FileId.QuadPart) goto next; - nameW.Buffer = (WCHAR *)&info->FileId; - nameW.Length = sizeof(info->FileId); - info->FileName[info->FileNameLength/sizeof(WCHAR)] = 0; - attr.RootDirectory = dir; + win_skip( "FILE_OPEN_BY_FILE_ID not supported\n" ); + break; + } + if (status == STATUS_SHARING_VIOLATION) + trace( "%s is currently open\n", wine_dbgstr_w(info->FileName) ); + if (!status) + { + BYTE buf[sizeof(FILE_ALL_INFORMATION) + MAX_PATH * sizeof(WCHAR)]; + + if (!pNtQueryInformationFile( handle, &io, buf, sizeof(buf), FileAllInformation )) + { + FILE_ALL_INFORMATION *fai = (FILE_ALL_INFORMATION *)buf; + + /* check that it's the same file/directory */ + + /* don't check the size for directories */ + if (!(info->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + ok( info->EndOfFile.QuadPart == fai->StandardInformation.EndOfFile.QuadPart, + "mismatched file size for %s\n", wine_dbgstr_w(info->FileName)); + + ok( info->CreationTime.QuadPart == fai->BasicInformation.CreationTime.QuadPart, + "mismatched creation time for %s\n", wine_dbgstr_w(info->FileName)); + } + CloseHandle( handle ); + + /* try same thing from drive root */ + attr.RootDirectory = root; status = pNtOpenFile( &handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_BY_FILE_ID | ((info->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? FILE_DIRECTORY_FILE : 0) ); - ok( status == STATUS_SUCCESS || status == STATUS_ACCESS_DENIED || status == STATUS_NOT_IMPLEMENTED, + ok( status == STATUS_SUCCESS || status == STATUS_NOT_IMPLEMENTED, "open %s failed %x\n", wine_dbgstr_w(info->FileName), status ); - if (status == STATUS_NOT_IMPLEMENTED) - { - win_skip( "FILE_OPEN_BY_FILE_ID not supported\n" ); - break; - } - if (!status) - { - FILE_ALL_INFORMATION all_info; - - if (!pNtQueryInformationFile( handle, &io, &all_info, sizeof(all_info), FileAllInformation )) - { - /* check that it's the same file */ - ok( info->EndOfFile.QuadPart == all_info.StandardInformation.EndOfFile.QuadPart, - "mismatched file size for %s\n", wine_dbgstr_w(info->FileName)); - ok( info->LastWriteTime.QuadPart == all_info.BasicInformation.LastWriteTime.QuadPart, - "mismatched write time for %s\n", wine_dbgstr_w(info->FileName)); - } - CloseHandle( handle ); - - /* try same thing from drive root */ - attr.RootDirectory = root; - status = pNtOpenFile( &handle, GENERIC_READ, &attr, &io, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN_BY_FILE_ID | - ((info->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? FILE_DIRECTORY_FILE : 0) ); - ok( status == STATUS_SUCCESS || status == STATUS_NOT_IMPLEMENTED, - "open %s failed %x\n", wine_dbgstr_w(info->FileName), status ); - if (!status) CloseHandle( handle ); - } - next: - if (!info->NextEntryOffset) break; - info = (FILE_ID_BOTH_DIRECTORY_INFORMATION *)((char *)info + info->NextEntryOffset); + if (!status) CloseHandle( handle ); } } @@ -907,13 +910,13 @@ static void nt_mailslot_test(void) static void test_iocp_setcompletion(HANDLE h) { NTSTATUS res; - long count; + ULONG count; res = pNtSetIoCompletion( h, CKEY_FIRST, CVALUE_FIRST, STATUS_INVALID_DEVICE_REQUEST, 3 ); ok( res == STATUS_SUCCESS, "NtSetIoCompletion failed: %x\n", res ); count = get_pending_msgs(h); - ok( count == 1, "Unexpected msg count: %ld\n", count ); + ok( count == 1, "Unexpected msg count: %d\n", count ); if (get_msg(h)) { @@ -924,7 +927,7 @@ static void test_iocp_setcompletion(HANDLE h) } count = get_pending_msgs(h); - ok( !count, "Unexpected msg count: %ld\n", count ); + ok( !count, "Unexpected msg count: %d\n", count ); } static void test_iocp_fileio(HANDLE h) @@ -1473,8 +1476,7 @@ START_TEST(file) pNtQueryDirectoryFile = (void *)GetProcAddress(hntdll, "NtQueryDirectoryFile"); create_file_test(); - ok(0, "broken test: open_file_test\n"); - //open_file_test(); + open_file_test(); delete_file_test(); read_file_test(); nt_mailslot_test(); @@ -1483,6 +1485,5 @@ START_TEST(file) test_file_all_information(); test_file_both_information(); test_file_name_information(); - ok(0, "broken test: test_file_all_name_information \n"); - //test_file_all_name_information(); + test_file_all_name_information(); } diff --git a/rostests/winetests/ntdll/generated.c b/rostests/winetests/ntdll/generated.c index b7bfa6dd14a..86d6425f091 100755 --- a/rostests/winetests/ntdll/generated.c +++ b/rostests/winetests/ntdll/generated.c @@ -51,42 +51,32 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + static void test_pack_DWORD32(void) { /* DWORD32 */ @@ -106,15 +96,15 @@ static void test_pack_DWORD64(void) static void test_pack_DWORD_PTR(void) { /* DWORD_PTR */ - TEST_TYPE_SIZE (DWORD_PTR, 4) - TEST_TYPE_ALIGN (DWORD_PTR, 4) + TEST_TYPE_SIZE (DWORD_PTR, 8) + TEST_TYPE_ALIGN (DWORD_PTR, 8) } static void test_pack_HALF_PTR(void) { /* HALF_PTR */ - TEST_TYPE_SIZE (HALF_PTR, 2) - TEST_TYPE_ALIGN (HALF_PTR, 2) + TEST_TYPE_SIZE (HALF_PTR, 4) + TEST_TYPE_ALIGN (HALF_PTR, 4) TEST_TYPE_SIGNED(HALF_PTR) } @@ -153,8 +143,8 @@ static void test_pack_INT8(void) static void test_pack_INT_PTR(void) { /* INT_PTR */ - TEST_TYPE_SIZE (INT_PTR, 4) - TEST_TYPE_ALIGN (INT_PTR, 4) + TEST_TYPE_SIZE (INT_PTR, 8) + TEST_TYPE_ALIGN (INT_PTR, 8) TEST_TYPE_SIGNED(INT_PTR) } @@ -177,30 +167,30 @@ static void test_pack_LONG64(void) static void test_pack_LONG_PTR(void) { /* LONG_PTR */ - TEST_TYPE_SIZE (LONG_PTR, 4) - TEST_TYPE_ALIGN (LONG_PTR, 4) + TEST_TYPE_SIZE (LONG_PTR, 8) + TEST_TYPE_ALIGN (LONG_PTR, 8) TEST_TYPE_SIGNED(LONG_PTR) } static void test_pack_SIZE_T(void) { /* SIZE_T */ - TEST_TYPE_SIZE (SIZE_T, 4) - TEST_TYPE_ALIGN (SIZE_T, 4) + TEST_TYPE_SIZE (SIZE_T, 8) + TEST_TYPE_ALIGN (SIZE_T, 8) } static void test_pack_SSIZE_T(void) { /* SSIZE_T */ - TEST_TYPE_SIZE (SSIZE_T, 4) - TEST_TYPE_ALIGN (SSIZE_T, 4) + TEST_TYPE_SIZE (SSIZE_T, 8) + TEST_TYPE_ALIGN (SSIZE_T, 8) } static void test_pack_UHALF_PTR(void) { /* UHALF_PTR */ - TEST_TYPE_SIZE (UHALF_PTR, 2) - TEST_TYPE_ALIGN (UHALF_PTR, 2) + TEST_TYPE_SIZE (UHALF_PTR, 4) + TEST_TYPE_ALIGN (UHALF_PTR, 4) TEST_TYPE_UNSIGNED(UHALF_PTR) } @@ -239,8 +229,8 @@ static void test_pack_UINT8(void) static void test_pack_UINT_PTR(void) { /* UINT_PTR */ - TEST_TYPE_SIZE (UINT_PTR, 4) - TEST_TYPE_ALIGN (UINT_PTR, 4) + TEST_TYPE_SIZE (UINT_PTR, 8) + TEST_TYPE_ALIGN (UINT_PTR, 8) TEST_TYPE_UNSIGNED(UINT_PTR) } @@ -263,14 +253,14 @@ static void test_pack_ULONG64(void) static void test_pack_ULONG_PTR(void) { /* ULONG_PTR */ - TEST_TYPE_SIZE (ULONG_PTR, 4) - TEST_TYPE_ALIGN (ULONG_PTR, 4) + TEST_TYPE_SIZE (ULONG_PTR, 8) + TEST_TYPE_ALIGN (ULONG_PTR, 8) TEST_TYPE_UNSIGNED(ULONG_PTR) } static void test_pack_ACCESS_ALLOWED_ACE(void) { - /* ACCESS_ALLOWED_ACE (pack 4) */ + /* ACCESS_ALLOWED_ACE */ TEST_TYPE_SIZE (ACCESS_ALLOWED_ACE, 12) TEST_TYPE_ALIGN (ACCESS_ALLOWED_ACE, 4) TEST_FIELD_SIZE (ACCESS_ALLOWED_ACE, Header, 4) @@ -286,7 +276,7 @@ static void test_pack_ACCESS_ALLOWED_ACE(void) static void test_pack_ACCESS_DENIED_ACE(void) { - /* ACCESS_DENIED_ACE (pack 4) */ + /* ACCESS_DENIED_ACE */ TEST_TYPE_SIZE (ACCESS_DENIED_ACE, 12) TEST_TYPE_ALIGN (ACCESS_DENIED_ACE, 4) TEST_FIELD_SIZE (ACCESS_DENIED_ACE, Header, 4) @@ -310,7 +300,7 @@ static void test_pack_ACCESS_MASK(void) static void test_pack_ACE_HEADER(void) { - /* ACE_HEADER (pack 4) */ + /* ACE_HEADER */ TEST_TYPE_SIZE (ACE_HEADER, 4) TEST_TYPE_ALIGN (ACE_HEADER, 2) TEST_FIELD_SIZE (ACE_HEADER, AceType, 1) @@ -326,7 +316,7 @@ static void test_pack_ACE_HEADER(void) static void test_pack_ACL(void) { - /* ACL (pack 4) */ + /* ACL */ TEST_TYPE_SIZE (ACL, 8) TEST_TYPE_ALIGN (ACL, 2) TEST_FIELD_SIZE (ACL, AclRevision, 1) @@ -348,7 +338,7 @@ static void test_pack_ACL(void) static void test_pack_ACL_REVISION_INFORMATION(void) { - /* ACL_REVISION_INFORMATION (pack 4) */ + /* ACL_REVISION_INFORMATION */ TEST_TYPE_SIZE (ACL_REVISION_INFORMATION, 4) TEST_TYPE_ALIGN (ACL_REVISION_INFORMATION, 4) TEST_FIELD_SIZE (ACL_REVISION_INFORMATION, AclRevision, 4) @@ -358,7 +348,7 @@ static void test_pack_ACL_REVISION_INFORMATION(void) static void test_pack_ACL_SIZE_INFORMATION(void) { - /* ACL_SIZE_INFORMATION (pack 4) */ + /* ACL_SIZE_INFORMATION */ TEST_TYPE_SIZE (ACL_SIZE_INFORMATION, 12) TEST_TYPE_ALIGN (ACL_SIZE_INFORMATION, 4) TEST_FIELD_SIZE (ACL_SIZE_INFORMATION, AceCount, 4) @@ -406,40 +396,40 @@ static void test_pack_DWORDLONG(void) static void test_pack_EXCEPTION_POINTERS(void) { - /* EXCEPTION_POINTERS (pack 4) */ - TEST_TYPE_SIZE (EXCEPTION_POINTERS, 8) - TEST_TYPE_ALIGN (EXCEPTION_POINTERS, 4) - TEST_FIELD_SIZE (EXCEPTION_POINTERS, ExceptionRecord, 4) - TEST_FIELD_ALIGN (EXCEPTION_POINTERS, ExceptionRecord, 4) + /* EXCEPTION_POINTERS */ + TEST_TYPE_SIZE (EXCEPTION_POINTERS, 16) + TEST_TYPE_ALIGN (EXCEPTION_POINTERS, 8) + TEST_FIELD_SIZE (EXCEPTION_POINTERS, ExceptionRecord, 8) + TEST_FIELD_ALIGN (EXCEPTION_POINTERS, ExceptionRecord, 8) TEST_FIELD_OFFSET(EXCEPTION_POINTERS, ExceptionRecord, 0) - TEST_FIELD_SIZE (EXCEPTION_POINTERS, ContextRecord, 4) - TEST_FIELD_ALIGN (EXCEPTION_POINTERS, ContextRecord, 4) - TEST_FIELD_OFFSET(EXCEPTION_POINTERS, ContextRecord, 4) + TEST_FIELD_SIZE (EXCEPTION_POINTERS, ContextRecord, 8) + TEST_FIELD_ALIGN (EXCEPTION_POINTERS, ContextRecord, 8) + TEST_FIELD_OFFSET(EXCEPTION_POINTERS, ContextRecord, 8) } static void test_pack_EXCEPTION_RECORD(void) { - /* EXCEPTION_RECORD (pack 4) */ - TEST_TYPE_SIZE (EXCEPTION_RECORD, 80) - TEST_TYPE_ALIGN (EXCEPTION_RECORD, 4) + /* EXCEPTION_RECORD */ + TEST_TYPE_SIZE (EXCEPTION_RECORD, 152) + TEST_TYPE_ALIGN (EXCEPTION_RECORD, 8) TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionCode, 4) TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionCode, 4) TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionCode, 0) TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionFlags, 4) TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionFlags, 4) TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionFlags, 4) - TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionRecord, 4) - TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionRecord, 4) + TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionRecord, 8) + TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionRecord, 8) TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionRecord, 8) - TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionAddress, 4) - TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionAddress, 4) - TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionAddress, 12) + TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionAddress, 8) + TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionAddress, 8) + TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionAddress, 16) TEST_FIELD_SIZE (EXCEPTION_RECORD, NumberParameters, 4) TEST_FIELD_ALIGN (EXCEPTION_RECORD, NumberParameters, 4) - TEST_FIELD_OFFSET(EXCEPTION_RECORD, NumberParameters, 16) - TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionInformation, 60) - TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionInformation, 4) - TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionInformation, 20) + TEST_FIELD_OFFSET(EXCEPTION_RECORD, NumberParameters, 24) + TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionInformation, 120) + TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionInformation, 8) + TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionInformation, 32) } static void test_pack_EXECUTION_STATE(void) @@ -452,7 +442,7 @@ static void test_pack_EXECUTION_STATE(void) static void test_pack_FLOATING_SAVE_AREA(void) { - /* FLOATING_SAVE_AREA (pack 4) */ + /* FLOATING_SAVE_AREA */ TEST_TYPE_SIZE (FLOATING_SAVE_AREA, 112) TEST_TYPE_ALIGN (FLOATING_SAVE_AREA, 4) TEST_FIELD_SIZE (FLOATING_SAVE_AREA, ControlWord, 4) @@ -486,7 +476,7 @@ static void test_pack_FLOATING_SAVE_AREA(void) static void test_pack_FPO_DATA(void) { - /* FPO_DATA (pack 4) */ + /* FPO_DATA */ TEST_TYPE_SIZE (FPO_DATA, 16) TEST_TYPE_ALIGN (FPO_DATA, 4) TEST_FIELD_SIZE (FPO_DATA, ulOffStart, 4) @@ -505,7 +495,7 @@ static void test_pack_FPO_DATA(void) static void test_pack_GENERIC_MAPPING(void) { - /* GENERIC_MAPPING (pack 4) */ + /* GENERIC_MAPPING */ TEST_TYPE_SIZE (GENERIC_MAPPING, 16) TEST_TYPE_ALIGN (GENERIC_MAPPING, 4) TEST_FIELD_SIZE (GENERIC_MAPPING, GenericRead, 4) @@ -525,8 +515,8 @@ static void test_pack_GENERIC_MAPPING(void) static void test_pack_HANDLE(void) { /* HANDLE */ - TEST_TYPE_SIZE (HANDLE, 4) - TEST_TYPE_ALIGN (HANDLE, 4) + TEST_TYPE_SIZE (HANDLE, 8) + TEST_TYPE_ALIGN (HANDLE, 8) } static void test_pack_HRESULT(void) @@ -538,7 +528,7 @@ static void test_pack_HRESULT(void) static void test_pack_IMAGE_ARCHIVE_MEMBER_HEADER(void) { - /* IMAGE_ARCHIVE_MEMBER_HEADER (pack 4) */ + /* IMAGE_ARCHIVE_MEMBER_HEADER */ TEST_TYPE_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, 60) TEST_TYPE_ALIGN (IMAGE_ARCHIVE_MEMBER_HEADER, 1) TEST_FIELD_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, Name, 16) @@ -571,7 +561,7 @@ static void test_pack_IMAGE_AUX_SYMBOL(void) static void test_pack_IMAGE_BASE_RELOCATION(void) { - /* IMAGE_BASE_RELOCATION (pack 4) */ + /* IMAGE_BASE_RELOCATION */ TEST_TYPE_SIZE (IMAGE_BASE_RELOCATION, 8) TEST_TYPE_ALIGN (IMAGE_BASE_RELOCATION, 4) TEST_FIELD_SIZE (IMAGE_BASE_RELOCATION, VirtualAddress, 4) @@ -584,7 +574,7 @@ static void test_pack_IMAGE_BASE_RELOCATION(void) static void test_pack_IMAGE_BOUND_FORWARDER_REF(void) { - /* IMAGE_BOUND_FORWARDER_REF (pack 4) */ + /* IMAGE_BOUND_FORWARDER_REF */ TEST_TYPE_SIZE (IMAGE_BOUND_FORWARDER_REF, 8) TEST_TYPE_ALIGN (IMAGE_BOUND_FORWARDER_REF, 4) TEST_FIELD_SIZE (IMAGE_BOUND_FORWARDER_REF, TimeDateStamp, 4) @@ -600,7 +590,7 @@ static void test_pack_IMAGE_BOUND_FORWARDER_REF(void) static void test_pack_IMAGE_BOUND_IMPORT_DESCRIPTOR(void) { - /* IMAGE_BOUND_IMPORT_DESCRIPTOR (pack 4) */ + /* IMAGE_BOUND_IMPORT_DESCRIPTOR */ TEST_TYPE_SIZE (IMAGE_BOUND_IMPORT_DESCRIPTOR, 8) TEST_TYPE_ALIGN (IMAGE_BOUND_IMPORT_DESCRIPTOR, 4) TEST_FIELD_SIZE (IMAGE_BOUND_IMPORT_DESCRIPTOR, TimeDateStamp, 4) @@ -616,7 +606,7 @@ static void test_pack_IMAGE_BOUND_IMPORT_DESCRIPTOR(void) static void test_pack_IMAGE_COFF_SYMBOLS_HEADER(void) { - /* IMAGE_COFF_SYMBOLS_HEADER (pack 4) */ + /* IMAGE_COFF_SYMBOLS_HEADER */ TEST_TYPE_SIZE (IMAGE_COFF_SYMBOLS_HEADER, 32) TEST_TYPE_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, 4) TEST_FIELD_SIZE (IMAGE_COFF_SYMBOLS_HEADER, NumberOfSymbols, 4) @@ -647,7 +637,7 @@ static void test_pack_IMAGE_COFF_SYMBOLS_HEADER(void) static void test_pack_IMAGE_DATA_DIRECTORY(void) { - /* IMAGE_DATA_DIRECTORY (pack 4) */ + /* IMAGE_DATA_DIRECTORY */ TEST_TYPE_SIZE (IMAGE_DATA_DIRECTORY, 8) TEST_TYPE_ALIGN (IMAGE_DATA_DIRECTORY, 4) TEST_FIELD_SIZE (IMAGE_DATA_DIRECTORY, VirtualAddress, 4) @@ -660,7 +650,7 @@ static void test_pack_IMAGE_DATA_DIRECTORY(void) static void test_pack_IMAGE_DEBUG_DIRECTORY(void) { - /* IMAGE_DEBUG_DIRECTORY (pack 4) */ + /* IMAGE_DEBUG_DIRECTORY */ TEST_TYPE_SIZE (IMAGE_DEBUG_DIRECTORY, 28) TEST_TYPE_ALIGN (IMAGE_DEBUG_DIRECTORY, 4) TEST_FIELD_SIZE (IMAGE_DEBUG_DIRECTORY, Characteristics, 4) @@ -691,7 +681,7 @@ static void test_pack_IMAGE_DEBUG_DIRECTORY(void) static void test_pack_IMAGE_DEBUG_MISC(void) { - /* IMAGE_DEBUG_MISC (pack 4) */ + /* IMAGE_DEBUG_MISC */ TEST_TYPE_SIZE (IMAGE_DEBUG_MISC, 16) TEST_TYPE_ALIGN (IMAGE_DEBUG_MISC, 4) TEST_FIELD_SIZE (IMAGE_DEBUG_MISC, DataType, 4) @@ -777,7 +767,7 @@ static void test_pack_IMAGE_DOS_HEADER(void) static void test_pack_IMAGE_EXPORT_DIRECTORY(void) { - /* IMAGE_EXPORT_DIRECTORY (pack 4) */ + /* IMAGE_EXPORT_DIRECTORY */ TEST_TYPE_SIZE (IMAGE_EXPORT_DIRECTORY, 40) TEST_TYPE_ALIGN (IMAGE_EXPORT_DIRECTORY, 4) TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, Characteristics, 4) @@ -817,7 +807,7 @@ static void test_pack_IMAGE_EXPORT_DIRECTORY(void) static void test_pack_IMAGE_FILE_HEADER(void) { - /* IMAGE_FILE_HEADER (pack 4) */ + /* IMAGE_FILE_HEADER */ TEST_TYPE_SIZE (IMAGE_FILE_HEADER, 20) TEST_TYPE_ALIGN (IMAGE_FILE_HEADER, 4) TEST_FIELD_SIZE (IMAGE_FILE_HEADER, Machine, 2) @@ -845,7 +835,7 @@ static void test_pack_IMAGE_FILE_HEADER(void) static void test_pack_IMAGE_FUNCTION_ENTRY(void) { - /* IMAGE_FUNCTION_ENTRY (pack 4) */ + /* IMAGE_FUNCTION_ENTRY */ TEST_TYPE_SIZE (IMAGE_FUNCTION_ENTRY, 12) TEST_TYPE_ALIGN (IMAGE_FUNCTION_ENTRY, 4) TEST_FIELD_SIZE (IMAGE_FUNCTION_ENTRY, StartingAddress, 4) @@ -861,7 +851,7 @@ static void test_pack_IMAGE_FUNCTION_ENTRY(void) static void test_pack_IMAGE_IMPORT_BY_NAME(void) { - /* IMAGE_IMPORT_BY_NAME (pack 4) */ + /* IMAGE_IMPORT_BY_NAME */ TEST_TYPE_SIZE (IMAGE_IMPORT_BY_NAME, 4) TEST_TYPE_ALIGN (IMAGE_IMPORT_BY_NAME, 2) TEST_FIELD_SIZE (IMAGE_IMPORT_BY_NAME, Hint, 2) @@ -874,7 +864,7 @@ static void test_pack_IMAGE_IMPORT_BY_NAME(void) static void test_pack_IMAGE_IMPORT_DESCRIPTOR(void) { - /* IMAGE_IMPORT_DESCRIPTOR (pack 4) */ + /* IMAGE_IMPORT_DESCRIPTOR */ } static void test_pack_IMAGE_LINENUMBER(void) @@ -884,9 +874,9 @@ static void test_pack_IMAGE_LINENUMBER(void) static void test_pack_IMAGE_LOAD_CONFIG_DIRECTORY(void) { - /* IMAGE_LOAD_CONFIG_DIRECTORY (pack 4) */ - TEST_TYPE_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, 72) - TEST_TYPE_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, 4) + /* IMAGE_LOAD_CONFIG_DIRECTORY */ + TEST_TYPE_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, 88) + TEST_TYPE_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, 8) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, Size, 4) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, Size, 4) TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, Size, 0) @@ -914,46 +904,282 @@ static void test_pack_IMAGE_LOAD_CONFIG_DIRECTORY(void) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, DeCommitTotalFreeThreshold, 4) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, DeCommitTotalFreeThreshold, 4) TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, DeCommitTotalFreeThreshold, 28) - TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, LockPrefixTable, 4) - TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, LockPrefixTable, 4) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, LockPrefixTable, 8) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, LockPrefixTable, 8) TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, LockPrefixTable, 32) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, MaximumAllocationSize, 4) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, MaximumAllocationSize, 4) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, MaximumAllocationSize, 36) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, MaximumAllocationSize, 40) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, VirtualMemoryThreshold, 4) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, VirtualMemoryThreshold, 4) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, VirtualMemoryThreshold, 40) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, VirtualMemoryThreshold, 44) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, ProcessHeapFlags, 4) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, ProcessHeapFlags, 4) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, ProcessHeapFlags, 44) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, ProcessHeapFlags, 48) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, ProcessAffinityMask, 4) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, ProcessAffinityMask, 4) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, ProcessAffinityMask, 48) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, ProcessAffinityMask, 52) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, CSDVersion, 2) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, CSDVersion, 2) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, CSDVersion, 52) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, CSDVersion, 56) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, Reserved1, 2) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, Reserved1, 2) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, Reserved1, 54) - TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, EditList, 4) - TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, EditList, 4) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, EditList, 56) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, Reserved1, 58) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, EditList, 8) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, EditList, 8) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, EditList, 64) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, SecurityCookie, 4) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, SecurityCookie, 4) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, SecurityCookie, 60) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, SecurityCookie, 72) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerTable, 4) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerTable, 4) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerTable, 64) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerTable, 76) TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerCount, 4) TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerCount, 4) - TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerCount, 68) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerCount, 80) } static void test_pack_IMAGE_NT_HEADERS(void) { /* IMAGE_NT_HEADERS */ - TEST_TYPE_SIZE (IMAGE_NT_HEADERS, 248) - TEST_TYPE_ALIGN (IMAGE_NT_HEADERS, 4) + TEST_TYPE_SIZE (IMAGE_NT_HEADERS, 264) + TEST_TYPE_ALIGN (IMAGE_NT_HEADERS, 8) +} + +static void test_pack_IMAGE_NT_HEADERS32(void) +{ + /* IMAGE_NT_HEADERS32 */ + TEST_TYPE_SIZE (IMAGE_NT_HEADERS32, 248) + TEST_TYPE_ALIGN (IMAGE_NT_HEADERS32, 4) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS32, Signature, 4) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS32, Signature, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS32, Signature, 0) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS32, FileHeader, 20) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS32, FileHeader, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS32, FileHeader, 4) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS32, OptionalHeader, 224) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS32, OptionalHeader, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader, 24) +} + +static void test_pack_IMAGE_NT_HEADERS64(void) +{ + /* IMAGE_NT_HEADERS64 */ + TEST_TYPE_SIZE (IMAGE_NT_HEADERS64, 264) + TEST_TYPE_ALIGN (IMAGE_NT_HEADERS64, 8) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS64, Signature, 4) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS64, Signature, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS64, Signature, 0) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS64, FileHeader, 20) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS64, FileHeader, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS64, FileHeader, 4) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS64, OptionalHeader, 240) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS64, OptionalHeader, 8) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS64, OptionalHeader, 24) +} + +static void test_pack_IMAGE_OPTIONAL_HEADER(void) +{ + /* IMAGE_OPTIONAL_HEADER */ + TEST_TYPE_SIZE (IMAGE_OPTIONAL_HEADER, 240) + TEST_TYPE_ALIGN (IMAGE_OPTIONAL_HEADER, 8) +} + +static void test_pack_IMAGE_OPTIONAL_HEADER32(void) +{ + /* IMAGE_OPTIONAL_HEADER32 */ + TEST_TYPE_SIZE (IMAGE_OPTIONAL_HEADER32, 224) + TEST_TYPE_ALIGN (IMAGE_OPTIONAL_HEADER32, 4) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, Magic, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, Magic, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, Magic, 0) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MajorLinkerVersion, 1) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MajorLinkerVersion, 1) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MajorLinkerVersion, 2) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MinorLinkerVersion, 1) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MinorLinkerVersion, 1) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MinorLinkerVersion, 3) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfCode, 4) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfInitializedData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfInitializedData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfInitializedData, 8) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfUninitializedData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfUninitializedData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfUninitializedData, 12) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, AddressOfEntryPoint, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, AddressOfEntryPoint, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, AddressOfEntryPoint, 16) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, BaseOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, BaseOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, BaseOfCode, 20) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, BaseOfData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, BaseOfData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, BaseOfData, 24) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, ImageBase, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, ImageBase, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, ImageBase, 28) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SectionAlignment, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SectionAlignment, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SectionAlignment, 32) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, FileAlignment, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, FileAlignment, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, FileAlignment, 36) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MajorOperatingSystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MajorOperatingSystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MajorOperatingSystemVersion, 40) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MinorOperatingSystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MinorOperatingSystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MinorOperatingSystemVersion, 42) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MajorImageVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MajorImageVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MajorImageVersion, 44) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MinorImageVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MinorImageVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MinorImageVersion, 46) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MajorSubsystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MajorSubsystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MajorSubsystemVersion, 48) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MinorSubsystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MinorSubsystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MinorSubsystemVersion, 50) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, Win32VersionValue, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, Win32VersionValue, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, Win32VersionValue, 52) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfImage, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfImage, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfImage, 56) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfHeaders, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfHeaders, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfHeaders, 60) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, CheckSum, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, CheckSum, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, CheckSum, 64) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, Subsystem, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, Subsystem, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, Subsystem, 68) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, DllCharacteristics, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, DllCharacteristics, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, DllCharacteristics, 70) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfStackReserve, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfStackReserve, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfStackReserve, 72) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfStackCommit, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfStackCommit, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfStackCommit, 76) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfHeapReserve, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfHeapReserve, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfHeapReserve, 80) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfHeapCommit, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfHeapCommit, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfHeapCommit, 84) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, LoaderFlags, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, LoaderFlags, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, LoaderFlags, 88) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, NumberOfRvaAndSizes, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, NumberOfRvaAndSizes, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, NumberOfRvaAndSizes, 92) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, DataDirectory, 128) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, DataDirectory, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, DataDirectory, 96) +} + +static void test_pack_IMAGE_OPTIONAL_HEADER64(void) +{ + /* IMAGE_OPTIONAL_HEADER64 */ + TEST_TYPE_SIZE (IMAGE_OPTIONAL_HEADER64, 240) + TEST_TYPE_ALIGN (IMAGE_OPTIONAL_HEADER64, 8) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, Magic, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, Magic, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, Magic, 0) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MajorLinkerVersion, 1) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MajorLinkerVersion, 1) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MajorLinkerVersion, 2) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MinorLinkerVersion, 1) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MinorLinkerVersion, 1) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MinorLinkerVersion, 3) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfCode, 4) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfInitializedData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfInitializedData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfInitializedData, 8) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfUninitializedData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfUninitializedData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfUninitializedData, 12) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint, 16) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, BaseOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, BaseOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, BaseOfCode, 20) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, ImageBase, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, ImageBase, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, ImageBase, 24) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SectionAlignment, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SectionAlignment, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SectionAlignment, 32) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, FileAlignment, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, FileAlignment, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, FileAlignment, 36) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MajorOperatingSystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MajorOperatingSystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MajorOperatingSystemVersion, 40) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MinorOperatingSystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MinorOperatingSystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MinorOperatingSystemVersion, 42) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MajorImageVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MajorImageVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MajorImageVersion, 44) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MinorImageVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MinorImageVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MinorImageVersion, 46) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion, 48) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion, 50) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, Win32VersionValue, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, Win32VersionValue, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, Win32VersionValue, 52) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfImage, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfImage, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfImage, 56) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfHeaders, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfHeaders, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfHeaders, 60) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, CheckSum, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, CheckSum, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, CheckSum, 64) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, Subsystem, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, Subsystem, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, Subsystem, 68) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, DllCharacteristics, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, DllCharacteristics, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, DllCharacteristics, 70) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfStackReserve, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfStackReserve, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfStackReserve, 72) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfStackCommit, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfStackCommit, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfStackCommit, 80) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfHeapReserve, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfHeapReserve, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfHeapReserve, 88) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfHeapCommit, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfHeapCommit, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfHeapCommit, 96) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, LoaderFlags, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, LoaderFlags, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, LoaderFlags, 104) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, NumberOfRvaAndSizes, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, NumberOfRvaAndSizes, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, NumberOfRvaAndSizes, 108) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, DataDirectory, 128) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, DataDirectory, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, DataDirectory, 112) } static void test_pack_IMAGE_OS2_HEADER(void) @@ -1060,7 +1286,7 @@ static void test_pack_IMAGE_RELOCATION(void) static void test_pack_IMAGE_RESOURCE_DATA_ENTRY(void) { - /* IMAGE_RESOURCE_DATA_ENTRY (pack 4) */ + /* IMAGE_RESOURCE_DATA_ENTRY */ TEST_TYPE_SIZE (IMAGE_RESOURCE_DATA_ENTRY, 16) TEST_TYPE_ALIGN (IMAGE_RESOURCE_DATA_ENTRY, 4) TEST_FIELD_SIZE (IMAGE_RESOURCE_DATA_ENTRY, OffsetToData, 4) @@ -1079,7 +1305,7 @@ static void test_pack_IMAGE_RESOURCE_DATA_ENTRY(void) static void test_pack_IMAGE_RESOURCE_DIRECTORY(void) { - /* IMAGE_RESOURCE_DIRECTORY (pack 4) */ + /* IMAGE_RESOURCE_DIRECTORY */ TEST_TYPE_SIZE (IMAGE_RESOURCE_DIRECTORY, 16) TEST_TYPE_ALIGN (IMAGE_RESOURCE_DIRECTORY, 4) TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY, Characteristics, 4) @@ -1104,12 +1330,12 @@ static void test_pack_IMAGE_RESOURCE_DIRECTORY(void) static void test_pack_IMAGE_RESOURCE_DIRECTORY_ENTRY(void) { - /* IMAGE_RESOURCE_DIRECTORY_ENTRY (pack 4) */ + /* IMAGE_RESOURCE_DIRECTORY_ENTRY */ } static void test_pack_IMAGE_RESOURCE_DIRECTORY_STRING(void) { - /* IMAGE_RESOURCE_DIRECTORY_STRING (pack 4) */ + /* IMAGE_RESOURCE_DIRECTORY_STRING */ TEST_TYPE_SIZE (IMAGE_RESOURCE_DIRECTORY_STRING, 4) TEST_TYPE_ALIGN (IMAGE_RESOURCE_DIRECTORY_STRING, 2) TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY_STRING, Length, 2) @@ -1122,7 +1348,7 @@ static void test_pack_IMAGE_RESOURCE_DIRECTORY_STRING(void) static void test_pack_IMAGE_RESOURCE_DIR_STRING_U(void) { - /* IMAGE_RESOURCE_DIR_STRING_U (pack 4) */ + /* IMAGE_RESOURCE_DIR_STRING_U */ TEST_TYPE_SIZE (IMAGE_RESOURCE_DIR_STRING_U, 4) TEST_TYPE_ALIGN (IMAGE_RESOURCE_DIR_STRING_U, 2) TEST_FIELD_SIZE (IMAGE_RESOURCE_DIR_STRING_U, Length, 2) @@ -1135,7 +1361,7 @@ static void test_pack_IMAGE_RESOURCE_DIR_STRING_U(void) static void test_pack_IMAGE_SECTION_HEADER(void) { - /* IMAGE_SECTION_HEADER (pack 4) */ + /* IMAGE_SECTION_HEADER */ TEST_FIELD_SIZE (IMAGE_SECTION_HEADER, Name, 8) TEST_FIELD_ALIGN (IMAGE_SECTION_HEADER, Name, 1) TEST_FIELD_OFFSET(IMAGE_SECTION_HEADER, Name, 0) @@ -1143,7 +1369,7 @@ static void test_pack_IMAGE_SECTION_HEADER(void) static void test_pack_IMAGE_SEPARATE_DEBUG_HEADER(void) { - /* IMAGE_SEPARATE_DEBUG_HEADER (pack 4) */ + /* IMAGE_SEPARATE_DEBUG_HEADER */ TEST_TYPE_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, 48) TEST_TYPE_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, 4) TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, Signature, 2) @@ -1200,8 +1426,58 @@ static void test_pack_IMAGE_THUNK_DATA(void) static void test_pack_IMAGE_TLS_DIRECTORY(void) { /* IMAGE_TLS_DIRECTORY */ - TEST_TYPE_SIZE (IMAGE_TLS_DIRECTORY, 24) - TEST_TYPE_ALIGN (IMAGE_TLS_DIRECTORY, 4) + TEST_TYPE_SIZE (IMAGE_TLS_DIRECTORY, 40) + TEST_TYPE_ALIGN (IMAGE_TLS_DIRECTORY, 8) +} + +static void test_pack_IMAGE_TLS_DIRECTORY32(void) +{ + /* IMAGE_TLS_DIRECTORY32 */ + TEST_TYPE_SIZE (IMAGE_TLS_DIRECTORY32, 24) + TEST_TYPE_ALIGN (IMAGE_TLS_DIRECTORY32, 4) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, StartAddressOfRawData, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, StartAddressOfRawData, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, StartAddressOfRawData, 0) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, EndAddressOfRawData, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, EndAddressOfRawData, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, EndAddressOfRawData, 4) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, AddressOfIndex, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, AddressOfIndex, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, AddressOfIndex, 8) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, AddressOfCallBacks, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, AddressOfCallBacks, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, AddressOfCallBacks, 12) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, SizeOfZeroFill, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, SizeOfZeroFill, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, SizeOfZeroFill, 16) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, Characteristics, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, Characteristics, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, Characteristics, 20) +} + +static void test_pack_IMAGE_TLS_DIRECTORY64(void) +{ + /* IMAGE_TLS_DIRECTORY64 */ + TEST_TYPE_SIZE (IMAGE_TLS_DIRECTORY64, 40) + TEST_TYPE_ALIGN (IMAGE_TLS_DIRECTORY64, 8) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, StartAddressOfRawData, 8) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, StartAddressOfRawData, 8) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, StartAddressOfRawData, 0) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, EndAddressOfRawData, 8) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, EndAddressOfRawData, 8) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, EndAddressOfRawData, 8) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, AddressOfIndex, 8) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, AddressOfIndex, 8) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, AddressOfIndex, 16) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, AddressOfCallBacks, 8) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, AddressOfCallBacks, 8) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, AddressOfCallBacks, 24) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, SizeOfZeroFill, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, SizeOfZeroFill, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, SizeOfZeroFill, 32) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, Characteristics, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, Characteristics, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, Characteristics, 36) } static void test_pack_IMAGE_VXD_HEADER(void) @@ -1399,7 +1675,7 @@ static void test_pack_LANGID(void) static void test_pack_LARGE_INTEGER(void) { - /* LARGE_INTEGER (pack 4) */ + /* LARGE_INTEGER */ } static void test_pack_LCID(void) @@ -1412,7 +1688,3418 @@ static void test_pack_LCID(void) static void test_pack_LIST_ENTRY(void) { - /* LIST_ENTRY (pack 4) */ + /* LIST_ENTRY */ + TEST_TYPE_SIZE (LIST_ENTRY, 16) + TEST_TYPE_ALIGN (LIST_ENTRY, 8) + TEST_FIELD_SIZE (LIST_ENTRY, Flink, 8) + TEST_FIELD_ALIGN (LIST_ENTRY, Flink, 8) + TEST_FIELD_OFFSET(LIST_ENTRY, Flink, 0) + TEST_FIELD_SIZE (LIST_ENTRY, Blink, 8) + TEST_FIELD_ALIGN (LIST_ENTRY, Blink, 8) + TEST_FIELD_OFFSET(LIST_ENTRY, Blink, 8) +} + +static void test_pack_LONG(void) +{ + /* LONG */ + TEST_TYPE_SIZE (LONG, 4) + TEST_TYPE_ALIGN (LONG, 4) + TEST_TYPE_SIGNED(LONG) +} + +static void test_pack_LONGLONG(void) +{ + /* LONGLONG */ + TEST_TYPE_SIZE (LONGLONG, 8) + TEST_TYPE_ALIGN (LONGLONG, 8) + TEST_TYPE_SIGNED(LONGLONG) +} + +static void test_pack_LUID(void) +{ + /* LUID */ + TEST_TYPE_SIZE (LUID, 8) + TEST_TYPE_ALIGN (LUID, 4) + TEST_FIELD_SIZE (LUID, LowPart, 4) + TEST_FIELD_ALIGN (LUID, LowPart, 4) + TEST_FIELD_OFFSET(LUID, LowPart, 0) + TEST_FIELD_SIZE (LUID, HighPart, 4) + TEST_FIELD_ALIGN (LUID, HighPart, 4) + TEST_FIELD_OFFSET(LUID, HighPart, 4) +} + +static void test_pack_LUID_AND_ATTRIBUTES(void) +{ + /* LUID_AND_ATTRIBUTES (pack 4) */ + TEST_TYPE_SIZE (LUID_AND_ATTRIBUTES, 12) + TEST_TYPE_ALIGN (LUID_AND_ATTRIBUTES, 4) + TEST_FIELD_SIZE (LUID_AND_ATTRIBUTES, Luid, 8) + TEST_FIELD_ALIGN (LUID_AND_ATTRIBUTES, Luid, 4) + TEST_FIELD_OFFSET(LUID_AND_ATTRIBUTES, Luid, 0) + TEST_FIELD_SIZE (LUID_AND_ATTRIBUTES, Attributes, 4) + TEST_FIELD_ALIGN (LUID_AND_ATTRIBUTES, Attributes, 4) + TEST_FIELD_OFFSET(LUID_AND_ATTRIBUTES, Attributes, 8) +} + +static void test_pack_MEMORY_BASIC_INFORMATION(void) +{ + /* MEMORY_BASIC_INFORMATION */ + TEST_TYPE_SIZE (MEMORY_BASIC_INFORMATION, 48) + TEST_TYPE_ALIGN (MEMORY_BASIC_INFORMATION, 8) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, BaseAddress, 8) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, BaseAddress, 8) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, BaseAddress, 0) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, AllocationBase, 8) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, AllocationBase, 8) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, AllocationBase, 8) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, AllocationProtect, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, AllocationProtect, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, AllocationProtect, 16) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, RegionSize, 8) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, RegionSize, 8) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, RegionSize, 24) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, State, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, State, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, State, 32) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, Protect, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, Protect, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, Protect, 36) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, Type, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, Type, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, Type, 40) +} + +static void test_pack_MESSAGE_RESOURCE_BLOCK(void) +{ + /* MESSAGE_RESOURCE_BLOCK */ + TEST_TYPE_SIZE (MESSAGE_RESOURCE_BLOCK, 12) + TEST_TYPE_ALIGN (MESSAGE_RESOURCE_BLOCK, 4) + TEST_FIELD_SIZE (MESSAGE_RESOURCE_BLOCK, LowId, 4) + TEST_FIELD_ALIGN (MESSAGE_RESOURCE_BLOCK, LowId, 4) + TEST_FIELD_OFFSET(MESSAGE_RESOURCE_BLOCK, LowId, 0) + TEST_FIELD_SIZE (MESSAGE_RESOURCE_BLOCK, HighId, 4) + TEST_FIELD_ALIGN (MESSAGE_RESOURCE_BLOCK, HighId, 4) + TEST_FIELD_OFFSET(MESSAGE_RESOURCE_BLOCK, HighId, 4) + TEST_FIELD_SIZE (MESSAGE_RESOURCE_BLOCK, OffsetToEntries, 4) + TEST_FIELD_ALIGN (MESSAGE_RESOURCE_BLOCK, OffsetToEntries, 4) + TEST_FIELD_OFFSET(MESSAGE_RESOURCE_BLOCK, OffsetToEntries, 8) +} + +static void test_pack_MESSAGE_RESOURCE_DATA(void) +{ + /* MESSAGE_RESOURCE_DATA */ + TEST_TYPE_SIZE (MESSAGE_RESOURCE_DATA, 16) + TEST_TYPE_ALIGN (MESSAGE_RESOURCE_DATA, 4) + TEST_FIELD_SIZE (MESSAGE_RESOURCE_DATA, NumberOfBlocks, 4) + TEST_FIELD_ALIGN (MESSAGE_RESOURCE_DATA, NumberOfBlocks, 4) + TEST_FIELD_OFFSET(MESSAGE_RESOURCE_DATA, NumberOfBlocks, 0) + TEST_FIELD_SIZE (MESSAGE_RESOURCE_DATA, Blocks, 12) + TEST_FIELD_ALIGN (MESSAGE_RESOURCE_DATA, Blocks, 4) + TEST_FIELD_OFFSET(MESSAGE_RESOURCE_DATA, Blocks, 4) +} + +static void test_pack_MESSAGE_RESOURCE_ENTRY(void) +{ + /* MESSAGE_RESOURCE_ENTRY */ + TEST_TYPE_SIZE (MESSAGE_RESOURCE_ENTRY, 6) + TEST_TYPE_ALIGN (MESSAGE_RESOURCE_ENTRY, 2) + TEST_FIELD_SIZE (MESSAGE_RESOURCE_ENTRY, Length, 2) + TEST_FIELD_ALIGN (MESSAGE_RESOURCE_ENTRY, Length, 2) + TEST_FIELD_OFFSET(MESSAGE_RESOURCE_ENTRY, Length, 0) + TEST_FIELD_SIZE (MESSAGE_RESOURCE_ENTRY, Flags, 2) + TEST_FIELD_ALIGN (MESSAGE_RESOURCE_ENTRY, Flags, 2) + TEST_FIELD_OFFSET(MESSAGE_RESOURCE_ENTRY, Flags, 2) + TEST_FIELD_SIZE (MESSAGE_RESOURCE_ENTRY, Text, 1) + TEST_FIELD_ALIGN (MESSAGE_RESOURCE_ENTRY, Text, 1) + TEST_FIELD_OFFSET(MESSAGE_RESOURCE_ENTRY, Text, 4) +} + +static void test_pack_NT_TIB(void) +{ + /* NT_TIB */ + TEST_FIELD_SIZE (NT_TIB, ExceptionList, 8) + TEST_FIELD_ALIGN (NT_TIB, ExceptionList, 8) + TEST_FIELD_OFFSET(NT_TIB, ExceptionList, 0) + TEST_FIELD_SIZE (NT_TIB, StackBase, 8) + TEST_FIELD_ALIGN (NT_TIB, StackBase, 8) + TEST_FIELD_OFFSET(NT_TIB, StackBase, 8) + TEST_FIELD_SIZE (NT_TIB, StackLimit, 8) + TEST_FIELD_ALIGN (NT_TIB, StackLimit, 8) + TEST_FIELD_OFFSET(NT_TIB, StackLimit, 16) + TEST_FIELD_SIZE (NT_TIB, SubSystemTib, 8) + TEST_FIELD_ALIGN (NT_TIB, SubSystemTib, 8) + TEST_FIELD_OFFSET(NT_TIB, SubSystemTib, 24) +} + +static void test_pack_OBJECT_TYPE_LIST(void) +{ + /* OBJECT_TYPE_LIST */ + TEST_TYPE_SIZE (OBJECT_TYPE_LIST, 16) + TEST_TYPE_ALIGN (OBJECT_TYPE_LIST, 8) + TEST_FIELD_SIZE (OBJECT_TYPE_LIST, Level, 2) + TEST_FIELD_ALIGN (OBJECT_TYPE_LIST, Level, 2) + TEST_FIELD_OFFSET(OBJECT_TYPE_LIST, Level, 0) + TEST_FIELD_SIZE (OBJECT_TYPE_LIST, Sbz, 2) + TEST_FIELD_ALIGN (OBJECT_TYPE_LIST, Sbz, 2) + TEST_FIELD_OFFSET(OBJECT_TYPE_LIST, Sbz, 2) + TEST_FIELD_SIZE (OBJECT_TYPE_LIST, ObjectType, 8) + TEST_FIELD_ALIGN (OBJECT_TYPE_LIST, ObjectType, 8) + TEST_FIELD_OFFSET(OBJECT_TYPE_LIST, ObjectType, 8) +} + +static void test_pack_PACCESS_ALLOWED_ACE(void) +{ + /* PACCESS_ALLOWED_ACE */ + TEST_TYPE_SIZE (PACCESS_ALLOWED_ACE, 8) + TEST_TYPE_ALIGN (PACCESS_ALLOWED_ACE, 8) + TEST_TARGET_SIZE (PACCESS_ALLOWED_ACE, 12) + TEST_TARGET_ALIGN(PACCESS_ALLOWED_ACE, 4) +} + +static void test_pack_PACCESS_DENIED_ACE(void) +{ + /* PACCESS_DENIED_ACE */ + TEST_TYPE_SIZE (PACCESS_DENIED_ACE, 8) + TEST_TYPE_ALIGN (PACCESS_DENIED_ACE, 8) + TEST_TARGET_SIZE (PACCESS_DENIED_ACE, 12) + TEST_TARGET_ALIGN(PACCESS_DENIED_ACE, 4) +} + +static void test_pack_PACCESS_TOKEN(void) +{ + /* PACCESS_TOKEN */ + TEST_TYPE_SIZE (PACCESS_TOKEN, 8) + TEST_TYPE_ALIGN (PACCESS_TOKEN, 8) +} + +static void test_pack_PACE_HEADER(void) +{ + /* PACE_HEADER */ + TEST_TYPE_SIZE (PACE_HEADER, 8) + TEST_TYPE_ALIGN (PACE_HEADER, 8) + TEST_TARGET_SIZE (PACE_HEADER, 4) + TEST_TARGET_ALIGN(PACE_HEADER, 2) +} + +static void test_pack_PACL(void) +{ + /* PACL */ + TEST_TYPE_SIZE (PACL, 8) + TEST_TYPE_ALIGN (PACL, 8) + TEST_TARGET_SIZE (PACL, 8) + TEST_TARGET_ALIGN(PACL, 2) +} + +static void test_pack_PACL_REVISION_INFORMATION(void) +{ + /* PACL_REVISION_INFORMATION */ + TEST_TYPE_SIZE (PACL_REVISION_INFORMATION, 8) + TEST_TYPE_ALIGN (PACL_REVISION_INFORMATION, 8) + TEST_TARGET_SIZE (PACL_REVISION_INFORMATION, 4) + TEST_TARGET_ALIGN(PACL_REVISION_INFORMATION, 4) +} + +static void test_pack_PACL_SIZE_INFORMATION(void) +{ + /* PACL_SIZE_INFORMATION */ + TEST_TYPE_SIZE (PACL_SIZE_INFORMATION, 8) + TEST_TYPE_ALIGN (PACL_SIZE_INFORMATION, 8) + TEST_TARGET_SIZE (PACL_SIZE_INFORMATION, 12) + TEST_TARGET_ALIGN(PACL_SIZE_INFORMATION, 4) +} + +static void test_pack_PCCH(void) +{ + /* PCCH */ + TEST_TYPE_SIZE (PCCH, 8) + TEST_TYPE_ALIGN (PCCH, 8) + TEST_TARGET_SIZE (PCCH, 1) + TEST_TARGET_ALIGN(PCCH, 1) +} + +static void test_pack_PCH(void) +{ + /* PCH */ + TEST_TYPE_SIZE (PCH, 8) + TEST_TYPE_ALIGN (PCH, 8) + TEST_TARGET_SIZE (PCH, 1) + TEST_TARGET_ALIGN(PCH, 1) +} + +static void test_pack_PCSTR(void) +{ + /* PCSTR */ + TEST_TYPE_SIZE (PCSTR, 8) + TEST_TYPE_ALIGN (PCSTR, 8) + TEST_TARGET_SIZE (PCSTR, 1) + TEST_TARGET_ALIGN(PCSTR, 1) +} + +static void test_pack_PCTSTR(void) +{ + /* PCTSTR */ + TEST_TYPE_SIZE (PCTSTR, 8) + TEST_TYPE_ALIGN (PCTSTR, 8) +} + +static void test_pack_PCWCH(void) +{ + /* PCWCH */ + TEST_TYPE_SIZE (PCWCH, 8) + TEST_TYPE_ALIGN (PCWCH, 8) + TEST_TARGET_SIZE (PCWCH, 2) + TEST_TARGET_ALIGN(PCWCH, 2) +} + +static void test_pack_PCWSTR(void) +{ + /* PCWSTR */ + TEST_TYPE_SIZE (PCWSTR, 8) + TEST_TYPE_ALIGN (PCWSTR, 8) + TEST_TARGET_SIZE (PCWSTR, 2) + TEST_TARGET_ALIGN(PCWSTR, 2) +} + +static void test_pack_PEXCEPTION_POINTERS(void) +{ + /* PEXCEPTION_POINTERS */ + TEST_TYPE_SIZE (PEXCEPTION_POINTERS, 8) + TEST_TYPE_ALIGN (PEXCEPTION_POINTERS, 8) + TEST_TARGET_SIZE (PEXCEPTION_POINTERS, 16) + TEST_TARGET_ALIGN(PEXCEPTION_POINTERS, 8) +} + +static void test_pack_PEXCEPTION_RECORD(void) +{ + /* PEXCEPTION_RECORD */ + TEST_TYPE_SIZE (PEXCEPTION_RECORD, 8) + TEST_TYPE_ALIGN (PEXCEPTION_RECORD, 8) + TEST_TARGET_SIZE (PEXCEPTION_RECORD, 152) + TEST_TARGET_ALIGN(PEXCEPTION_RECORD, 8) +} + +static void test_pack_PFLOATING_SAVE_AREA(void) +{ + /* PFLOATING_SAVE_AREA */ + TEST_TYPE_SIZE (PFLOATING_SAVE_AREA, 8) + TEST_TYPE_ALIGN (PFLOATING_SAVE_AREA, 8) + TEST_TARGET_SIZE (PFLOATING_SAVE_AREA, 112) + TEST_TARGET_ALIGN(PFLOATING_SAVE_AREA, 4) +} + +static void test_pack_PFPO_DATA(void) +{ + /* PFPO_DATA */ + TEST_TYPE_SIZE (PFPO_DATA, 8) + TEST_TYPE_ALIGN (PFPO_DATA, 8) + TEST_TARGET_SIZE (PFPO_DATA, 16) + TEST_TARGET_ALIGN(PFPO_DATA, 4) +} + +static void test_pack_PGENERIC_MAPPING(void) +{ + /* PGENERIC_MAPPING */ + TEST_TYPE_SIZE (PGENERIC_MAPPING, 8) + TEST_TYPE_ALIGN (PGENERIC_MAPPING, 8) + TEST_TARGET_SIZE (PGENERIC_MAPPING, 16) + TEST_TARGET_ALIGN(PGENERIC_MAPPING, 4) +} + +static void test_pack_PHANDLE(void) +{ + /* PHANDLE */ + TEST_TYPE_SIZE (PHANDLE, 8) + TEST_TYPE_ALIGN (PHANDLE, 8) + TEST_TARGET_SIZE (PHANDLE, 8) + TEST_TARGET_ALIGN(PHANDLE, 8) +} + +static void test_pack_PIMAGE_ARCHIVE_MEMBER_HEADER(void) +{ + /* PIMAGE_ARCHIVE_MEMBER_HEADER */ + TEST_TYPE_SIZE (PIMAGE_ARCHIVE_MEMBER_HEADER, 8) + TEST_TYPE_ALIGN (PIMAGE_ARCHIVE_MEMBER_HEADER, 8) + TEST_TARGET_SIZE (PIMAGE_ARCHIVE_MEMBER_HEADER, 60) + TEST_TARGET_ALIGN(PIMAGE_ARCHIVE_MEMBER_HEADER, 1) +} + +static void test_pack_PIMAGE_AUX_SYMBOL(void) +{ + /* PIMAGE_AUX_SYMBOL */ + TEST_TYPE_SIZE (PIMAGE_AUX_SYMBOL, 8) + TEST_TYPE_ALIGN (PIMAGE_AUX_SYMBOL, 8) +} + +static void test_pack_PIMAGE_BASE_RELOCATION(void) +{ + /* PIMAGE_BASE_RELOCATION */ + TEST_TYPE_SIZE (PIMAGE_BASE_RELOCATION, 8) + TEST_TYPE_ALIGN (PIMAGE_BASE_RELOCATION, 8) + TEST_TARGET_SIZE (PIMAGE_BASE_RELOCATION, 8) + TEST_TARGET_ALIGN(PIMAGE_BASE_RELOCATION, 4) +} + +static void test_pack_PIMAGE_BOUND_FORWARDER_REF(void) +{ + /* PIMAGE_BOUND_FORWARDER_REF */ + TEST_TYPE_SIZE (PIMAGE_BOUND_FORWARDER_REF, 8) + TEST_TYPE_ALIGN (PIMAGE_BOUND_FORWARDER_REF, 8) + TEST_TARGET_SIZE (PIMAGE_BOUND_FORWARDER_REF, 8) + TEST_TARGET_ALIGN(PIMAGE_BOUND_FORWARDER_REF, 4) +} + +static void test_pack_PIMAGE_BOUND_IMPORT_DESCRIPTOR(void) +{ + /* PIMAGE_BOUND_IMPORT_DESCRIPTOR */ + TEST_TYPE_SIZE (PIMAGE_BOUND_IMPORT_DESCRIPTOR, 8) + TEST_TYPE_ALIGN (PIMAGE_BOUND_IMPORT_DESCRIPTOR, 8) + TEST_TARGET_SIZE (PIMAGE_BOUND_IMPORT_DESCRIPTOR, 8) + TEST_TARGET_ALIGN(PIMAGE_BOUND_IMPORT_DESCRIPTOR, 4) +} + +static void test_pack_PIMAGE_COFF_SYMBOLS_HEADER(void) +{ + /* PIMAGE_COFF_SYMBOLS_HEADER */ + TEST_TYPE_SIZE (PIMAGE_COFF_SYMBOLS_HEADER, 8) + TEST_TYPE_ALIGN (PIMAGE_COFF_SYMBOLS_HEADER, 8) + TEST_TARGET_SIZE (PIMAGE_COFF_SYMBOLS_HEADER, 32) + TEST_TARGET_ALIGN(PIMAGE_COFF_SYMBOLS_HEADER, 4) +} + +static void test_pack_PIMAGE_DATA_DIRECTORY(void) +{ + /* PIMAGE_DATA_DIRECTORY */ + TEST_TYPE_SIZE (PIMAGE_DATA_DIRECTORY, 8) + TEST_TYPE_ALIGN (PIMAGE_DATA_DIRECTORY, 8) + TEST_TARGET_SIZE (PIMAGE_DATA_DIRECTORY, 8) + TEST_TARGET_ALIGN(PIMAGE_DATA_DIRECTORY, 4) +} + +static void test_pack_PIMAGE_DEBUG_DIRECTORY(void) +{ + /* PIMAGE_DEBUG_DIRECTORY */ + TEST_TYPE_SIZE (PIMAGE_DEBUG_DIRECTORY, 8) + TEST_TYPE_ALIGN (PIMAGE_DEBUG_DIRECTORY, 8) + TEST_TARGET_SIZE (PIMAGE_DEBUG_DIRECTORY, 28) + TEST_TARGET_ALIGN(PIMAGE_DEBUG_DIRECTORY, 4) +} + +static void test_pack_PIMAGE_DEBUG_MISC(void) +{ + /* PIMAGE_DEBUG_MISC */ + TEST_TYPE_SIZE (PIMAGE_DEBUG_MISC, 8) + TEST_TYPE_ALIGN (PIMAGE_DEBUG_MISC, 8) + TEST_TARGET_SIZE (PIMAGE_DEBUG_MISC, 16) + TEST_TARGET_ALIGN(PIMAGE_DEBUG_MISC, 4) +} + +static void test_pack_PIMAGE_DOS_HEADER(void) +{ + /* PIMAGE_DOS_HEADER */ + TEST_TYPE_SIZE (PIMAGE_DOS_HEADER, 8) + TEST_TYPE_ALIGN (PIMAGE_DOS_HEADER, 8) + TEST_TARGET_SIZE (PIMAGE_DOS_HEADER, 64) + TEST_TARGET_ALIGN(PIMAGE_DOS_HEADER, 2) +} + +static void test_pack_PIMAGE_EXPORT_DIRECTORY(void) +{ + /* PIMAGE_EXPORT_DIRECTORY */ + TEST_TYPE_SIZE (PIMAGE_EXPORT_DIRECTORY, 8) + TEST_TYPE_ALIGN (PIMAGE_EXPORT_DIRECTORY, 8) + TEST_TARGET_SIZE (PIMAGE_EXPORT_DIRECTORY, 40) + TEST_TARGET_ALIGN(PIMAGE_EXPORT_DIRECTORY, 4) +} + +static void test_pack_PIMAGE_FILE_HEADER(void) +{ + /* PIMAGE_FILE_HEADER */ + TEST_TYPE_SIZE (PIMAGE_FILE_HEADER, 8) + TEST_TYPE_ALIGN (PIMAGE_FILE_HEADER, 8) + TEST_TARGET_SIZE (PIMAGE_FILE_HEADER, 20) + TEST_TARGET_ALIGN(PIMAGE_FILE_HEADER, 4) +} + +static void test_pack_PIMAGE_FUNCTION_ENTRY(void) +{ + /* PIMAGE_FUNCTION_ENTRY */ + TEST_TYPE_SIZE (PIMAGE_FUNCTION_ENTRY, 8) + TEST_TYPE_ALIGN (PIMAGE_FUNCTION_ENTRY, 8) + TEST_TARGET_SIZE (PIMAGE_FUNCTION_ENTRY, 12) + TEST_TARGET_ALIGN(PIMAGE_FUNCTION_ENTRY, 4) +} + +static void test_pack_PIMAGE_IMPORT_BY_NAME(void) +{ + /* PIMAGE_IMPORT_BY_NAME */ + TEST_TYPE_SIZE (PIMAGE_IMPORT_BY_NAME, 8) + TEST_TYPE_ALIGN (PIMAGE_IMPORT_BY_NAME, 8) + TEST_TARGET_SIZE (PIMAGE_IMPORT_BY_NAME, 4) + TEST_TARGET_ALIGN(PIMAGE_IMPORT_BY_NAME, 2) +} + +static void test_pack_PIMAGE_IMPORT_DESCRIPTOR(void) +{ + /* PIMAGE_IMPORT_DESCRIPTOR */ + TEST_TYPE_SIZE (PIMAGE_IMPORT_DESCRIPTOR, 8) + TEST_TYPE_ALIGN (PIMAGE_IMPORT_DESCRIPTOR, 8) +} + +static void test_pack_PIMAGE_LINENUMBER(void) +{ + /* PIMAGE_LINENUMBER */ + TEST_TYPE_SIZE (PIMAGE_LINENUMBER, 8) + TEST_TYPE_ALIGN (PIMAGE_LINENUMBER, 8) +} + +static void test_pack_PIMAGE_LOAD_CONFIG_DIRECTORY(void) +{ + /* PIMAGE_LOAD_CONFIG_DIRECTORY */ + TEST_TYPE_SIZE (PIMAGE_LOAD_CONFIG_DIRECTORY, 8) + TEST_TYPE_ALIGN (PIMAGE_LOAD_CONFIG_DIRECTORY, 8) + TEST_TARGET_SIZE (PIMAGE_LOAD_CONFIG_DIRECTORY, 88) + TEST_TARGET_ALIGN(PIMAGE_LOAD_CONFIG_DIRECTORY, 8) +} + +static void test_pack_PIMAGE_NT_HEADERS(void) +{ + /* PIMAGE_NT_HEADERS */ + TEST_TYPE_SIZE (PIMAGE_NT_HEADERS, 8) + TEST_TYPE_ALIGN (PIMAGE_NT_HEADERS, 8) +} + +static void test_pack_PIMAGE_NT_HEADERS32(void) +{ + /* PIMAGE_NT_HEADERS32 */ + TEST_TYPE_SIZE (PIMAGE_NT_HEADERS32, 8) + TEST_TYPE_ALIGN (PIMAGE_NT_HEADERS32, 8) + TEST_TARGET_SIZE (PIMAGE_NT_HEADERS32, 248) + TEST_TARGET_ALIGN(PIMAGE_NT_HEADERS32, 4) +} + +static void test_pack_PIMAGE_NT_HEADERS64(void) +{ + /* PIMAGE_NT_HEADERS64 */ + TEST_TYPE_SIZE (PIMAGE_NT_HEADERS64, 8) + TEST_TYPE_ALIGN (PIMAGE_NT_HEADERS64, 8) + TEST_TARGET_SIZE (PIMAGE_NT_HEADERS64, 264) + TEST_TARGET_ALIGN(PIMAGE_NT_HEADERS64, 8) +} + +static void test_pack_PIMAGE_OPTIONAL_HEADER(void) +{ + /* PIMAGE_OPTIONAL_HEADER */ + TEST_TYPE_SIZE (PIMAGE_OPTIONAL_HEADER, 8) + TEST_TYPE_ALIGN (PIMAGE_OPTIONAL_HEADER, 8) +} + +static void test_pack_PIMAGE_OPTIONAL_HEADER32(void) +{ + /* PIMAGE_OPTIONAL_HEADER32 */ + TEST_TYPE_SIZE (PIMAGE_OPTIONAL_HEADER32, 8) + TEST_TYPE_ALIGN (PIMAGE_OPTIONAL_HEADER32, 8) + TEST_TARGET_SIZE (PIMAGE_OPTIONAL_HEADER32, 224) + TEST_TARGET_ALIGN(PIMAGE_OPTIONAL_HEADER32, 4) +} + +static void test_pack_PIMAGE_OPTIONAL_HEADER64(void) +{ + /* PIMAGE_OPTIONAL_HEADER64 */ + TEST_TYPE_SIZE (PIMAGE_OPTIONAL_HEADER64, 8) + TEST_TYPE_ALIGN (PIMAGE_OPTIONAL_HEADER64, 8) + TEST_TARGET_SIZE (PIMAGE_OPTIONAL_HEADER64, 240) + TEST_TARGET_ALIGN(PIMAGE_OPTIONAL_HEADER64, 8) +} + +static void test_pack_PIMAGE_OS2_HEADER(void) +{ + /* PIMAGE_OS2_HEADER */ + TEST_TYPE_SIZE (PIMAGE_OS2_HEADER, 8) + TEST_TYPE_ALIGN (PIMAGE_OS2_HEADER, 8) + TEST_TARGET_SIZE (PIMAGE_OS2_HEADER, 64) + TEST_TARGET_ALIGN(PIMAGE_OS2_HEADER, 2) +} + +static void test_pack_PIMAGE_RELOCATION(void) +{ + /* PIMAGE_RELOCATION */ + TEST_TYPE_SIZE (PIMAGE_RELOCATION, 8) + TEST_TYPE_ALIGN (PIMAGE_RELOCATION, 8) +} + +static void test_pack_PIMAGE_RESOURCE_DATA_ENTRY(void) +{ + /* PIMAGE_RESOURCE_DATA_ENTRY */ + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DATA_ENTRY, 8) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DATA_ENTRY, 8) + TEST_TARGET_SIZE (PIMAGE_RESOURCE_DATA_ENTRY, 16) + TEST_TARGET_ALIGN(PIMAGE_RESOURCE_DATA_ENTRY, 4) +} + +static void test_pack_PIMAGE_RESOURCE_DIRECTORY(void) +{ + /* PIMAGE_RESOURCE_DIRECTORY */ + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DIRECTORY, 8) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DIRECTORY, 8) + TEST_TARGET_SIZE (PIMAGE_RESOURCE_DIRECTORY, 16) + TEST_TARGET_ALIGN(PIMAGE_RESOURCE_DIRECTORY, 4) +} + +static void test_pack_PIMAGE_RESOURCE_DIRECTORY_ENTRY(void) +{ + /* PIMAGE_RESOURCE_DIRECTORY_ENTRY */ + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DIRECTORY_ENTRY, 8) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DIRECTORY_ENTRY, 8) +} + +static void test_pack_PIMAGE_RESOURCE_DIRECTORY_STRING(void) +{ + /* PIMAGE_RESOURCE_DIRECTORY_STRING */ + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DIRECTORY_STRING, 8) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DIRECTORY_STRING, 8) + TEST_TARGET_SIZE (PIMAGE_RESOURCE_DIRECTORY_STRING, 4) + TEST_TARGET_ALIGN(PIMAGE_RESOURCE_DIRECTORY_STRING, 2) +} + +static void test_pack_PIMAGE_RESOURCE_DIR_STRING_U(void) +{ + /* PIMAGE_RESOURCE_DIR_STRING_U */ + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DIR_STRING_U, 8) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DIR_STRING_U, 8) + TEST_TARGET_SIZE (PIMAGE_RESOURCE_DIR_STRING_U, 4) + TEST_TARGET_ALIGN(PIMAGE_RESOURCE_DIR_STRING_U, 2) +} + +static void test_pack_PIMAGE_SECTION_HEADER(void) +{ + /* PIMAGE_SECTION_HEADER */ + TEST_TYPE_SIZE (PIMAGE_SECTION_HEADER, 8) + TEST_TYPE_ALIGN (PIMAGE_SECTION_HEADER, 8) +} + +static void test_pack_PIMAGE_SEPARATE_DEBUG_HEADER(void) +{ + /* PIMAGE_SEPARATE_DEBUG_HEADER */ + TEST_TYPE_SIZE (PIMAGE_SEPARATE_DEBUG_HEADER, 8) + TEST_TYPE_ALIGN (PIMAGE_SEPARATE_DEBUG_HEADER, 8) + TEST_TARGET_SIZE (PIMAGE_SEPARATE_DEBUG_HEADER, 48) + TEST_TARGET_ALIGN(PIMAGE_SEPARATE_DEBUG_HEADER, 4) +} + +static void test_pack_PIMAGE_SYMBOL(void) +{ + /* PIMAGE_SYMBOL */ + TEST_TYPE_SIZE (PIMAGE_SYMBOL, 8) + TEST_TYPE_ALIGN (PIMAGE_SYMBOL, 8) +} + +static void test_pack_PIMAGE_THUNK_DATA(void) +{ + /* PIMAGE_THUNK_DATA */ + TEST_TYPE_SIZE (PIMAGE_THUNK_DATA, 8) + TEST_TYPE_ALIGN (PIMAGE_THUNK_DATA, 8) +} + +static void test_pack_PIMAGE_TLS_CALLBACK(void) +{ + /* PIMAGE_TLS_CALLBACK */ + TEST_TYPE_SIZE (PIMAGE_TLS_CALLBACK, 8) + TEST_TYPE_ALIGN (PIMAGE_TLS_CALLBACK, 8) +} + +static void test_pack_PIMAGE_TLS_DIRECTORY(void) +{ + /* PIMAGE_TLS_DIRECTORY */ + TEST_TYPE_SIZE (PIMAGE_TLS_DIRECTORY, 8) + TEST_TYPE_ALIGN (PIMAGE_TLS_DIRECTORY, 8) +} + +static void test_pack_PIMAGE_VXD_HEADER(void) +{ + /* PIMAGE_VXD_HEADER */ + TEST_TYPE_SIZE (PIMAGE_VXD_HEADER, 8) + TEST_TYPE_ALIGN (PIMAGE_VXD_HEADER, 8) + TEST_TARGET_SIZE (PIMAGE_VXD_HEADER, 196) + TEST_TARGET_ALIGN(PIMAGE_VXD_HEADER, 2) +} + +static void test_pack_PIO_COUNTERS(void) +{ + /* PIO_COUNTERS */ + TEST_TYPE_SIZE (PIO_COUNTERS, 8) + TEST_TYPE_ALIGN (PIO_COUNTERS, 8) + TEST_TARGET_SIZE (PIO_COUNTERS, 48) + TEST_TARGET_ALIGN(PIO_COUNTERS, 8) +} + +static void test_pack_PISECURITY_DESCRIPTOR(void) +{ + /* PISECURITY_DESCRIPTOR */ + TEST_TYPE_SIZE (PISECURITY_DESCRIPTOR, 8) + TEST_TYPE_ALIGN (PISECURITY_DESCRIPTOR, 8) + TEST_TARGET_SIZE (PISECURITY_DESCRIPTOR, 40) + TEST_TARGET_ALIGN(PISECURITY_DESCRIPTOR, 8) +} + +static void test_pack_PISECURITY_DESCRIPTOR_RELATIVE(void) +{ + /* PISECURITY_DESCRIPTOR_RELATIVE */ + TEST_TYPE_SIZE (PISECURITY_DESCRIPTOR_RELATIVE, 8) + TEST_TYPE_ALIGN (PISECURITY_DESCRIPTOR_RELATIVE, 8) + TEST_TARGET_SIZE (PISECURITY_DESCRIPTOR_RELATIVE, 20) + TEST_TARGET_ALIGN(PISECURITY_DESCRIPTOR_RELATIVE, 4) +} + +static void test_pack_PISID(void) +{ + /* PISID */ + TEST_TYPE_SIZE (PISID, 8) + TEST_TYPE_ALIGN (PISID, 8) + TEST_TARGET_SIZE (PISID, 12) + TEST_TARGET_ALIGN(PISID, 4) +} + +static void test_pack_PLARGE_INTEGER(void) +{ + /* PLARGE_INTEGER */ + TEST_TYPE_SIZE (PLARGE_INTEGER, 8) + TEST_TYPE_ALIGN (PLARGE_INTEGER, 8) +} + +static void test_pack_PLIST_ENTRY(void) +{ + /* PLIST_ENTRY */ + TEST_TYPE_SIZE (PLIST_ENTRY, 8) + TEST_TYPE_ALIGN (PLIST_ENTRY, 8) + TEST_TARGET_SIZE (PLIST_ENTRY, 16) + TEST_TARGET_ALIGN(PLIST_ENTRY, 8) +} + +static void test_pack_PLUID(void) +{ + /* PLUID */ + TEST_TYPE_SIZE (PLUID, 8) + TEST_TYPE_ALIGN (PLUID, 8) + TEST_TARGET_SIZE (PLUID, 8) + TEST_TARGET_ALIGN(PLUID, 4) +} + +static void test_pack_PLUID_AND_ATTRIBUTES(void) +{ + /* PLUID_AND_ATTRIBUTES */ + TEST_TYPE_SIZE (PLUID_AND_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (PLUID_AND_ATTRIBUTES, 8) + TEST_TARGET_SIZE (PLUID_AND_ATTRIBUTES, 12) + TEST_TARGET_ALIGN(PLUID_AND_ATTRIBUTES, 4) +} + +static void test_pack_PMEMORY_BASIC_INFORMATION(void) +{ + /* PMEMORY_BASIC_INFORMATION */ + TEST_TYPE_SIZE (PMEMORY_BASIC_INFORMATION, 8) + TEST_TYPE_ALIGN (PMEMORY_BASIC_INFORMATION, 8) + TEST_TARGET_SIZE (PMEMORY_BASIC_INFORMATION, 48) + TEST_TARGET_ALIGN(PMEMORY_BASIC_INFORMATION, 8) +} + +static void test_pack_PMESSAGE_RESOURCE_BLOCK(void) +{ + /* PMESSAGE_RESOURCE_BLOCK */ + TEST_TYPE_SIZE (PMESSAGE_RESOURCE_BLOCK, 8) + TEST_TYPE_ALIGN (PMESSAGE_RESOURCE_BLOCK, 8) + TEST_TARGET_SIZE (PMESSAGE_RESOURCE_BLOCK, 12) + TEST_TARGET_ALIGN(PMESSAGE_RESOURCE_BLOCK, 4) +} + +static void test_pack_PMESSAGE_RESOURCE_DATA(void) +{ + /* PMESSAGE_RESOURCE_DATA */ + TEST_TYPE_SIZE (PMESSAGE_RESOURCE_DATA, 8) + TEST_TYPE_ALIGN (PMESSAGE_RESOURCE_DATA, 8) + TEST_TARGET_SIZE (PMESSAGE_RESOURCE_DATA, 16) + TEST_TARGET_ALIGN(PMESSAGE_RESOURCE_DATA, 4) +} + +static void test_pack_PMESSAGE_RESOURCE_ENTRY(void) +{ + /* PMESSAGE_RESOURCE_ENTRY */ + TEST_TYPE_SIZE (PMESSAGE_RESOURCE_ENTRY, 8) + TEST_TYPE_ALIGN (PMESSAGE_RESOURCE_ENTRY, 8) + TEST_TARGET_SIZE (PMESSAGE_RESOURCE_ENTRY, 6) + TEST_TARGET_ALIGN(PMESSAGE_RESOURCE_ENTRY, 2) +} + +static void test_pack_PNT_TIB(void) +{ + /* PNT_TIB */ + TEST_TYPE_SIZE (PNT_TIB, 8) + TEST_TYPE_ALIGN (PNT_TIB, 8) +} + +static void test_pack_POBJECT_TYPE_LIST(void) +{ + /* POBJECT_TYPE_LIST */ + TEST_TYPE_SIZE (POBJECT_TYPE_LIST, 8) + TEST_TYPE_ALIGN (POBJECT_TYPE_LIST, 8) + TEST_TARGET_SIZE (POBJECT_TYPE_LIST, 16) + TEST_TARGET_ALIGN(POBJECT_TYPE_LIST, 8) +} + +static void test_pack_PPRIVILEGE_SET(void) +{ + /* PPRIVILEGE_SET */ + TEST_TYPE_SIZE (PPRIVILEGE_SET, 8) + TEST_TYPE_ALIGN (PPRIVILEGE_SET, 8) + TEST_TARGET_SIZE (PPRIVILEGE_SET, 20) + TEST_TARGET_ALIGN(PPRIVILEGE_SET, 4) +} + +static void test_pack_PRIVILEGE_SET(void) +{ + /* PRIVILEGE_SET */ + TEST_TYPE_SIZE (PRIVILEGE_SET, 20) + TEST_TYPE_ALIGN (PRIVILEGE_SET, 4) + TEST_FIELD_SIZE (PRIVILEGE_SET, PrivilegeCount, 4) + TEST_FIELD_ALIGN (PRIVILEGE_SET, PrivilegeCount, 4) + TEST_FIELD_OFFSET(PRIVILEGE_SET, PrivilegeCount, 0) + TEST_FIELD_SIZE (PRIVILEGE_SET, Control, 4) + TEST_FIELD_ALIGN (PRIVILEGE_SET, Control, 4) + TEST_FIELD_OFFSET(PRIVILEGE_SET, Control, 4) + TEST_FIELD_SIZE (PRIVILEGE_SET, Privilege, 12) + TEST_FIELD_ALIGN (PRIVILEGE_SET, Privilege, 4) + TEST_FIELD_OFFSET(PRIVILEGE_SET, Privilege, 8) +} + +static void test_pack_PRLIST_ENTRY(void) +{ + /* PRLIST_ENTRY */ + TEST_TYPE_SIZE (PRLIST_ENTRY, 8) + TEST_TYPE_ALIGN (PRLIST_ENTRY, 8) + TEST_TARGET_SIZE (PRLIST_ENTRY, 16) + TEST_TARGET_ALIGN(PRLIST_ENTRY, 8) +} + +static void test_pack_PRTL_CRITICAL_SECTION(void) +{ + /* PRTL_CRITICAL_SECTION */ + TEST_TYPE_SIZE (PRTL_CRITICAL_SECTION, 8) + TEST_TYPE_ALIGN (PRTL_CRITICAL_SECTION, 8) + TEST_TARGET_SIZE (PRTL_CRITICAL_SECTION, 40) + TEST_TARGET_ALIGN(PRTL_CRITICAL_SECTION, 8) +} + +static void test_pack_PRTL_CRITICAL_SECTION_DEBUG(void) +{ + /* PRTL_CRITICAL_SECTION_DEBUG */ + TEST_TYPE_SIZE (PRTL_CRITICAL_SECTION_DEBUG, 8) + TEST_TYPE_ALIGN (PRTL_CRITICAL_SECTION_DEBUG, 8) +} + +static void test_pack_PRTL_OSVERSIONINFOEXW(void) +{ + /* PRTL_OSVERSIONINFOEXW */ + TEST_TYPE_SIZE (PRTL_OSVERSIONINFOEXW, 8) + TEST_TYPE_ALIGN (PRTL_OSVERSIONINFOEXW, 8) + TEST_TARGET_SIZE (PRTL_OSVERSIONINFOEXW, 284) + TEST_TARGET_ALIGN(PRTL_OSVERSIONINFOEXW, 4) +} + +static void test_pack_PRTL_OSVERSIONINFOW(void) +{ + /* PRTL_OSVERSIONINFOW */ + TEST_TYPE_SIZE (PRTL_OSVERSIONINFOW, 8) + TEST_TYPE_ALIGN (PRTL_OSVERSIONINFOW, 8) + TEST_TARGET_SIZE (PRTL_OSVERSIONINFOW, 276) + TEST_TARGET_ALIGN(PRTL_OSVERSIONINFOW, 4) +} + +static void test_pack_PRTL_RESOURCE_DEBUG(void) +{ + /* PRTL_RESOURCE_DEBUG */ + TEST_TYPE_SIZE (PRTL_RESOURCE_DEBUG, 8) + TEST_TYPE_ALIGN (PRTL_RESOURCE_DEBUG, 8) +} + +static void test_pack_PSECURITY_DESCRIPTOR(void) +{ + /* PSECURITY_DESCRIPTOR */ + TEST_TYPE_SIZE (PSECURITY_DESCRIPTOR, 8) + TEST_TYPE_ALIGN (PSECURITY_DESCRIPTOR, 8) +} + +static void test_pack_PSECURITY_QUALITY_OF_SERVICE(void) +{ + /* PSECURITY_QUALITY_OF_SERVICE */ + TEST_TYPE_SIZE (PSECURITY_QUALITY_OF_SERVICE, 8) + TEST_TYPE_ALIGN (PSECURITY_QUALITY_OF_SERVICE, 8) +} + +static void test_pack_PSID(void) +{ + /* PSID */ + TEST_TYPE_SIZE (PSID, 8) + TEST_TYPE_ALIGN (PSID, 8) +} + +static void test_pack_PSID_IDENTIFIER_AUTHORITY(void) +{ + /* PSID_IDENTIFIER_AUTHORITY */ + TEST_TYPE_SIZE (PSID_IDENTIFIER_AUTHORITY, 8) + TEST_TYPE_ALIGN (PSID_IDENTIFIER_AUTHORITY, 8) + TEST_TARGET_SIZE (PSID_IDENTIFIER_AUTHORITY, 6) + TEST_TARGET_ALIGN(PSID_IDENTIFIER_AUTHORITY, 1) +} + +static void test_pack_PSINGLE_LIST_ENTRY(void) +{ + /* PSINGLE_LIST_ENTRY */ + TEST_TYPE_SIZE (PSINGLE_LIST_ENTRY, 8) + TEST_TYPE_ALIGN (PSINGLE_LIST_ENTRY, 8) + TEST_TARGET_SIZE (PSINGLE_LIST_ENTRY, 8) + TEST_TARGET_ALIGN(PSINGLE_LIST_ENTRY, 8) +} + +static void test_pack_PSTR(void) +{ + /* PSTR */ + TEST_TYPE_SIZE (PSTR, 8) + TEST_TYPE_ALIGN (PSTR, 8) + TEST_TARGET_SIZE (PSTR, 1) + TEST_TARGET_ALIGN(PSTR, 1) +} + +static void test_pack_PSYSTEM_ALARM_ACE(void) +{ + /* PSYSTEM_ALARM_ACE */ + TEST_TYPE_SIZE (PSYSTEM_ALARM_ACE, 8) + TEST_TYPE_ALIGN (PSYSTEM_ALARM_ACE, 8) + TEST_TARGET_SIZE (PSYSTEM_ALARM_ACE, 12) + TEST_TARGET_ALIGN(PSYSTEM_ALARM_ACE, 4) +} + +static void test_pack_PSYSTEM_AUDIT_ACE(void) +{ + /* PSYSTEM_AUDIT_ACE */ + TEST_TYPE_SIZE (PSYSTEM_AUDIT_ACE, 8) + TEST_TYPE_ALIGN (PSYSTEM_AUDIT_ACE, 8) + TEST_TARGET_SIZE (PSYSTEM_AUDIT_ACE, 12) + TEST_TARGET_ALIGN(PSYSTEM_AUDIT_ACE, 4) +} + +static void test_pack_PTOKEN_GROUPS(void) +{ + /* PTOKEN_GROUPS */ + TEST_TYPE_SIZE (PTOKEN_GROUPS, 8) + TEST_TYPE_ALIGN (PTOKEN_GROUPS, 8) + TEST_TARGET_SIZE (PTOKEN_GROUPS, 24) + TEST_TARGET_ALIGN(PTOKEN_GROUPS, 8) +} + +static void test_pack_PTOKEN_PRIVILEGES(void) +{ + /* PTOKEN_PRIVILEGES */ + TEST_TYPE_SIZE (PTOKEN_PRIVILEGES, 8) + TEST_TYPE_ALIGN (PTOKEN_PRIVILEGES, 8) + TEST_TARGET_SIZE (PTOKEN_PRIVILEGES, 16) + TEST_TARGET_ALIGN(PTOKEN_PRIVILEGES, 4) +} + +static void test_pack_PTOKEN_USER(void) +{ + /* PTOKEN_USER */ + TEST_TYPE_SIZE (PTOKEN_USER, 8) + TEST_TYPE_ALIGN (PTOKEN_USER, 8) + TEST_TARGET_SIZE (PTOKEN_USER, 16) + TEST_TARGET_ALIGN(PTOKEN_USER, 8) +} + +static void test_pack_PTSTR(void) +{ + /* PTSTR */ + TEST_TYPE_SIZE (PTSTR, 8) + TEST_TYPE_ALIGN (PTSTR, 8) +} + +static void test_pack_PULARGE_INTEGER(void) +{ + /* PULARGE_INTEGER */ + TEST_TYPE_SIZE (PULARGE_INTEGER, 8) + TEST_TYPE_ALIGN (PULARGE_INTEGER, 8) +} + +static void test_pack_PVECTORED_EXCEPTION_HANDLER(void) +{ + /* PVECTORED_EXCEPTION_HANDLER */ + TEST_TYPE_SIZE (PVECTORED_EXCEPTION_HANDLER, 8) + TEST_TYPE_ALIGN (PVECTORED_EXCEPTION_HANDLER, 8) +} + +static void test_pack_PVOID(void) +{ + /* PVOID */ + TEST_TYPE_SIZE (PVOID, 8) + TEST_TYPE_ALIGN (PVOID, 8) +} + +static void test_pack_PWCH(void) +{ + /* PWCH */ + TEST_TYPE_SIZE (PWCH, 8) + TEST_TYPE_ALIGN (PWCH, 8) + TEST_TARGET_SIZE (PWCH, 2) + TEST_TARGET_ALIGN(PWCH, 2) +} + +static void test_pack_PWSTR(void) +{ + /* PWSTR */ + TEST_TYPE_SIZE (PWSTR, 8) + TEST_TYPE_ALIGN (PWSTR, 8) + TEST_TARGET_SIZE (PWSTR, 2) + TEST_TARGET_ALIGN(PWSTR, 2) +} + +static void test_pack_RTL_CRITICAL_SECTION(void) +{ + /* RTL_CRITICAL_SECTION */ + TEST_TYPE_SIZE (RTL_CRITICAL_SECTION, 40) + TEST_TYPE_ALIGN (RTL_CRITICAL_SECTION, 8) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, DebugInfo, 8) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, DebugInfo, 8) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, DebugInfo, 0) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, LockCount, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, LockCount, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, LockCount, 8) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, RecursionCount, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, RecursionCount, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, RecursionCount, 12) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, OwningThread, 8) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, OwningThread, 8) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, OwningThread, 16) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, LockSemaphore, 8) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, LockSemaphore, 8) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, LockSemaphore, 24) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, SpinCount, 8) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, SpinCount, 8) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, SpinCount, 32) +} + +static void test_pack_RTL_CRITICAL_SECTION_DEBUG(void) +{ + /* RTL_CRITICAL_SECTION_DEBUG */ + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION_DEBUG, Type, 2) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION_DEBUG, Type, 2) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION_DEBUG, Type, 0) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION_DEBUG, CreatorBackTraceIndex, 2) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION_DEBUG, CreatorBackTraceIndex, 2) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION_DEBUG, CreatorBackTraceIndex, 2) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION_DEBUG, CriticalSection, 8) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION_DEBUG, CriticalSection, 8) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION_DEBUG, CriticalSection, 8) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION_DEBUG, ProcessLocksList, 16) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION_DEBUG, ProcessLocksList, 8) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION_DEBUG, ProcessLocksList, 16) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION_DEBUG, EntryCount, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION_DEBUG, EntryCount, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION_DEBUG, EntryCount, 32) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION_DEBUG, ContentionCount, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION_DEBUG, ContentionCount, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION_DEBUG, ContentionCount, 36) +} + +static void test_pack_RTL_OSVERSIONINFOEXW(void) +{ + /* RTL_OSVERSIONINFOEXW */ + TEST_TYPE_SIZE (RTL_OSVERSIONINFOEXW, 284) + TEST_TYPE_ALIGN (RTL_OSVERSIONINFOEXW, 4) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, dwMajorVersion, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, dwMajorVersion, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, dwMajorVersion, 4) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, dwMinorVersion, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, dwMinorVersion, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, dwMinorVersion, 8) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, dwBuildNumber, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, dwBuildNumber, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, dwBuildNumber, 12) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, dwPlatformId, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, dwPlatformId, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, dwPlatformId, 16) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, szCSDVersion, 256) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, szCSDVersion, 2) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, szCSDVersion, 20) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, wServicePackMajor, 2) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, wServicePackMajor, 2) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, wServicePackMajor, 276) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, wServicePackMinor, 2) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, wServicePackMinor, 2) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, wServicePackMinor, 278) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, wSuiteMask, 2) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, wSuiteMask, 2) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, wSuiteMask, 280) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, wProductType, 1) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, wProductType, 1) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, wProductType, 282) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, wReserved, 1) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOEXW, wReserved, 1) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOEXW, wReserved, 283) +} + +static void test_pack_RTL_OSVERSIONINFOW(void) +{ + /* RTL_OSVERSIONINFOW */ + TEST_TYPE_SIZE (RTL_OSVERSIONINFOW, 276) + TEST_TYPE_ALIGN (RTL_OSVERSIONINFOW, 4) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOW, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOW, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOW, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOW, dwMajorVersion, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOW, dwMajorVersion, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOW, dwMajorVersion, 4) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOW, dwMinorVersion, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOW, dwMinorVersion, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOW, dwMinorVersion, 8) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOW, dwBuildNumber, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOW, dwBuildNumber, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOW, dwBuildNumber, 12) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOW, dwPlatformId, 4) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOW, dwPlatformId, 4) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOW, dwPlatformId, 16) + TEST_FIELD_SIZE (RTL_OSVERSIONINFOW, szCSDVersion, 256) + TEST_FIELD_ALIGN (RTL_OSVERSIONINFOW, szCSDVersion, 2) + TEST_FIELD_OFFSET(RTL_OSVERSIONINFOW, szCSDVersion, 20) +} + +static void test_pack_RTL_RESOURCE_DEBUG(void) +{ + /* RTL_RESOURCE_DEBUG */ + TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, Type, 2) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, Type, 2) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, Type, 0) + TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, CreatorBackTraceIndex, 2) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, CreatorBackTraceIndex, 2) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, CreatorBackTraceIndex, 2) + TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, CriticalSection, 8) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, CriticalSection, 8) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, CriticalSection, 8) + TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, ProcessLocksList, 16) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, ProcessLocksList, 8) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, ProcessLocksList, 16) + TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, EntryCount, 4) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, EntryCount, 4) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, EntryCount, 32) + TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, ContentionCount, 4) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, ContentionCount, 4) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, ContentionCount, 36) +} + +static void test_pack_SECURITY_CONTEXT_TRACKING_MODE(void) +{ + /* SECURITY_CONTEXT_TRACKING_MODE */ + TEST_TYPE_SIZE (SECURITY_CONTEXT_TRACKING_MODE, 1) + TEST_TYPE_ALIGN (SECURITY_CONTEXT_TRACKING_MODE, 1) +} + +static void test_pack_SECURITY_DESCRIPTOR(void) +{ + /* SECURITY_DESCRIPTOR */ + TEST_TYPE_SIZE (SECURITY_DESCRIPTOR, 40) + TEST_TYPE_ALIGN (SECURITY_DESCRIPTOR, 8) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Revision, 1) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Revision, 1) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Revision, 0) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Sbz1, 1) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Sbz1, 1) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Sbz1, 1) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Control, 2) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Control, 2) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Control, 2) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Owner, 8) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Owner, 8) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Owner, 8) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Group, 8) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Group, 8) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Group, 16) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Sacl, 8) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Sacl, 8) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Sacl, 24) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Dacl, 8) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Dacl, 8) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Dacl, 32) +} + +static void test_pack_SECURITY_DESCRIPTOR_CONTROL(void) +{ + /* SECURITY_DESCRIPTOR_CONTROL */ + TEST_TYPE_SIZE (SECURITY_DESCRIPTOR_CONTROL, 2) + TEST_TYPE_ALIGN (SECURITY_DESCRIPTOR_CONTROL, 2) + TEST_TYPE_UNSIGNED(SECURITY_DESCRIPTOR_CONTROL) +} + +static void test_pack_SECURITY_DESCRIPTOR_RELATIVE(void) +{ + /* SECURITY_DESCRIPTOR_RELATIVE */ + TEST_TYPE_SIZE (SECURITY_DESCRIPTOR_RELATIVE, 20) + TEST_TYPE_ALIGN (SECURITY_DESCRIPTOR_RELATIVE, 4) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR_RELATIVE, Revision, 1) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR_RELATIVE, Revision, 1) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR_RELATIVE, Revision, 0) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR_RELATIVE, Sbz1, 1) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR_RELATIVE, Sbz1, 1) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR_RELATIVE, Sbz1, 1) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR_RELATIVE, Control, 2) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR_RELATIVE, Control, 2) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR_RELATIVE, Control, 2) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR_RELATIVE, Owner, 4) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR_RELATIVE, Owner, 4) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR_RELATIVE, Owner, 4) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR_RELATIVE, Group, 4) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR_RELATIVE, Group, 4) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR_RELATIVE, Group, 8) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR_RELATIVE, Sacl, 4) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR_RELATIVE, Sacl, 4) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR_RELATIVE, Sacl, 12) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR_RELATIVE, Dacl, 4) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR_RELATIVE, Dacl, 4) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR_RELATIVE, Dacl, 16) +} + +static void test_pack_SECURITY_INFORMATION(void) +{ + /* SECURITY_INFORMATION */ + TEST_TYPE_SIZE (SECURITY_INFORMATION, 4) + TEST_TYPE_ALIGN (SECURITY_INFORMATION, 4) + TEST_TYPE_UNSIGNED(SECURITY_INFORMATION) +} + +static void test_pack_SECURITY_QUALITY_OF_SERVICE(void) +{ + /* SECURITY_QUALITY_OF_SERVICE */ + TEST_FIELD_SIZE (SECURITY_QUALITY_OF_SERVICE, Length, 4) + TEST_FIELD_ALIGN (SECURITY_QUALITY_OF_SERVICE, Length, 4) + TEST_FIELD_OFFSET(SECURITY_QUALITY_OF_SERVICE, Length, 0) +} + +static void test_pack_SHORT(void) +{ + /* SHORT */ + TEST_TYPE_SIZE (SHORT, 2) + TEST_TYPE_ALIGN (SHORT, 2) + TEST_TYPE_SIGNED(SHORT) +} + +static void test_pack_SID(void) +{ + /* SID */ + TEST_TYPE_SIZE (SID, 12) + TEST_TYPE_ALIGN (SID, 4) + TEST_FIELD_SIZE (SID, Revision, 1) + TEST_FIELD_ALIGN (SID, Revision, 1) + TEST_FIELD_OFFSET(SID, Revision, 0) + TEST_FIELD_SIZE (SID, SubAuthorityCount, 1) + TEST_FIELD_ALIGN (SID, SubAuthorityCount, 1) + TEST_FIELD_OFFSET(SID, SubAuthorityCount, 1) + TEST_FIELD_SIZE (SID, IdentifierAuthority, 6) + TEST_FIELD_ALIGN (SID, IdentifierAuthority, 1) + TEST_FIELD_OFFSET(SID, IdentifierAuthority, 2) + TEST_FIELD_SIZE (SID, SubAuthority, 4) + TEST_FIELD_ALIGN (SID, SubAuthority, 4) + TEST_FIELD_OFFSET(SID, SubAuthority, 8) +} + +static void test_pack_SID_AND_ATTRIBUTES(void) +{ + /* SID_AND_ATTRIBUTES */ + TEST_TYPE_SIZE (SID_AND_ATTRIBUTES, 16) + TEST_TYPE_ALIGN (SID_AND_ATTRIBUTES, 8) + TEST_FIELD_SIZE (SID_AND_ATTRIBUTES, Sid, 8) + TEST_FIELD_ALIGN (SID_AND_ATTRIBUTES, Sid, 8) + TEST_FIELD_OFFSET(SID_AND_ATTRIBUTES, Sid, 0) + TEST_FIELD_SIZE (SID_AND_ATTRIBUTES, Attributes, 4) + TEST_FIELD_ALIGN (SID_AND_ATTRIBUTES, Attributes, 4) + TEST_FIELD_OFFSET(SID_AND_ATTRIBUTES, Attributes, 8) +} + +static void test_pack_SID_IDENTIFIER_AUTHORITY(void) +{ + /* SID_IDENTIFIER_AUTHORITY */ + TEST_TYPE_SIZE (SID_IDENTIFIER_AUTHORITY, 6) + TEST_TYPE_ALIGN (SID_IDENTIFIER_AUTHORITY, 1) + TEST_FIELD_SIZE (SID_IDENTIFIER_AUTHORITY, Value, 6) + TEST_FIELD_ALIGN (SID_IDENTIFIER_AUTHORITY, Value, 1) + TEST_FIELD_OFFSET(SID_IDENTIFIER_AUTHORITY, Value, 0) +} + +static void test_pack_SINGLE_LIST_ENTRY(void) +{ + /* SINGLE_LIST_ENTRY */ + TEST_TYPE_SIZE (SINGLE_LIST_ENTRY, 8) + TEST_TYPE_ALIGN (SINGLE_LIST_ENTRY, 8) + TEST_FIELD_SIZE (SINGLE_LIST_ENTRY, Next, 8) + TEST_FIELD_ALIGN (SINGLE_LIST_ENTRY, Next, 8) + TEST_FIELD_OFFSET(SINGLE_LIST_ENTRY, Next, 0) +} + +static void test_pack_SYSTEM_ALARM_ACE(void) +{ + /* SYSTEM_ALARM_ACE */ + TEST_TYPE_SIZE (SYSTEM_ALARM_ACE, 12) + TEST_TYPE_ALIGN (SYSTEM_ALARM_ACE, 4) + TEST_FIELD_SIZE (SYSTEM_ALARM_ACE, Header, 4) + TEST_FIELD_ALIGN (SYSTEM_ALARM_ACE, Header, 2) + TEST_FIELD_OFFSET(SYSTEM_ALARM_ACE, Header, 0) + TEST_FIELD_SIZE (SYSTEM_ALARM_ACE, Mask, 4) + TEST_FIELD_ALIGN (SYSTEM_ALARM_ACE, Mask, 4) + TEST_FIELD_OFFSET(SYSTEM_ALARM_ACE, Mask, 4) + TEST_FIELD_SIZE (SYSTEM_ALARM_ACE, SidStart, 4) + TEST_FIELD_ALIGN (SYSTEM_ALARM_ACE, SidStart, 4) + TEST_FIELD_OFFSET(SYSTEM_ALARM_ACE, SidStart, 8) +} + +static void test_pack_SYSTEM_AUDIT_ACE(void) +{ + /* SYSTEM_AUDIT_ACE */ + TEST_TYPE_SIZE (SYSTEM_AUDIT_ACE, 12) + TEST_TYPE_ALIGN (SYSTEM_AUDIT_ACE, 4) + TEST_FIELD_SIZE (SYSTEM_AUDIT_ACE, Header, 4) + TEST_FIELD_ALIGN (SYSTEM_AUDIT_ACE, Header, 2) + TEST_FIELD_OFFSET(SYSTEM_AUDIT_ACE, Header, 0) + TEST_FIELD_SIZE (SYSTEM_AUDIT_ACE, Mask, 4) + TEST_FIELD_ALIGN (SYSTEM_AUDIT_ACE, Mask, 4) + TEST_FIELD_OFFSET(SYSTEM_AUDIT_ACE, Mask, 4) + TEST_FIELD_SIZE (SYSTEM_AUDIT_ACE, SidStart, 4) + TEST_FIELD_ALIGN (SYSTEM_AUDIT_ACE, SidStart, 4) + TEST_FIELD_OFFSET(SYSTEM_AUDIT_ACE, SidStart, 8) +} + +static void test_pack_TCHAR(void) +{ + /* TCHAR */ + TEST_TYPE_SIZE (TCHAR, 1) + TEST_TYPE_ALIGN (TCHAR, 1) +} + +static void test_pack_TOKEN_DEFAULT_DACL(void) +{ + /* TOKEN_DEFAULT_DACL */ + TEST_TYPE_SIZE (TOKEN_DEFAULT_DACL, 8) + TEST_TYPE_ALIGN (TOKEN_DEFAULT_DACL, 8) + TEST_FIELD_SIZE (TOKEN_DEFAULT_DACL, DefaultDacl, 8) + TEST_FIELD_ALIGN (TOKEN_DEFAULT_DACL, DefaultDacl, 8) + TEST_FIELD_OFFSET(TOKEN_DEFAULT_DACL, DefaultDacl, 0) +} + +static void test_pack_TOKEN_GROUPS(void) +{ + /* TOKEN_GROUPS */ + TEST_TYPE_SIZE (TOKEN_GROUPS, 24) + TEST_TYPE_ALIGN (TOKEN_GROUPS, 8) + TEST_FIELD_SIZE (TOKEN_GROUPS, GroupCount, 4) + TEST_FIELD_ALIGN (TOKEN_GROUPS, GroupCount, 4) + TEST_FIELD_OFFSET(TOKEN_GROUPS, GroupCount, 0) + TEST_FIELD_SIZE (TOKEN_GROUPS, Groups, 16) + TEST_FIELD_ALIGN (TOKEN_GROUPS, Groups, 8) + TEST_FIELD_OFFSET(TOKEN_GROUPS, Groups, 8) +} + +static void test_pack_TOKEN_OWNER(void) +{ + /* TOKEN_OWNER */ + TEST_TYPE_SIZE (TOKEN_OWNER, 8) + TEST_TYPE_ALIGN (TOKEN_OWNER, 8) + TEST_FIELD_SIZE (TOKEN_OWNER, Owner, 8) + TEST_FIELD_ALIGN (TOKEN_OWNER, Owner, 8) + TEST_FIELD_OFFSET(TOKEN_OWNER, Owner, 0) +} + +static void test_pack_TOKEN_PRIMARY_GROUP(void) +{ + /* TOKEN_PRIMARY_GROUP */ + TEST_TYPE_SIZE (TOKEN_PRIMARY_GROUP, 8) + TEST_TYPE_ALIGN (TOKEN_PRIMARY_GROUP, 8) + TEST_FIELD_SIZE (TOKEN_PRIMARY_GROUP, PrimaryGroup, 8) + TEST_FIELD_ALIGN (TOKEN_PRIMARY_GROUP, PrimaryGroup, 8) + TEST_FIELD_OFFSET(TOKEN_PRIMARY_GROUP, PrimaryGroup, 0) +} + +static void test_pack_TOKEN_PRIVILEGES(void) +{ + /* TOKEN_PRIVILEGES */ + TEST_TYPE_SIZE (TOKEN_PRIVILEGES, 16) + TEST_TYPE_ALIGN (TOKEN_PRIVILEGES, 4) + TEST_FIELD_SIZE (TOKEN_PRIVILEGES, PrivilegeCount, 4) + TEST_FIELD_ALIGN (TOKEN_PRIVILEGES, PrivilegeCount, 4) + TEST_FIELD_OFFSET(TOKEN_PRIVILEGES, PrivilegeCount, 0) + TEST_FIELD_SIZE (TOKEN_PRIVILEGES, Privileges, 12) + TEST_FIELD_ALIGN (TOKEN_PRIVILEGES, Privileges, 4) + TEST_FIELD_OFFSET(TOKEN_PRIVILEGES, Privileges, 4) +} + +static void test_pack_TOKEN_SOURCE(void) +{ + /* TOKEN_SOURCE */ + TEST_TYPE_SIZE (TOKEN_SOURCE, 16) + TEST_TYPE_ALIGN (TOKEN_SOURCE, 4) + TEST_FIELD_SIZE (TOKEN_SOURCE, SourceName, 8) + TEST_FIELD_ALIGN (TOKEN_SOURCE, SourceName, 1) + TEST_FIELD_OFFSET(TOKEN_SOURCE, SourceName, 0) + TEST_FIELD_SIZE (TOKEN_SOURCE, SourceIdentifier, 8) + TEST_FIELD_ALIGN (TOKEN_SOURCE, SourceIdentifier, 4) + TEST_FIELD_OFFSET(TOKEN_SOURCE, SourceIdentifier, 8) +} + +static void test_pack_TOKEN_STATISTICS(void) +{ + /* TOKEN_STATISTICS (pack 4) */ + TEST_FIELD_SIZE (TOKEN_STATISTICS, TokenId, 8) + TEST_FIELD_ALIGN (TOKEN_STATISTICS, TokenId, 4) + TEST_FIELD_OFFSET(TOKEN_STATISTICS, TokenId, 0) + TEST_FIELD_SIZE (TOKEN_STATISTICS, AuthenticationId, 8) + TEST_FIELD_ALIGN (TOKEN_STATISTICS, AuthenticationId, 4) + TEST_FIELD_OFFSET(TOKEN_STATISTICS, AuthenticationId, 8) + TEST_FIELD_SIZE (TOKEN_STATISTICS, ExpirationTime, 8) + TEST_FIELD_ALIGN (TOKEN_STATISTICS, ExpirationTime, 4) + TEST_FIELD_OFFSET(TOKEN_STATISTICS, ExpirationTime, 16) +} + +static void test_pack_TOKEN_USER(void) +{ + /* TOKEN_USER */ + TEST_TYPE_SIZE (TOKEN_USER, 16) + TEST_TYPE_ALIGN (TOKEN_USER, 8) + TEST_FIELD_SIZE (TOKEN_USER, User, 16) + TEST_FIELD_ALIGN (TOKEN_USER, User, 8) + TEST_FIELD_OFFSET(TOKEN_USER, User, 0) +} + +static void test_pack_ULARGE_INTEGER(void) +{ + /* ULARGE_INTEGER */ +} + +static void test_pack_ULONGLONG(void) +{ + /* ULONGLONG */ + TEST_TYPE_SIZE (ULONGLONG, 8) + TEST_TYPE_ALIGN (ULONGLONG, 8) + TEST_TYPE_UNSIGNED(ULONGLONG) +} + +static void test_pack_WAITORTIMERCALLBACKFUNC(void) +{ + /* WAITORTIMERCALLBACKFUNC */ + TEST_TYPE_SIZE (WAITORTIMERCALLBACKFUNC, 8) + TEST_TYPE_ALIGN (WAITORTIMERCALLBACKFUNC, 8) +} + +static void test_pack_WCHAR(void) +{ + /* WCHAR */ + TEST_TYPE_SIZE (WCHAR, 2) + TEST_TYPE_ALIGN (WCHAR, 2) + TEST_TYPE_UNSIGNED(WCHAR) +} + +static void test_pack_ATOM(void) +{ + /* ATOM */ + TEST_TYPE_SIZE (ATOM, 2) + TEST_TYPE_ALIGN (ATOM, 2) + TEST_TYPE_UNSIGNED(ATOM) +} + +static void test_pack_BOOL(void) +{ + /* BOOL */ + TEST_TYPE_SIZE (BOOL, 4) + TEST_TYPE_ALIGN (BOOL, 4) + TEST_TYPE_SIGNED(BOOL) +} + +static void test_pack_BYTE(void) +{ + /* BYTE */ + TEST_TYPE_SIZE (BYTE, 1) + TEST_TYPE_ALIGN (BYTE, 1) + TEST_TYPE_UNSIGNED(BYTE) +} + +static void test_pack_COLORREF(void) +{ + /* COLORREF */ + TEST_TYPE_SIZE (COLORREF, 4) + TEST_TYPE_ALIGN (COLORREF, 4) + TEST_TYPE_UNSIGNED(COLORREF) +} + +static void test_pack_DWORD(void) +{ + /* DWORD */ + TEST_TYPE_SIZE (DWORD, 4) + TEST_TYPE_ALIGN (DWORD, 4) + TEST_TYPE_UNSIGNED(DWORD) +} + +static void test_pack_FARPROC(void) +{ + /* FARPROC */ + TEST_TYPE_SIZE (FARPROC, 8) + TEST_TYPE_ALIGN (FARPROC, 8) +} + +static void test_pack_FLOAT(void) +{ + /* FLOAT */ + TEST_TYPE_SIZE (FLOAT, 4) + TEST_TYPE_ALIGN (FLOAT, 4) +} + +static void test_pack_GLOBALHANDLE(void) +{ + /* GLOBALHANDLE */ + TEST_TYPE_SIZE (GLOBALHANDLE, 8) + TEST_TYPE_ALIGN (GLOBALHANDLE, 8) +} + +static void test_pack_HCURSOR(void) +{ + /* HCURSOR */ + TEST_TYPE_SIZE (HCURSOR, 8) + TEST_TYPE_ALIGN (HCURSOR, 8) +} + +static void test_pack_HFILE(void) +{ + /* HFILE */ + TEST_TYPE_SIZE (HFILE, 4) + TEST_TYPE_ALIGN (HFILE, 4) + TEST_TYPE_SIGNED(HFILE) +} + +static void test_pack_HGDIOBJ(void) +{ + /* HGDIOBJ */ + TEST_TYPE_SIZE (HGDIOBJ, 8) + TEST_TYPE_ALIGN (HGDIOBJ, 8) +} + +static void test_pack_HGLOBAL(void) +{ + /* HGLOBAL */ + TEST_TYPE_SIZE (HGLOBAL, 8) + TEST_TYPE_ALIGN (HGLOBAL, 8) +} + +static void test_pack_HLOCAL(void) +{ + /* HLOCAL */ + TEST_TYPE_SIZE (HLOCAL, 8) + TEST_TYPE_ALIGN (HLOCAL, 8) +} + +static void test_pack_HMODULE(void) +{ + /* HMODULE */ + TEST_TYPE_SIZE (HMODULE, 8) + TEST_TYPE_ALIGN (HMODULE, 8) +} + +static void test_pack_INT(void) +{ + /* INT */ + TEST_TYPE_SIZE (INT, 4) + TEST_TYPE_ALIGN (INT, 4) + TEST_TYPE_SIGNED(INT) +} + +static void test_pack_LOCALHANDLE(void) +{ + /* LOCALHANDLE */ + TEST_TYPE_SIZE (LOCALHANDLE, 8) + TEST_TYPE_ALIGN (LOCALHANDLE, 8) +} + +static void test_pack_LPARAM(void) +{ + /* LPARAM */ + TEST_TYPE_SIZE (LPARAM, 8) + TEST_TYPE_ALIGN (LPARAM, 8) +} + +static void test_pack_LPCRECT(void) +{ + /* LPCRECT */ + TEST_TYPE_SIZE (LPCRECT, 8) + TEST_TYPE_ALIGN (LPCRECT, 8) + TEST_TARGET_SIZE (LPCRECT, 16) + TEST_TARGET_ALIGN(LPCRECT, 4) +} + +static void test_pack_LPCRECTL(void) +{ + /* LPCRECTL */ + TEST_TYPE_SIZE (LPCRECTL, 8) + TEST_TYPE_ALIGN (LPCRECTL, 8) + TEST_TARGET_SIZE (LPCRECTL, 16) + TEST_TARGET_ALIGN(LPCRECTL, 4) +} + +static void test_pack_LPCVOID(void) +{ + /* LPCVOID */ + TEST_TYPE_SIZE (LPCVOID, 8) + TEST_TYPE_ALIGN (LPCVOID, 8) +} + +static void test_pack_LPPOINT(void) +{ + /* LPPOINT */ + TEST_TYPE_SIZE (LPPOINT, 8) + TEST_TYPE_ALIGN (LPPOINT, 8) + TEST_TARGET_SIZE (LPPOINT, 8) + TEST_TARGET_ALIGN(LPPOINT, 4) +} + +static void test_pack_LPRECT(void) +{ + /* LPRECT */ + TEST_TYPE_SIZE (LPRECT, 8) + TEST_TYPE_ALIGN (LPRECT, 8) + TEST_TARGET_SIZE (LPRECT, 16) + TEST_TARGET_ALIGN(LPRECT, 4) +} + +static void test_pack_LPRECTL(void) +{ + /* LPRECTL */ + TEST_TYPE_SIZE (LPRECTL, 8) + TEST_TYPE_ALIGN (LPRECTL, 8) + TEST_TARGET_SIZE (LPRECTL, 16) + TEST_TARGET_ALIGN(LPRECTL, 4) +} + +static void test_pack_LPSIZE(void) +{ + /* LPSIZE */ + TEST_TYPE_SIZE (LPSIZE, 8) + TEST_TYPE_ALIGN (LPSIZE, 8) + TEST_TARGET_SIZE (LPSIZE, 8) + TEST_TARGET_ALIGN(LPSIZE, 4) +} + +static void test_pack_LRESULT(void) +{ + /* LRESULT */ + TEST_TYPE_SIZE (LRESULT, 8) + TEST_TYPE_ALIGN (LRESULT, 8) +} + +static void test_pack_POINT(void) +{ + /* POINT */ + TEST_TYPE_SIZE (POINT, 8) + TEST_TYPE_ALIGN (POINT, 4) + TEST_FIELD_SIZE (POINT, x, 4) + TEST_FIELD_ALIGN (POINT, x, 4) + TEST_FIELD_OFFSET(POINT, x, 0) + TEST_FIELD_SIZE (POINT, y, 4) + TEST_FIELD_ALIGN (POINT, y, 4) + TEST_FIELD_OFFSET(POINT, y, 4) +} + +static void test_pack_POINTL(void) +{ + /* POINTL */ + TEST_TYPE_SIZE (POINTL, 8) + TEST_TYPE_ALIGN (POINTL, 4) + TEST_FIELD_SIZE (POINTL, x, 4) + TEST_FIELD_ALIGN (POINTL, x, 4) + TEST_FIELD_OFFSET(POINTL, x, 0) + TEST_FIELD_SIZE (POINTL, y, 4) + TEST_FIELD_ALIGN (POINTL, y, 4) + TEST_FIELD_OFFSET(POINTL, y, 4) +} + +static void test_pack_PPOINT(void) +{ + /* PPOINT */ + TEST_TYPE_SIZE (PPOINT, 8) + TEST_TYPE_ALIGN (PPOINT, 8) + TEST_TARGET_SIZE (PPOINT, 8) + TEST_TARGET_ALIGN(PPOINT, 4) +} + +static void test_pack_PPOINTL(void) +{ + /* PPOINTL */ + TEST_TYPE_SIZE (PPOINTL, 8) + TEST_TYPE_ALIGN (PPOINTL, 8) + TEST_TARGET_SIZE (PPOINTL, 8) + TEST_TARGET_ALIGN(PPOINTL, 4) +} + +static void test_pack_PRECT(void) +{ + /* PRECT */ + TEST_TYPE_SIZE (PRECT, 8) + TEST_TYPE_ALIGN (PRECT, 8) + TEST_TARGET_SIZE (PRECT, 16) + TEST_TARGET_ALIGN(PRECT, 4) +} + +static void test_pack_PRECTL(void) +{ + /* PRECTL */ + TEST_TYPE_SIZE (PRECTL, 8) + TEST_TYPE_ALIGN (PRECTL, 8) + TEST_TARGET_SIZE (PRECTL, 16) + TEST_TARGET_ALIGN(PRECTL, 4) +} + +static void test_pack_PROC(void) +{ + /* PROC */ + TEST_TYPE_SIZE (PROC, 8) + TEST_TYPE_ALIGN (PROC, 8) +} + +static void test_pack_PSIZE(void) +{ + /* PSIZE */ + TEST_TYPE_SIZE (PSIZE, 8) + TEST_TYPE_ALIGN (PSIZE, 8) + TEST_TARGET_SIZE (PSIZE, 8) + TEST_TARGET_ALIGN(PSIZE, 4) +} + +static void test_pack_PSZ(void) +{ + /* PSZ */ + TEST_TYPE_SIZE (PSZ, 8) + TEST_TYPE_ALIGN (PSZ, 8) +} + +static void test_pack_RECT(void) +{ + /* RECT */ + TEST_TYPE_SIZE (RECT, 16) + TEST_TYPE_ALIGN (RECT, 4) + TEST_FIELD_SIZE (RECT, left, 4) + TEST_FIELD_ALIGN (RECT, left, 4) + TEST_FIELD_OFFSET(RECT, left, 0) + TEST_FIELD_SIZE (RECT, top, 4) + TEST_FIELD_ALIGN (RECT, top, 4) + TEST_FIELD_OFFSET(RECT, top, 4) + TEST_FIELD_SIZE (RECT, right, 4) + TEST_FIELD_ALIGN (RECT, right, 4) + TEST_FIELD_OFFSET(RECT, right, 8) + TEST_FIELD_SIZE (RECT, bottom, 4) + TEST_FIELD_ALIGN (RECT, bottom, 4) + TEST_FIELD_OFFSET(RECT, bottom, 12) +} + +static void test_pack_RECTL(void) +{ + /* RECTL */ + TEST_TYPE_SIZE (RECTL, 16) + TEST_TYPE_ALIGN (RECTL, 4) + TEST_FIELD_SIZE (RECTL, left, 4) + TEST_FIELD_ALIGN (RECTL, left, 4) + TEST_FIELD_OFFSET(RECTL, left, 0) + TEST_FIELD_SIZE (RECTL, top, 4) + TEST_FIELD_ALIGN (RECTL, top, 4) + TEST_FIELD_OFFSET(RECTL, top, 4) + TEST_FIELD_SIZE (RECTL, right, 4) + TEST_FIELD_ALIGN (RECTL, right, 4) + TEST_FIELD_OFFSET(RECTL, right, 8) + TEST_FIELD_SIZE (RECTL, bottom, 4) + TEST_FIELD_ALIGN (RECTL, bottom, 4) + TEST_FIELD_OFFSET(RECTL, bottom, 12) +} + +static void test_pack_SIZE(void) +{ + /* SIZE */ + TEST_TYPE_SIZE (SIZE, 8) + TEST_TYPE_ALIGN (SIZE, 4) + TEST_FIELD_SIZE (SIZE, cx, 4) + TEST_FIELD_ALIGN (SIZE, cx, 4) + TEST_FIELD_OFFSET(SIZE, cx, 0) + TEST_FIELD_SIZE (SIZE, cy, 4) + TEST_FIELD_ALIGN (SIZE, cy, 4) + TEST_FIELD_OFFSET(SIZE, cy, 4) +} + +static void test_pack_SIZEL(void) +{ + /* SIZEL */ + TEST_TYPE_SIZE (SIZEL, 8) + TEST_TYPE_ALIGN (SIZEL, 4) +} + +static void test_pack_UCHAR(void) +{ + /* UCHAR */ + TEST_TYPE_SIZE (UCHAR, 1) + TEST_TYPE_ALIGN (UCHAR, 1) + TEST_TYPE_UNSIGNED(UCHAR) +} + +static void test_pack_UINT(void) +{ + /* UINT */ + TEST_TYPE_SIZE (UINT, 4) + TEST_TYPE_ALIGN (UINT, 4) + TEST_TYPE_UNSIGNED(UINT) +} + +static void test_pack_ULONG(void) +{ + /* ULONG */ + TEST_TYPE_SIZE (ULONG, 4) + TEST_TYPE_ALIGN (ULONG, 4) + TEST_TYPE_UNSIGNED(ULONG) +} + +static void test_pack_USHORT(void) +{ + /* USHORT */ + TEST_TYPE_SIZE (USHORT, 2) + TEST_TYPE_ALIGN (USHORT, 2) + TEST_TYPE_UNSIGNED(USHORT) +} + +static void test_pack_WORD(void) +{ + /* WORD */ + TEST_TYPE_SIZE (WORD, 2) + TEST_TYPE_ALIGN (WORD, 2) + TEST_TYPE_UNSIGNED(WORD) +} + +static void test_pack_WPARAM(void) +{ + /* WPARAM */ + TEST_TYPE_SIZE (WPARAM, 8) + TEST_TYPE_ALIGN (WPARAM, 8) +} + +#else /* _WIN64 */ + +static void test_pack_DWORD32(void) +{ + /* DWORD32 */ + TEST_TYPE_SIZE (DWORD32, 4) + TEST_TYPE_ALIGN (DWORD32, 4) + TEST_TYPE_UNSIGNED(DWORD32) +} + +static void test_pack_DWORD64(void) +{ + /* DWORD64 */ + TEST_TYPE_SIZE (DWORD64, 8) + TEST_TYPE_ALIGN (DWORD64, 8) + TEST_TYPE_UNSIGNED(DWORD64) +} + +static void test_pack_DWORD_PTR(void) +{ + /* DWORD_PTR */ + TEST_TYPE_SIZE (DWORD_PTR, 4) + TEST_TYPE_ALIGN (DWORD_PTR, 4) +} + +static void test_pack_HALF_PTR(void) +{ + /* HALF_PTR */ + TEST_TYPE_SIZE (HALF_PTR, 2) + TEST_TYPE_ALIGN (HALF_PTR, 2) + TEST_TYPE_SIGNED(HALF_PTR) +} + +static void test_pack_INT16(void) +{ + /* INT16 */ + TEST_TYPE_SIZE (INT16, 2) + TEST_TYPE_ALIGN (INT16, 2) + TEST_TYPE_SIGNED(INT16) +} + +static void test_pack_INT32(void) +{ + /* INT32 */ + TEST_TYPE_SIZE (INT32, 4) + TEST_TYPE_ALIGN (INT32, 4) + TEST_TYPE_SIGNED(INT32) +} + +static void test_pack_INT64(void) +{ + /* INT64 */ + TEST_TYPE_SIZE (INT64, 8) + TEST_TYPE_ALIGN (INT64, 8) + TEST_TYPE_SIGNED(INT64) +} + +static void test_pack_INT8(void) +{ + /* INT8 */ + TEST_TYPE_SIZE (INT8, 1) + TEST_TYPE_ALIGN (INT8, 1) + TEST_TYPE_SIGNED(INT8) +} + +static void test_pack_INT_PTR(void) +{ + /* INT_PTR */ + TEST_TYPE_SIZE (INT_PTR, 4) + TEST_TYPE_ALIGN (INT_PTR, 4) + TEST_TYPE_SIGNED(INT_PTR) +} + +static void test_pack_LONG32(void) +{ + /* LONG32 */ + TEST_TYPE_SIZE (LONG32, 4) + TEST_TYPE_ALIGN (LONG32, 4) + TEST_TYPE_SIGNED(LONG32) +} + +static void test_pack_LONG64(void) +{ + /* LONG64 */ + TEST_TYPE_SIZE (LONG64, 8) + TEST_TYPE_ALIGN (LONG64, 8) + TEST_TYPE_SIGNED(LONG64) +} + +static void test_pack_LONG_PTR(void) +{ + /* LONG_PTR */ + TEST_TYPE_SIZE (LONG_PTR, 4) + TEST_TYPE_ALIGN (LONG_PTR, 4) + TEST_TYPE_SIGNED(LONG_PTR) +} + +static void test_pack_SIZE_T(void) +{ + /* SIZE_T */ + TEST_TYPE_SIZE (SIZE_T, 4) + TEST_TYPE_ALIGN (SIZE_T, 4) +} + +static void test_pack_SSIZE_T(void) +{ + /* SSIZE_T */ + TEST_TYPE_SIZE (SSIZE_T, 4) + TEST_TYPE_ALIGN (SSIZE_T, 4) +} + +static void test_pack_UHALF_PTR(void) +{ + /* UHALF_PTR */ + TEST_TYPE_SIZE (UHALF_PTR, 2) + TEST_TYPE_ALIGN (UHALF_PTR, 2) + TEST_TYPE_UNSIGNED(UHALF_PTR) +} + +static void test_pack_UINT16(void) +{ + /* UINT16 */ + TEST_TYPE_SIZE (UINT16, 2) + TEST_TYPE_ALIGN (UINT16, 2) + TEST_TYPE_UNSIGNED(UINT16) +} + +static void test_pack_UINT32(void) +{ + /* UINT32 */ + TEST_TYPE_SIZE (UINT32, 4) + TEST_TYPE_ALIGN (UINT32, 4) + TEST_TYPE_UNSIGNED(UINT32) +} + +static void test_pack_UINT64(void) +{ + /* UINT64 */ + TEST_TYPE_SIZE (UINT64, 8) + TEST_TYPE_ALIGN (UINT64, 8) + TEST_TYPE_UNSIGNED(UINT64) +} + +static void test_pack_UINT8(void) +{ + /* UINT8 */ + TEST_TYPE_SIZE (UINT8, 1) + TEST_TYPE_ALIGN (UINT8, 1) + TEST_TYPE_UNSIGNED(UINT8) +} + +static void test_pack_UINT_PTR(void) +{ + /* UINT_PTR */ + TEST_TYPE_SIZE (UINT_PTR, 4) + TEST_TYPE_ALIGN (UINT_PTR, 4) + TEST_TYPE_UNSIGNED(UINT_PTR) +} + +static void test_pack_ULONG32(void) +{ + /* ULONG32 */ + TEST_TYPE_SIZE (ULONG32, 4) + TEST_TYPE_ALIGN (ULONG32, 4) + TEST_TYPE_UNSIGNED(ULONG32) +} + +static void test_pack_ULONG64(void) +{ + /* ULONG64 */ + TEST_TYPE_SIZE (ULONG64, 8) + TEST_TYPE_ALIGN (ULONG64, 8) + TEST_TYPE_UNSIGNED(ULONG64) +} + +static void test_pack_ULONG_PTR(void) +{ + /* ULONG_PTR */ + TEST_TYPE_SIZE (ULONG_PTR, 4) + TEST_TYPE_ALIGN (ULONG_PTR, 4) + TEST_TYPE_UNSIGNED(ULONG_PTR) +} + +static void test_pack_ACCESS_ALLOWED_ACE(void) +{ + /* ACCESS_ALLOWED_ACE */ + TEST_TYPE_SIZE (ACCESS_ALLOWED_ACE, 12) + TEST_TYPE_ALIGN (ACCESS_ALLOWED_ACE, 4) + TEST_FIELD_SIZE (ACCESS_ALLOWED_ACE, Header, 4) + TEST_FIELD_ALIGN (ACCESS_ALLOWED_ACE, Header, 2) + TEST_FIELD_OFFSET(ACCESS_ALLOWED_ACE, Header, 0) + TEST_FIELD_SIZE (ACCESS_ALLOWED_ACE, Mask, 4) + TEST_FIELD_ALIGN (ACCESS_ALLOWED_ACE, Mask, 4) + TEST_FIELD_OFFSET(ACCESS_ALLOWED_ACE, Mask, 4) + TEST_FIELD_SIZE (ACCESS_ALLOWED_ACE, SidStart, 4) + TEST_FIELD_ALIGN (ACCESS_ALLOWED_ACE, SidStart, 4) + TEST_FIELD_OFFSET(ACCESS_ALLOWED_ACE, SidStart, 8) +} + +static void test_pack_ACCESS_DENIED_ACE(void) +{ + /* ACCESS_DENIED_ACE */ + TEST_TYPE_SIZE (ACCESS_DENIED_ACE, 12) + TEST_TYPE_ALIGN (ACCESS_DENIED_ACE, 4) + TEST_FIELD_SIZE (ACCESS_DENIED_ACE, Header, 4) + TEST_FIELD_ALIGN (ACCESS_DENIED_ACE, Header, 2) + TEST_FIELD_OFFSET(ACCESS_DENIED_ACE, Header, 0) + TEST_FIELD_SIZE (ACCESS_DENIED_ACE, Mask, 4) + TEST_FIELD_ALIGN (ACCESS_DENIED_ACE, Mask, 4) + TEST_FIELD_OFFSET(ACCESS_DENIED_ACE, Mask, 4) + TEST_FIELD_SIZE (ACCESS_DENIED_ACE, SidStart, 4) + TEST_FIELD_ALIGN (ACCESS_DENIED_ACE, SidStart, 4) + TEST_FIELD_OFFSET(ACCESS_DENIED_ACE, SidStart, 8) +} + +static void test_pack_ACCESS_MASK(void) +{ + /* ACCESS_MASK */ + TEST_TYPE_SIZE (ACCESS_MASK, 4) + TEST_TYPE_ALIGN (ACCESS_MASK, 4) + TEST_TYPE_UNSIGNED(ACCESS_MASK) +} + +static void test_pack_ACE_HEADER(void) +{ + /* ACE_HEADER */ + TEST_TYPE_SIZE (ACE_HEADER, 4) + TEST_TYPE_ALIGN (ACE_HEADER, 2) + TEST_FIELD_SIZE (ACE_HEADER, AceType, 1) + TEST_FIELD_ALIGN (ACE_HEADER, AceType, 1) + TEST_FIELD_OFFSET(ACE_HEADER, AceType, 0) + TEST_FIELD_SIZE (ACE_HEADER, AceFlags, 1) + TEST_FIELD_ALIGN (ACE_HEADER, AceFlags, 1) + TEST_FIELD_OFFSET(ACE_HEADER, AceFlags, 1) + TEST_FIELD_SIZE (ACE_HEADER, AceSize, 2) + TEST_FIELD_ALIGN (ACE_HEADER, AceSize, 2) + TEST_FIELD_OFFSET(ACE_HEADER, AceSize, 2) +} + +static void test_pack_ACL(void) +{ + /* ACL */ + TEST_TYPE_SIZE (ACL, 8) + TEST_TYPE_ALIGN (ACL, 2) + TEST_FIELD_SIZE (ACL, AclRevision, 1) + TEST_FIELD_ALIGN (ACL, AclRevision, 1) + TEST_FIELD_OFFSET(ACL, AclRevision, 0) + TEST_FIELD_SIZE (ACL, Sbz1, 1) + TEST_FIELD_ALIGN (ACL, Sbz1, 1) + TEST_FIELD_OFFSET(ACL, Sbz1, 1) + TEST_FIELD_SIZE (ACL, AclSize, 2) + TEST_FIELD_ALIGN (ACL, AclSize, 2) + TEST_FIELD_OFFSET(ACL, AclSize, 2) + TEST_FIELD_SIZE (ACL, AceCount, 2) + TEST_FIELD_ALIGN (ACL, AceCount, 2) + TEST_FIELD_OFFSET(ACL, AceCount, 4) + TEST_FIELD_SIZE (ACL, Sbz2, 2) + TEST_FIELD_ALIGN (ACL, Sbz2, 2) + TEST_FIELD_OFFSET(ACL, Sbz2, 6) +} + +static void test_pack_ACL_REVISION_INFORMATION(void) +{ + /* ACL_REVISION_INFORMATION */ + TEST_TYPE_SIZE (ACL_REVISION_INFORMATION, 4) + TEST_TYPE_ALIGN (ACL_REVISION_INFORMATION, 4) + TEST_FIELD_SIZE (ACL_REVISION_INFORMATION, AclRevision, 4) + TEST_FIELD_ALIGN (ACL_REVISION_INFORMATION, AclRevision, 4) + TEST_FIELD_OFFSET(ACL_REVISION_INFORMATION, AclRevision, 0) +} + +static void test_pack_ACL_SIZE_INFORMATION(void) +{ + /* ACL_SIZE_INFORMATION */ + TEST_TYPE_SIZE (ACL_SIZE_INFORMATION, 12) + TEST_TYPE_ALIGN (ACL_SIZE_INFORMATION, 4) + TEST_FIELD_SIZE (ACL_SIZE_INFORMATION, AceCount, 4) + TEST_FIELD_ALIGN (ACL_SIZE_INFORMATION, AceCount, 4) + TEST_FIELD_OFFSET(ACL_SIZE_INFORMATION, AceCount, 0) + TEST_FIELD_SIZE (ACL_SIZE_INFORMATION, AclBytesInUse, 4) + TEST_FIELD_ALIGN (ACL_SIZE_INFORMATION, AclBytesInUse, 4) + TEST_FIELD_OFFSET(ACL_SIZE_INFORMATION, AclBytesInUse, 4) + TEST_FIELD_SIZE (ACL_SIZE_INFORMATION, AclBytesFree, 4) + TEST_FIELD_ALIGN (ACL_SIZE_INFORMATION, AclBytesFree, 4) + TEST_FIELD_OFFSET(ACL_SIZE_INFORMATION, AclBytesFree, 8) +} + +static void test_pack_BOOLEAN(void) +{ + /* BOOLEAN */ + TEST_TYPE_SIZE (BOOLEAN, 1) + TEST_TYPE_ALIGN (BOOLEAN, 1) + TEST_TYPE_UNSIGNED(BOOLEAN) +} + +static void test_pack_CCHAR(void) +{ + /* CCHAR */ + TEST_TYPE_SIZE (CCHAR, 1) + TEST_TYPE_ALIGN (CCHAR, 1) + TEST_TYPE_SIGNED(CCHAR) +} + +static void test_pack_CHAR(void) +{ + /* CHAR */ + TEST_TYPE_SIZE (CHAR, 1) + TEST_TYPE_ALIGN (CHAR, 1) + TEST_TYPE_SIGNED(CHAR) +} + +static void test_pack_DWORDLONG(void) +{ + /* DWORDLONG */ + TEST_TYPE_SIZE (DWORDLONG, 8) + TEST_TYPE_ALIGN (DWORDLONG, 8) + TEST_TYPE_UNSIGNED(DWORDLONG) +} + +static void test_pack_EXCEPTION_POINTERS(void) +{ + /* EXCEPTION_POINTERS */ + TEST_TYPE_SIZE (EXCEPTION_POINTERS, 8) + TEST_TYPE_ALIGN (EXCEPTION_POINTERS, 4) + TEST_FIELD_SIZE (EXCEPTION_POINTERS, ExceptionRecord, 4) + TEST_FIELD_ALIGN (EXCEPTION_POINTERS, ExceptionRecord, 4) + TEST_FIELD_OFFSET(EXCEPTION_POINTERS, ExceptionRecord, 0) + TEST_FIELD_SIZE (EXCEPTION_POINTERS, ContextRecord, 4) + TEST_FIELD_ALIGN (EXCEPTION_POINTERS, ContextRecord, 4) + TEST_FIELD_OFFSET(EXCEPTION_POINTERS, ContextRecord, 4) +} + +static void test_pack_EXCEPTION_RECORD(void) +{ + /* EXCEPTION_RECORD */ + TEST_TYPE_SIZE (EXCEPTION_RECORD, 80) + TEST_TYPE_ALIGN (EXCEPTION_RECORD, 4) + TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionCode, 4) + TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionCode, 4) + TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionCode, 0) + TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionFlags, 4) + TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionFlags, 4) + TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionFlags, 4) + TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionRecord, 4) + TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionRecord, 4) + TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionRecord, 8) + TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionAddress, 4) + TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionAddress, 4) + TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionAddress, 12) + TEST_FIELD_SIZE (EXCEPTION_RECORD, NumberParameters, 4) + TEST_FIELD_ALIGN (EXCEPTION_RECORD, NumberParameters, 4) + TEST_FIELD_OFFSET(EXCEPTION_RECORD, NumberParameters, 16) + TEST_FIELD_SIZE (EXCEPTION_RECORD, ExceptionInformation, 60) + TEST_FIELD_ALIGN (EXCEPTION_RECORD, ExceptionInformation, 4) + TEST_FIELD_OFFSET(EXCEPTION_RECORD, ExceptionInformation, 20) +} + +static void test_pack_EXECUTION_STATE(void) +{ + /* EXECUTION_STATE */ + TEST_TYPE_SIZE (EXECUTION_STATE, 4) + TEST_TYPE_ALIGN (EXECUTION_STATE, 4) + TEST_TYPE_UNSIGNED(EXECUTION_STATE) +} + +static void test_pack_FLOATING_SAVE_AREA(void) +{ + /* FLOATING_SAVE_AREA */ + TEST_TYPE_SIZE (FLOATING_SAVE_AREA, 112) + TEST_TYPE_ALIGN (FLOATING_SAVE_AREA, 4) + TEST_FIELD_SIZE (FLOATING_SAVE_AREA, ControlWord, 4) + TEST_FIELD_ALIGN (FLOATING_SAVE_AREA, ControlWord, 4) + TEST_FIELD_OFFSET(FLOATING_SAVE_AREA, ControlWord, 0) + TEST_FIELD_SIZE (FLOATING_SAVE_AREA, StatusWord, 4) + TEST_FIELD_ALIGN (FLOATING_SAVE_AREA, StatusWord, 4) + TEST_FIELD_OFFSET(FLOATING_SAVE_AREA, StatusWord, 4) + TEST_FIELD_SIZE (FLOATING_SAVE_AREA, TagWord, 4) + TEST_FIELD_ALIGN (FLOATING_SAVE_AREA, TagWord, 4) + TEST_FIELD_OFFSET(FLOATING_SAVE_AREA, TagWord, 8) + TEST_FIELD_SIZE (FLOATING_SAVE_AREA, ErrorOffset, 4) + TEST_FIELD_ALIGN (FLOATING_SAVE_AREA, ErrorOffset, 4) + TEST_FIELD_OFFSET(FLOATING_SAVE_AREA, ErrorOffset, 12) + TEST_FIELD_SIZE (FLOATING_SAVE_AREA, ErrorSelector, 4) + TEST_FIELD_ALIGN (FLOATING_SAVE_AREA, ErrorSelector, 4) + TEST_FIELD_OFFSET(FLOATING_SAVE_AREA, ErrorSelector, 16) + TEST_FIELD_SIZE (FLOATING_SAVE_AREA, DataOffset, 4) + TEST_FIELD_ALIGN (FLOATING_SAVE_AREA, DataOffset, 4) + TEST_FIELD_OFFSET(FLOATING_SAVE_AREA, DataOffset, 20) + TEST_FIELD_SIZE (FLOATING_SAVE_AREA, DataSelector, 4) + TEST_FIELD_ALIGN (FLOATING_SAVE_AREA, DataSelector, 4) + TEST_FIELD_OFFSET(FLOATING_SAVE_AREA, DataSelector, 24) + TEST_FIELD_SIZE (FLOATING_SAVE_AREA, RegisterArea, 80) + TEST_FIELD_ALIGN (FLOATING_SAVE_AREA, RegisterArea, 1) + TEST_FIELD_OFFSET(FLOATING_SAVE_AREA, RegisterArea, 28) + TEST_FIELD_SIZE (FLOATING_SAVE_AREA, Cr0NpxState, 4) + TEST_FIELD_ALIGN (FLOATING_SAVE_AREA, Cr0NpxState, 4) + TEST_FIELD_OFFSET(FLOATING_SAVE_AREA, Cr0NpxState, 108) +} + +static void test_pack_FPO_DATA(void) +{ + /* FPO_DATA */ + TEST_TYPE_SIZE (FPO_DATA, 16) + TEST_TYPE_ALIGN (FPO_DATA, 4) + TEST_FIELD_SIZE (FPO_DATA, ulOffStart, 4) + TEST_FIELD_ALIGN (FPO_DATA, ulOffStart, 4) + TEST_FIELD_OFFSET(FPO_DATA, ulOffStart, 0) + TEST_FIELD_SIZE (FPO_DATA, cbProcSize, 4) + TEST_FIELD_ALIGN (FPO_DATA, cbProcSize, 4) + TEST_FIELD_OFFSET(FPO_DATA, cbProcSize, 4) + TEST_FIELD_SIZE (FPO_DATA, cdwLocals, 4) + TEST_FIELD_ALIGN (FPO_DATA, cdwLocals, 4) + TEST_FIELD_OFFSET(FPO_DATA, cdwLocals, 8) + TEST_FIELD_SIZE (FPO_DATA, cdwParams, 2) + TEST_FIELD_ALIGN (FPO_DATA, cdwParams, 2) + TEST_FIELD_OFFSET(FPO_DATA, cdwParams, 12) +} + +static void test_pack_GENERIC_MAPPING(void) +{ + /* GENERIC_MAPPING */ + TEST_TYPE_SIZE (GENERIC_MAPPING, 16) + TEST_TYPE_ALIGN (GENERIC_MAPPING, 4) + TEST_FIELD_SIZE (GENERIC_MAPPING, GenericRead, 4) + TEST_FIELD_ALIGN (GENERIC_MAPPING, GenericRead, 4) + TEST_FIELD_OFFSET(GENERIC_MAPPING, GenericRead, 0) + TEST_FIELD_SIZE (GENERIC_MAPPING, GenericWrite, 4) + TEST_FIELD_ALIGN (GENERIC_MAPPING, GenericWrite, 4) + TEST_FIELD_OFFSET(GENERIC_MAPPING, GenericWrite, 4) + TEST_FIELD_SIZE (GENERIC_MAPPING, GenericExecute, 4) + TEST_FIELD_ALIGN (GENERIC_MAPPING, GenericExecute, 4) + TEST_FIELD_OFFSET(GENERIC_MAPPING, GenericExecute, 8) + TEST_FIELD_SIZE (GENERIC_MAPPING, GenericAll, 4) + TEST_FIELD_ALIGN (GENERIC_MAPPING, GenericAll, 4) + TEST_FIELD_OFFSET(GENERIC_MAPPING, GenericAll, 12) +} + +static void test_pack_HANDLE(void) +{ + /* HANDLE */ + TEST_TYPE_SIZE (HANDLE, 4) + TEST_TYPE_ALIGN (HANDLE, 4) +} + +static void test_pack_HRESULT(void) +{ + /* HRESULT */ + TEST_TYPE_SIZE (HRESULT, 4) + TEST_TYPE_ALIGN (HRESULT, 4) +} + +static void test_pack_IMAGE_ARCHIVE_MEMBER_HEADER(void) +{ + /* IMAGE_ARCHIVE_MEMBER_HEADER */ + TEST_TYPE_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, 60) + TEST_TYPE_ALIGN (IMAGE_ARCHIVE_MEMBER_HEADER, 1) + TEST_FIELD_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, Name, 16) + TEST_FIELD_ALIGN (IMAGE_ARCHIVE_MEMBER_HEADER, Name, 1) + TEST_FIELD_OFFSET(IMAGE_ARCHIVE_MEMBER_HEADER, Name, 0) + TEST_FIELD_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, Date, 12) + TEST_FIELD_ALIGN (IMAGE_ARCHIVE_MEMBER_HEADER, Date, 1) + TEST_FIELD_OFFSET(IMAGE_ARCHIVE_MEMBER_HEADER, Date, 16) + TEST_FIELD_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, UserID, 6) + TEST_FIELD_ALIGN (IMAGE_ARCHIVE_MEMBER_HEADER, UserID, 1) + TEST_FIELD_OFFSET(IMAGE_ARCHIVE_MEMBER_HEADER, UserID, 28) + TEST_FIELD_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, GroupID, 6) + TEST_FIELD_ALIGN (IMAGE_ARCHIVE_MEMBER_HEADER, GroupID, 1) + TEST_FIELD_OFFSET(IMAGE_ARCHIVE_MEMBER_HEADER, GroupID, 34) + TEST_FIELD_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, Mode, 8) + TEST_FIELD_ALIGN (IMAGE_ARCHIVE_MEMBER_HEADER, Mode, 1) + TEST_FIELD_OFFSET(IMAGE_ARCHIVE_MEMBER_HEADER, Mode, 40) + TEST_FIELD_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, Size, 10) + TEST_FIELD_ALIGN (IMAGE_ARCHIVE_MEMBER_HEADER, Size, 1) + TEST_FIELD_OFFSET(IMAGE_ARCHIVE_MEMBER_HEADER, Size, 48) + TEST_FIELD_SIZE (IMAGE_ARCHIVE_MEMBER_HEADER, EndHeader, 2) + TEST_FIELD_ALIGN (IMAGE_ARCHIVE_MEMBER_HEADER, EndHeader, 1) + TEST_FIELD_OFFSET(IMAGE_ARCHIVE_MEMBER_HEADER, EndHeader, 58) +} + +static void test_pack_IMAGE_AUX_SYMBOL(void) +{ + /* IMAGE_AUX_SYMBOL (pack 2) */ +} + +static void test_pack_IMAGE_BASE_RELOCATION(void) +{ + /* IMAGE_BASE_RELOCATION */ + TEST_TYPE_SIZE (IMAGE_BASE_RELOCATION, 8) + TEST_TYPE_ALIGN (IMAGE_BASE_RELOCATION, 4) + TEST_FIELD_SIZE (IMAGE_BASE_RELOCATION, VirtualAddress, 4) + TEST_FIELD_ALIGN (IMAGE_BASE_RELOCATION, VirtualAddress, 4) + TEST_FIELD_OFFSET(IMAGE_BASE_RELOCATION, VirtualAddress, 0) + TEST_FIELD_SIZE (IMAGE_BASE_RELOCATION, SizeOfBlock, 4) + TEST_FIELD_ALIGN (IMAGE_BASE_RELOCATION, SizeOfBlock, 4) + TEST_FIELD_OFFSET(IMAGE_BASE_RELOCATION, SizeOfBlock, 4) +} + +static void test_pack_IMAGE_BOUND_FORWARDER_REF(void) +{ + /* IMAGE_BOUND_FORWARDER_REF */ + TEST_TYPE_SIZE (IMAGE_BOUND_FORWARDER_REF, 8) + TEST_TYPE_ALIGN (IMAGE_BOUND_FORWARDER_REF, 4) + TEST_FIELD_SIZE (IMAGE_BOUND_FORWARDER_REF, TimeDateStamp, 4) + TEST_FIELD_ALIGN (IMAGE_BOUND_FORWARDER_REF, TimeDateStamp, 4) + TEST_FIELD_OFFSET(IMAGE_BOUND_FORWARDER_REF, TimeDateStamp, 0) + TEST_FIELD_SIZE (IMAGE_BOUND_FORWARDER_REF, OffsetModuleName, 2) + TEST_FIELD_ALIGN (IMAGE_BOUND_FORWARDER_REF, OffsetModuleName, 2) + TEST_FIELD_OFFSET(IMAGE_BOUND_FORWARDER_REF, OffsetModuleName, 4) + TEST_FIELD_SIZE (IMAGE_BOUND_FORWARDER_REF, Reserved, 2) + TEST_FIELD_ALIGN (IMAGE_BOUND_FORWARDER_REF, Reserved, 2) + TEST_FIELD_OFFSET(IMAGE_BOUND_FORWARDER_REF, Reserved, 6) +} + +static void test_pack_IMAGE_BOUND_IMPORT_DESCRIPTOR(void) +{ + /* IMAGE_BOUND_IMPORT_DESCRIPTOR */ + TEST_TYPE_SIZE (IMAGE_BOUND_IMPORT_DESCRIPTOR, 8) + TEST_TYPE_ALIGN (IMAGE_BOUND_IMPORT_DESCRIPTOR, 4) + TEST_FIELD_SIZE (IMAGE_BOUND_IMPORT_DESCRIPTOR, TimeDateStamp, 4) + TEST_FIELD_ALIGN (IMAGE_BOUND_IMPORT_DESCRIPTOR, TimeDateStamp, 4) + TEST_FIELD_OFFSET(IMAGE_BOUND_IMPORT_DESCRIPTOR, TimeDateStamp, 0) + TEST_FIELD_SIZE (IMAGE_BOUND_IMPORT_DESCRIPTOR, OffsetModuleName, 2) + TEST_FIELD_ALIGN (IMAGE_BOUND_IMPORT_DESCRIPTOR, OffsetModuleName, 2) + TEST_FIELD_OFFSET(IMAGE_BOUND_IMPORT_DESCRIPTOR, OffsetModuleName, 4) + TEST_FIELD_SIZE (IMAGE_BOUND_IMPORT_DESCRIPTOR, NumberOfModuleForwarderRefs, 2) + TEST_FIELD_ALIGN (IMAGE_BOUND_IMPORT_DESCRIPTOR, NumberOfModuleForwarderRefs, 2) + TEST_FIELD_OFFSET(IMAGE_BOUND_IMPORT_DESCRIPTOR, NumberOfModuleForwarderRefs, 6) +} + +static void test_pack_IMAGE_COFF_SYMBOLS_HEADER(void) +{ + /* IMAGE_COFF_SYMBOLS_HEADER */ + TEST_TYPE_SIZE (IMAGE_COFF_SYMBOLS_HEADER, 32) + TEST_TYPE_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, 4) + TEST_FIELD_SIZE (IMAGE_COFF_SYMBOLS_HEADER, NumberOfSymbols, 4) + TEST_FIELD_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, NumberOfSymbols, 4) + TEST_FIELD_OFFSET(IMAGE_COFF_SYMBOLS_HEADER, NumberOfSymbols, 0) + TEST_FIELD_SIZE (IMAGE_COFF_SYMBOLS_HEADER, LvaToFirstSymbol, 4) + TEST_FIELD_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, LvaToFirstSymbol, 4) + TEST_FIELD_OFFSET(IMAGE_COFF_SYMBOLS_HEADER, LvaToFirstSymbol, 4) + TEST_FIELD_SIZE (IMAGE_COFF_SYMBOLS_HEADER, NumberOfLinenumbers, 4) + TEST_FIELD_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, NumberOfLinenumbers, 4) + TEST_FIELD_OFFSET(IMAGE_COFF_SYMBOLS_HEADER, NumberOfLinenumbers, 8) + TEST_FIELD_SIZE (IMAGE_COFF_SYMBOLS_HEADER, LvaToFirstLinenumber, 4) + TEST_FIELD_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, LvaToFirstLinenumber, 4) + TEST_FIELD_OFFSET(IMAGE_COFF_SYMBOLS_HEADER, LvaToFirstLinenumber, 12) + TEST_FIELD_SIZE (IMAGE_COFF_SYMBOLS_HEADER, RvaToFirstByteOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, RvaToFirstByteOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_COFF_SYMBOLS_HEADER, RvaToFirstByteOfCode, 16) + TEST_FIELD_SIZE (IMAGE_COFF_SYMBOLS_HEADER, RvaToLastByteOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, RvaToLastByteOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_COFF_SYMBOLS_HEADER, RvaToLastByteOfCode, 20) + TEST_FIELD_SIZE (IMAGE_COFF_SYMBOLS_HEADER, RvaToFirstByteOfData, 4) + TEST_FIELD_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, RvaToFirstByteOfData, 4) + TEST_FIELD_OFFSET(IMAGE_COFF_SYMBOLS_HEADER, RvaToFirstByteOfData, 24) + TEST_FIELD_SIZE (IMAGE_COFF_SYMBOLS_HEADER, RvaToLastByteOfData, 4) + TEST_FIELD_ALIGN (IMAGE_COFF_SYMBOLS_HEADER, RvaToLastByteOfData, 4) + TEST_FIELD_OFFSET(IMAGE_COFF_SYMBOLS_HEADER, RvaToLastByteOfData, 28) +} + +static void test_pack_IMAGE_DATA_DIRECTORY(void) +{ + /* IMAGE_DATA_DIRECTORY */ + TEST_TYPE_SIZE (IMAGE_DATA_DIRECTORY, 8) + TEST_TYPE_ALIGN (IMAGE_DATA_DIRECTORY, 4) + TEST_FIELD_SIZE (IMAGE_DATA_DIRECTORY, VirtualAddress, 4) + TEST_FIELD_ALIGN (IMAGE_DATA_DIRECTORY, VirtualAddress, 4) + TEST_FIELD_OFFSET(IMAGE_DATA_DIRECTORY, VirtualAddress, 0) + TEST_FIELD_SIZE (IMAGE_DATA_DIRECTORY, Size, 4) + TEST_FIELD_ALIGN (IMAGE_DATA_DIRECTORY, Size, 4) + TEST_FIELD_OFFSET(IMAGE_DATA_DIRECTORY, Size, 4) +} + +static void test_pack_IMAGE_DEBUG_DIRECTORY(void) +{ + /* IMAGE_DEBUG_DIRECTORY */ + TEST_TYPE_SIZE (IMAGE_DEBUG_DIRECTORY, 28) + TEST_TYPE_ALIGN (IMAGE_DEBUG_DIRECTORY, 4) + TEST_FIELD_SIZE (IMAGE_DEBUG_DIRECTORY, Characteristics, 4) + TEST_FIELD_ALIGN (IMAGE_DEBUG_DIRECTORY, Characteristics, 4) + TEST_FIELD_OFFSET(IMAGE_DEBUG_DIRECTORY, Characteristics, 0) + TEST_FIELD_SIZE (IMAGE_DEBUG_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_ALIGN (IMAGE_DEBUG_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_OFFSET(IMAGE_DEBUG_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_SIZE (IMAGE_DEBUG_DIRECTORY, MajorVersion, 2) + TEST_FIELD_ALIGN (IMAGE_DEBUG_DIRECTORY, MajorVersion, 2) + TEST_FIELD_OFFSET(IMAGE_DEBUG_DIRECTORY, MajorVersion, 8) + TEST_FIELD_SIZE (IMAGE_DEBUG_DIRECTORY, MinorVersion, 2) + TEST_FIELD_ALIGN (IMAGE_DEBUG_DIRECTORY, MinorVersion, 2) + TEST_FIELD_OFFSET(IMAGE_DEBUG_DIRECTORY, MinorVersion, 10) + TEST_FIELD_SIZE (IMAGE_DEBUG_DIRECTORY, Type, 4) + TEST_FIELD_ALIGN (IMAGE_DEBUG_DIRECTORY, Type, 4) + TEST_FIELD_OFFSET(IMAGE_DEBUG_DIRECTORY, Type, 12) + TEST_FIELD_SIZE (IMAGE_DEBUG_DIRECTORY, SizeOfData, 4) + TEST_FIELD_ALIGN (IMAGE_DEBUG_DIRECTORY, SizeOfData, 4) + TEST_FIELD_OFFSET(IMAGE_DEBUG_DIRECTORY, SizeOfData, 16) + TEST_FIELD_SIZE (IMAGE_DEBUG_DIRECTORY, AddressOfRawData, 4) + TEST_FIELD_ALIGN (IMAGE_DEBUG_DIRECTORY, AddressOfRawData, 4) + TEST_FIELD_OFFSET(IMAGE_DEBUG_DIRECTORY, AddressOfRawData, 20) + TEST_FIELD_SIZE (IMAGE_DEBUG_DIRECTORY, PointerToRawData, 4) + TEST_FIELD_ALIGN (IMAGE_DEBUG_DIRECTORY, PointerToRawData, 4) + TEST_FIELD_OFFSET(IMAGE_DEBUG_DIRECTORY, PointerToRawData, 24) +} + +static void test_pack_IMAGE_DEBUG_MISC(void) +{ + /* IMAGE_DEBUG_MISC */ + TEST_TYPE_SIZE (IMAGE_DEBUG_MISC, 16) + TEST_TYPE_ALIGN (IMAGE_DEBUG_MISC, 4) + TEST_FIELD_SIZE (IMAGE_DEBUG_MISC, DataType, 4) + TEST_FIELD_ALIGN (IMAGE_DEBUG_MISC, DataType, 4) + TEST_FIELD_OFFSET(IMAGE_DEBUG_MISC, DataType, 0) + TEST_FIELD_SIZE (IMAGE_DEBUG_MISC, Length, 4) + TEST_FIELD_ALIGN (IMAGE_DEBUG_MISC, Length, 4) + TEST_FIELD_OFFSET(IMAGE_DEBUG_MISC, Length, 4) + TEST_FIELD_SIZE (IMAGE_DEBUG_MISC, Unicode, 1) + TEST_FIELD_ALIGN (IMAGE_DEBUG_MISC, Unicode, 1) + TEST_FIELD_OFFSET(IMAGE_DEBUG_MISC, Unicode, 8) + TEST_FIELD_SIZE (IMAGE_DEBUG_MISC, Reserved, 3) + TEST_FIELD_ALIGN (IMAGE_DEBUG_MISC, Reserved, 1) + TEST_FIELD_OFFSET(IMAGE_DEBUG_MISC, Reserved, 9) + TEST_FIELD_SIZE (IMAGE_DEBUG_MISC, Data, 1) + TEST_FIELD_ALIGN (IMAGE_DEBUG_MISC, Data, 1) + TEST_FIELD_OFFSET(IMAGE_DEBUG_MISC, Data, 12) +} + +static void test_pack_IMAGE_DOS_HEADER(void) +{ + /* IMAGE_DOS_HEADER (pack 2) */ + TEST_TYPE_SIZE (IMAGE_DOS_HEADER, 64) + TEST_TYPE_ALIGN (IMAGE_DOS_HEADER, 2) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_magic, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_magic, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_magic, 0) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_cblp, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_cblp, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_cblp, 2) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_cp, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_cp, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_cp, 4) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_crlc, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_crlc, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_crlc, 6) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_cparhdr, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_cparhdr, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_cparhdr, 8) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_minalloc, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_minalloc, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_minalloc, 10) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_maxalloc, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_maxalloc, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_maxalloc, 12) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_ss, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_ss, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_ss, 14) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_sp, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_sp, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_sp, 16) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_csum, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_csum, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_csum, 18) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_ip, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_ip, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_ip, 20) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_cs, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_cs, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_cs, 22) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_lfarlc, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_lfarlc, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_lfarlc, 24) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_ovno, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_ovno, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_ovno, 26) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_res, 8) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_res, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_res, 28) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_oemid, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_oemid, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_oemid, 36) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_oeminfo, 2) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_oeminfo, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_oeminfo, 38) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_res2, 20) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_res2, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_res2, 40) + TEST_FIELD_SIZE (IMAGE_DOS_HEADER, e_lfanew, 4) + TEST_FIELD_ALIGN (IMAGE_DOS_HEADER, e_lfanew, 2) + TEST_FIELD_OFFSET(IMAGE_DOS_HEADER, e_lfanew, 60) +} + +static void test_pack_IMAGE_EXPORT_DIRECTORY(void) +{ + /* IMAGE_EXPORT_DIRECTORY */ + TEST_TYPE_SIZE (IMAGE_EXPORT_DIRECTORY, 40) + TEST_TYPE_ALIGN (IMAGE_EXPORT_DIRECTORY, 4) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, Characteristics, 4) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, Characteristics, 4) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, Characteristics, 0) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, MajorVersion, 2) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, MajorVersion, 2) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, MajorVersion, 8) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, MinorVersion, 2) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, MinorVersion, 2) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, MinorVersion, 10) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, Name, 4) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, Name, 4) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, Name, 12) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, Base, 4) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, Base, 4) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, Base, 16) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, NumberOfFunctions, 4) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, NumberOfFunctions, 4) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, NumberOfFunctions, 20) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, NumberOfNames, 4) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, NumberOfNames, 4) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, NumberOfNames, 24) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, AddressOfFunctions, 4) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, AddressOfFunctions, 4) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, AddressOfFunctions, 28) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, AddressOfNames, 4) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, AddressOfNames, 4) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, AddressOfNames, 32) + TEST_FIELD_SIZE (IMAGE_EXPORT_DIRECTORY, AddressOfNameOrdinals, 4) + TEST_FIELD_ALIGN (IMAGE_EXPORT_DIRECTORY, AddressOfNameOrdinals, 4) + TEST_FIELD_OFFSET(IMAGE_EXPORT_DIRECTORY, AddressOfNameOrdinals, 36) +} + +static void test_pack_IMAGE_FILE_HEADER(void) +{ + /* IMAGE_FILE_HEADER */ + TEST_TYPE_SIZE (IMAGE_FILE_HEADER, 20) + TEST_TYPE_ALIGN (IMAGE_FILE_HEADER, 4) + TEST_FIELD_SIZE (IMAGE_FILE_HEADER, Machine, 2) + TEST_FIELD_ALIGN (IMAGE_FILE_HEADER, Machine, 2) + TEST_FIELD_OFFSET(IMAGE_FILE_HEADER, Machine, 0) + TEST_FIELD_SIZE (IMAGE_FILE_HEADER, NumberOfSections, 2) + TEST_FIELD_ALIGN (IMAGE_FILE_HEADER, NumberOfSections, 2) + TEST_FIELD_OFFSET(IMAGE_FILE_HEADER, NumberOfSections, 2) + TEST_FIELD_SIZE (IMAGE_FILE_HEADER, TimeDateStamp, 4) + TEST_FIELD_ALIGN (IMAGE_FILE_HEADER, TimeDateStamp, 4) + TEST_FIELD_OFFSET(IMAGE_FILE_HEADER, TimeDateStamp, 4) + TEST_FIELD_SIZE (IMAGE_FILE_HEADER, PointerToSymbolTable, 4) + TEST_FIELD_ALIGN (IMAGE_FILE_HEADER, PointerToSymbolTable, 4) + TEST_FIELD_OFFSET(IMAGE_FILE_HEADER, PointerToSymbolTable, 8) + TEST_FIELD_SIZE (IMAGE_FILE_HEADER, NumberOfSymbols, 4) + TEST_FIELD_ALIGN (IMAGE_FILE_HEADER, NumberOfSymbols, 4) + TEST_FIELD_OFFSET(IMAGE_FILE_HEADER, NumberOfSymbols, 12) + TEST_FIELD_SIZE (IMAGE_FILE_HEADER, SizeOfOptionalHeader, 2) + TEST_FIELD_ALIGN (IMAGE_FILE_HEADER, SizeOfOptionalHeader, 2) + TEST_FIELD_OFFSET(IMAGE_FILE_HEADER, SizeOfOptionalHeader, 16) + TEST_FIELD_SIZE (IMAGE_FILE_HEADER, Characteristics, 2) + TEST_FIELD_ALIGN (IMAGE_FILE_HEADER, Characteristics, 2) + TEST_FIELD_OFFSET(IMAGE_FILE_HEADER, Characteristics, 18) +} + +static void test_pack_IMAGE_FUNCTION_ENTRY(void) +{ + /* IMAGE_FUNCTION_ENTRY */ + TEST_TYPE_SIZE (IMAGE_FUNCTION_ENTRY, 12) + TEST_TYPE_ALIGN (IMAGE_FUNCTION_ENTRY, 4) + TEST_FIELD_SIZE (IMAGE_FUNCTION_ENTRY, StartingAddress, 4) + TEST_FIELD_ALIGN (IMAGE_FUNCTION_ENTRY, StartingAddress, 4) + TEST_FIELD_OFFSET(IMAGE_FUNCTION_ENTRY, StartingAddress, 0) + TEST_FIELD_SIZE (IMAGE_FUNCTION_ENTRY, EndingAddress, 4) + TEST_FIELD_ALIGN (IMAGE_FUNCTION_ENTRY, EndingAddress, 4) + TEST_FIELD_OFFSET(IMAGE_FUNCTION_ENTRY, EndingAddress, 4) + TEST_FIELD_SIZE (IMAGE_FUNCTION_ENTRY, EndOfPrologue, 4) + TEST_FIELD_ALIGN (IMAGE_FUNCTION_ENTRY, EndOfPrologue, 4) + TEST_FIELD_OFFSET(IMAGE_FUNCTION_ENTRY, EndOfPrologue, 8) +} + +static void test_pack_IMAGE_IMPORT_BY_NAME(void) +{ + /* IMAGE_IMPORT_BY_NAME */ + TEST_TYPE_SIZE (IMAGE_IMPORT_BY_NAME, 4) + TEST_TYPE_ALIGN (IMAGE_IMPORT_BY_NAME, 2) + TEST_FIELD_SIZE (IMAGE_IMPORT_BY_NAME, Hint, 2) + TEST_FIELD_ALIGN (IMAGE_IMPORT_BY_NAME, Hint, 2) + TEST_FIELD_OFFSET(IMAGE_IMPORT_BY_NAME, Hint, 0) + TEST_FIELD_SIZE (IMAGE_IMPORT_BY_NAME, Name, 1) + TEST_FIELD_ALIGN (IMAGE_IMPORT_BY_NAME, Name, 1) + TEST_FIELD_OFFSET(IMAGE_IMPORT_BY_NAME, Name, 2) +} + +static void test_pack_IMAGE_IMPORT_DESCRIPTOR(void) +{ + /* IMAGE_IMPORT_DESCRIPTOR */ +} + +static void test_pack_IMAGE_LINENUMBER(void) +{ + /* IMAGE_LINENUMBER (pack 2) */ +} + +static void test_pack_IMAGE_LOAD_CONFIG_DIRECTORY(void) +{ + /* IMAGE_LOAD_CONFIG_DIRECTORY */ + TEST_TYPE_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, 72) + TEST_TYPE_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, 4) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, Size, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, Size, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, Size, 0) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, MajorVersion, 2) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, MajorVersion, 2) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, MajorVersion, 8) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, MinorVersion, 2) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, MinorVersion, 2) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, MinorVersion, 10) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, GlobalFlagsClear, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, GlobalFlagsClear, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, GlobalFlagsClear, 12) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, GlobalFlagsSet, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, GlobalFlagsSet, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, GlobalFlagsSet, 16) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, CriticalSectionDefaultTimeout, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, CriticalSectionDefaultTimeout, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, CriticalSectionDefaultTimeout, 20) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, DeCommitFreeBlockThreshold, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, DeCommitFreeBlockThreshold, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, DeCommitFreeBlockThreshold, 24) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, DeCommitTotalFreeThreshold, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, DeCommitTotalFreeThreshold, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, DeCommitTotalFreeThreshold, 28) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, LockPrefixTable, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, LockPrefixTable, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, LockPrefixTable, 32) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, MaximumAllocationSize, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, MaximumAllocationSize, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, MaximumAllocationSize, 36) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, VirtualMemoryThreshold, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, VirtualMemoryThreshold, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, VirtualMemoryThreshold, 40) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, ProcessHeapFlags, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, ProcessHeapFlags, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, ProcessHeapFlags, 44) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, ProcessAffinityMask, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, ProcessAffinityMask, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, ProcessAffinityMask, 48) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, CSDVersion, 2) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, CSDVersion, 2) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, CSDVersion, 52) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, Reserved1, 2) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, Reserved1, 2) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, Reserved1, 54) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, EditList, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, EditList, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, EditList, 56) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, SecurityCookie, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, SecurityCookie, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, SecurityCookie, 60) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerTable, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerTable, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerTable, 64) + TEST_FIELD_SIZE (IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerCount, 4) + TEST_FIELD_ALIGN (IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerCount, 4) + TEST_FIELD_OFFSET(IMAGE_LOAD_CONFIG_DIRECTORY, SEHandlerCount, 68) +} + +static void test_pack_IMAGE_NT_HEADERS(void) +{ + /* IMAGE_NT_HEADERS */ + TEST_TYPE_SIZE (IMAGE_NT_HEADERS, 248) + TEST_TYPE_ALIGN (IMAGE_NT_HEADERS, 4) +} + +static void test_pack_IMAGE_NT_HEADERS32(void) +{ + /* IMAGE_NT_HEADERS32 */ + TEST_TYPE_SIZE (IMAGE_NT_HEADERS32, 248) + TEST_TYPE_ALIGN (IMAGE_NT_HEADERS32, 4) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS32, Signature, 4) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS32, Signature, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS32, Signature, 0) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS32, FileHeader, 20) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS32, FileHeader, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS32, FileHeader, 4) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS32, OptionalHeader, 224) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS32, OptionalHeader, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader, 24) +} + +static void test_pack_IMAGE_NT_HEADERS64(void) +{ + /* IMAGE_NT_HEADERS64 */ + TEST_TYPE_SIZE (IMAGE_NT_HEADERS64, 264) + TEST_TYPE_ALIGN (IMAGE_NT_HEADERS64, 8) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS64, Signature, 4) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS64, Signature, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS64, Signature, 0) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS64, FileHeader, 20) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS64, FileHeader, 4) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS64, FileHeader, 4) + TEST_FIELD_SIZE (IMAGE_NT_HEADERS64, OptionalHeader, 240) + TEST_FIELD_ALIGN (IMAGE_NT_HEADERS64, OptionalHeader, 8) + TEST_FIELD_OFFSET(IMAGE_NT_HEADERS64, OptionalHeader, 24) +} + +static void test_pack_IMAGE_OPTIONAL_HEADER(void) +{ + /* IMAGE_OPTIONAL_HEADER */ + TEST_TYPE_SIZE (IMAGE_OPTIONAL_HEADER, 224) + TEST_TYPE_ALIGN (IMAGE_OPTIONAL_HEADER, 4) +} + +static void test_pack_IMAGE_OPTIONAL_HEADER32(void) +{ + /* IMAGE_OPTIONAL_HEADER32 */ + TEST_TYPE_SIZE (IMAGE_OPTIONAL_HEADER32, 224) + TEST_TYPE_ALIGN (IMAGE_OPTIONAL_HEADER32, 4) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, Magic, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, Magic, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, Magic, 0) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MajorLinkerVersion, 1) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MajorLinkerVersion, 1) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MajorLinkerVersion, 2) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MinorLinkerVersion, 1) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MinorLinkerVersion, 1) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MinorLinkerVersion, 3) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfCode, 4) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfInitializedData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfInitializedData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfInitializedData, 8) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfUninitializedData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfUninitializedData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfUninitializedData, 12) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, AddressOfEntryPoint, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, AddressOfEntryPoint, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, AddressOfEntryPoint, 16) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, BaseOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, BaseOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, BaseOfCode, 20) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, BaseOfData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, BaseOfData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, BaseOfData, 24) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, ImageBase, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, ImageBase, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, ImageBase, 28) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SectionAlignment, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SectionAlignment, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SectionAlignment, 32) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, FileAlignment, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, FileAlignment, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, FileAlignment, 36) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MajorOperatingSystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MajorOperatingSystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MajorOperatingSystemVersion, 40) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MinorOperatingSystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MinorOperatingSystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MinorOperatingSystemVersion, 42) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MajorImageVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MajorImageVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MajorImageVersion, 44) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MinorImageVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MinorImageVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MinorImageVersion, 46) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MajorSubsystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MajorSubsystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MajorSubsystemVersion, 48) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, MinorSubsystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, MinorSubsystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, MinorSubsystemVersion, 50) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, Win32VersionValue, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, Win32VersionValue, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, Win32VersionValue, 52) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfImage, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfImage, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfImage, 56) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfHeaders, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfHeaders, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfHeaders, 60) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, CheckSum, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, CheckSum, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, CheckSum, 64) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, Subsystem, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, Subsystem, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, Subsystem, 68) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, DllCharacteristics, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, DllCharacteristics, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, DllCharacteristics, 70) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfStackReserve, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfStackReserve, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfStackReserve, 72) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfStackCommit, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfStackCommit, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfStackCommit, 76) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfHeapReserve, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfHeapReserve, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfHeapReserve, 80) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, SizeOfHeapCommit, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, SizeOfHeapCommit, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, SizeOfHeapCommit, 84) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, LoaderFlags, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, LoaderFlags, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, LoaderFlags, 88) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, NumberOfRvaAndSizes, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, NumberOfRvaAndSizes, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, NumberOfRvaAndSizes, 92) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER32, DataDirectory, 128) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER32, DataDirectory, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, DataDirectory, 96) +} + +static void test_pack_IMAGE_OPTIONAL_HEADER64(void) +{ + /* IMAGE_OPTIONAL_HEADER64 */ + TEST_TYPE_SIZE (IMAGE_OPTIONAL_HEADER64, 240) + TEST_TYPE_ALIGN (IMAGE_OPTIONAL_HEADER64, 8) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, Magic, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, Magic, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, Magic, 0) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MajorLinkerVersion, 1) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MajorLinkerVersion, 1) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MajorLinkerVersion, 2) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MinorLinkerVersion, 1) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MinorLinkerVersion, 1) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MinorLinkerVersion, 3) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfCode, 4) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfInitializedData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfInitializedData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfInitializedData, 8) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfUninitializedData, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfUninitializedData, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfUninitializedData, 12) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint, 16) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, BaseOfCode, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, BaseOfCode, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, BaseOfCode, 20) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, ImageBase, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, ImageBase, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, ImageBase, 24) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SectionAlignment, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SectionAlignment, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SectionAlignment, 32) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, FileAlignment, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, FileAlignment, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, FileAlignment, 36) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MajorOperatingSystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MajorOperatingSystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MajorOperatingSystemVersion, 40) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MinorOperatingSystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MinorOperatingSystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MinorOperatingSystemVersion, 42) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MajorImageVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MajorImageVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MajorImageVersion, 44) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MinorImageVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MinorImageVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MinorImageVersion, 46) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion, 48) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion, 50) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, Win32VersionValue, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, Win32VersionValue, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, Win32VersionValue, 52) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfImage, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfImage, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfImage, 56) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfHeaders, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfHeaders, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfHeaders, 60) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, CheckSum, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, CheckSum, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, CheckSum, 64) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, Subsystem, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, Subsystem, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, Subsystem, 68) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, DllCharacteristics, 2) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, DllCharacteristics, 2) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, DllCharacteristics, 70) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfStackReserve, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfStackReserve, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfStackReserve, 72) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfStackCommit, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfStackCommit, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfStackCommit, 80) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfHeapReserve, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfHeapReserve, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfHeapReserve, 88) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, SizeOfHeapCommit, 8) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, SizeOfHeapCommit, 8) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, SizeOfHeapCommit, 96) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, LoaderFlags, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, LoaderFlags, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, LoaderFlags, 104) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, NumberOfRvaAndSizes, 4) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, NumberOfRvaAndSizes, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, NumberOfRvaAndSizes, 108) + TEST_FIELD_SIZE (IMAGE_OPTIONAL_HEADER64, DataDirectory, 128) + TEST_FIELD_ALIGN (IMAGE_OPTIONAL_HEADER64, DataDirectory, 4) + TEST_FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, DataDirectory, 112) +} + +static void test_pack_IMAGE_OS2_HEADER(void) +{ + /* IMAGE_OS2_HEADER (pack 2) */ + TEST_TYPE_SIZE (IMAGE_OS2_HEADER, 64) + TEST_TYPE_ALIGN (IMAGE_OS2_HEADER, 2) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_magic, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_magic, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_magic, 0) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_ver, 1) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_ver, 1) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_ver, 2) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_rev, 1) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_rev, 1) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_rev, 3) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_enttab, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_enttab, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_enttab, 4) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_cbenttab, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_cbenttab, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_cbenttab, 6) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_crc, 4) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_crc, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_crc, 8) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_flags, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_flags, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_flags, 12) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_autodata, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_autodata, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_autodata, 14) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_heap, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_heap, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_heap, 16) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_stack, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_stack, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_stack, 18) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_csip, 4) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_csip, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_csip, 20) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_sssp, 4) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_sssp, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_sssp, 24) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_cseg, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_cseg, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_cseg, 28) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_cmod, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_cmod, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_cmod, 30) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_cbnrestab, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_cbnrestab, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_cbnrestab, 32) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_segtab, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_segtab, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_segtab, 34) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_rsrctab, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_rsrctab, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_rsrctab, 36) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_restab, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_restab, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_restab, 38) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_modtab, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_modtab, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_modtab, 40) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_imptab, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_imptab, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_imptab, 42) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_nrestab, 4) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_nrestab, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_nrestab, 44) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_cmovent, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_cmovent, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_cmovent, 48) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_align, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_align, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_align, 50) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_cres, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_cres, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_cres, 52) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_exetyp, 1) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_exetyp, 1) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_exetyp, 54) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_flagsothers, 1) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_flagsothers, 1) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_flagsothers, 55) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_pretthunks, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_pretthunks, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_pretthunks, 56) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_psegrefbytes, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_psegrefbytes, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_psegrefbytes, 58) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_swaparea, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_swaparea, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_swaparea, 60) + TEST_FIELD_SIZE (IMAGE_OS2_HEADER, ne_expver, 2) + TEST_FIELD_ALIGN (IMAGE_OS2_HEADER, ne_expver, 2) + TEST_FIELD_OFFSET(IMAGE_OS2_HEADER, ne_expver, 62) +} + +static void test_pack_IMAGE_RELOCATION(void) +{ + /* IMAGE_RELOCATION (pack 2) */ +} + +static void test_pack_IMAGE_RESOURCE_DATA_ENTRY(void) +{ + /* IMAGE_RESOURCE_DATA_ENTRY */ + TEST_TYPE_SIZE (IMAGE_RESOURCE_DATA_ENTRY, 16) + TEST_TYPE_ALIGN (IMAGE_RESOURCE_DATA_ENTRY, 4) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DATA_ENTRY, OffsetToData, 4) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DATA_ENTRY, OffsetToData, 4) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DATA_ENTRY, OffsetToData, 0) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DATA_ENTRY, Size, 4) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DATA_ENTRY, Size, 4) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DATA_ENTRY, Size, 4) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DATA_ENTRY, CodePage, 4) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DATA_ENTRY, CodePage, 4) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DATA_ENTRY, CodePage, 8) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DATA_ENTRY, Reserved, 4) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DATA_ENTRY, Reserved, 4) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DATA_ENTRY, Reserved, 12) +} + +static void test_pack_IMAGE_RESOURCE_DIRECTORY(void) +{ + /* IMAGE_RESOURCE_DIRECTORY */ + TEST_TYPE_SIZE (IMAGE_RESOURCE_DIRECTORY, 16) + TEST_TYPE_ALIGN (IMAGE_RESOURCE_DIRECTORY, 4) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY, Characteristics, 4) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIRECTORY, Characteristics, 4) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIRECTORY, Characteristics, 0) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIRECTORY, TimeDateStamp, 4) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY, MajorVersion, 2) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIRECTORY, MajorVersion, 2) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIRECTORY, MajorVersion, 8) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY, MinorVersion, 2) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIRECTORY, MinorVersion, 2) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIRECTORY, MinorVersion, 10) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY, NumberOfNamedEntries, 2) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIRECTORY, NumberOfNamedEntries, 2) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIRECTORY, NumberOfNamedEntries, 12) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY, NumberOfIdEntries, 2) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIRECTORY, NumberOfIdEntries, 2) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIRECTORY, NumberOfIdEntries, 14) +} + +static void test_pack_IMAGE_RESOURCE_DIRECTORY_ENTRY(void) +{ + /* IMAGE_RESOURCE_DIRECTORY_ENTRY */ +} + +static void test_pack_IMAGE_RESOURCE_DIRECTORY_STRING(void) +{ + /* IMAGE_RESOURCE_DIRECTORY_STRING */ + TEST_TYPE_SIZE (IMAGE_RESOURCE_DIRECTORY_STRING, 4) + TEST_TYPE_ALIGN (IMAGE_RESOURCE_DIRECTORY_STRING, 2) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY_STRING, Length, 2) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIRECTORY_STRING, Length, 2) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIRECTORY_STRING, Length, 0) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIRECTORY_STRING, NameString, 1) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIRECTORY_STRING, NameString, 1) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIRECTORY_STRING, NameString, 2) +} + +static void test_pack_IMAGE_RESOURCE_DIR_STRING_U(void) +{ + /* IMAGE_RESOURCE_DIR_STRING_U */ + TEST_TYPE_SIZE (IMAGE_RESOURCE_DIR_STRING_U, 4) + TEST_TYPE_ALIGN (IMAGE_RESOURCE_DIR_STRING_U, 2) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIR_STRING_U, Length, 2) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIR_STRING_U, Length, 2) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIR_STRING_U, Length, 0) + TEST_FIELD_SIZE (IMAGE_RESOURCE_DIR_STRING_U, NameString, 2) + TEST_FIELD_ALIGN (IMAGE_RESOURCE_DIR_STRING_U, NameString, 2) + TEST_FIELD_OFFSET(IMAGE_RESOURCE_DIR_STRING_U, NameString, 2) +} + +static void test_pack_IMAGE_SECTION_HEADER(void) +{ + /* IMAGE_SECTION_HEADER */ + TEST_FIELD_SIZE (IMAGE_SECTION_HEADER, Name, 8) + TEST_FIELD_ALIGN (IMAGE_SECTION_HEADER, Name, 1) + TEST_FIELD_OFFSET(IMAGE_SECTION_HEADER, Name, 0) +} + +static void test_pack_IMAGE_SEPARATE_DEBUG_HEADER(void) +{ + /* IMAGE_SEPARATE_DEBUG_HEADER */ + TEST_TYPE_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, 48) + TEST_TYPE_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, 4) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, Signature, 2) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, Signature, 2) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, Signature, 0) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, Flags, 2) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, Flags, 2) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, Flags, 2) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, Machine, 2) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, Machine, 2) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, Machine, 4) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, Characteristics, 2) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, Characteristics, 2) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, Characteristics, 6) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, TimeDateStamp, 4) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, TimeDateStamp, 4) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, TimeDateStamp, 8) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, CheckSum, 4) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, CheckSum, 4) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, CheckSum, 12) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, ImageBase, 4) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, ImageBase, 4) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, ImageBase, 16) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, SizeOfImage, 4) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, SizeOfImage, 4) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, SizeOfImage, 20) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, NumberOfSections, 4) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, NumberOfSections, 4) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, NumberOfSections, 24) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, ExportedNamesSize, 4) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, ExportedNamesSize, 4) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, ExportedNamesSize, 28) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, DebugDirectorySize, 4) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, DebugDirectorySize, 4) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, DebugDirectorySize, 32) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, SectionAlignment, 4) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, SectionAlignment, 4) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, SectionAlignment, 36) + TEST_FIELD_SIZE (IMAGE_SEPARATE_DEBUG_HEADER, Reserved, 8) + TEST_FIELD_ALIGN (IMAGE_SEPARATE_DEBUG_HEADER, Reserved, 4) + TEST_FIELD_OFFSET(IMAGE_SEPARATE_DEBUG_HEADER, Reserved, 40) +} + +static void test_pack_IMAGE_SYMBOL(void) +{ + /* IMAGE_SYMBOL (pack 2) */ +} + +static void test_pack_IMAGE_THUNK_DATA(void) +{ + /* IMAGE_THUNK_DATA */ +} + +static void test_pack_IMAGE_TLS_DIRECTORY(void) +{ + /* IMAGE_TLS_DIRECTORY */ + TEST_TYPE_SIZE (IMAGE_TLS_DIRECTORY, 24) + TEST_TYPE_ALIGN (IMAGE_TLS_DIRECTORY, 4) +} + +static void test_pack_IMAGE_TLS_DIRECTORY32(void) +{ + /* IMAGE_TLS_DIRECTORY32 */ + TEST_TYPE_SIZE (IMAGE_TLS_DIRECTORY32, 24) + TEST_TYPE_ALIGN (IMAGE_TLS_DIRECTORY32, 4) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, StartAddressOfRawData, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, StartAddressOfRawData, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, StartAddressOfRawData, 0) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, EndAddressOfRawData, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, EndAddressOfRawData, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, EndAddressOfRawData, 4) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, AddressOfIndex, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, AddressOfIndex, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, AddressOfIndex, 8) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, AddressOfCallBacks, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, AddressOfCallBacks, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, AddressOfCallBacks, 12) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, SizeOfZeroFill, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, SizeOfZeroFill, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, SizeOfZeroFill, 16) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY32, Characteristics, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY32, Characteristics, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY32, Characteristics, 20) +} + +static void test_pack_IMAGE_TLS_DIRECTORY64(void) +{ + /* IMAGE_TLS_DIRECTORY64 */ + TEST_TYPE_SIZE (IMAGE_TLS_DIRECTORY64, 40) + TEST_TYPE_ALIGN (IMAGE_TLS_DIRECTORY64, 8) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, StartAddressOfRawData, 8) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, StartAddressOfRawData, 8) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, StartAddressOfRawData, 0) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, EndAddressOfRawData, 8) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, EndAddressOfRawData, 8) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, EndAddressOfRawData, 8) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, AddressOfIndex, 8) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, AddressOfIndex, 8) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, AddressOfIndex, 16) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, AddressOfCallBacks, 8) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, AddressOfCallBacks, 8) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, AddressOfCallBacks, 24) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, SizeOfZeroFill, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, SizeOfZeroFill, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, SizeOfZeroFill, 32) + TEST_FIELD_SIZE (IMAGE_TLS_DIRECTORY64, Characteristics, 4) + TEST_FIELD_ALIGN (IMAGE_TLS_DIRECTORY64, Characteristics, 4) + TEST_FIELD_OFFSET(IMAGE_TLS_DIRECTORY64, Characteristics, 36) +} + +static void test_pack_IMAGE_VXD_HEADER(void) +{ + /* IMAGE_VXD_HEADER (pack 2) */ + TEST_TYPE_SIZE (IMAGE_VXD_HEADER, 196) + TEST_TYPE_ALIGN (IMAGE_VXD_HEADER, 2) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_magic, 2) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_magic, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_magic, 0) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_border, 1) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_border, 1) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_border, 2) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_worder, 1) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_worder, 1) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_worder, 3) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_level, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_level, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_level, 4) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_cpu, 2) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_cpu, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_cpu, 8) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_os, 2) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_os, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_os, 10) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_ver, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_ver, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_ver, 12) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_mflags, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_mflags, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_mflags, 16) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_mpages, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_mpages, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_mpages, 20) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_startobj, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_startobj, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_startobj, 24) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_eip, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_eip, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_eip, 28) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_stackobj, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_stackobj, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_stackobj, 32) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_esp, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_esp, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_esp, 36) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_pagesize, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_pagesize, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_pagesize, 40) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_lastpagesize, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_lastpagesize, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_lastpagesize, 44) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_fixupsize, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_fixupsize, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_fixupsize, 48) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_fixupsum, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_fixupsum, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_fixupsum, 52) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_ldrsize, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_ldrsize, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_ldrsize, 56) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_ldrsum, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_ldrsum, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_ldrsum, 60) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_objtab, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_objtab, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_objtab, 64) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_objcnt, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_objcnt, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_objcnt, 68) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_objmap, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_objmap, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_objmap, 72) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_itermap, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_itermap, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_itermap, 76) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_rsrctab, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_rsrctab, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_rsrctab, 80) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_rsrccnt, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_rsrccnt, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_rsrccnt, 84) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_restab, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_restab, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_restab, 88) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_enttab, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_enttab, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_enttab, 92) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_dirtab, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_dirtab, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_dirtab, 96) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_dircnt, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_dircnt, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_dircnt, 100) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_fpagetab, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_fpagetab, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_fpagetab, 104) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_frectab, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_frectab, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_frectab, 108) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_impmod, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_impmod, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_impmod, 112) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_impmodcnt, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_impmodcnt, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_impmodcnt, 116) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_impproc, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_impproc, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_impproc, 120) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_pagesum, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_pagesum, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_pagesum, 124) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_datapage, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_datapage, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_datapage, 128) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_preload, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_preload, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_preload, 132) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_nrestab, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_nrestab, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_nrestab, 136) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_cbnrestab, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_cbnrestab, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_cbnrestab, 140) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_nressum, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_nressum, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_nressum, 144) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_autodata, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_autodata, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_autodata, 148) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_debuginfo, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_debuginfo, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_debuginfo, 152) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_debuglen, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_debuglen, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_debuglen, 156) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_instpreload, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_instpreload, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_instpreload, 160) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_instdemand, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_instdemand, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_instdemand, 164) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_heapsize, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_heapsize, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_heapsize, 168) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_res3, 12) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_res3, 1) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_res3, 172) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_winresoff, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_winresoff, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_winresoff, 184) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_winreslen, 4) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_winreslen, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_winreslen, 188) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_devid, 2) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_devid, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_devid, 192) + TEST_FIELD_SIZE (IMAGE_VXD_HEADER, e32_ddkver, 2) + TEST_FIELD_ALIGN (IMAGE_VXD_HEADER, e32_ddkver, 2) + TEST_FIELD_OFFSET(IMAGE_VXD_HEADER, e32_ddkver, 194) +} + +static void test_pack_IO_COUNTERS(void) +{ + /* IO_COUNTERS (pack 8) */ + TEST_TYPE_SIZE (IO_COUNTERS, 48) + TEST_TYPE_ALIGN (IO_COUNTERS, 8) + TEST_FIELD_SIZE (IO_COUNTERS, ReadOperationCount, 8) + TEST_FIELD_ALIGN (IO_COUNTERS, ReadOperationCount, 8) + TEST_FIELD_OFFSET(IO_COUNTERS, ReadOperationCount, 0) + TEST_FIELD_SIZE (IO_COUNTERS, WriteOperationCount, 8) + TEST_FIELD_ALIGN (IO_COUNTERS, WriteOperationCount, 8) + TEST_FIELD_OFFSET(IO_COUNTERS, WriteOperationCount, 8) + TEST_FIELD_SIZE (IO_COUNTERS, OtherOperationCount, 8) + TEST_FIELD_ALIGN (IO_COUNTERS, OtherOperationCount, 8) + TEST_FIELD_OFFSET(IO_COUNTERS, OtherOperationCount, 16) + TEST_FIELD_SIZE (IO_COUNTERS, ReadTransferCount, 8) + TEST_FIELD_ALIGN (IO_COUNTERS, ReadTransferCount, 8) + TEST_FIELD_OFFSET(IO_COUNTERS, ReadTransferCount, 24) + TEST_FIELD_SIZE (IO_COUNTERS, WriteTransferCount, 8) + TEST_FIELD_ALIGN (IO_COUNTERS, WriteTransferCount, 8) + TEST_FIELD_OFFSET(IO_COUNTERS, WriteTransferCount, 32) + TEST_FIELD_SIZE (IO_COUNTERS, OtherTransferCount, 8) + TEST_FIELD_ALIGN (IO_COUNTERS, OtherTransferCount, 8) + TEST_FIELD_OFFSET(IO_COUNTERS, OtherTransferCount, 40) +} + +static void test_pack_LANGID(void) +{ + /* LANGID */ + TEST_TYPE_SIZE (LANGID, 2) + TEST_TYPE_ALIGN (LANGID, 2) + TEST_TYPE_UNSIGNED(LANGID) +} + +static void test_pack_LARGE_INTEGER(void) +{ + /* LARGE_INTEGER */ +} + +static void test_pack_LCID(void) +{ + /* LCID */ + TEST_TYPE_SIZE (LCID, 4) + TEST_TYPE_ALIGN (LCID, 4) + TEST_TYPE_UNSIGNED(LCID) +} + +static void test_pack_LIST_ENTRY(void) +{ + /* LIST_ENTRY */ TEST_TYPE_SIZE (LIST_ENTRY, 8) TEST_TYPE_ALIGN (LIST_ENTRY, 4) TEST_FIELD_SIZE (LIST_ENTRY, Flink, 4) @@ -1441,7 +5128,7 @@ static void test_pack_LONGLONG(void) static void test_pack_LUID(void) { - /* LUID (pack 4) */ + /* LUID */ TEST_TYPE_SIZE (LUID, 8) TEST_TYPE_ALIGN (LUID, 4) TEST_FIELD_SIZE (LUID, LowPart, 4) @@ -1467,7 +5154,7 @@ static void test_pack_LUID_AND_ATTRIBUTES(void) static void test_pack_MEMORY_BASIC_INFORMATION(void) { - /* MEMORY_BASIC_INFORMATION (pack 4) */ + /* MEMORY_BASIC_INFORMATION */ TEST_TYPE_SIZE (MEMORY_BASIC_INFORMATION, 28) TEST_TYPE_ALIGN (MEMORY_BASIC_INFORMATION, 4) TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, BaseAddress, 4) @@ -1495,7 +5182,7 @@ static void test_pack_MEMORY_BASIC_INFORMATION(void) static void test_pack_MESSAGE_RESOURCE_BLOCK(void) { - /* MESSAGE_RESOURCE_BLOCK (pack 4) */ + /* MESSAGE_RESOURCE_BLOCK */ TEST_TYPE_SIZE (MESSAGE_RESOURCE_BLOCK, 12) TEST_TYPE_ALIGN (MESSAGE_RESOURCE_BLOCK, 4) TEST_FIELD_SIZE (MESSAGE_RESOURCE_BLOCK, LowId, 4) @@ -1511,7 +5198,7 @@ static void test_pack_MESSAGE_RESOURCE_BLOCK(void) static void test_pack_MESSAGE_RESOURCE_DATA(void) { - /* MESSAGE_RESOURCE_DATA (pack 4) */ + /* MESSAGE_RESOURCE_DATA */ TEST_TYPE_SIZE (MESSAGE_RESOURCE_DATA, 16) TEST_TYPE_ALIGN (MESSAGE_RESOURCE_DATA, 4) TEST_FIELD_SIZE (MESSAGE_RESOURCE_DATA, NumberOfBlocks, 4) @@ -1524,7 +5211,7 @@ static void test_pack_MESSAGE_RESOURCE_DATA(void) static void test_pack_MESSAGE_RESOURCE_ENTRY(void) { - /* MESSAGE_RESOURCE_ENTRY (pack 4) */ + /* MESSAGE_RESOURCE_ENTRY */ TEST_TYPE_SIZE (MESSAGE_RESOURCE_ENTRY, 6) TEST_TYPE_ALIGN (MESSAGE_RESOURCE_ENTRY, 2) TEST_FIELD_SIZE (MESSAGE_RESOURCE_ENTRY, Length, 2) @@ -1540,7 +5227,7 @@ static void test_pack_MESSAGE_RESOURCE_ENTRY(void) static void test_pack_NT_TIB(void) { - /* NT_TIB (pack 4) */ + /* NT_TIB */ TEST_FIELD_SIZE (NT_TIB, ExceptionList, 4) TEST_FIELD_ALIGN (NT_TIB, ExceptionList, 4) TEST_FIELD_OFFSET(NT_TIB, ExceptionList, 0) @@ -1557,7 +5244,7 @@ static void test_pack_NT_TIB(void) static void test_pack_OBJECT_TYPE_LIST(void) { - /* OBJECT_TYPE_LIST (pack 4) */ + /* OBJECT_TYPE_LIST */ TEST_TYPE_SIZE (OBJECT_TYPE_LIST, 8) TEST_TYPE_ALIGN (OBJECT_TYPE_LIST, 4) TEST_FIELD_SIZE (OBJECT_TYPE_LIST, Level, 2) @@ -1892,6 +5579,24 @@ static void test_pack_PIMAGE_NT_HEADERS(void) TEST_TYPE_ALIGN (PIMAGE_NT_HEADERS, 4) } +static void test_pack_PIMAGE_NT_HEADERS32(void) +{ + /* PIMAGE_NT_HEADERS32 */ + TEST_TYPE_SIZE (PIMAGE_NT_HEADERS32, 4) + TEST_TYPE_ALIGN (PIMAGE_NT_HEADERS32, 4) + TEST_TARGET_SIZE (PIMAGE_NT_HEADERS32, 248) + TEST_TARGET_ALIGN(PIMAGE_NT_HEADERS32, 4) +} + +static void test_pack_PIMAGE_NT_HEADERS64(void) +{ + /* PIMAGE_NT_HEADERS64 */ + TEST_TYPE_SIZE (PIMAGE_NT_HEADERS64, 4) + TEST_TYPE_ALIGN (PIMAGE_NT_HEADERS64, 4) + TEST_TARGET_SIZE (PIMAGE_NT_HEADERS64, 264) + TEST_TARGET_ALIGN(PIMAGE_NT_HEADERS64, 8) +} + static void test_pack_PIMAGE_OPTIONAL_HEADER(void) { /* PIMAGE_OPTIONAL_HEADER */ @@ -1899,6 +5604,24 @@ static void test_pack_PIMAGE_OPTIONAL_HEADER(void) TEST_TYPE_ALIGN (PIMAGE_OPTIONAL_HEADER, 4) } +static void test_pack_PIMAGE_OPTIONAL_HEADER32(void) +{ + /* PIMAGE_OPTIONAL_HEADER32 */ + TEST_TYPE_SIZE (PIMAGE_OPTIONAL_HEADER32, 4) + TEST_TYPE_ALIGN (PIMAGE_OPTIONAL_HEADER32, 4) + TEST_TARGET_SIZE (PIMAGE_OPTIONAL_HEADER32, 224) + TEST_TARGET_ALIGN(PIMAGE_OPTIONAL_HEADER32, 4) +} + +static void test_pack_PIMAGE_OPTIONAL_HEADER64(void) +{ + /* PIMAGE_OPTIONAL_HEADER64 */ + TEST_TYPE_SIZE (PIMAGE_OPTIONAL_HEADER64, 4) + TEST_TYPE_ALIGN (PIMAGE_OPTIONAL_HEADER64, 4) + TEST_TARGET_SIZE (PIMAGE_OPTIONAL_HEADER64, 240) + TEST_TARGET_ALIGN(PIMAGE_OPTIONAL_HEADER64, 8) +} + static void test_pack_PIMAGE_OS2_HEADER(void) { /* PIMAGE_OS2_HEADER */ @@ -2144,7 +5867,7 @@ static void test_pack_PPRIVILEGE_SET(void) static void test_pack_PRIVILEGE_SET(void) { - /* PRIVILEGE_SET (pack 4) */ + /* PRIVILEGE_SET */ TEST_TYPE_SIZE (PRIVILEGE_SET, 20) TEST_TYPE_ALIGN (PRIVILEGE_SET, 4) TEST_FIELD_SIZE (PRIVILEGE_SET, PrivilegeCount, 4) @@ -2349,7 +6072,7 @@ static void test_pack_PWSTR(void) static void test_pack_RTL_CRITICAL_SECTION(void) { - /* RTL_CRITICAL_SECTION (pack 4) */ + /* RTL_CRITICAL_SECTION */ TEST_TYPE_SIZE (RTL_CRITICAL_SECTION, 24) TEST_TYPE_ALIGN (RTL_CRITICAL_SECTION, 4) TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, DebugInfo, 4) @@ -2374,7 +6097,7 @@ static void test_pack_RTL_CRITICAL_SECTION(void) static void test_pack_RTL_CRITICAL_SECTION_DEBUG(void) { - /* RTL_CRITICAL_SECTION_DEBUG (pack 4) */ + /* RTL_CRITICAL_SECTION_DEBUG */ TEST_FIELD_SIZE (RTL_CRITICAL_SECTION_DEBUG, Type, 2) TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION_DEBUG, Type, 2) TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION_DEBUG, Type, 0) @@ -2397,7 +6120,7 @@ static void test_pack_RTL_CRITICAL_SECTION_DEBUG(void) static void test_pack_RTL_OSVERSIONINFOEXW(void) { - /* RTL_OSVERSIONINFOEXW (pack 4) */ + /* RTL_OSVERSIONINFOEXW */ TEST_TYPE_SIZE (RTL_OSVERSIONINFOEXW, 284) TEST_TYPE_ALIGN (RTL_OSVERSIONINFOEXW, 4) TEST_FIELD_SIZE (RTL_OSVERSIONINFOEXW, dwOSVersionInfoSize, 4) @@ -2437,7 +6160,7 @@ static void test_pack_RTL_OSVERSIONINFOEXW(void) static void test_pack_RTL_OSVERSIONINFOW(void) { - /* RTL_OSVERSIONINFOW (pack 4) */ + /* RTL_OSVERSIONINFOW */ TEST_TYPE_SIZE (RTL_OSVERSIONINFOW, 276) TEST_TYPE_ALIGN (RTL_OSVERSIONINFOW, 4) TEST_FIELD_SIZE (RTL_OSVERSIONINFOW, dwOSVersionInfoSize, 4) @@ -2462,7 +6185,7 @@ static void test_pack_RTL_OSVERSIONINFOW(void) static void test_pack_RTL_RESOURCE_DEBUG(void) { - /* RTL_RESOURCE_DEBUG (pack 4) */ + /* RTL_RESOURCE_DEBUG */ TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, Type, 2) TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, Type, 2) TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, Type, 0) @@ -2492,7 +6215,7 @@ static void test_pack_SECURITY_CONTEXT_TRACKING_MODE(void) static void test_pack_SECURITY_DESCRIPTOR(void) { - /* SECURITY_DESCRIPTOR (pack 4) */ + /* SECURITY_DESCRIPTOR */ TEST_TYPE_SIZE (SECURITY_DESCRIPTOR, 20) TEST_TYPE_ALIGN (SECURITY_DESCRIPTOR, 4) TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Revision, 1) @@ -2528,7 +6251,7 @@ static void test_pack_SECURITY_DESCRIPTOR_CONTROL(void) static void test_pack_SECURITY_DESCRIPTOR_RELATIVE(void) { - /* SECURITY_DESCRIPTOR_RELATIVE (pack 4) */ + /* SECURITY_DESCRIPTOR_RELATIVE */ TEST_TYPE_SIZE (SECURITY_DESCRIPTOR_RELATIVE, 20) TEST_TYPE_ALIGN (SECURITY_DESCRIPTOR_RELATIVE, 4) TEST_FIELD_SIZE (SECURITY_DESCRIPTOR_RELATIVE, Revision, 1) @@ -2564,7 +6287,7 @@ static void test_pack_SECURITY_INFORMATION(void) static void test_pack_SECURITY_QUALITY_OF_SERVICE(void) { - /* SECURITY_QUALITY_OF_SERVICE (pack 4) */ + /* SECURITY_QUALITY_OF_SERVICE */ TEST_FIELD_SIZE (SECURITY_QUALITY_OF_SERVICE, Length, 4) TEST_FIELD_ALIGN (SECURITY_QUALITY_OF_SERVICE, Length, 4) TEST_FIELD_OFFSET(SECURITY_QUALITY_OF_SERVICE, Length, 0) @@ -2580,7 +6303,7 @@ static void test_pack_SHORT(void) static void test_pack_SID(void) { - /* SID (pack 4) */ + /* SID */ TEST_TYPE_SIZE (SID, 12) TEST_TYPE_ALIGN (SID, 4) TEST_FIELD_SIZE (SID, Revision, 1) @@ -2599,7 +6322,7 @@ static void test_pack_SID(void) static void test_pack_SID_AND_ATTRIBUTES(void) { - /* SID_AND_ATTRIBUTES (pack 4) */ + /* SID_AND_ATTRIBUTES */ TEST_TYPE_SIZE (SID_AND_ATTRIBUTES, 8) TEST_TYPE_ALIGN (SID_AND_ATTRIBUTES, 4) TEST_FIELD_SIZE (SID_AND_ATTRIBUTES, Sid, 4) @@ -2612,7 +6335,7 @@ static void test_pack_SID_AND_ATTRIBUTES(void) static void test_pack_SID_IDENTIFIER_AUTHORITY(void) { - /* SID_IDENTIFIER_AUTHORITY (pack 4) */ + /* SID_IDENTIFIER_AUTHORITY */ TEST_TYPE_SIZE (SID_IDENTIFIER_AUTHORITY, 6) TEST_TYPE_ALIGN (SID_IDENTIFIER_AUTHORITY, 1) TEST_FIELD_SIZE (SID_IDENTIFIER_AUTHORITY, Value, 6) @@ -2622,7 +6345,7 @@ static void test_pack_SID_IDENTIFIER_AUTHORITY(void) static void test_pack_SINGLE_LIST_ENTRY(void) { - /* SINGLE_LIST_ENTRY (pack 4) */ + /* SINGLE_LIST_ENTRY */ TEST_TYPE_SIZE (SINGLE_LIST_ENTRY, 4) TEST_TYPE_ALIGN (SINGLE_LIST_ENTRY, 4) TEST_FIELD_SIZE (SINGLE_LIST_ENTRY, Next, 4) @@ -2632,7 +6355,7 @@ static void test_pack_SINGLE_LIST_ENTRY(void) static void test_pack_SYSTEM_ALARM_ACE(void) { - /* SYSTEM_ALARM_ACE (pack 4) */ + /* SYSTEM_ALARM_ACE */ TEST_TYPE_SIZE (SYSTEM_ALARM_ACE, 12) TEST_TYPE_ALIGN (SYSTEM_ALARM_ACE, 4) TEST_FIELD_SIZE (SYSTEM_ALARM_ACE, Header, 4) @@ -2648,7 +6371,7 @@ static void test_pack_SYSTEM_ALARM_ACE(void) static void test_pack_SYSTEM_AUDIT_ACE(void) { - /* SYSTEM_AUDIT_ACE (pack 4) */ + /* SYSTEM_AUDIT_ACE */ TEST_TYPE_SIZE (SYSTEM_AUDIT_ACE, 12) TEST_TYPE_ALIGN (SYSTEM_AUDIT_ACE, 4) TEST_FIELD_SIZE (SYSTEM_AUDIT_ACE, Header, 4) @@ -2671,7 +6394,7 @@ static void test_pack_TCHAR(void) static void test_pack_TOKEN_DEFAULT_DACL(void) { - /* TOKEN_DEFAULT_DACL (pack 4) */ + /* TOKEN_DEFAULT_DACL */ TEST_TYPE_SIZE (TOKEN_DEFAULT_DACL, 4) TEST_TYPE_ALIGN (TOKEN_DEFAULT_DACL, 4) TEST_FIELD_SIZE (TOKEN_DEFAULT_DACL, DefaultDacl, 4) @@ -2681,7 +6404,7 @@ static void test_pack_TOKEN_DEFAULT_DACL(void) static void test_pack_TOKEN_GROUPS(void) { - /* TOKEN_GROUPS (pack 4) */ + /* TOKEN_GROUPS */ TEST_TYPE_SIZE (TOKEN_GROUPS, 12) TEST_TYPE_ALIGN (TOKEN_GROUPS, 4) TEST_FIELD_SIZE (TOKEN_GROUPS, GroupCount, 4) @@ -2694,7 +6417,7 @@ static void test_pack_TOKEN_GROUPS(void) static void test_pack_TOKEN_OWNER(void) { - /* TOKEN_OWNER (pack 4) */ + /* TOKEN_OWNER */ TEST_TYPE_SIZE (TOKEN_OWNER, 4) TEST_TYPE_ALIGN (TOKEN_OWNER, 4) TEST_FIELD_SIZE (TOKEN_OWNER, Owner, 4) @@ -2704,7 +6427,7 @@ static void test_pack_TOKEN_OWNER(void) static void test_pack_TOKEN_PRIMARY_GROUP(void) { - /* TOKEN_PRIMARY_GROUP (pack 4) */ + /* TOKEN_PRIMARY_GROUP */ TEST_TYPE_SIZE (TOKEN_PRIMARY_GROUP, 4) TEST_TYPE_ALIGN (TOKEN_PRIMARY_GROUP, 4) TEST_FIELD_SIZE (TOKEN_PRIMARY_GROUP, PrimaryGroup, 4) @@ -2714,7 +6437,7 @@ static void test_pack_TOKEN_PRIMARY_GROUP(void) static void test_pack_TOKEN_PRIVILEGES(void) { - /* TOKEN_PRIVILEGES (pack 4) */ + /* TOKEN_PRIVILEGES */ TEST_TYPE_SIZE (TOKEN_PRIVILEGES, 16) TEST_TYPE_ALIGN (TOKEN_PRIVILEGES, 4) TEST_FIELD_SIZE (TOKEN_PRIVILEGES, PrivilegeCount, 4) @@ -2727,7 +6450,7 @@ static void test_pack_TOKEN_PRIVILEGES(void) static void test_pack_TOKEN_SOURCE(void) { - /* TOKEN_SOURCE (pack 4) */ + /* TOKEN_SOURCE */ TEST_TYPE_SIZE (TOKEN_SOURCE, 16) TEST_TYPE_ALIGN (TOKEN_SOURCE, 4) TEST_FIELD_SIZE (TOKEN_SOURCE, SourceName, 8) @@ -2754,7 +6477,7 @@ static void test_pack_TOKEN_STATISTICS(void) static void test_pack_TOKEN_USER(void) { - /* TOKEN_USER (pack 4) */ + /* TOKEN_USER */ TEST_TYPE_SIZE (TOKEN_USER, 8) TEST_TYPE_ALIGN (TOKEN_USER, 4) TEST_FIELD_SIZE (TOKEN_USER, User, 8) @@ -2764,7 +6487,7 @@ static void test_pack_TOKEN_USER(void) static void test_pack_ULARGE_INTEGER(void) { - /* ULARGE_INTEGER (pack 4) */ + /* ULARGE_INTEGER */ } static void test_pack_ULONGLONG(void) @@ -2986,7 +6709,7 @@ static void test_pack_LRESULT(void) static void test_pack_POINT(void) { - /* POINT (pack 4) */ + /* POINT */ TEST_TYPE_SIZE (POINT, 8) TEST_TYPE_ALIGN (POINT, 4) TEST_FIELD_SIZE (POINT, x, 4) @@ -2999,7 +6722,7 @@ static void test_pack_POINT(void) static void test_pack_POINTL(void) { - /* POINTL (pack 4) */ + /* POINTL */ TEST_TYPE_SIZE (POINTL, 8) TEST_TYPE_ALIGN (POINTL, 4) TEST_FIELD_SIZE (POINTL, x, 4) @@ -3071,7 +6794,7 @@ static void test_pack_PSZ(void) static void test_pack_RECT(void) { - /* RECT (pack 4) */ + /* RECT */ TEST_TYPE_SIZE (RECT, 16) TEST_TYPE_ALIGN (RECT, 4) TEST_FIELD_SIZE (RECT, left, 4) @@ -3090,7 +6813,7 @@ static void test_pack_RECT(void) static void test_pack_RECTL(void) { - /* RECTL (pack 4) */ + /* RECTL */ TEST_TYPE_SIZE (RECTL, 16) TEST_TYPE_ALIGN (RECTL, 4) TEST_FIELD_SIZE (RECTL, left, 4) @@ -3109,7 +6832,7 @@ static void test_pack_RECTL(void) static void test_pack_SIZE(void) { - /* SIZE (pack 4) */ + /* SIZE */ TEST_TYPE_SIZE (SIZE, 8) TEST_TYPE_ALIGN (SIZE, 4) TEST_FIELD_SIZE (SIZE, cx, 4) @@ -3174,6 +6897,8 @@ static void test_pack_WPARAM(void) TEST_TYPE_ALIGN (WPARAM, 4) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_ACCESS_ALLOWED_ACE(); @@ -3231,6 +6956,11 @@ static void test_pack(void) test_pack_IMAGE_LINENUMBER(); test_pack_IMAGE_LOAD_CONFIG_DIRECTORY(); test_pack_IMAGE_NT_HEADERS(); + test_pack_IMAGE_NT_HEADERS32(); + test_pack_IMAGE_NT_HEADERS64(); + test_pack_IMAGE_OPTIONAL_HEADER(); + test_pack_IMAGE_OPTIONAL_HEADER32(); + test_pack_IMAGE_OPTIONAL_HEADER64(); test_pack_IMAGE_OS2_HEADER(); test_pack_IMAGE_RELOCATION(); test_pack_IMAGE_RESOURCE_DATA_ENTRY(); @@ -3243,6 +6973,8 @@ static void test_pack(void) test_pack_IMAGE_SYMBOL(); test_pack_IMAGE_THUNK_DATA(); test_pack_IMAGE_TLS_DIRECTORY(); + test_pack_IMAGE_TLS_DIRECTORY32(); + test_pack_IMAGE_TLS_DIRECTORY64(); test_pack_IMAGE_VXD_HEADER(); test_pack_INT(); test_pack_INT16(); @@ -3315,7 +7047,11 @@ static void test_pack(void) test_pack_PIMAGE_LINENUMBER(); test_pack_PIMAGE_LOAD_CONFIG_DIRECTORY(); test_pack_PIMAGE_NT_HEADERS(); + test_pack_PIMAGE_NT_HEADERS32(); + test_pack_PIMAGE_NT_HEADERS64(); test_pack_PIMAGE_OPTIONAL_HEADER(); + test_pack_PIMAGE_OPTIONAL_HEADER32(); + test_pack_PIMAGE_OPTIONAL_HEADER64(); test_pack_PIMAGE_OS2_HEADER(); test_pack_PIMAGE_RELOCATION(); test_pack_PIMAGE_RESOURCE_DATA_ENTRY(); @@ -3434,9 +7170,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/ntdll/info.c b/rostests/winetests/ntdll/info.c index c7d451c70b3..74ce71084b0 100755 --- a/rostests/winetests/ntdll/info.c +++ b/rostests/winetests/ntdll/info.c @@ -20,6 +20,7 @@ #include "ntdll_test.h" #include +#include static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG); static NTSTATUS (WINAPI * pNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG); @@ -27,6 +28,9 @@ static NTSTATUS (WINAPI * pNtQueryInformationThread)(HANDLE, THREADINFOCLASS, PV static NTSTATUS (WINAPI * pNtSetInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG); static NTSTATUS (WINAPI * pNtSetInformationThread)(HANDLE, THREADINFOCLASS, PVOID, ULONG); static NTSTATUS (WINAPI * pNtReadVirtualMemory)(HANDLE, const void*, void*, SIZE_T, SIZE_T*); +static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); + +static BOOL is_wow64; /* one_before_last_pid is used to be able to compare values of a still running process with the output of the test_query_process_times and test_query_process_handlecount tests. @@ -58,6 +62,8 @@ static BOOL InitFunctionPtrs(void) NTDLL_GET_PROC(NtSetInformationThread); NTDLL_GET_PROC(NtReadVirtualMemory); + pIsWow64Process = (void *)GetProcAddress(GetModuleHandle("kernel32.dll"), "IsWow64Process"); + if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE; return TRUE; } @@ -128,21 +134,25 @@ static void test_query_performance(void) { NTSTATUS status; ULONG ReturnLength; - ULONGLONG buffer[sizeof(SYSTEM_PERFORMANCE_INFORMATION)/sizeof(ULONGLONG) + 1]; + ULONGLONG buffer[sizeof(SYSTEM_PERFORMANCE_INFORMATION)/sizeof(ULONGLONG) + 5]; + DWORD size = sizeof(SYSTEM_PERFORMANCE_INFORMATION); status = pNtQuerySystemInformation(SystemPerformanceInformation, buffer, 0, &ReturnLength); ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); - status = pNtQuerySystemInformation(SystemPerformanceInformation, buffer, - sizeof(SYSTEM_PERFORMANCE_INFORMATION), &ReturnLength); + status = pNtQuerySystemInformation(SystemPerformanceInformation, buffer, size, &ReturnLength); + if (status == STATUS_INFO_LENGTH_MISMATCH && is_wow64) + { + /* size is larger on wow64 under w2k8/win7 */ + size += 16; + status = pNtQuerySystemInformation(SystemPerformanceInformation, buffer, size, &ReturnLength); + } ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); - ok( ReturnLength == sizeof(SYSTEM_PERFORMANCE_INFORMATION), "Inconsistent length %d\n", ReturnLength); + ok( ReturnLength == size, "Inconsistent length %d\n", ReturnLength); - status = pNtQuerySystemInformation(SystemPerformanceInformation, buffer, - sizeof(SYSTEM_PERFORMANCE_INFORMATION) + 2, &ReturnLength); + status = pNtQuerySystemInformation(SystemPerformanceInformation, buffer, size + 2, &ReturnLength); ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); - ok( ReturnLength == sizeof(SYSTEM_PERFORMANCE_INFORMATION) || - ReturnLength == sizeof(SYSTEM_PERFORMANCE_INFORMATION) + 2, + ok( ReturnLength == size || ReturnLength == size + 2, "Inconsistent length %d\n", ReturnLength); /* Not return values yet, as struct members are unknown */ @@ -747,10 +757,84 @@ static void test_query_process_times(void) status = pNtQueryInformationProcess( GetCurrentProcess(), ProcessTimes, &spti, sizeof(spti) * 2, &ReturnLength); ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); - ok( sizeof(spti) == ReturnLength || ReturnLength == 0 /* vista */, + ok( sizeof(spti) == ReturnLength || + ReturnLength == 0 /* vista */ || + broken(is_wow64), /* returns garbage on wow64 */ "Inconsistent length %d\n", ReturnLength); } +static void test_query_process_debug_port(int argc, char **argv) +{ + DWORD_PTR debug_port = 0xdeadbeef; + char cmdline[MAX_PATH]; + PROCESS_INFORMATION pi; + STARTUPINFO si = { 0 }; + NTSTATUS status; + BOOL ret; + + sprintf(cmdline, "%s %s %s", argv[0], argv[1], "debuggee"); + + si.cb = sizeof(si); + ret = CreateProcess(NULL, cmdline, NULL, NULL, FALSE, DEBUG_PROCESS, NULL, NULL, &si, &pi); + ok(ret, "CreateProcess failed, last error %#x.\n", GetLastError()); + if (!ret) return; + + status = pNtQueryInformationProcess(NULL, ProcessDebugPort, + NULL, 0, NULL); + ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %#x.\n", status); + + status = pNtQueryInformationProcess(NULL, ProcessDebugPort, + NULL, sizeof(debug_port), NULL); + ok(status == STATUS_INVALID_HANDLE || status == STATUS_ACCESS_VIOLATION, + "Expected STATUS_INVALID_HANDLE, got %#x.\n", status); + + status = pNtQueryInformationProcess(GetCurrentProcess(), ProcessDebugPort, + NULL, sizeof(debug_port), NULL); + ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got %#x.\n", status); + + status = pNtQueryInformationProcess(NULL, ProcessDebugPort, + &debug_port, sizeof(debug_port), NULL); + ok(status == STATUS_INVALID_HANDLE, "Expected STATUS_ACCESS_VIOLATION, got %#x.\n", status); + + status = pNtQueryInformationProcess(GetCurrentProcess(), ProcessDebugPort, + &debug_port, sizeof(debug_port) - 1, NULL); + ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %#x.\n", status); + + status = pNtQueryInformationProcess(GetCurrentProcess(), ProcessDebugPort, + &debug_port, sizeof(debug_port) + 1, NULL); + ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %#x.\n", status); + + status = pNtQueryInformationProcess(GetCurrentProcess(), ProcessDebugPort, + &debug_port, sizeof(debug_port), NULL); + ok(!status, "NtQueryInformationProcess failed, status %#x.\n", status); + ok(debug_port == 0, "Expected port 0, got %#lx.\n", debug_port); + + status = pNtQueryInformationProcess(pi.hProcess, ProcessDebugPort, + &debug_port, sizeof(debug_port), NULL); + ok(!status, "NtQueryInformationProcess failed, status %#x.\n", status); + ok(debug_port == ~(DWORD_PTR)0, "Expected port %#lx, got %#lx.\n", ~(DWORD_PTR)0, debug_port); + + for (;;) + { + DEBUG_EVENT ev; + + ret = WaitForDebugEvent(&ev, INFINITE); + ok(ret, "WaitForDebugEvent failed, last error %#x.\n", GetLastError()); + if (!ret) break; + + if (ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) break; + + ret = ContinueDebugEvent(ev.dwProcessId, ev.dwThreadId, DBG_CONTINUE); + ok(ret, "ContinueDebugEvent failed, last error %#x.\n", GetLastError()); + if (!ret) break; + } + + ret = CloseHandle(pi.hThread); + ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); + ret = CloseHandle(pi.hProcess); + ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); +} + static void test_query_process_handlecount(void) { NTSTATUS status; @@ -928,7 +1012,7 @@ static void test_affinity(void) ok( tbi.AffinityMask == 1, "Unexpected thread affinity\n" ); /* NOTE: Pre-Vista does not recognize the "all processors" flag (all bits set) */ - thread_affinity = ~0UL; + thread_affinity = ~(DWORD_PTR)0; status = pNtSetInformationThread( GetCurrentThread(), ThreadAffinityMask, &thread_affinity, sizeof(thread_affinity) ); ok( broken(status == STATUS_INVALID_PARAMETER) || status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); @@ -978,9 +1062,15 @@ static void test_affinity(void) START_TEST(info) { + char **argv; + int argc; + if(!InitFunctionPtrs()) return; + argc = winetest_get_mainargs(&argv); + if (argc >= 3) return; /* Child */ + /* NtQuerySystemInformation */ /* 0x0 SystemBasicInformation */ @@ -1049,6 +1139,10 @@ START_TEST(info) trace("Starting test_query_process_times()\n"); test_query_process_times(); + /* 0x7 ProcessDebugPort */ + trace("Starting test_process_debug_port()\n"); + test_query_process_debug_port(argc, argv); + /* 0x14 ProcessHandleCount */ trace("Starting test_query_process_handlecount()\n"); test_query_process_handlecount(); diff --git a/rostests/winetests/ntdll/path.c b/rostests/winetests/ntdll/path.c index 9d39cdcd9ab..90db536a827 100755 --- a/rostests/winetests/ntdll/path.c +++ b/rostests/winetests/ntdll/path.c @@ -226,6 +226,9 @@ static void test_RtlIsNameLegalDOS8Dot3(void) } static void test_RtlGetFullPathName_U(void) { + static const WCHAR emptyW[] = {0}; + static const WCHAR deadbeefW[] = {'d','e','a','d','b','e','e','f',0}; + struct test { const char *path; @@ -269,6 +272,26 @@ static void test_RtlGetFullPathName_U(void) DWORD reslen; UINT len; + file_part = (WCHAR *)0xdeadbeef; + lstrcpyW(rbufferW, deadbeefW); + ret = pRtlGetFullPathName_U(NULL, MAX_PATH, rbufferW, &file_part); + ok(!ret, "Expected RtlGetFullPathName_U to return 0, got %u\n", ret); + ok(!lstrcmpW(rbufferW, deadbeefW), + "Expected the output buffer to be untouched, got %s\n", wine_dbgstr_w(rbufferW)); + ok(file_part == (WCHAR *)0xdeadbeef || + file_part == NULL, /* Win7 */ + "Expected file part pointer to be untouched, got %p\n", file_part); + + file_part = (WCHAR *)0xdeadbeef; + lstrcpyW(rbufferW, deadbeefW); + ret = pRtlGetFullPathName_U(emptyW, MAX_PATH, rbufferW, &file_part); + ok(!ret, "Expected RtlGetFullPathName_U to return 0, got %u\n", ret); + ok(!lstrcmpW(rbufferW, deadbeefW), + "Expected the output buffer to be untouched, got %s\n", wine_dbgstr_w(rbufferW)); + ok(file_part == (WCHAR *)0xdeadbeef || + file_part == NULL, /* Win7 */ + "Expected file part pointer to be untouched, got %p\n", file_part); + for (test = tests; test->path; test++) { len= strlen(test->rname) * sizeof(WCHAR); diff --git a/rostests/winetests/ntdll/port.c b/rostests/winetests/ntdll/port.c index 0795b4ce307..d092ed789ab 100644 --- a/rostests/winetests/ntdll/port.c +++ b/rostests/winetests/ntdll/port.c @@ -69,6 +69,25 @@ typedef struct _LPC_MESSAGE #endif +/* on Wow64 we have to use the 64-bit layout */ +typedef struct +{ + USHORT DataSize; + USHORT MessageSize; + USHORT MessageType; + USHORT VirtualRangesOffset; + ULONGLONG ClientId[2]; + ULONGLONG MessageId; + ULONGLONG SectionSize; + UCHAR Data[ANYSIZE_ARRAY]; +} LPC_MESSAGE64; + +union lpc_message +{ + LPC_MESSAGE msg; + LPC_MESSAGE64 msg64; +}; + /* Types of LPC messages */ #define UNUSED_MSG_TYPE 0 #define LPC_REQUEST 1 @@ -110,6 +129,9 @@ static NTSTATUS (WINAPI *pNtConnectPort)(PHANDLE,PUNICODE_STRING, PVOID,PVOID,PULONG); static NTSTATUS (WINAPI *pRtlInitUnicodeString)(PUNICODE_STRING,LPCWSTR); static NTSTATUS (WINAPI *pNtWaitForSingleObject)(HANDLE,BOOLEAN,PLARGE_INTEGER); +static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); + +static BOOL is_wow64; static BOOL init_function_ptrs(void) { @@ -140,47 +162,75 @@ static BOOL init_function_ptrs(void) return FALSE; } + pIsWow64Process = (void *)GetProcAddress(GetModuleHandle("kernel32.dll"), "IsWow64Process"); + if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE; return TRUE; } -static void ProcessConnectionRequest(PLPC_MESSAGE LpcMessage, PHANDLE pAcceptPortHandle) +static void ProcessConnectionRequest(union lpc_message *LpcMessage, PHANDLE pAcceptPortHandle) { NTSTATUS status; - ok(LpcMessage->MessageType == LPC_CONNECTION_REQUEST, - "Expected LPC_CONNECTION_REQUEST, got %d\n", LpcMessage->MessageType); - ok(!*LpcMessage->Data, "Expected empty string!\n"); + if (is_wow64) + { + ok(LpcMessage->msg64.MessageType == LPC_CONNECTION_REQUEST, + "Expected LPC_CONNECTION_REQUEST, got %d\n", LpcMessage->msg64.MessageType); + ok(!*LpcMessage->msg64.Data, "Expected empty string!\n"); + } + else + { + ok(LpcMessage->msg.MessageType == LPC_CONNECTION_REQUEST, + "Expected LPC_CONNECTION_REQUEST, got %d\n", LpcMessage->msg.MessageType); + ok(!*LpcMessage->msg.Data, "Expected empty string!\n"); + } - status = pNtAcceptConnectPort(pAcceptPortHandle, 0, LpcMessage, 1, 0, NULL); + status = pNtAcceptConnectPort(pAcceptPortHandle, 0, &LpcMessage->msg, 1, 0, NULL); ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); status = pNtCompleteConnectPort(*pAcceptPortHandle); ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); } -static void ProcessLpcRequest(HANDLE PortHandle, PLPC_MESSAGE LpcMessage) +static void ProcessLpcRequest(HANDLE PortHandle, union lpc_message *LpcMessage) { NTSTATUS status; - ok(LpcMessage->MessageType == LPC_REQUEST, - "Expected LPC_REQUEST, got %d\n", LpcMessage->MessageType); - ok(!lstrcmp((LPSTR)LpcMessage->Data, REQUEST2), - "Expected %s, got %s\n", REQUEST2, LpcMessage->Data); + if (is_wow64) + { + ok(LpcMessage->msg64.MessageType == LPC_REQUEST, + "Expected LPC_REQUEST, got %d\n", LpcMessage->msg64.MessageType); + ok(!lstrcmp((LPSTR)LpcMessage->msg64.Data, REQUEST2), + "Expected %s, got %s\n", REQUEST2, LpcMessage->msg64.Data); + lstrcpy((LPSTR)LpcMessage->msg64.Data, REPLY); - lstrcpy((LPSTR)LpcMessage->Data, REPLY); + status = pNtReplyPort(PortHandle, &LpcMessage->msg); + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); + ok(LpcMessage->msg64.MessageType == LPC_REQUEST, + "Expected LPC_REQUEST, got %d\n", LpcMessage->msg64.MessageType); + ok(!lstrcmp((LPSTR)LpcMessage->msg64.Data, REPLY), + "Expected %s, got %s\n", REPLY, LpcMessage->msg64.Data); + } + else + { + ok(LpcMessage->msg.MessageType == LPC_REQUEST, + "Expected LPC_REQUEST, got %d\n", LpcMessage->msg.MessageType); + ok(!lstrcmp((LPSTR)LpcMessage->msg.Data, REQUEST2), + "Expected %s, got %s\n", REQUEST2, LpcMessage->msg.Data); + lstrcpy((LPSTR)LpcMessage->msg.Data, REPLY); - status = pNtReplyPort(PortHandle, LpcMessage); - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); - ok(LpcMessage->MessageType == LPC_REQUEST, - "Expected LPC_REQUEST, got %d\n", LpcMessage->MessageType); - ok(!lstrcmp((LPSTR)LpcMessage->Data, REPLY), - "Expected %s, got %s\n", REPLY, LpcMessage->Data); + status = pNtReplyPort(PortHandle, &LpcMessage->msg); + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); + ok(LpcMessage->msg.MessageType == LPC_REQUEST, + "Expected LPC_REQUEST, got %d\n", LpcMessage->msg.MessageType); + ok(!lstrcmp((LPSTR)LpcMessage->msg.Data, REPLY), + "Expected %s, got %s\n", REPLY, LpcMessage->msg.Data); + } } static DWORD WINAPI test_ports_client(LPVOID arg) { SECURITY_QUALITY_OF_SERVICE sqos; - LPC_MESSAGE *LpcMessage, *out; + union lpc_message *LpcMessage, *out; HANDLE PortHandle; ULONG len, size; NTSTATUS status; @@ -197,31 +247,62 @@ static DWORD WINAPI test_ports_client(LPVOID arg) status = pNtRegisterThreadTerminatePort(PortHandle); ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); - size = FIELD_OFFSET(LPC_MESSAGE, Data) + MAX_MESSAGE_LEN; - LpcMessage = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); - out = HeapAlloc(GetProcessHeap(), 0, size); + if (is_wow64) + { + size = FIELD_OFFSET(LPC_MESSAGE64, Data[MAX_MESSAGE_LEN]); + LpcMessage = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + out = HeapAlloc(GetProcessHeap(), 0, size); - LpcMessage->DataSize = lstrlen(REQUEST1) + 1; - LpcMessage->MessageSize = FIELD_OFFSET(LPC_MESSAGE, Data) + LpcMessage->DataSize; - lstrcpy((LPSTR)LpcMessage->Data, REQUEST1); + LpcMessage->msg64.DataSize = lstrlen(REQUEST1) + 1; + LpcMessage->msg64.MessageSize = FIELD_OFFSET(LPC_MESSAGE64, Data[LpcMessage->msg64.DataSize]); + lstrcpy((LPSTR)LpcMessage->msg64.Data, REQUEST1); - status = pNtRequestPort(PortHandle, LpcMessage); - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); - ok(LpcMessage->MessageType == 0, "Expected 0, got %d\n", LpcMessage->MessageType); - ok(!lstrcmp((LPSTR)LpcMessage->Data, REQUEST1), - "Expected %s, got %s\n", REQUEST1, LpcMessage->Data); + status = pNtRequestPort(PortHandle, &LpcMessage->msg); + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); + ok(LpcMessage->msg64.MessageType == 0, "Expected 0, got %d\n", LpcMessage->msg64.MessageType); + ok(!lstrcmp((LPSTR)LpcMessage->msg64.Data, REQUEST1), + "Expected %s, got %s\n", REQUEST1, LpcMessage->msg64.Data); - /* Fill in the message */ - memset(LpcMessage, 0, size); - LpcMessage->DataSize = lstrlen(REQUEST2) + 1; - LpcMessage->MessageSize = FIELD_OFFSET(LPC_MESSAGE, Data) + LpcMessage->DataSize; - lstrcpy((LPSTR)LpcMessage->Data, REQUEST2); + /* Fill in the message */ + memset(LpcMessage, 0, size); + LpcMessage->msg64.DataSize = lstrlen(REQUEST2) + 1; + LpcMessage->msg64.MessageSize = FIELD_OFFSET(LPC_MESSAGE64, Data[LpcMessage->msg64.DataSize]); + lstrcpy((LPSTR)LpcMessage->msg64.Data, REQUEST2); - /* Send the message and wait for the reply */ - status = pNtRequestWaitReplyPort(PortHandle, LpcMessage, out); - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); - ok(!lstrcmp((LPSTR)out->Data, REPLY), "Expected %s, got %s\n", REPLY, out->Data); - ok(out->MessageType == LPC_REPLY, "Expected LPC_REPLY, got %d\n", out->MessageType); + /* Send the message and wait for the reply */ + status = pNtRequestWaitReplyPort(PortHandle, &LpcMessage->msg, &out->msg); + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); + ok(!lstrcmp((LPSTR)out->msg64.Data, REPLY), "Expected %s, got %s\n", REPLY, out->msg64.Data); + ok(out->msg64.MessageType == LPC_REPLY, "Expected LPC_REPLY, got %d\n", out->msg64.MessageType); + } + else + { + size = FIELD_OFFSET(LPC_MESSAGE, Data[MAX_MESSAGE_LEN]); + LpcMessage = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + out = HeapAlloc(GetProcessHeap(), 0, size); + + LpcMessage->msg.DataSize = lstrlen(REQUEST1) + 1; + LpcMessage->msg.MessageSize = FIELD_OFFSET(LPC_MESSAGE, Data[LpcMessage->msg.DataSize]); + lstrcpy((LPSTR)LpcMessage->msg.Data, REQUEST1); + + status = pNtRequestPort(PortHandle, &LpcMessage->msg); + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); + ok(LpcMessage->msg.MessageType == 0, "Expected 0, got %d\n", LpcMessage->msg.MessageType); + ok(!lstrcmp((LPSTR)LpcMessage->msg.Data, REQUEST1), + "Expected %s, got %s\n", REQUEST1, LpcMessage->msg.Data); + + /* Fill in the message */ + memset(LpcMessage, 0, size); + LpcMessage->msg.DataSize = lstrlen(REQUEST2) + 1; + LpcMessage->msg.MessageSize = FIELD_OFFSET(LPC_MESSAGE, Data[LpcMessage->msg.DataSize]); + lstrcpy((LPSTR)LpcMessage->msg.Data, REQUEST2); + + /* Send the message and wait for the reply */ + status = pNtRequestWaitReplyPort(PortHandle, &LpcMessage->msg, &out->msg); + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); + ok(!lstrcmp((LPSTR)out->msg.Data, REPLY), "Expected %s, got %s\n", REPLY, out->msg.Data); + ok(out->msg.MessageType == LPC_REPLY, "Expected LPC_REPLY, got %d\n", out->msg.MessageType); + } HeapFree(GetProcessHeap(), 0, out); HeapFree(GetProcessHeap(), 0, LpcMessage); @@ -232,7 +313,7 @@ static DWORD WINAPI test_ports_client(LPVOID arg) static void test_ports_server( HANDLE PortHandle ) { HANDLE AcceptPortHandle; - PLPC_MESSAGE LpcMessage; + union lpc_message *LpcMessage; ULONG size; NTSTATUS status; BOOL done = FALSE; @@ -242,7 +323,7 @@ static void test_ports_server( HANDLE PortHandle ) while (TRUE) { - status = pNtReplyWaitReceivePort(PortHandle, NULL, NULL, LpcMessage); + status = pNtReplyWaitReceivePort(PortHandle, NULL, NULL, &LpcMessage->msg); todo_wine { ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d(%x)\n", status, status); @@ -253,7 +334,7 @@ static void test_ports_server( HANDLE PortHandle ) if ((status == STATUS_NOT_IMPLEMENTED) || (status == STATUS_INVALID_HANDLE)) return; - switch (LpcMessage->MessageType) + switch (is_wow64 ? LpcMessage->msg64.MessageType : LpcMessage->msg.MessageType) { case LPC_CONNECTION_REQUEST: ProcessConnectionRequest(LpcMessage, &AcceptPortHandle); @@ -265,8 +346,12 @@ static void test_ports_server( HANDLE PortHandle ) break; case LPC_DATAGRAM: - ok(!lstrcmp((LPSTR)LpcMessage->Data, REQUEST1), - "Expected %s, got %s\n", REQUEST1, LpcMessage->Data); + if (is_wow64) + ok(!lstrcmp((LPSTR)LpcMessage->msg64.Data, REQUEST1), + "Expected %s, got %s\n", REQUEST1, LpcMessage->msg64.Data); + else + ok(!lstrcmp((LPSTR)LpcMessage->msg.Data, REQUEST1), + "Expected %s, got %s\n", REQUEST1, LpcMessage->msg.Data); break; case LPC_CLIENT_DIED: @@ -275,7 +360,8 @@ static void test_ports_server( HANDLE PortHandle ) return; default: - ok(FALSE, "Unexpected message: %d\n", LpcMessage->MessageType); + ok(FALSE, "Unexpected message: %d\n", + is_wow64 ? LpcMessage->msg64.MessageType : LpcMessage->msg.MessageType); break; } } diff --git a/rostests/winetests/ntdll/rtlstr.c b/rostests/winetests/ntdll/rtlstr.c index d9ba0c9eaea..5dd35008d5d 100755 --- a/rostests/winetests/ntdll/rtlstr.c +++ b/rostests/winetests/ntdll/rtlstr.c @@ -42,7 +42,7 @@ static VOID (WINAPI *pRtlCopyString)(STRING *, const STRING *); static BOOLEAN (WINAPI *pRtlCreateUnicodeString)(PUNICODE_STRING, LPCWSTR); static BOOLEAN (WINAPI *pRtlCreateUnicodeStringFromAsciiz)(PUNICODE_STRING, LPCSTR); static NTSTATUS (WINAPI *pRtlDowncaseUnicodeString)(UNICODE_STRING *, const UNICODE_STRING *, BOOLEAN); -static NTSTATUS (WINAPI *pRtlDuplicateUnicodeString)(long, UNICODE_STRING *, UNICODE_STRING *); +static NTSTATUS (WINAPI *pRtlDuplicateUnicodeString)(int, UNICODE_STRING *, UNICODE_STRING *); static BOOLEAN (WINAPI *pRtlEqualUnicodeString)(const UNICODE_STRING *, const UNICODE_STRING *, BOOLEAN); static NTSTATUS (WINAPI *pRtlFindCharInUnicodeString)(int, const UNICODE_STRING *, const UNICODE_STRING *, USHORT *); static VOID (WINAPI *pRtlFreeAnsiString)(PSTRING); @@ -53,14 +53,14 @@ static VOID (WINAPI *pRtlInitUnicodeString)(PUNICODE_STRING, LPCWSTR); static NTSTATUS (WINAPI *pRtlInitUnicodeStringEx)(PUNICODE_STRING, LPCWSTR); static NTSTATUS (WINAPI *pRtlIntegerToChar)(ULONG, ULONG, ULONG, PCHAR); static NTSTATUS (WINAPI *pRtlIntegerToUnicodeString)(ULONG, ULONG, UNICODE_STRING *); -static NTSTATUS (WINAPI *pRtlMultiAppendUnicodeStringBuffer)(UNICODE_STRING *, long, UNICODE_STRING *); +static NTSTATUS (WINAPI *pRtlMultiAppendUnicodeStringBuffer)(UNICODE_STRING *, LONG, UNICODE_STRING *); static NTSTATUS (WINAPI *pRtlUnicodeStringToAnsiString)(STRING *, const UNICODE_STRING *, BOOLEAN); static NTSTATUS (WINAPI *pRtlUnicodeStringToInteger)(const UNICODE_STRING *, int, int *); static WCHAR (WINAPI *pRtlUpcaseUnicodeChar)(WCHAR); static NTSTATUS (WINAPI *pRtlUpcaseUnicodeString)(UNICODE_STRING *, const UNICODE_STRING *, BOOLEAN); static CHAR (WINAPI *pRtlUpperChar)(CHAR); static NTSTATUS (WINAPI *pRtlUpperString)(STRING *, const STRING *); -static NTSTATUS (WINAPI *pRtlValidateUnicodeString)(long, UNICODE_STRING *); +static NTSTATUS (WINAPI *pRtlValidateUnicodeString)(LONG, UNICODE_STRING *); static NTSTATUS (WINAPI *pRtlGUIDFromString)(const UNICODE_STRING*,GUID*); static NTSTATUS (WINAPI *pRtlStringFromGUID)(const GUID*, UNICODE_STRING*); static BOOLEAN (WINAPI *pRtlIsTextUnicode)(LPVOID, INT, INT *); @@ -1695,6 +1695,8 @@ static void test_RtlIntegerToChar(void) static void test_RtlIsTextUnicode(void) { char ascii[] = "A simple string"; + char false_positive[] = {0x41, 0x0a, 0x0d, 0x1d}; + WCHAR false_negative = 0x0d0a; WCHAR unicode[] = {'A',' ','U','n','i','c','o','d','e',' ','s','t','r','i','n','g',0}; WCHAR unicode_no_controls[] = {'A','U','n','i','c','o','d','e','s','t','r','i','n','g',0}; /* String with both byte-reversed and standard Unicode control characters. */ @@ -1810,6 +1812,11 @@ static void test_RtlIsTextUnicode(void) ok(!pRtlIsTextUnicode(mixed_controls, sizeof(mixed_controls), &flags), "Test should pass on string containing both byte-reversed and standard control characters.\n"); ok(flags == (IS_TEXT_UNICODE_CONTROLS | IS_TEXT_UNICODE_REVERSE_CONTROLS), "Expected flags 0x44, obtained %x\n", flags); + flags = IS_TEXT_UNICODE_STATISTICS; + todo_wine ok(pRtlIsTextUnicode(false_positive, sizeof(false_positive), &flags), "Test should pass on false positive.\n"); + + ok(!pRtlIsTextUnicode(&false_negative, sizeof(false_negative), NULL), "Test should fail on 0x0d0a (MALAYALAM LETTER UU).\n"); + HeapFree(GetProcessHeap(), 0, be_unicode); HeapFree(GetProcessHeap(), 0, be_unicode_no_controls); } diff --git a/rostests/winetests/ntdll/string.c b/rostests/winetests/ntdll/string.c index cd3ae37cf4c..3f7236a3dfe 100755 --- a/rostests/winetests/ntdll/string.c +++ b/rostests/winetests/ntdll/string.c @@ -37,8 +37,8 @@ static int (WINAPIV *patoi)(const char *); static long (WINAPIV *patol)(const char *); static LONGLONG (WINAPIV *p_atoi64)(const char *); static LPSTR (WINAPIV *p_itoa)(int, LPSTR, INT); -static LPSTR (WINAPIV *p_ltoa)(long, LPSTR, INT); -static LPSTR (WINAPIV *p_ultoa)(unsigned long, LPSTR, INT); +static LPSTR (WINAPIV *p_ltoa)(LONG, LPSTR, INT); +static LPSTR (WINAPIV *p_ultoa)(ULONG, LPSTR, INT); static LPSTR (WINAPIV *p_i64toa)(LONGLONG, LPSTR, INT); static LPSTR (WINAPIV *p_ui64toa)(ULONGLONG, LPSTR, INT); @@ -46,8 +46,8 @@ static int (WINAPIV *p_wtoi)(LPWSTR); static long (WINAPIV *p_wtol)(LPWSTR); static LONGLONG (WINAPIV *p_wtoi64)(LPWSTR); static LPWSTR (WINAPIV *p_itow)(int, LPWSTR, int); -static LPWSTR (WINAPIV *p_ltow)(long, LPWSTR, INT); -static LPWSTR (WINAPIV *p_ultow)(unsigned long, LPWSTR, INT); +static LPWSTR (WINAPIV *p_ltow)(LONG, LPWSTR, INT); +static LPWSTR (WINAPIV *p_ultow)(ULONG, LPWSTR, INT); static LPWSTR (WINAPIV *p_i64tow)(LONGLONG, LPWSTR, INT); static LPWSTR (WINAPIV *p_ui64tow)(ULONGLONG, LPWSTR, INT); @@ -57,6 +57,10 @@ static ULONG (WINAPIV *pwcstoul)(LPCWSTR, LPWSTR *, INT); static LPWSTR (WINAPIV *p_wcschr)(LPCWSTR, WCHAR); static LPWSTR (WINAPIV *p_wcsrchr)(LPCWSTR, WCHAR); +static void (__cdecl *p_qsort)(void *,size_t,size_t, int(__cdecl *compar)(const void *, const void *) ); +static void* (__cdecl *p_bsearch)(void *,void*,size_t,size_t, int(__cdecl *compar)(const void *, const void *) ); + + static void InitFunctionPtrs(void) { hntdll = LoadLibraryA("ntdll.dll"); @@ -90,6 +94,8 @@ static void InitFunctionPtrs(void) p_wcschr= (void *)GetProcAddress(hntdll, "wcschr"); p_wcsrchr= (void *)GetProcAddress(hntdll, "wcsrchr"); + p_qsort= (void *)GetProcAddress(hntdll, "qsort"); + p_bsearch= (void *)GetProcAddress(hntdll, "bsearch"); } /* if */ } @@ -228,7 +234,7 @@ static void one_itoa_test(int test_num, const ulong2str_t *ulong2str) static void one_ltoa_test(int test_num, const ulong2str_t *ulong2str) { char dest_str[LARGE_STRI_BUFFER_LENGTH + 1]; - long value; + LONG value; LPSTR result; memset(dest_str, '-', LARGE_STRI_BUFFER_LENGTH); @@ -236,10 +242,10 @@ static void one_ltoa_test(int test_num, const ulong2str_t *ulong2str) value = ulong2str->value; result = p_ltoa(ulong2str->value, dest_str, ulong2str->base); ok(result == dest_str, - "(test %d): _ltoa(%ld, [out], %d) has result %p, expected: %p\n", + "(test %d): _ltoa(%d, [out], %d) has result %p, expected: %p\n", test_num, value, ulong2str->base, result, dest_str); ok(memcmp(dest_str, ulong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0, - "(test %d): _ltoa(%ld, [out], %d) assigns string \"%s\", expected: \"%s\"\n", + "(test %d): _ltoa(%d, [out], %d) assigns string \"%s\", expected: \"%s\"\n", test_num, value, ulong2str->base, dest_str, ulong2str->Buffer); } @@ -247,7 +253,7 @@ static void one_ltoa_test(int test_num, const ulong2str_t *ulong2str) static void one_ultoa_test(int test_num, const ulong2str_t *ulong2str) { char dest_str[LARGE_STRI_BUFFER_LENGTH + 1]; - unsigned long value; + ULONG value; LPSTR result; memset(dest_str, '-', LARGE_STRI_BUFFER_LENGTH); @@ -255,10 +261,10 @@ static void one_ultoa_test(int test_num, const ulong2str_t *ulong2str) value = ulong2str->value; result = p_ultoa(ulong2str->value, dest_str, ulong2str->base); ok(result == dest_str, - "(test %d): _ultoa(%lu, [out], %d) has result %p, expected: %p\n", + "(test %d): _ultoa(%u, [out], %d) has result %p, expected: %p\n", test_num, value, ulong2str->base, result, dest_str); ok(memcmp(dest_str, ulong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0, - "(test %d): _ultoa(%lu, [out], %d) assigns string \"%s\", expected: \"%s\"\n", + "(test %d): _ultoa(%u, [out], %d) assigns string \"%s\", expected: \"%s\"\n", test_num, value, ulong2str->base, dest_str, ulong2str->Buffer); } @@ -323,7 +329,7 @@ static void one_ltow_test(int test_num, const ulong2str_t *ulong2str) WCHAR dest_wstr[LARGE_STRI_BUFFER_LENGTH + 1]; UNICODE_STRING unicode_string; STRING ansi_str; - long value; + LONG value; LPWSTR result; for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) { @@ -343,10 +349,10 @@ static void one_ltow_test(int test_num, const ulong2str_t *ulong2str) result = p_ltow(value, dest_wstr, ulong2str->base); pRtlUnicodeStringToAnsiString(&ansi_str, &unicode_string, 1); ok(result == dest_wstr, - "(test %d): _ltow(%ld, [out], %d) has result %p, expected: %p\n", + "(test %d): _ltow(%d, [out], %d) has result %p, expected: %p\n", test_num, value, ulong2str->base, result, dest_wstr); ok(memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) == 0, - "(test %d): _ltow(%ld, [out], %d) assigns string \"%s\", expected: \"%s\"\n", + "(test %d): _ltow(%d, [out], %d) assigns string \"%s\", expected: \"%s\"\n", test_num, value, ulong2str->base, ansi_str.Buffer, ulong2str->Buffer); pRtlFreeAnsiString(&ansi_str); } @@ -359,7 +365,7 @@ static void one_ultow_test(int test_num, const ulong2str_t *ulong2str) WCHAR dest_wstr[LARGE_STRI_BUFFER_LENGTH + 1]; UNICODE_STRING unicode_string; STRING ansi_str; - unsigned long value; + ULONG value; LPWSTR result; for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) { @@ -379,10 +385,10 @@ static void one_ultow_test(int test_num, const ulong2str_t *ulong2str) result = p_ultow(value, dest_wstr, ulong2str->base); pRtlUnicodeStringToAnsiString(&ansi_str, &unicode_string, 1); ok(result == dest_wstr, - "(test %d): _ultow(%lu, [out], %d) has result %p, expected: %p\n", + "(test %d): _ultow(%u, [out], %d) has result %p, expected: %p\n", test_num, value, ulong2str->base, result, dest_wstr); ok(memcmp(dest_wstr, expected_wstr, LARGE_STRI_BUFFER_LENGTH * sizeof(WCHAR)) == 0, - "(test %d): _ultow(%lu, [out], %d) assigns string \"%s\", expected: \"%s\"\n", + "(test %d): _ultow(%u, [out], %d) assigns string \"%s\", expected: \"%s\"\n", test_num, value, ulong2str->base, ansi_str.Buffer, ulong2str->Buffer); pRtlFreeAnsiString(&ansi_str); } @@ -1137,6 +1143,80 @@ static void test_wcsrchr(void) "wcsrchr should have returned NULL\n"); } +static __cdecl int intcomparefunc(const void *a, const void*b) +{ + ok (a != b, "must never get the same pointer\n"); + return (*(int*)a) - (*(int*)b); +} + +static __cdecl int charcomparefunc(const void *a, const void*b) +{ + ok (a != b, "must never get the same pointer\n"); + return (*(char*)a) - (*(char*)b); +} + +static __cdecl int strcomparefunc(const void *a, const void*b) +{ + ok (a != b, "must never get the same pointer\n"); + return lstrcmpA(*(char**)a,*(char**)b); +} + +static void test_qsort(void) +{ + int arr[5] = { 23, 42, 8, 4, 16 }; + char carr[5] = { 42, 23, 4, 8, 16 }; + const char *strarr[7] = { + "Hello", + "Wine", + "World", + "!", + "Hopefully", + "Sorted", + "." + }; + + p_qsort ((void*)arr, 5, sizeof(int), intcomparefunc); + ok(arr[0] == 4, "badly sorted, arr[0] is %d\n", arr[0]); + ok(arr[1] == 8, "badly sorted, arr[1] is %d\n", arr[1]); + ok(arr[2] == 16, "badly sorted, arr[2] is %d\n", arr[2]); + ok(arr[3] == 23, "badly sorted, arr[3] is %d\n", arr[3]); + ok(arr[4] == 42, "badly sorted, arr[4] is %d\n", arr[4]); + + p_qsort ((void*)carr, 5, sizeof(char), charcomparefunc); + ok(carr[0] == 4, "badly sorted, carr[0] is %d\n", carr[0]); + ok(carr[1] == 8, "badly sorted, carr[1] is %d\n", carr[1]); + ok(carr[2] == 16, "badly sorted, carr[2] is %d\n", carr[2]); + ok(carr[3] == 23, "badly sorted, carr[3] is %d\n", carr[3]); + ok(carr[4] == 42, "badly sorted, carr[4] is %d\n", carr[4]); + + p_qsort ((void*)strarr, 7, sizeof(char*), strcomparefunc); + ok(!strcmp(strarr[0],"!"), "badly sorted, strarr[0] is %s\n", strarr[0]); + ok(!strcmp(strarr[1],"."), "badly sorted, strarr[1] is %s\n", strarr[1]); + ok(!strcmp(strarr[2],"Hello"), "badly sorted, strarr[2] is %s\n", strarr[2]); + ok(!strcmp(strarr[3],"Hopefully"), "badly sorted, strarr[3] is %s\n", strarr[3]); + ok(!strcmp(strarr[4],"Sorted"), "badly sorted, strarr[4] is %s\n", strarr[4]); + ok(!strcmp(strarr[5],"Wine"), "badly sorted, strarr[5] is %s\n", strarr[5]); + ok(!strcmp(strarr[6],"World"), "badly sorted, strarr[6] is %s\n", strarr[6]); +} + +static void test_bsearch(void) +{ + int arr[7] = { 1, 3, 4, 8, 16, 23, 42 }; + int *x, l, i,j ; + + /* just try all all sizes */ + for (j=1;jCopyTo failed, hr=%08x\n", r); + ok(r==S_OK, "IStorage->CopyTo failed, hr=%08x\n", r); IStream_Release(stm); diff --git a/rostests/winetests/ole32/usrmarshal.c b/rostests/winetests/ole32/usrmarshal.c index a6553977744..a40e66b2916 100644 --- a/rostests/winetests/ole32/usrmarshal.c +++ b/rostests/winetests/ole32/usrmarshal.c @@ -603,7 +603,7 @@ static void marshal_WdtpInterfacePointer(DWORD umcb_ctx, DWORD ctx) buffer_end = WdtpInterfacePointer_UserMarshal(&umcb.Flags, ctx, buffer, unk, &IID_IUnknown); wireip = buffer; - ok(buffer_end == buffer + marshal_size + 2 * sizeof(DWORD), "buffer_end %p buffer %p (diff %x)\n", buffer_end, buffer, buffer_end - buffer); + ok(buffer_end == buffer + marshal_size + 2 * sizeof(DWORD), "buffer_end %p buffer %p\n", buffer_end, buffer); ok(*(DWORD *)wireip == marshal_size, "wireip + 0x0 should be %x instead of %x\n", marshal_size, *(DWORD *)wireip); wireip += sizeof(DWORD); diff --git a/rostests/winetests/pdh/pdh.c b/rostests/winetests/pdh/pdh.c index cd03bcb4fe3..094ad74f14b 100644 --- a/rostests/winetests/pdh/pdh.c +++ b/rostests/winetests/pdh/pdh.c @@ -934,6 +934,28 @@ static void test_PdhMakeCounterPathA(void) ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); } +static void test_PdhGetDllVersion(void) +{ + PDH_STATUS ret; + DWORD version; + + ret = PdhGetDllVersion(NULL); + ok(ret == PDH_INVALID_ARGUMENT || + broken(ret == ERROR_SUCCESS), /* Vista+ */ + "Expected PdhGetDllVersion to return PDH_INVALID_ARGUMENT, got %d\n", ret); + + ret = PdhGetDllVersion(&version); + ok(ret == ERROR_SUCCESS, + "Expected PdhGetDllVersion to return ERROR_SUCCESS, got %d\n", ret); + + if (ret == ERROR_SUCCESS) + { + ok(version == PDH_CVERSION_WIN50 || + version == PDH_VERSION, + "Expected version number to be PDH_CVERSION_WIN50 or PDH_VERSION, got %u\n", version); + } +} + START_TEST(pdh) { if (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) != LANG_ENGLISH) @@ -975,4 +997,5 @@ START_TEST(pdh) test_PdhCollectQueryDataEx(); test_PdhMakeCounterPathA(); + test_PdhGetDllVersion(); } diff --git a/rostests/winetests/psapi/psapi_main.c b/rostests/winetests/psapi/psapi_main.c index 21a3d1aa269..55eb9377c54 100644 --- a/rostests/winetests/psapi/psapi_main.c +++ b/rostests/winetests/psapi/psapi_main.c @@ -275,23 +275,36 @@ static void test_ws_functions(void) ULONG_PTR pages[4096]; char *addr; unsigned int i; - + BOOL ret; + todo_wine w32_err(pEmptyWorkingSet(NULL), ERROR_INVALID_HANDLE); todo_wine w32_err(pEmptyWorkingSet(hpSR), ERROR_ACCESS_DENIED); w32_suc(pEmptyWorkingSet(hpAA)); - - todo_wine w32_err(pInitializeProcessForWsWatch(NULL), ERROR_INVALID_HANDLE); + + SetLastError( 0xdeadbeef ); + ret = pInitializeProcessForWsWatch( NULL ); + todo_wine ok( !ret, "InitializeProcessForWsWatch succeeded\n" ); + if (!ret) + { + if (GetLastError() == ERROR_INVALID_FUNCTION) /* not supported on xp in wow64 mode */ + { + trace( "InitializeProcessForWsWatch not supported\n" ); + return; + } + ok( GetLastError() == ERROR_INVALID_HANDLE, "wrong error %u\n", GetLastError() ); + } w32_suc(pInitializeProcessForWsWatch(hpAA)); if(!w32_suc(addr = VirtualAlloc(NULL, 1, MEM_COMMIT, PAGE_READWRITE))) return; + *addr = 0; /* make sure it's paged in (needed on wow64) */ if(!VirtualLock(addr, 1)) { trace("locking failed (error=%d) - skipping test\n", GetLastError()); goto free_page; } - + todo_wine if(w32_suc(pQueryWorkingSet(hpQI, pages, 4096 * sizeof(ULONG_PTR)))) { for(i = 0; i < pages[0]; i++) diff --git a/rostests/winetests/quartz/dsoundrender.c b/rostests/winetests/quartz/dsoundrender.c new file mode 100644 index 00000000000..5ecdaaac9a1 --- /dev/null +++ b/rostests/winetests/quartz/dsoundrender.c @@ -0,0 +1,234 @@ +/* + * Unit tests for DSound Renderer functions + * + * Copyright (C) 2010 Maarten Lankhorst for CodeWeavers + * Copyright (C) 2007 Google (Lei Zhang) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define NONAMELESSUNION +#define COBJMACROS + +#include "wine/test.h" +#include "dshow.h" +#include "initguid.h" +#include "dsound.h" +#include "amaudio.h" + +#define QI_SUCCEED(iface, riid, ppv) hr = IUnknown_QueryInterface(iface, &riid, (LPVOID*)&ppv); \ + ok(hr == S_OK, "IUnknown_QueryInterface returned %x\n", hr); \ + ok(ppv != NULL, "Pointer is NULL\n"); + +#define RELEASE_EXPECT(iface, num) if (iface) { \ + hr = IUnknown_Release(iface); \ + ok(hr == num, "IUnknown_Release should return %d, got %d\n", num, hr); \ +} + +static IUnknown *pDSRender = NULL; + +static int create_dsound_renderer(void) +{ + HRESULT hr; + + hr = CoCreateInstance(&CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER, + &IID_IUnknown, (LPVOID*)&pDSRender); + return (hr == S_OK && pDSRender != NULL); +} + +static void release_dsound_renderer(void) +{ + HRESULT hr; + + hr = IUnknown_Release(pDSRender); + ok(hr == 0, "IUnknown_Release failed with %x\n", hr); +} + +static HRESULT WINAPI PB_QueryInterface(IPropertyBag *iface, REFIID riid, void **ppv) +{ + ok(0, "Should not be called\n"); + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI PB_AddRef(IPropertyBag *iface) +{ + ok(0, "Should not be called\n"); + return 2; +} + +static ULONG WINAPI PB_Release(IPropertyBag *iface) +{ + ok(0, "Should not be called\n"); + return 1; +} + +static HRESULT WINAPI PB_Read(IPropertyBag *iface, LPCOLESTR name, VARIANT *var, IErrorLog *log) +{ + static const WCHAR dsguid[] = { 'D','S','G','u','i','d', 0 }; + char temp[50]; + WideCharToMultiByte(CP_ACP, 0, name, -1, temp, sizeof(temp)-1, NULL, NULL); + temp[sizeof(temp)-1] = 0; + trace("Trying to read %s, type %u\n", temp, var->n1.n2.vt); + if (!lstrcmpW(name, dsguid)) + { + static const WCHAR defaultplayback[] = + { + '{','D','E','F','0','0','0','0','0','-', + '9','C','6','D','-','4','7','E','D','-', + 'A','A','F','1','-','4','D','D','A','8', + 'F','2','B','5','C','0','3','}',0 + }; + ok(var->n1.n2.vt == VT_BSTR, "Wrong type asked: %u\n", var->n1.n2.vt); + var->n1.n2.n3.bstrVal = SysAllocString(defaultplayback); + return S_OK; + } + ok(0, "Unknown property '%s' queried\n", temp); + return E_FAIL; +} + +static HRESULT WINAPI PB_Write(IPropertyBag *iface, LPCOLESTR name, VARIANT *var) +{ + ok(0, "Should not be called\n"); + return E_FAIL; +} + +static IPropertyBagVtbl PB_Vtbl = +{ + PB_QueryInterface, + PB_AddRef, + PB_Release, + PB_Read, + PB_Write +}; + +static void test_query_interface(void) +{ + HRESULT hr; + IBaseFilter *pBaseFilter = NULL; + IBasicAudio *pBasicAudio = NULL; + IMediaPosition *pMediaPosition = NULL; + IMediaSeeking *pMediaSeeking = NULL; + IQualityControl *pQualityControl = NULL; + IPersistPropertyBag *ppb = NULL; + IDirectSound3DBuffer *ds3dbuf = NULL; + IReferenceClock *clock = NULL; + IAMDirectSound *pAMDirectSound = NULL; + + QI_SUCCEED(pDSRender, IID_IBaseFilter, pBaseFilter); + RELEASE_EXPECT(pBaseFilter, 1); + QI_SUCCEED(pDSRender, IID_IBasicAudio, pBasicAudio); + RELEASE_EXPECT(pBasicAudio, 1); + QI_SUCCEED(pDSRender, IID_IMediaSeeking, pMediaSeeking); + RELEASE_EXPECT(pMediaSeeking, 1); + QI_SUCCEED(pDSRender, IID_IReferenceClock, clock); + RELEASE_EXPECT(clock, 1); + QI_SUCCEED(pDSRender, IID_IAMDirectSound, pAMDirectSound); + RELEASE_EXPECT( pAMDirectSound, 1); + todo_wine { + QI_SUCCEED(pDSRender, IID_IDirectSound3DBuffer, ds3dbuf); + RELEASE_EXPECT(ds3dbuf, 1); + QI_SUCCEED(pDSRender, IID_IPersistPropertyBag, ppb); + if (ppb) + { + IPropertyBag bag = { &PB_Vtbl }; + hr = IPersistPropertyBag_Load(ppb, &bag, NULL); + ok(hr == S_OK, "Couldn't load default device: %08x\n", hr); + } + RELEASE_EXPECT(ppb, 1); + QI_SUCCEED(pDSRender, IID_IMediaPosition, pMediaPosition); + RELEASE_EXPECT(pMediaPosition, 1); + QI_SUCCEED(pDSRender, IID_IQualityControl, pQualityControl); + RELEASE_EXPECT(pQualityControl, 1); + } +} + +static void test_pin(IPin *pin) +{ + IMemInputPin *mpin = NULL; + + IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&mpin); + + ok(mpin != NULL, "No IMemInputPin found!\n"); + if (mpin) + { + ok(IMemInputPin_ReceiveCanBlock(mpin) == S_OK, "Receive can't block for pin!\n"); + ok(IMemInputPin_NotifyAllocator(mpin, NULL, 0) == E_POINTER, "NotifyAllocator likes a NULL pointer argument\n"); + IMemInputPin_Release(mpin); + } + /* TODO */ +} + +static void test_basefilter(void) +{ + IEnumPins *pin_enum = NULL; + IBaseFilter *base = NULL; + IPin *pins[2]; + ULONG ref; + HRESULT hr; + + IUnknown_QueryInterface(pDSRender, &IID_IBaseFilter, (void *)&base); + if (base == NULL) + { + /* test_query_interface handles this case */ + skip("No IBaseFilter\n"); + return; + } + + hr = IBaseFilter_EnumPins(base, NULL); + ok(hr == E_POINTER, "hr = %08x and not E_POINTER\n", hr); + + hr= IBaseFilter_EnumPins(base, &pin_enum); + ok(hr == S_OK, "hr = %08x and not S_OK\n", hr); + + hr = IEnumPins_Next(pin_enum, 1, NULL, NULL); + ok(hr == E_POINTER, "hr = %08x and not E_POINTER\n", hr); + + hr = IEnumPins_Next(pin_enum, 2, pins, NULL); + ok(hr == E_INVALIDARG, "hr = %08x and not E_INVALIDARG\n", hr); + + pins[0] = (void *)0xdead; + pins[1] = (void *)0xdeed; + + hr = IEnumPins_Next(pin_enum, 2, pins, &ref); + ok(hr == S_FALSE, "hr = %08x instead of S_FALSE\n", hr); + ok(pins[0] != (void *)0xdead && pins[0] != NULL, "pins[0] = %p\n", pins[0]); + if (pins[0] != (void *)0xdead && pins[0] != NULL) + { + test_pin(pins[0]); + IPin_Release(pins[0]); + } + + ok(pins[1] == (void *)0xdeed, "pins[1] = %p\n", pins[1]); + + ref = IEnumPins_Release(pin_enum); + ok(ref == 0, "ref is %u and not 0!\n", ref); + + IBaseFilter_Release(base); +} + +START_TEST(dsoundrender) +{ + CoInitialize(NULL); + if (!create_dsound_renderer()) + return; + + test_query_interface(); + test_basefilter(); + + release_dsound_renderer(); + + CoUninitialize(); +} diff --git a/rostests/winetests/quartz/quartz.rbuild b/rostests/winetests/quartz/quartz.rbuild index 4e6ab816799..fe3d780268a 100644 --- a/rostests/winetests/quartz/quartz.rbuild +++ b/rostests/winetests/quartz/quartz.rbuild @@ -2,6 +2,7 @@ . avisplitter.c + dsoundrender.c filtergraph.c filtermapper.c memallocator.c diff --git a/rostests/winetests/quartz/referenceclock.c b/rostests/winetests/quartz/referenceclock.c index 164fc3d89f8..ddce02eaa72 100644 --- a/rostests/winetests/quartz/referenceclock.c +++ b/rostests/winetests/quartz/referenceclock.c @@ -54,7 +54,7 @@ static void test_IReferenceClock_methods(const char * clockdesc, IReferenceClock HRESULT hr; REFERENCE_TIME time1; REFERENCE_TIME time2; - signed long diff; + LONG diff; /* Test response from invalid (NULL) argument */ hr = IReferenceClock_GetTime(pClock, NULL); @@ -86,7 +86,7 @@ static void test_IReferenceClock_methods(const char * clockdesc, IReferenceClock /* FIXME: How much deviation should be allowed after a sleep? */ /* 0.3% is common, and 0.4% is sometimes observed. */ diff = time2 - time1; - ok (9940000 <= diff && diff <= 10240000, "%s - Expected difference around 10000000, got %lu\n", clockdesc, diff); + ok (9940000 <= diff && diff <= 10240000, "%s - Expected difference around 10000000, got %u\n", clockdesc, diff); } diff --git a/rostests/winetests/rasapi32/rasapi.c b/rostests/winetests/rasapi32/rasapi.c index 11fca0eb4ad..d25c7411301 100644 --- a/rostests/winetests/rasapi32/rasapi.c +++ b/rostests/winetests/rasapi32/rasapi.c @@ -55,7 +55,8 @@ static void test_rasenum(void) /* create the return buffer */ result = pRasEnumDevicesA(NULL, &bufsize, &cDevices); - if(ERROR_RASMAN_CANNOT_INITIALIZE == result) { + if(ERROR_RASMAN_CANNOT_INITIALIZE == result || + ERROR_STATE_MACHINES_NOT_STARTED == result) { win_skip("RAS configuration problem\n"); return; } @@ -67,7 +68,7 @@ static void test_rasenum(void) ok(result == ERROR_BUFFER_TOO_SMALL, "Expected ERROR_BUFFER_TOO_SMALL, got %08d\n", result); - rasDevInfo = (LPRASDEVINFO) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + rasDevInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, max(bufsize,sizeof(RASDEVINFOA))); if(!rasDevInfo) { win_skip("failed to allocate buffer for RasEnumDevicesA tests\n"); diff --git a/rostests/winetests/riched20/editor.c b/rostests/winetests/riched20/editor.c index ee266836f0f..685eeade3fe 100644 --- a/rostests/winetests/riched20/editor.c +++ b/rostests/winetests/riched20/editor.c @@ -4318,7 +4318,7 @@ const struct exsetsel_s exsetsel_tests[] = { static void check_EM_EXSETSEL(HWND hwnd, const struct exsetsel_s *setsel, int id) { CHARRANGE cr; - long result; + LRESULT result; int start, end; cr.cpMin = setsel->min; diff --git a/rostests/winetests/rsaenh/rsaenh.c b/rostests/winetests/rsaenh/rsaenh.c index cb560f21e0e..5ee85f42a05 100644 --- a/rostests/winetests/rsaenh/rsaenh.c +++ b/rostests/winetests/rsaenh/rsaenh.c @@ -135,6 +135,7 @@ static int init_base_environment(DWORD dwKeyFlags) if (!CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, 0)) { ok(GetLastError()==NTE_BAD_KEYSET || + broken(GetLastError() == NTE_TEMPORARY_PROFILE /* some Win7 setups */) || broken(GetLastError() == NTE_KEYSET_NOT_DEF /* Win9x/NT4 */), "%08x\n", GetLastError()); if (GetLastError()!=NTE_BAD_KEYSET) @@ -300,6 +301,84 @@ static BOOL derive_key(ALG_ID aiAlgid, HCRYPTKEY *phKey, DWORD len) return TRUE; } +static BYTE abPlainPrivateKey[596] = { + 0x07, 0x02, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, + 0x52, 0x53, 0x41, 0x32, 0x00, 0x04, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x9b, 0x64, 0xef, 0xce, + 0x31, 0x7c, 0xad, 0x56, 0xe2, 0x1e, 0x9b, 0x96, + 0xb3, 0xf0, 0x29, 0x88, 0x6e, 0xa8, 0xc2, 0x11, + 0x33, 0xd6, 0xcc, 0x8c, 0x69, 0xb2, 0x1a, 0xfd, + 0xfc, 0x23, 0x21, 0x30, 0x4d, 0x29, 0x45, 0xb6, + 0x3a, 0x67, 0x11, 0x80, 0x1a, 0x91, 0xf2, 0x9f, + 0x01, 0xac, 0xc0, 0x11, 0x50, 0x5f, 0xcd, 0xb9, + 0xad, 0x76, 0x9f, 0x6e, 0x91, 0x55, 0x71, 0xda, + 0x97, 0x96, 0x96, 0x22, 0x75, 0xb4, 0x83, 0x44, + 0x89, 0x9e, 0xf8, 0x44, 0x40, 0x7c, 0xd6, 0xcd, + 0x9d, 0x88, 0xd6, 0x88, 0xbc, 0x56, 0xb7, 0x64, + 0xe9, 0x2c, 0x24, 0x2f, 0x0d, 0x78, 0x55, 0x1c, + 0xb2, 0x67, 0xb1, 0x5e, 0xbc, 0x0c, 0xcf, 0x1c, + 0xe9, 0xd3, 0x9e, 0xa2, 0x15, 0x24, 0x73, 0xd6, + 0xdb, 0x6f, 0x83, 0xb2, 0xf8, 0xbc, 0xe7, 0x47, + 0x3b, 0x01, 0xef, 0x49, 0x08, 0x98, 0xd6, 0xa3, + 0xf9, 0x25, 0x57, 0xe9, 0x39, 0x3c, 0x53, 0x30, + 0x1b, 0xf2, 0xc9, 0x62, 0x31, 0x43, 0x5d, 0x84, + 0x24, 0x30, 0x21, 0x9a, 0xad, 0xdb, 0x62, 0x91, + 0xc8, 0x07, 0xd9, 0x2f, 0xd6, 0xb5, 0x37, 0x6f, + 0xfe, 0x7a, 0x12, 0xbc, 0xd9, 0xd2, 0x2b, 0xbf, + 0xd7, 0xb1, 0xfa, 0x7d, 0xc0, 0x48, 0xdd, 0x74, + 0xdd, 0x55, 0x04, 0xa1, 0x8b, 0xc1, 0x0a, 0xc4, + 0xa5, 0x57, 0x62, 0xee, 0x08, 0x8b, 0xf9, 0x19, + 0x6c, 0x52, 0x06, 0xf8, 0x73, 0x0f, 0x24, 0xc9, + 0x71, 0x9f, 0xc5, 0x45, 0x17, 0x3e, 0xae, 0x06, + 0x81, 0xa2, 0x96, 0x40, 0x06, 0xbf, 0xeb, 0x9e, + 0x80, 0x2b, 0x27, 0x20, 0x8f, 0x38, 0xcf, 0xeb, + 0xff, 0x3b, 0x38, 0x41, 0x35, 0x69, 0x66, 0x13, + 0x1d, 0x3c, 0x01, 0x3b, 0xf6, 0x37, 0xca, 0x9c, + 0x61, 0x74, 0x98, 0xcf, 0xc9, 0x6e, 0xe8, 0x90, + 0xc7, 0xb7, 0x33, 0xc0, 0x07, 0x3c, 0xf8, 0xc8, + 0xf6, 0xf2, 0xd7, 0xf0, 0x21, 0x62, 0x58, 0x8a, + 0x55, 0xbf, 0xa1, 0x2d, 0x3d, 0xa6, 0x69, 0xc5, + 0x02, 0x19, 0x31, 0xf0, 0x94, 0x0f, 0x45, 0x5c, + 0x95, 0x1b, 0x53, 0xbc, 0xf5, 0xb0, 0x1a, 0x8f, + 0xbf, 0x40, 0xe0, 0xc7, 0x73, 0xe7, 0x72, 0x6e, + 0xeb, 0xb1, 0x0f, 0x38, 0xc5, 0xf8, 0xee, 0x04, + 0xed, 0x34, 0x1a, 0x10, 0xf9, 0x53, 0x34, 0xf3, + 0x3e, 0xe6, 0x5c, 0xd1, 0x47, 0x65, 0xcd, 0xbd, + 0xf1, 0x06, 0xcb, 0xb4, 0xb1, 0x26, 0x39, 0x9f, + 0x71, 0xfe, 0x3d, 0xf8, 0x62, 0xab, 0x22, 0x8b, + 0x0e, 0xdc, 0xb9, 0xe8, 0x74, 0x06, 0xfc, 0x8c, + 0x25, 0xa1, 0xa9, 0xcf, 0x07, 0xf9, 0xac, 0x21, + 0x01, 0x7b, 0x1c, 0xdc, 0x94, 0xbd, 0x47, 0xe1, + 0xa0, 0x86, 0x59, 0x35, 0x6a, 0x6f, 0xb9, 0x70, + 0x26, 0x7c, 0x3c, 0xfd, 0xbd, 0x81, 0x39, 0x36, + 0x42, 0xc2, 0xbd, 0xbe, 0x84, 0x27, 0x9a, 0x69, + 0x81, 0xda, 0x99, 0x27, 0xc2, 0x4f, 0x62, 0x33, + 0xf4, 0x79, 0x30, 0xc5, 0x63, 0x54, 0x71, 0xf1, + 0x47, 0x22, 0x25, 0x9b, 0x6c, 0x00, 0x2f, 0x1c, + 0xf4, 0x1f, 0x85, 0xbc, 0xf6, 0x67, 0x6a, 0xe3, + 0xf6, 0x55, 0x8a, 0xef, 0xd0, 0x0b, 0xd3, 0xa2, + 0xc5, 0x51, 0x70, 0x15, 0x0a, 0xf0, 0x98, 0x4c, + 0xb7, 0x19, 0x62, 0x0e, 0x2d, 0x2a, 0x4a, 0x7d, + 0x7a, 0x0a, 0xc4, 0x17, 0xe3, 0x5d, 0x20, 0x52, + 0xa9, 0x98, 0xc3, 0xaa, 0x11, 0xf6, 0xbf, 0x4c, + 0x94, 0x99, 0x81, 0x89, 0xf0, 0x7f, 0x66, 0xaa, + 0xc8, 0x88, 0xd7, 0x31, 0x84, 0x71, 0xb6, 0x64, + 0x09, 0x76, 0x0b, 0x7f, 0x1a, 0x1f, 0x2e, 0xfe, + 0xcd, 0x59, 0x2a, 0x54, 0x11, 0x84, 0xd4, 0x6a, + 0x61, 0xdf, 0xaa, 0x76, 0x66, 0x9d, 0x82, 0x11, + 0x56, 0x3d, 0xd2, 0x52, 0xe6, 0x42, 0x5a, 0x77, + 0x92, 0x98, 0x34, 0xf3, 0x56, 0x6c, 0x96, 0x10, + 0x40, 0x59, 0x16, 0xcb, 0x77, 0x61, 0xe3, 0xbf, + 0x4b, 0xd4, 0x39, 0xfb, 0xb1, 0x4e, 0xc1, 0x74, + 0xec, 0x7a, 0xea, 0x3d, 0x68, 0xbb, 0x0b, 0xe6, + 0xc6, 0x06, 0xbf, 0xdd, 0x7f, 0x94, 0x42, 0xc0, + 0x0f, 0xe4, 0x92, 0x33, 0x6c, 0x6e, 0x1b, 0xba, + 0x73, 0xf9, 0x79, 0x84, 0xdf, 0x45, 0x00, 0xe4, + 0x94, 0x88, 0x9d, 0x08, 0x89, 0xcf, 0xf2, 0xa4, + 0xc5, 0x47, 0x45, 0x85, 0x86, 0xa5, 0xcc, 0xa8, + 0xf2, 0x5d, 0x58, 0x07 +}; + static void test_hashes(void) { static const unsigned char md2hash[16] = { @@ -317,11 +396,24 @@ static void test_hashes(void) static const unsigned char sha1hash[20] = { 0xf1, 0x0c, 0xcf, 0xde, 0x60, 0xc1, 0x7d, 0xb2, 0x6e, 0x7d, 0x85, 0xd3, 0x56, 0x65, 0xc7, 0x66, 0x1d, 0xbb, 0xeb, 0x2c }; + static const unsigned char signed_ssl3_shamd5_hash[] = { + 0x4f,0xcc,0x2f,0x33,0x44,0x60,0x76,0x16,0x13,0xc8,0xff,0xd4,0x59,0x19, + 0xde,0x85,0x44,0x72,0x47,0x98,0x01,0xfb,0x67,0x5c,0x5b,0x35,0x15,0x0f, + 0x91,0xda,0xc7,0x7c,0xfb,0xe2,0x18,0xef,0xac,0x31,0x40,0x7b,0xa9,0x83, + 0xdb,0x30,0xcd,0x94,0x4b,0x8e,0x3b,0x6c,0x7a,0x86,0x59,0xf0,0xd1,0xd2, + 0x5e,0xce,0xd4,0x1b,0x7f,0xed,0x24,0xee,0x53,0x5c,0x15,0x97,0x21,0x7c, + 0x5c,0xea,0xab,0xf5,0xd6,0x4b,0xb3,0xbb,0x14,0xf5,0x59,0x9e,0x21,0x90, + 0x21,0x99,0x19,0xad,0xa2,0xa6,0xea,0x61,0xc1,0x41,0xe2,0x70,0x77,0xf7, + 0x15,0x68,0x96,0x1e,0x5c,0x84,0x97,0xe3,0x5c,0xd2,0xd9,0xfb,0x87,0x6f, + 0x11,0x21,0x82,0x43,0x76,0x32,0xa4,0x38,0x7b,0x85,0x22,0x30,0x1e,0x55, + 0x79,0x93 }; unsigned char pbData[2048]; BOOL result; HCRYPTHASH hHash, hHashClone; HCRYPTPROV prov; BYTE pbHashValue[36]; + BYTE pbSigValue[128]; + HCRYPTKEY hKeyExchangeKey; DWORD hashlen, len, error; int i; @@ -521,6 +613,59 @@ static void test_hashes(void) result = CryptReleaseContext(prov, 0); ok(result, "CryptReleaseContext failed 0x%08x\n", GetLastError()); + + /* Test CALG_SSL3_SHAMD5 */ + result = CryptAcquireContextA(&prov, NULL, szProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + ok(result, "CryptAcquireContext failed 0x%08x\n", GetLastError()); + + /* Step 1: create an MD5 hash of the data */ + result = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash); + ok(result, "CryptCreateHash failed 0x%08x\n", GetLastError()); + result = CryptHashData(hHash, pbData, sizeof(pbData), 0); + ok(result, "%08x\n", GetLastError()); + len = 16; + result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue, &len, 0); + ok(result, "CryptGetHashParam failed 0x%08x\n", GetLastError()); + result = CryptDestroyHash(hHash); + ok(result, "CryptDestroyHash failed 0x%08x\n", GetLastError()); + /* Step 2: create a SHA1 hash of the data */ + result = CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash); + ok(result, "CryptCreateHash failed 0x%08x\n", GetLastError()); + result = CryptHashData(hHash, pbData, sizeof(pbData), 0); + ok(result, "%08x\n", GetLastError()); + len = 20; + result = CryptGetHashParam(hHash, HP_HASHVAL, pbHashValue + 16, &len, 0); + ok(result, "CryptGetHashParam failed 0x%08x\n", GetLastError()); + result = CryptDestroyHash(hHash); + ok(result, "CryptDestroyHash failed 0x%08x\n", GetLastError()); + /* Step 3: create a CALG_SSL3_SHAMD5 hash handle */ + result = CryptCreateHash(hProv, CALG_SSL3_SHAMD5, 0, 0, &hHash); + ok(result, "CryptCreateHash failed 0x%08x\n", GetLastError()); + /* Test that CryptHashData fails on this hash */ + result = CryptHashData(hHash, pbData, sizeof(pbData), 0); + ok(!result && GetLastError() == NTE_BAD_ALGID, "%08x\n", GetLastError()); + result = CryptSetHashParam(hHash, HP_HASHVAL, pbHashValue, 0); + ok(result, "%08x\n", GetLastError()); + len = (DWORD)sizeof(abPlainPrivateKey); + result = CryptImportKey(hProv, abPlainPrivateKey, len, 0, 0, &hKeyExchangeKey); + ok(result, "%08x\n", GetLastError()); + len = 0; + result = CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, NULL, &len); + ok(result, "%08x\n", GetLastError()); + ok(len == 128, "expected len 128, got %d\n", len); + result = CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0, pbSigValue, &len); + ok(result, "%08x\n", GetLastError()); + ok(!memcmp(pbSigValue, signed_ssl3_shamd5_hash, len), "unexpected value\n"); + if (len != 128 || memcmp(pbSigValue, signed_ssl3_shamd5_hash, len)) + { + printBytes("expected", signed_ssl3_shamd5_hash, + sizeof(signed_ssl3_shamd5_hash)); + printBytes("got", pbSigValue, len); + } + result = CryptDestroyHash(hHash); + ok(result, "CryptDestroyHash failed 0x%08x\n", GetLastError()); + result = CryptReleaseContext(prov, 0); + ok(result, "CryptReleaseContext failed 0x%08x\n", GetLastError()); } static void test_block_cipher_modes(void) @@ -1337,84 +1482,6 @@ static void test_mac(void) { ok(result, "%08x\n", GetLastError()); } -static BYTE abPlainPrivateKey[596] = { - 0x07, 0x02, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, - 0x52, 0x53, 0x41, 0x32, 0x00, 0x04, 0x00, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x9b, 0x64, 0xef, 0xce, - 0x31, 0x7c, 0xad, 0x56, 0xe2, 0x1e, 0x9b, 0x96, - 0xb3, 0xf0, 0x29, 0x88, 0x6e, 0xa8, 0xc2, 0x11, - 0x33, 0xd6, 0xcc, 0x8c, 0x69, 0xb2, 0x1a, 0xfd, - 0xfc, 0x23, 0x21, 0x30, 0x4d, 0x29, 0x45, 0xb6, - 0x3a, 0x67, 0x11, 0x80, 0x1a, 0x91, 0xf2, 0x9f, - 0x01, 0xac, 0xc0, 0x11, 0x50, 0x5f, 0xcd, 0xb9, - 0xad, 0x76, 0x9f, 0x6e, 0x91, 0x55, 0x71, 0xda, - 0x97, 0x96, 0x96, 0x22, 0x75, 0xb4, 0x83, 0x44, - 0x89, 0x9e, 0xf8, 0x44, 0x40, 0x7c, 0xd6, 0xcd, - 0x9d, 0x88, 0xd6, 0x88, 0xbc, 0x56, 0xb7, 0x64, - 0xe9, 0x2c, 0x24, 0x2f, 0x0d, 0x78, 0x55, 0x1c, - 0xb2, 0x67, 0xb1, 0x5e, 0xbc, 0x0c, 0xcf, 0x1c, - 0xe9, 0xd3, 0x9e, 0xa2, 0x15, 0x24, 0x73, 0xd6, - 0xdb, 0x6f, 0x83, 0xb2, 0xf8, 0xbc, 0xe7, 0x47, - 0x3b, 0x01, 0xef, 0x49, 0x08, 0x98, 0xd6, 0xa3, - 0xf9, 0x25, 0x57, 0xe9, 0x39, 0x3c, 0x53, 0x30, - 0x1b, 0xf2, 0xc9, 0x62, 0x31, 0x43, 0x5d, 0x84, - 0x24, 0x30, 0x21, 0x9a, 0xad, 0xdb, 0x62, 0x91, - 0xc8, 0x07, 0xd9, 0x2f, 0xd6, 0xb5, 0x37, 0x6f, - 0xfe, 0x7a, 0x12, 0xbc, 0xd9, 0xd2, 0x2b, 0xbf, - 0xd7, 0xb1, 0xfa, 0x7d, 0xc0, 0x48, 0xdd, 0x74, - 0xdd, 0x55, 0x04, 0xa1, 0x8b, 0xc1, 0x0a, 0xc4, - 0xa5, 0x57, 0x62, 0xee, 0x08, 0x8b, 0xf9, 0x19, - 0x6c, 0x52, 0x06, 0xf8, 0x73, 0x0f, 0x24, 0xc9, - 0x71, 0x9f, 0xc5, 0x45, 0x17, 0x3e, 0xae, 0x06, - 0x81, 0xa2, 0x96, 0x40, 0x06, 0xbf, 0xeb, 0x9e, - 0x80, 0x2b, 0x27, 0x20, 0x8f, 0x38, 0xcf, 0xeb, - 0xff, 0x3b, 0x38, 0x41, 0x35, 0x69, 0x66, 0x13, - 0x1d, 0x3c, 0x01, 0x3b, 0xf6, 0x37, 0xca, 0x9c, - 0x61, 0x74, 0x98, 0xcf, 0xc9, 0x6e, 0xe8, 0x90, - 0xc7, 0xb7, 0x33, 0xc0, 0x07, 0x3c, 0xf8, 0xc8, - 0xf6, 0xf2, 0xd7, 0xf0, 0x21, 0x62, 0x58, 0x8a, - 0x55, 0xbf, 0xa1, 0x2d, 0x3d, 0xa6, 0x69, 0xc5, - 0x02, 0x19, 0x31, 0xf0, 0x94, 0x0f, 0x45, 0x5c, - 0x95, 0x1b, 0x53, 0xbc, 0xf5, 0xb0, 0x1a, 0x8f, - 0xbf, 0x40, 0xe0, 0xc7, 0x73, 0xe7, 0x72, 0x6e, - 0xeb, 0xb1, 0x0f, 0x38, 0xc5, 0xf8, 0xee, 0x04, - 0xed, 0x34, 0x1a, 0x10, 0xf9, 0x53, 0x34, 0xf3, - 0x3e, 0xe6, 0x5c, 0xd1, 0x47, 0x65, 0xcd, 0xbd, - 0xf1, 0x06, 0xcb, 0xb4, 0xb1, 0x26, 0x39, 0x9f, - 0x71, 0xfe, 0x3d, 0xf8, 0x62, 0xab, 0x22, 0x8b, - 0x0e, 0xdc, 0xb9, 0xe8, 0x74, 0x06, 0xfc, 0x8c, - 0x25, 0xa1, 0xa9, 0xcf, 0x07, 0xf9, 0xac, 0x21, - 0x01, 0x7b, 0x1c, 0xdc, 0x94, 0xbd, 0x47, 0xe1, - 0xa0, 0x86, 0x59, 0x35, 0x6a, 0x6f, 0xb9, 0x70, - 0x26, 0x7c, 0x3c, 0xfd, 0xbd, 0x81, 0x39, 0x36, - 0x42, 0xc2, 0xbd, 0xbe, 0x84, 0x27, 0x9a, 0x69, - 0x81, 0xda, 0x99, 0x27, 0xc2, 0x4f, 0x62, 0x33, - 0xf4, 0x79, 0x30, 0xc5, 0x63, 0x54, 0x71, 0xf1, - 0x47, 0x22, 0x25, 0x9b, 0x6c, 0x00, 0x2f, 0x1c, - 0xf4, 0x1f, 0x85, 0xbc, 0xf6, 0x67, 0x6a, 0xe3, - 0xf6, 0x55, 0x8a, 0xef, 0xd0, 0x0b, 0xd3, 0xa2, - 0xc5, 0x51, 0x70, 0x15, 0x0a, 0xf0, 0x98, 0x4c, - 0xb7, 0x19, 0x62, 0x0e, 0x2d, 0x2a, 0x4a, 0x7d, - 0x7a, 0x0a, 0xc4, 0x17, 0xe3, 0x5d, 0x20, 0x52, - 0xa9, 0x98, 0xc3, 0xaa, 0x11, 0xf6, 0xbf, 0x4c, - 0x94, 0x99, 0x81, 0x89, 0xf0, 0x7f, 0x66, 0xaa, - 0xc8, 0x88, 0xd7, 0x31, 0x84, 0x71, 0xb6, 0x64, - 0x09, 0x76, 0x0b, 0x7f, 0x1a, 0x1f, 0x2e, 0xfe, - 0xcd, 0x59, 0x2a, 0x54, 0x11, 0x84, 0xd4, 0x6a, - 0x61, 0xdf, 0xaa, 0x76, 0x66, 0x9d, 0x82, 0x11, - 0x56, 0x3d, 0xd2, 0x52, 0xe6, 0x42, 0x5a, 0x77, - 0x92, 0x98, 0x34, 0xf3, 0x56, 0x6c, 0x96, 0x10, - 0x40, 0x59, 0x16, 0xcb, 0x77, 0x61, 0xe3, 0xbf, - 0x4b, 0xd4, 0x39, 0xfb, 0xb1, 0x4e, 0xc1, 0x74, - 0xec, 0x7a, 0xea, 0x3d, 0x68, 0xbb, 0x0b, 0xe6, - 0xc6, 0x06, 0xbf, 0xdd, 0x7f, 0x94, 0x42, 0xc0, - 0x0f, 0xe4, 0x92, 0x33, 0x6c, 0x6e, 0x1b, 0xba, - 0x73, 0xf9, 0x79, 0x84, 0xdf, 0x45, 0x00, 0xe4, - 0x94, 0x88, 0x9d, 0x08, 0x89, 0xcf, 0xf2, 0xa4, - 0xc5, 0x47, 0x45, 0x85, 0x86, 0xa5, 0xcc, 0xa8, - 0xf2, 0x5d, 0x58, 0x07 -}; - static void test_import_private(void) { DWORD dwLen, dwVal; @@ -1803,8 +1870,8 @@ static void test_rsa_encrypt(void) /* An RSA key doesn't support salt */ result = CryptGetKeyParam(hRSAKey, KP_SALT, NULL, &dwLen, 0); - ok(!result && GetLastError() == NTE_BAD_KEY, - "expected NTE_BAD_KEY, got %08x\n", GetLastError()); + ok(!result && (GetLastError() == NTE_BAD_KEY || GetLastError() == NTE_NOT_FOUND /* Win7 */), + "expected NTE_BAD_KEY or NTE_NOT_FOUND, got %08x\n", GetLastError()); /* The key exchange key's public key may be exported.. */ result = CryptExportKey(hRSAKey, 0, PUBLICKEYBLOB, 0, NULL, &dwLen);