diff --git a/rostests/winetests/advapi32/cred.c b/rostests/winetests/advapi32/cred.c index 58103c63166..ad06fd5ffd7 100644 --- a/rostests/winetests/advapi32/cred.c +++ b/rostests/winetests/advapi32/cred.c @@ -238,7 +238,13 @@ static void test_generic(void) new_cred.UserName = (char *)"winetest"; ret = pCredWriteA(&new_cred, 0); - ok(ret, "CredWriteA failed with error %d\n", GetLastError()); + ok(ret || broken(GetLastError() == ERROR_NO_SUCH_LOGON_SESSION), + "CredWriteA failed with error %d\n", GetLastError()); + if (!ret) + { + skip("couldn't write generic credentials, skipping tests\n"); + return; + } ret = pCredEnumerateA(NULL, 0, &count, &creds); ok(ret, "CredEnumerateA failed with error %d\n", GetLastError()); @@ -345,7 +351,7 @@ START_TEST(cred) if (!pCredEnumerateA || !pCredFree || !pCredWriteA || !pCredDeleteA || !pCredReadA) { - skip("credentials functions not present in advapi32.dll\n"); + win_skip("credentials functions not present in advapi32.dll\n"); return; } diff --git a/rostests/winetests/advapi32/crypt.c b/rostests/winetests/advapi32/crypt.c index 41759d5b9b9..4ce89078f84 100644 --- a/rostests/winetests/advapi32/crypt.c +++ b/rostests/winetests/advapi32/crypt.c @@ -331,7 +331,7 @@ static void test_incorrect_api_usage(void) GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%d\n", GetLastError()); } else - skip("CryptSignHashW is not available\n"); + win_skip("CryptSignHashW is not available\n"); result = pCryptSetKeyParam(hKey, 0, &temp, 1); ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError()); @@ -349,7 +349,7 @@ static void test_incorrect_api_usage(void) GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), "%d\n", GetLastError()); } else - skip("CryptVerifySignatureW is not available\n"); + win_skip("CryptVerifySignatureW is not available\n"); result = pCryptDestroyHash(hHash); ok (!result && GetLastError() == ERROR_INVALID_PARAMETER, "%d\n", GetLastError()); @@ -394,7 +394,7 @@ static void test_verify_sig(void) if (!pCryptVerifySignatureW) { - skip("CryptVerifySignatureW is not available\n"); + win_skip("CryptVerifySignatureW is not available\n"); return; } @@ -402,7 +402,7 @@ static void test_verify_sig(void) ret = pCryptVerifySignatureW(0, NULL, 0, 0, NULL, 0); if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("CryptVerifySignatureW is not implemented\n"); + win_skip("CryptVerifySignatureW is not implemented\n"); return; } ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, @@ -497,13 +497,13 @@ static void test_enum_providers(void) if(!pCryptEnumProvidersA) { - skip("CryptEnumProvidersA is not available\n"); + win_skip("CryptEnumProvidersA is not available\n"); return; } if (!FindProvRegVals(dwIndex, &dwType, &pszProvName, &cbName, &provCount)) { - skip("Could not find providers in registry\n"); + win_skip("Could not find providers in registry\n"); return; } @@ -643,7 +643,7 @@ static void test_enum_provider_types(void) if(!pCryptEnumProviderTypesA) { - skip("CryptEnumProviderTypesA is not available\n"); + win_skip("CryptEnumProviderTypesA is not available\n"); return; } @@ -784,7 +784,7 @@ static void test_get_default_provider(void) if(!pCryptGetDefaultProviderA) { - skip("CryptGetDefaultProviderA is not available\n"); + win_skip("CryptGetDefaultProviderA is not available\n"); return; } @@ -858,7 +858,7 @@ static void test_set_provider_ex(void) if(!pCryptGetDefaultProviderA || !pCryptSetProviderExA) { - skip("CryptGetDefaultProviderA and/or CryptSetProviderExA are not available\n"); + win_skip("CryptGetDefaultProviderA and/or CryptSetProviderExA are not available\n"); return; } diff --git a/rostests/winetests/advapi32/crypt_lmhash.c b/rostests/winetests/advapi32/crypt_lmhash.c index df1d3a73b6b..253090a970e 100644 --- a/rostests/winetests/advapi32/crypt_lmhash.c +++ b/rostests/winetests/advapi32/crypt_lmhash.c @@ -43,8 +43,8 @@ typedef VOID (WINAPI *fnSystemFunction006)( PCSTR passwd, PSTR lmhash ); typedef NTSTATUS (WINAPI *fnSystemFunction008)(const BYTE *, const BYTE *, LPBYTE); typedef NTSTATUS (WINAPI *fnSystemFunction009)(const BYTE *, const BYTE *, LPBYTE); typedef int (WINAPI *descrypt)(unsigned char *, unsigned char *, unsigned char *); -typedef NTSTATUS (WINAPI *fnSystemFunction030)(void*, void*); -typedef NTSTATUS (WINAPI *fnSystemFunction032)(struct ustring *, struct ustring *); +typedef NTSTATUS (WINAPI *fnSystemFunction030)(const void*, const void*); +typedef NTSTATUS (WINAPI *fnSystemFunction032)(struct ustring *, const struct ustring *); fnSystemFunction001 pSystemFunction001; fnSystemFunction002 pSystemFunction002; @@ -413,7 +413,7 @@ static void test_SystemFunction_encrypt(descrypt func, int num) if (!func) { - skip("SystemFunction%03d is not available\n", num); + win_skip("SystemFunction%03d is not available\n", num); return; } @@ -434,7 +434,7 @@ static void test_SystemFunction_decrypt(descrypt func, int num) if (!func) { - skip("SystemFunction%03d is not available\n", num); + win_skip("SystemFunction%03d is not available\n", num); return; } @@ -460,7 +460,7 @@ static void test_SystemFunction_enc32(descrypt func, int num) if (!func) { - skip("SystemFunction%03d is not available\n", num); + win_skip("SystemFunction%03d is not available\n", num); return; } @@ -482,7 +482,7 @@ static void test_SystemFunction_dec32(descrypt func, int num) if (!func) { - skip("SystemFunction%03d is not available\n", num); + win_skip("SystemFunction%03d is not available\n", num); return; } @@ -504,7 +504,7 @@ static void test_memcmpfunc(memcmpfunc fn) if (!fn) { - skip("function is not available\n"); + win_skip("function is not available\n"); return; } @@ -549,49 +549,49 @@ START_TEST(crypt_lmhash) if (pSystemFunction001) test_SystemFunction001(); else - skip("SystemFunction001 is not available\n"); + win_skip("SystemFunction001 is not available\n"); pSystemFunction002 = (fnSystemFunction002)GetProcAddress( module, "SystemFunction002" ); if (pSystemFunction002) test_SystemFunction002(); else - skip("SystemFunction002 is not available\n"); + win_skip("SystemFunction002 is not available\n"); pSystemFunction003 = (fnSystemFunction003)GetProcAddress( module, "SystemFunction003" ); if (pSystemFunction003) test_SystemFunction003(); else - skip("SystemFunction002 is not available\n"); + win_skip("SystemFunction002 is not available\n"); pSystemFunction004 = (fnSystemFunction004)GetProcAddress( module, "SystemFunction004" ); if (pSystemFunction004) test_SystemFunction004(); else - skip("SystemFunction004 is not available\n"); + win_skip("SystemFunction004 is not available\n"); pSystemFunction005 = (fnSystemFunction005)GetProcAddress( module, "SystemFunction005" ); if (pSystemFunction005) test_SystemFunction005(); else - skip("SystemFunction005 is not available\n"); + win_skip("SystemFunction005 is not available\n"); pSystemFunction006 = (fnSystemFunction006)GetProcAddress( module, "SystemFunction006" ); if (pSystemFunction006) test_SystemFunction006(); else - skip("SystemFunction006 is not available\n"); + win_skip("SystemFunction006 is not available\n"); pSystemFunction008 = (fnSystemFunction008)GetProcAddress( module, "SystemFunction008" ); if (pSystemFunction008) test_SystemFunction008(); else - skip("SystemFunction008 is not available\n"); + win_skip("SystemFunction008 is not available\n"); pSystemFunction009 = (fnSystemFunction009)GetProcAddress( module, "SystemFunction009" ); if (pSystemFunction009) test_SystemFunction009(); else - skip("SystemFunction009 is not available\n"); + win_skip("SystemFunction009 is not available\n"); pSystemFunction012 = (descrypt) GetProcAddress( module, "SystemFunction012"); pSystemFunction013 = (descrypt) GetProcAddress( module, "SystemFunction013"); @@ -645,5 +645,5 @@ START_TEST(crypt_lmhash) if (pSystemFunction032) test_SystemFunction032(); else - skip("SystemFunction032 is not available\n"); + win_skip("SystemFunction032 is not available\n"); } diff --git a/rostests/winetests/advapi32/crypt_md4.c b/rostests/winetests/advapi32/crypt_md4.c index 02e4c02b192..e866910d970 100644 --- a/rostests/winetests/advapi32/crypt_md4.c +++ b/rostests/winetests/advapi32/crypt_md4.c @@ -156,23 +156,23 @@ START_TEST(crypt_md4) if (pMD4Init && pMD4Update && pMD4Final) test_md4_ctx(); else - skip("MD4Init and/or MD4Update and/or MD4Final are not available\n"); + win_skip("MD4Init and/or MD4Update and/or MD4Final are not available\n"); pSystemFunction007 = (fnSystemFunction007)GetProcAddress( module, "SystemFunction007" ); if (pSystemFunction007) test_SystemFunction007(); else - skip("SystemFunction007 is not available\n"); + win_skip("SystemFunction007 is not available\n"); pSystemFunction010 = (md4hashfunc)GetProcAddress( module, "SystemFunction010" ); if (pSystemFunction010) test_md4hashfunc(pSystemFunction010); else - skip("SystemFunction010 is not available\n"); + win_skip("SystemFunction010 is not available\n"); pSystemFunction011 = (md4hashfunc)GetProcAddress( module, "SystemFunction011" ); if (pSystemFunction011) test_md4hashfunc(pSystemFunction011); else - skip("SystemFunction011 is not available\n"); + win_skip("SystemFunction011 is not available\n"); } diff --git a/rostests/winetests/advapi32/crypt_md5.c b/rostests/winetests/advapi32/crypt_md5.c index 4c6346cba44..9136dfbc28c 100644 --- a/rostests/winetests/advapi32/crypt_md5.c +++ b/rostests/winetests/advapi32/crypt_md5.c @@ -85,7 +85,7 @@ static void test_md5_ctx(void) if (!pMD5Init || !pMD5Update || !pMD5Final) { - skip("Needed functions are not available\n"); + win_skip("Needed functions are not available\n"); return; } diff --git a/rostests/winetests/advapi32/crypt_sha.c b/rostests/winetests/advapi32/crypt_sha.c index cfdaf991d41..025f2cdcd47 100644 --- a/rostests/winetests/advapi32/crypt_sha.c +++ b/rostests/winetests/advapi32/crypt_sha.c @@ -53,7 +53,7 @@ static void test_sha_ctx(void) if (!pA_SHAInit || !pA_SHAUpdate || !pA_SHAFinal) { - skip("A_SHAInit and/or A_SHAUpdate and/or A_SHAFinal are not available\n"); + win_skip("A_SHAInit and/or A_SHAUpdate and/or A_SHAFinal are not available\n"); return; } diff --git a/rostests/winetests/advapi32/lsa.c b/rostests/winetests/advapi32/lsa.c index 90fbe1031b1..39c91d38123 100644 --- a/rostests/winetests/advapi32/lsa.c +++ b/rostests/winetests/advapi32/lsa.c @@ -182,7 +182,7 @@ static void test_lsa(void) START_TEST(lsa) { if (!init()) { - skip("Needed functions are not available\n"); + win_skip("Needed functions are not available\n"); return; } diff --git a/rostests/winetests/advapi32/registry.c b/rostests/winetests/advapi32/registry.c index b63b3e260dd..a3d9f300672 100644 --- a/rostests/winetests/advapi32/registry.c +++ b/rostests/winetests/advapi32/registry.c @@ -47,9 +47,9 @@ static DWORD (WINAPI *pRegDeleteTreeA)(HKEY,LPCSTR); static char *get_temp_buffer( int size ) { static char *list[32]; - static long pos; + static UINT pos; char *ret; - int idx; + UINT idx; idx = ++pos % (sizeof(list)/sizeof(list[0])); if ((ret = realloc( list[idx], size ))) list[idx] = ret; diff --git a/rostests/winetests/advapi32/security.c b/rostests/winetests/advapi32/security.c index 9fac210d48f..b68629d3916 100644 --- a/rostests/winetests/advapi32/security.c +++ b/rostests/winetests/advapi32/security.c @@ -857,7 +857,7 @@ static void test_AccessCheck(void) GetProcAddress(NtDllModule, "RtlAdjustPrivilege"); if (!pRtlAdjustPrivilege) { - skip("missing RtlAdjustPrivilege, skipping test\n"); + win_skip("missing RtlAdjustPrivilege, skipping test\n"); return; } @@ -1128,7 +1128,7 @@ static void test_AccessCheck(void) ok(ret, "AddAccessAllowedAceEx failed with error %d\n", GetLastError()); } else - skip("AddAccessAllowedAceEx is not available\n"); + win_skip("AddAccessAllowedAceEx is not available\n"); ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping, PrivSet, &PrivSetLen, &Access, &AccessStatus); @@ -1176,27 +1176,29 @@ static void test_AccessCheck(void) static void test_token_attr(void) { HANDLE Token, ImpersonationToken; - DWORD Size; + DWORD Size, Size2; TOKEN_PRIVILEGES *Privileges; TOKEN_GROUPS *Groups; TOKEN_USER *User; + TOKEN_DEFAULT_DACL *Dacl; BOOL ret; DWORD i, GLE; LPSTR SidString; SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + ACL *acl; /* cygwin-like use case */ SetLastError(0xdeadbeef); ret = OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, &Token); if(!ret && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("OpenProcessToken is not implemented\n"); + win_skip("OpenProcessToken is not implemented\n"); return; } ok(ret, "OpenProcessToken failed with error %d\n", GetLastError()); if (ret) { - BYTE buf[1024]; + DWORD buf[256]; /* GetTokenInformation wants a dword-aligned buffer */ Size = sizeof(buf); ret = GetTokenInformation(Token, TokenUser,(void*)buf, Size, &Size); ok(ret, "GetTokenInformation failed with error %d\n", GetLastError()); @@ -1209,12 +1211,12 @@ static void test_token_attr(void) if(!pConvertSidToStringSidA) { - skip("ConvertSidToStringSidA is not available\n"); + win_skip("ConvertSidToStringSidA is not available\n"); return; } SetLastError(0xdeadbeef); - ret = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &Token); + ret = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &Token); ok(ret, "OpenProcessToken failed with error %d\n", GetLastError()); /* groups */ @@ -1283,6 +1285,49 @@ static void test_token_attr(void) ok(ImpersonationLevel == SecurityAnonymous, "ImpersonationLevel should have been SecurityAnonymous instead of %d\n", ImpersonationLevel); CloseHandle(ImpersonationToken); + + /* default dacl */ + ret = GetTokenInformation(Token, TokenDefaultDacl, NULL, 0, &Size); + ok(!ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER), + "GetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError()); + + Dacl = HeapAlloc(GetProcessHeap(), 0, Size); + ret = GetTokenInformation(Token, TokenDefaultDacl, Dacl, Size, &Size); + ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = SetTokenInformation(Token, TokenDefaultDacl, NULL, 0); + GLE = GetLastError(); + ok(!ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n"); + ok(GLE == ERROR_BAD_LENGTH, "expected ERROR_BAD_LENGTH got %u\n", GLE); + + SetLastError(0xdeadbeef); + ret = SetTokenInformation(Token, TokenDefaultDacl, NULL, Size); + GLE = GetLastError(); + ok(!ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n"); + ok(GLE == ERROR_NOACCESS, "expected ERROR_NOACCESS got %u\n", GLE); + + acl = Dacl->DefaultDacl; + Dacl->DefaultDacl = NULL; + + ret = SetTokenInformation(Token, TokenDefaultDacl, Dacl, Size); + ok(ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n"); + + Size2 = 0; + Dacl->DefaultDacl = (ACL *)0xdeadbeef; + ret = GetTokenInformation(Token, TokenDefaultDacl, Dacl, Size, &Size2); + ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError()); + ok(Dacl->DefaultDacl == NULL, "expected NULL, got %p\n", Dacl->DefaultDacl); + ok(Size2 == sizeof(TOKEN_DEFAULT_DACL), "got %u expected sizeof(TOKEN_DEFAULT_DACL)\n", Size2); + + Dacl->DefaultDacl = acl; + ret = SetTokenInformation(Token, TokenDefaultDacl, Dacl, Size); + ok(ret, "SetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError()); + + ret = GetTokenInformation(Token, TokenDefaultDacl, Dacl, Size, &Size2); + ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError()); + + HeapFree(GetProcessHeap(), 0, Dacl); CloseHandle(Token); } @@ -1354,15 +1399,36 @@ struct well_known_sid_value static void test_CreateWellKnownSid(void) { SID_IDENTIFIER_AUTHORITY ident = { SECURITY_NT_AUTHORITY }; - PSID domainsid; + PSID domainsid, sid; + DWORD size, error; + BOOL ret; int i; if (!pCreateWellKnownSid) { - skip("CreateWellKnownSid not available\n"); + win_skip("CreateWellKnownSid not available\n"); return; } + size = 0; + SetLastError(0xdeadbeef); + ret = pCreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size); + error = GetLastError(); + ok(!ret, "CreateWellKnownSid succeeded\n"); + ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error); + ok(size, "expected size > 0\n"); + + SetLastError(0xdeadbeef); + ret = pCreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size); + error = GetLastError(); + ok(!ret, "CreateWellKnownSid succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error); + + sid = HeapAlloc(GetProcessHeap(), 0, size); + ret = pCreateWellKnownSid(WinInteractiveSid, NULL, sid, &size); + ok(ret, "CreateWellKnownSid failed %u\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, sid); + /* a domain sid usually have three subauthorities but we test that CreateWellKnownSid doesn't check it */ AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid); @@ -1410,8 +1476,8 @@ static void test_CreateWellKnownSid(void) static void test_LookupAccountSid(void) { SID_IDENTIFIER_AUTHORITY SIDAuthNT = { SECURITY_NT_AUTHORITY }; - CHAR accountA[MAX_PATH], domainA[MAX_PATH]; - DWORD acc_sizeA, dom_sizeA; + CHAR accountA[MAX_PATH], domainA[MAX_PATH], usernameA[MAX_PATH]; + DWORD acc_sizeA, dom_sizeA, user_sizeA; DWORD real_acc_sizeA, real_dom_sizeA; WCHAR accountW[MAX_PATH], domainW[MAX_PATH]; DWORD acc_sizeW, dom_sizeW; @@ -1419,10 +1485,12 @@ static void test_LookupAccountSid(void) PSID pUsersSid = NULL; SID_NAME_USE use; BOOL ret; - DWORD size; + DWORD size,cbti = 0; MAX_SID max_sid; CHAR *str_sidA; int i; + HANDLE hToken; + PTOKEN_USER ptiUser = NULL; /* native windows crashes if account size, domain size, or name use is NULL */ @@ -1581,6 +1649,26 @@ static void test_LookupAccountSid(void) FreeSid(pUsersSid); + /* Test LookupAccountSid with Sid retrieved from token information. + This assumes this process is running under the account of the current user.*/ + ret = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &hToken); + ret = GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti); + ptiUser = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), 0, cbti); + if (GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti)) + { + acc_sizeA = dom_sizeA = MAX_PATH; + ret = LookupAccountSidA(NULL, ptiUser->User.Sid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use); + ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n"); + user_sizeA = MAX_PATH; + ret = GetUserNameA(usernameA , &user_sizeA); + ok(ret, "GetUserNameA() Expected TRUE, got FALSE\n"); + todo_wine + { + ok(lstrcmpA(usernameA, accountA) == 0, "LookupAccountSidA() Expected account name: %s got: %s\n", usernameA, accountA ); + } + } + HeapFree(GetProcessHeap(), 0, ptiUser); + if (pCreateWellKnownSid && pConvertSidToStringSidA) { trace("Well Known SIDs:\n"); @@ -1684,7 +1772,7 @@ static void test_LookupAccountSid(void) } } -static void get_sid_info(PSID psid, LPSTR *user, LPSTR *dom) +static BOOL get_sid_info(PSID psid, LPSTR *user, LPSTR *dom) { static CHAR account[UNLEN + 1]; static CHAR domain[UNLEN + 1]; @@ -1697,7 +1785,65 @@ static void get_sid_info(PSID psid, LPSTR *user, LPSTR *dom) size = dom_size = UNLEN + 1; account[0] = '\0'; domain[0] = '\0'; - LookupAccountSidA(NULL, psid, account, &size, domain, &dom_size, &use); + SetLastError(0xdeadbeef); + return LookupAccountSidA(NULL, psid, account, &size, domain, &dom_size, &use); +} + +static void check_wellknown_name(const char* name, WELL_KNOWN_SID_TYPE result) +{ + SID_IDENTIFIER_AUTHORITY ident = { SECURITY_NT_AUTHORITY }; + PSID domainsid; + char wk_sid[SECURITY_MAX_SID_SIZE]; + DWORD cb; + + DWORD sid_size, domain_size; + SID_NAME_USE sid_use; + LPSTR domain, account, sid_domain, wk_domain, wk_account; + PSID psid; + BOOL ret ,ret2; + + sid_size = 0; + domain_size = 0; + ret = LookupAccountNameA(NULL, name, NULL, &sid_size, NULL, &domain_size, &sid_use); + psid = HeapAlloc(GetProcessHeap(),0,sid_size); + domain = HeapAlloc(GetProcessHeap(),0,domain_size); + ret = LookupAccountNameA(NULL, name, psid, &sid_size, domain, &domain_size, &sid_use); + + if (!result) + { + ok(!ret, " %s Should have failed to lookup account name\n",name); + goto cleanup; + } + + AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid); + cb = sizeof(wk_sid); + if (!pCreateWellKnownSid(result, domainsid, wk_sid, &cb)) + { + win_skip("SID %i is not available on the system\n",result); + goto cleanup; + } + + ret2 = get_sid_info(wk_sid, &wk_account, &wk_domain); + if (!ret2 && GetLastError() == ERROR_NONE_MAPPED) + { + win_skip("CreateWellKnownSid() succeeded but the account '%s' is not present (W2K)\n", name); + goto cleanup; + } + + get_sid_info(psid, &account, &sid_domain); + + ok(ret, "Failed to lookup account name %s\n",name); + ok(sid_size != 0, "sid_size was zero\n"); + + ok(EqualSid(psid,wk_sid),"(%s) Sids fail to match well known sid!\n",name); + + ok(!lstrcmp(account, wk_account), "Expected %s , got %s\n", account, wk_account); + ok(!lstrcmp(domain, wk_domain), "Expected %s, got %s\n", wk_domain, domain); + ok(sid_use == SidTypeWellKnownGroup , "Expected Use (5), got %d\n", sid_use); + +cleanup: + HeapFree(GetProcessHeap(),0,psid); + HeapFree(GetProcessHeap(),0,domain); } static void test_LookupAccountName(void) @@ -1737,7 +1883,7 @@ static void test_LookupAccountName(void) ret = LookupAccountNameA(NULL, user_name, NULL, &sid_size, NULL, &domain_size, &sid_use); if(!ret && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("LookupAccountNameA is not implemented\n"); + win_skip("LookupAccountNameA is not implemented\n"); return; } ok(!ret, "Expected 0, got %d\n", ret); @@ -1884,6 +2030,7 @@ static void test_LookupAccountName(void) domain_size = 0; ret = LookupAccountNameA(NULL, computer_name, NULL, &sid_size, NULL, &domain_size, &sid_use); ok(!ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || + GetLastError() == ERROR_NONE_MAPPED /* in a domain */ || broken(GetLastError() == ERROR_TRUSTED_DOMAIN_FAILURE) || broken(GetLastError() == ERROR_TRUSTED_RELATIONSHIP_FAILURE)), "LookupAccountNameA failed: %d\n", GetLastError()); @@ -1897,6 +2044,47 @@ static void test_LookupAccountName(void) HeapFree(GetProcessHeap(), 0, domain); HeapFree(GetProcessHeap(), 0, psid); } + + /* Well Known names */ + if (!pCreateWellKnownSid) + { + win_skip("CreateWellKnownSid not available\n"); + return; + } + + if (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) != LANG_ENGLISH) + { + skip("Non-english locale (skipping well known name creation tests)\n"); + return; + } + + check_wellknown_name("LocalService", WinLocalServiceSid); + check_wellknown_name("Local Service", WinLocalServiceSid); + /* 2 spaces */ + check_wellknown_name("Local Service", 0); + check_wellknown_name("NetworkService", WinNetworkServiceSid); + check_wellknown_name("Network Service", WinNetworkServiceSid); + + /* example of some names where the spaces are not optional */ + check_wellknown_name("Terminal Server User", WinTerminalServerSid); + check_wellknown_name("TerminalServer User", 0); + check_wellknown_name("TerminalServerUser", 0); + check_wellknown_name("Terminal ServerUser", 0); + + check_wellknown_name("enterprise domain controllers",WinEnterpriseControllersSid); + check_wellknown_name("enterprisedomain controllers", 0); + check_wellknown_name("enterprise domaincontrollers", 0); + check_wellknown_name("enterprisedomaincontrollers", 0); + + /* case insensitivity */ + check_wellknown_name("lOCAlServICE", WinLocalServiceSid); + + /* fully qualified account names */ + check_wellknown_name("NT AUTHORITY\\LocalService", WinLocalServiceSid); + check_wellknown_name("nt authority\\Network Service", WinNetworkServiceSid); + check_wellknown_name("nt authority test\\Network Service", 0); + check_wellknown_name("Dummy\\Network Service", 0); + check_wellknown_name("ntauthority\\Network Service", 0); } static void test_security_descriptor(void) @@ -1912,7 +2100,7 @@ static void test_security_descriptor(void) ret = InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); if (ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("InitializeSecurityDescriptor is not implemented\n"); + win_skip("InitializeSecurityDescriptor is not implemented\n"); return; } @@ -2005,7 +2193,7 @@ static void test_process_security(void) res = InitializeAcl(Acl, 256, ACL_REVISION); if (!res && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("ACLs not implemented - skipping tests\n"); + win_skip("ACLs not implemented - skipping tests\n"); HeapFree(GetProcessHeap(), 0, Acl); return; } @@ -2183,14 +2371,14 @@ static void test_impersonation_level(void) pDuplicateTokenEx = (fnDuplicateTokenEx) GetProcAddress(hmod, "DuplicateTokenEx"); if( !pDuplicateTokenEx ) { - skip("DuplicateTokenEx is not available\n"); + win_skip("DuplicateTokenEx is not available\n"); return; } SetLastError(0xdeadbeef); ret = ImpersonateSelf(SecurityAnonymous); if(!ret && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("ImpersonateSelf is not implemented\n"); + win_skip("ImpersonateSelf is not implemented\n"); return; } ok(ret, "ImpersonateSelf(SecurityAnonymous) failed with error %d\n", GetLastError()); @@ -2408,7 +2596,7 @@ static void test_GetNamedSecurityInfoA(void) if (!pGetNamedSecurityInfoA) { - skip("GetNamedSecurityInfoA is not available\n"); + win_skip("GetNamedSecurityInfoA is not available\n"); return; } @@ -2421,7 +2609,7 @@ static void test_GetNamedSecurityInfoA(void) NULL, NULL, NULL, NULL, &pSecDesc); if (error != ERROR_SUCCESS && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("GetNamedSecurityInfoA is not implemented\n"); + win_skip("GetNamedSecurityInfoA is not implemented\n"); return; } ok(!error, "GetNamedSecurityInfo failed with error %d\n", error); @@ -2449,7 +2637,7 @@ static void test_ConvertStringSecurityDescriptor(void) if (!pConvertStringSecurityDescriptorToSecurityDescriptorA) { - skip("ConvertStringSecurityDescriptorToSecurityDescriptor is not available\n"); + win_skip("ConvertStringSecurityDescriptorToSecurityDescriptor is not available\n"); return; } @@ -2600,12 +2788,12 @@ static void test_ConvertSecurityDescriptorToString(void) if (!pConvertSecurityDescriptorToStringSecurityDescriptorA) { - skip("ConvertSecurityDescriptorToStringSecurityDescriptor is not available\n"); + win_skip("ConvertSecurityDescriptorToStringSecurityDescriptor is not available\n"); return; } if (!pCreateWellKnownSid) { - skip("CreateWellKnownSid is not available\n"); + win_skip("CreateWellKnownSid is not available\n"); return; } @@ -2800,7 +2988,7 @@ static void test_PrivateObjectSecurity(void) if (!pConvertStringSecurityDescriptorToSecurityDescriptorA) { - skip("ConvertStringSecurityDescriptorToSecurityDescriptor is not available\n"); + win_skip("ConvertStringSecurityDescriptorToSecurityDescriptor is not available\n"); return; } @@ -2810,8 +2998,7 @@ static void test_PrivateObjectSecurity(void) "D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)" "(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)" "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)", - SDDL_REVISION_1, &sec, &dwDescSize), "Creating descriptor failed\n"); // FIXME: ConvertStringSecurityDescriptorToSecurityDescriptor fails and 'sec' isn't set - + SDDL_REVISION_1, &sec, &dwDescSize), "Creating descriptor failed\n"); test_SetSecurityDescriptorControl(sec); @@ -2883,7 +3070,7 @@ static void test_acls(void) ret = InitializeAcl(pAcl, sizeof(ACL) - 1, ACL_REVISION); if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("InitializeAcl is not implemented\n"); + win_skip("InitializeAcl is not implemented\n"); return; } @@ -2976,7 +3163,6 @@ static void test_GetSecurityInfo(void) /* If we don't ask for the security descriptor, Windows will still give us the other stuff, leaving us no way to free it. */ - dacl = NULL; ret = pGetSecurityInfo(obj, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, &owner, &group, &dacl, NULL, NULL); @@ -2984,11 +3170,7 @@ static void test_GetSecurityInfo(void) ok(owner != NULL, "GetSecurityInfo\n"); ok(group != NULL, "GetSecurityInfo\n"); ok(dacl != NULL, "GetSecurityInfo\n"); - - if (dacl != NULL) - { - ok(IsValidAcl(dacl), "GetSecurityInfo\n"); - } + ok(IsValidAcl(dacl), "GetSecurityInfo\n"); CloseHandle(obj); } diff --git a/rostests/winetests/advapi32/service.c b/rostests/winetests/advapi32/service.c index 451a21be087..b924c69d3d4 100644 --- a/rostests/winetests/advapi32/service.c +++ b/rostests/winetests/advapi32/service.c @@ -307,7 +307,8 @@ static void test_create_delete_svc(void) svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, GENERIC_ALL, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, account, password); ok(!svc_handle1, "Expected failure\n"); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + ok(GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_INVALID_SERVICE_ACCOUNT, + "Expected ERROR_INVALID_PARAMETER or ERROR_INVALID_SERVICE_ACCOUNT, got %d\n", GetLastError()); /* Illegal (start-type is not a mask and should only be one of the possibilities) * Remark : 'OR'-ing them could result in a valid possibility (but doesn't make sense as @@ -1762,10 +1763,7 @@ static void test_sequence(void) SetLastError(0xdeadbeef); ret = QueryServiceConfigA(svc_handle, config, given, &needed); ok(ret, "Expected success, got error %u\n", GetLastError()); - todo_wine - { - ok(given == needed, "Expected the given (%d) and needed (%d) buffersizes to be equal\n", given, needed); - } + ok(config->lpBinaryPathName && config->lpLoadOrderGroup && config->lpDependencies && config->lpServiceStartName && config->lpDisplayName, "Expected all string struct members to be non-NULL\n"); ok(config->dwServiceType == (SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS), @@ -1829,7 +1827,7 @@ static void test_queryconfig2(void) if(!pQueryServiceConfig2A) { - skip("function QueryServiceConfig2A not present\n"); + win_skip("function QueryServiceConfig2A not present\n"); return; } @@ -1933,7 +1931,7 @@ static void test_queryconfig2(void) if(!pChangeServiceConfig2A) { - skip("function ChangeServiceConfig2A not present\n"); + win_skip("function ChangeServiceConfig2A not present\n"); goto cleanup; } @@ -1971,7 +1969,7 @@ static void test_queryconfig2(void) if(!pQueryServiceConfig2W) { - skip("function QueryServiceConfig2W not present\n"); + win_skip("function QueryServiceConfig2W not present\n"); goto cleanup; } SetLastError(0xdeadbeef); @@ -2107,7 +2105,7 @@ START_TEST(service) if (!scm_handle && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("OpenSCManagerA is not implemented, we are most likely on win9x\n"); + win_skip("OpenSCManagerA is not implemented, we are most likely on win9x\n"); return; } CloseServiceHandle(scm_handle); diff --git a/rostests/winetests/advpack/advpack.c b/rostests/winetests/advpack/advpack.c index 8615850ab38..3ead0f25c4b 100644 --- a/rostests/winetests/advpack/advpack.c +++ b/rostests/winetests/advpack/advpack.c @@ -83,7 +83,7 @@ static BOOL init_function_pointers(void) if (!pCloseINFEngine || !pDelNode || !pGetVersionFromFile || !pOpenINFEngine || !pSetPerUserSecValues || !pTranslateInfString) { - skip("Needed functions are not available\n"); + win_skip("Needed functions are not available\n"); FreeLibrary(hAdvPack); return FALSE; } @@ -272,6 +272,11 @@ static void translateinfstring_test(void) buffer[0] = 0; hr = pTranslateInfString(inf_file, "idontexist", "Options.NTx86", "InstallDir", buffer, MAX_PATH, &dwSize, NULL); + if (hr == E_ACCESSDENIED) + { + skip("TranslateInfString is broken\n"); + return; + } ok(hr == S_OK, "Expected S_OK, got 0x%08x\n", (UINT)hr); ok(!strcmp(buffer, TEST_STRING2), "Expected %s, got %s\n", TEST_STRING2, buffer); ok(dwSize == 25, "Expected size 25, got %d\n", dwSize); @@ -328,7 +333,7 @@ static void translateinfstringex_test(void) hr = pOpenINFEngine(inf_file, NULL, 0, &hinf, NULL); if (hr == E_UNEXPECTED) { - skip("Skipping tests on win9x because of brokenness\n"); + win_skip("Skipping tests on win9x because of brokenness\n"); return; } @@ -591,6 +596,11 @@ static void setperusersecvalues_test(void) /* set initial values */ lstrcpy(peruser.szGUID, "guid"); hr = pSetPerUserSecValues(&peruser); + if (hr == E_FAIL) + { + skip("SetPerUserSecValues is broken\n"); + return; + } ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(OPEN_GUID_KEY(), "Expected guid key to exist\n"); ok(check_reg_str(guid, NULL, "displayname"), "Expected displayname\n"); diff --git a/rostests/winetests/advpack/files.c b/rostests/winetests/advpack/files.c index d3f7338beb9..5c6ea8de1f2 100644 --- a/rostests/winetests/advpack/files.c +++ b/rostests/winetests/advpack/files.c @@ -133,8 +133,13 @@ static void test_AddDelBackupEntry(void) /* create the INF file */ res = pAddDelBackupEntry("one\0two\0three\0", "c:\\", "basename", AADBE_ADD_ENTRY); ok(res == S_OK, "Expected S_OK, got %d\n", res); - ok(check_ini_file_attr(path), "Expected ini file to be hidden\n"); - ok(DeleteFileA(path), "Expected path to exist\n"); + if (GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES) + { + ok(check_ini_file_attr(path), "Expected ini file to be hidden\n"); + ok(DeleteFileA(path), "Expected path to exist\n"); + } + else + win_skip("Test file could not be created\n"); lstrcpyA(path, CURR_DIR); lstrcatA(path, "\\backup\\basename.INI"); diff --git a/rostests/winetests/comcat/comcat.c b/rostests/winetests/comcat/comcat.c index 49e5afe7c41..029d2e30ab3 100644 --- a/rostests/winetests/comcat/comcat.c +++ b/rostests/winetests/comcat/comcat.c @@ -29,7 +29,7 @@ #include "wine/test.h" -#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x \n", hr) +#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr) static BOOL register_testentry(void) { diff --git a/rostests/winetests/comctl32/comboex.c b/rostests/winetests/comctl32/comboex.c index f59d1d1f810..1e741924ce8 100644 --- a/rostests/winetests/comctl32/comboex.c +++ b/rostests/winetests/comctl32/comboex.c @@ -187,7 +187,7 @@ static void test_WM_LBUTTONDOWN(void) pGetComboBoxInfo = (void*)GetProcAddress(GetModuleHandleA("user32.dll"), "GetComboBoxInfo"); if (!pGetComboBoxInfo){ - skip("GetComboBoxInfo is not available\n"); + win_skip("GetComboBoxInfo is not available\n"); return; } @@ -314,7 +314,7 @@ static int init(void) pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); if (!pInitCommonControlsEx) { - skip("InitCommonControlsEx() is missing. Skipping the tests\n"); + win_skip("InitCommonControlsEx() is missing. Skipping the tests\n"); return 0; } iccex.dwSize = sizeof(iccex); diff --git a/rostests/winetests/comctl32/comctl32.rbuild b/rostests/winetests/comctl32/comctl32.rbuild index 10a8b863d02..1331dcca693 100644 --- a/rostests/winetests/comctl32/comctl32.rbuild +++ b/rostests/winetests/comctl32/comctl32.rbuild @@ -10,6 +10,7 @@ dpa.c header.c imagelist.c + ipaddress.c listview.c misc.c monthcal.c diff --git a/rostests/winetests/comctl32/datetime.c b/rostests/winetests/comctl32/datetime.c index caef2762951..8fdbbe53608 100644 --- a/rostests/winetests/comctl32/datetime.c +++ b/rostests/winetests/comctl32/datetime.c @@ -140,7 +140,7 @@ struct subclass_info static LRESULT WINAPI datetime_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { struct subclass_info *info = (struct subclass_info *)GetWindowLongPtrA(hwnd, GWLP_USERDATA); - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; diff --git a/rostests/winetests/comctl32/dpa.c b/rostests/winetests/comctl32/dpa.c index a0d19202981..ed28119ac89 100644 --- a/rostests/winetests/comctl32/dpa.c +++ b/rostests/winetests/comctl32/dpa.c @@ -373,7 +373,7 @@ static void test_dpa(void) if(pDPA_EnumCallback) { nEnum = 0; - pDPA_EnumCallback(dpa2, CB_EnumFirstThree, (PVOID)dpa2); + pDPA_EnumCallback(dpa2, CB_EnumFirstThree, dpa2); rc=CheckDPA(dpa2, 0x777456, &dw2); ok(rc, "dw=0x%x\n", dw2); ok(nEnum == 3, "nEnum=%d\n", nEnum); diff --git a/rostests/winetests/comctl32/header.c b/rostests/winetests/comctl32/header.c index 5598e586164..76612530c98 100644 --- a/rostests/winetests/comctl32/header.c +++ b/rostests/winetests/comctl32/header.c @@ -404,7 +404,7 @@ struct subclass_info static LRESULT WINAPI header_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { struct subclass_info *info = (struct subclass_info *)GetWindowLongPtrA(hwnd, GWLP_USERDATA); - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; @@ -425,7 +425,7 @@ static LRESULT WINAPI header_subclass_proc(HWND hwnd, UINT message, WPARAM wPara static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; @@ -1159,10 +1159,10 @@ static void test_hdm_index_messages(HWND hParent) flush_sequences(sequences, NUM_MSG_SEQUENCES); iSize = SendMessage(hChild, HDM_GETITEMCOUNT, 0, (LPARAM) &hdItem); - retVal = SendMessage(hChild, HDM_SETORDERARRAY, (WPARAM) iSize , (LPARAM) (LPINT) lpiarray ); + retVal = SendMessage(hChild, HDM_SETORDERARRAY, iSize, (LPARAM) lpiarray); ok(retVal == TRUE, "Setting header items order should return TRUE, got %d\n", retVal); - retVal = SendMessage(hChild, HDM_GETORDERARRAY, (WPARAM) iSize, (LPARAM) (LPINT) lpiarrayReceived ); + retVal = SendMessage(hChild, HDM_GETORDERARRAY, iSize, (LPARAM) lpiarrayReceived); ok(retVal == TRUE, "Getting header items order should return TRUE, got %d\n", retVal); ok_sequence(sequences, HEADER_SEQ_INDEX, orderArray_seq, "set_get_orderArray sequence testing", FALSE); diff --git a/rostests/winetests/comctl32/ipaddress.c b/rostests/winetests/comctl32/ipaddress.c new file mode 100644 index 00000000000..d04223cb4fc --- /dev/null +++ b/rostests/winetests/comctl32/ipaddress.c @@ -0,0 +1,90 @@ +/* Unit test suite for IP Address control. + * + * Copyright 2009 Nikolay Sivov + * + * 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 + */ + + +#include +#include +#include + +#include "wine/test.h" + +#define expect(expected, got) ok(expected == got, "expected %d, got %d\n", expected,got) + +static HWND create_ipaddress_control (void) +{ + HWND handle; + + handle = CreateWindowEx(0, WC_IPADDRESS, NULL, + WS_BORDER|WS_VISIBLE, 0, 0, 0, 0, + NULL, NULL, NULL, NULL); + assert(handle); + + return handle; +} + +static void test_get_set_text(void) +{ + HWND hwnd; + CHAR ip[16]; + INT r; + + hwnd = create_ipaddress_control(); + + /* check text just after creation */ + r = GetWindowText(hwnd, ip, sizeof(ip)/sizeof(CHAR)); + expect(7, r); + ok(strcmp(ip, "0.0.0.0") == 0, "Expected null IP address, got %s\n", ip); + + SendMessage(hwnd, IPM_SETADDRESS, 0, MAKEIPADDRESS(127, 0, 0, 1)); + r = GetWindowText(hwnd, ip, sizeof(ip)/sizeof(CHAR)); + expect(9, r); + ok(strcmp(ip, "127.0.0.1") == 0, "Expected 127.0.0.1, got %s\n", ip); + + DestroyWindow(hwnd); +} + +static int init(void) +{ + HMODULE hComctl32; + BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); + INITCOMMONCONTROLSEX iccex; + + hComctl32 = GetModuleHandleA("comctl32.dll"); + pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); + if (!pInitCommonControlsEx) + { + win_skip("InitCommonControlsEx() is missing.\n"); + return 0; + } + + iccex.dwSize = sizeof(iccex); + /* W2K and below need ICC_INTERNET_CLASSES for the IP Address Control */ + iccex.dwICC = ICC_INTERNET_CLASSES; + pInitCommonControlsEx(&iccex); + + return 1; +} + +START_TEST(ipaddress) +{ + if (!init()) + return; + + test_get_set_text(); +} diff --git a/rostests/winetests/comctl32/listview.c b/rostests/winetests/comctl32/listview.c index 4033e9e683a..e94bdaaabd0 100644 --- a/rostests/winetests/comctl32/listview.c +++ b/rostests/winetests/comctl32/listview.c @@ -26,9 +26,10 @@ #include "wine/test.h" #include "msg.h" -#define PARENT_SEQ_INDEX 0 -#define LISTVIEW_SEQ_INDEX 1 -#define NUM_MSG_SEQUENCES 2 +#define PARENT_SEQ_INDEX 0 +#define PARENT_FULL_SEQ_INDEX 1 +#define LISTVIEW_SEQ_INDEX 2 +#define NUM_MSG_SEQUENCES 3 #define LISTVIEW_ID 0 #define HEADER_ID 1 @@ -146,6 +147,27 @@ static const struct message listview_itempos_seq[] = { { 0 } }; +static const struct message listview_ownerdata_switchto_seq[] = { + { WM_STYLECHANGING, sent }, + { WM_STYLECHANGED, sent }, + { 0 } +}; + +static const struct message listview_getorderarray_seq[] = { + { LVM_GETCOLUMNORDERARRAY, sent|id|wparam, 2, 0, LISTVIEW_ID }, + { HDM_GETORDERARRAY, sent|id|wparam, 2, 0, HEADER_ID }, + { 0 } +}; + +static const struct message empty_seq[] = { + { 0 } +}; + +static const struct message forward_erasebkgnd_parent_seq[] = { + { WM_ERASEBKGND, sent }, + { 0 } +}; + struct subclass_info { WNDPROC oldproc; @@ -153,10 +175,16 @@ struct subclass_info static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + /* log system messages, except for painting */ if (message < WM_USER && message != WM_PAINT && @@ -169,13 +197,9 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP { trace("parent: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - msg.message = message; - msg.flags = sent|wparam|lparam; - if (defwndproc_counter) msg.flags |= defwinproc; - msg.wParam = wParam; - msg.lParam = lParam; add_message(sequences, PARENT_SEQ_INDEX, &msg); } + add_message(sequences, PARENT_FULL_SEQ_INDEX, &msg); defwndproc_counter++; ret = DefWindowProcA(hwnd, message, wParam, lParam); @@ -217,12 +241,20 @@ static HWND create_parent_window(void) static LRESULT WINAPI listview_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { struct subclass_info *info = (struct subclass_info *)GetWindowLongPtrA(hwnd, GWLP_USERDATA); - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; trace("listview: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); + /* some debug output for style changing */ + if ((message == WM_STYLECHANGING || + message == WM_STYLECHANGED) && lParam) + { + STYLESTRUCT *style = (STYLESTRUCT*)lParam; + trace("\told style: 0x%08x, new style: 0x%08x\n", style->styleOld, style->styleNew); + } + msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; @@ -237,7 +269,7 @@ static LRESULT WINAPI listview_subclass_proc(HWND hwnd, UINT message, WPARAM wPa return ret; } -static HWND create_listview_control(void) +static HWND create_listview_control(DWORD style) { struct subclass_info *info; HWND hwnd; @@ -249,7 +281,7 @@ static HWND create_listview_control(void) GetClientRect(hwndparent, &rect); hwnd = CreateWindowExA(0, WC_LISTVIEW, "foo", - WS_CHILD | WS_BORDER | WS_VISIBLE | LVS_REPORT, + WS_CHILD | WS_BORDER | WS_VISIBLE | LVS_REPORT | style, 0, 0, rect.right, rect.bottom, hwndparent, NULL, GetModuleHandleA(NULL), NULL); ok(hwnd != NULL, "gle=%d\n", GetLastError()); @@ -300,7 +332,7 @@ static HWND create_custom_listview_control(DWORD style) static LRESULT WINAPI header_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { struct subclass_info *info = (struct subclass_info *)GetWindowLongPtrA(hwnd, GWLP_USERDATA); - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; @@ -634,6 +666,72 @@ static void test_items(void) insert_column(hwnd, 0); insert_column(hwnd, 1); + /* LVIS_SELECTED with zero stateMask */ + /* set */ + memset (&item, 0, sizeof (item)); + item.mask = LVIF_STATE; + item.state = LVIS_SELECTED; + item.stateMask = 0; + item.iItem = 0; + item.iSubItem = 0; + r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); + ok(r == 0, "ret %d\n", r); + /* get */ + memset (&item, 0xcc, sizeof (item)); + item.mask = LVIF_STATE; + item.stateMask = LVIS_SELECTED; + item.state = 0; + item.iItem = 0; + item.iSubItem = 0; + r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + ok(r != 0, "ret %d\n", r); + ok(item.state & LVIS_SELECTED, "Expected LVIS_SELECTED\n"); + SendMessage(hwnd, LVM_DELETEITEM, 0, 0); + + /* LVIS_SELECTED with zero stateMask */ + /* set */ + memset (&item, 0, sizeof (item)); + item.mask = LVIF_STATE; + item.state = LVIS_FOCUSED; + item.stateMask = 0; + item.iItem = 0; + item.iSubItem = 0; + r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); + ok(r == 0, "ret %d\n", r); + /* get */ + memset (&item, 0xcc, sizeof (item)); + item.mask = LVIF_STATE; + item.stateMask = LVIS_FOCUSED; + item.state = 0; + item.iItem = 0; + item.iSubItem = 0; + r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + ok(r != 0, "ret %d\n", r); + ok(item.state & LVIS_FOCUSED, "Expected LVIS_FOCUSED\n"); + SendMessage(hwnd, LVM_DELETEITEM, 0, 0); + + /* LVIS_CUT with LVIS_FOCUSED stateMask */ + /* set */ + memset (&item, 0, sizeof (item)); + item.mask = LVIF_STATE; + item.state = LVIS_CUT; + item.stateMask = LVIS_FOCUSED; + item.iItem = 0; + item.iSubItem = 0; + r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); + ok(r == 0, "ret %d\n", r); + /* get */ + memset (&item, 0xcc, sizeof (item)); + item.mask = LVIF_STATE; + item.stateMask = LVIS_CUT; + item.state = 0; + item.iItem = 0; + item.iSubItem = 0; + r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + ok(r != 0, "ret %d\n", r); + ok(item.state & LVIS_CUT, "Expected LVIS_CUT\n"); + SendMessage(hwnd, LVM_DELETEITEM, 0, 0); + /* Insert an item with just a param */ memset (&item, 0xcc, sizeof (item)); item.mask = LVIF_PARAM; @@ -715,14 +813,29 @@ static void test_items(void) ok(r != 0, "ret %d\n", r); todo_wine ok(item.state == LVIS_DROPHILITED, "got state %x, expected %x\n", item.state, LVIS_DROPHILITED); + /* some notnull but meaningless masks */ + memset (&item, 0, sizeof(item)); + item.mask = LVIF_NORECOMPUTE; + item.iItem = 0; + item.iSubItem = 0; + r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + ok(r != 0, "ret %d\n", r); + memset (&item, 0, sizeof(item)); + item.mask = LVIF_DI_SETITEM; + item.iItem = 0; + item.iSubItem = 0; + r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + ok(r != 0, "ret %d\n", r); + DestroyWindow(hwnd); } static void test_columns(void) { - HWND hwnd; + HWND hwnd, hwndheader; LVCOLUMN column; DWORD rc; + INT order[2]; hwnd = CreateWindowEx(0, "SysListView32", "foo", LVS_REPORT, 10, 10, 100, 200, hwndparent, NULL, NULL, NULL); @@ -741,6 +854,31 @@ static void test_columns(void) "Inserting column with no mask failed to set width to 10 with %d\n", rc); DestroyWindow(hwnd); + + /* LVM_GETCOLUMNORDERARRAY */ + hwnd = create_listview_control(0); + hwndheader = subclass_header(hwnd); + + memset(&column, 0, sizeof(column)); + column.mask = LVCF_WIDTH; + column.cx = 100; + rc = ListView_InsertColumn(hwnd, 0, &column); + ok(rc == 0, "Inserting column failed with %d\n", rc); + + column.cx = 200; + rc = ListView_InsertColumn(hwnd, 1, &column); + ok(rc == 1, "Inserting column failed with %d\n", rc); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + rc = SendMessage(hwnd, LVM_GETCOLUMNORDERARRAY, 2, (LPARAM)&order); + ok(rc != 0, "Expected LVM_GETCOLUMNORDERARRAY to succeed\n"); + ok(order[0] == 0, "Expected order 0, got %d\n", order[0]); + ok(order[1] == 1, "Expected order 1, got %d\n", order[1]); + + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_getorderarray_seq, "get order array", FALSE); + + DestroyWindow(hwnd); } /* test setting imagelist between WM_NCCREATE and WM_CREATE */ static WNDPROC listviewWndProc; @@ -748,19 +886,26 @@ static HIMAGELIST test_create_imagelist; static LRESULT CALLBACK create_test_wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + LRESULT ret; + if (uMsg == WM_CREATE) { LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; lpcs->style |= LVS_REPORT; - SendMessage(hwnd, LVM_SETIMAGELIST, 0, (LPARAM)test_create_imagelist); } - return CallWindowProc(listviewWndProc, hwnd, uMsg, wParam, lParam); + ret = CallWindowProc(listviewWndProc, hwnd, uMsg, wParam, lParam); + if (uMsg == WM_CREATE) SendMessage(hwnd, LVM_SETIMAGELIST, 0, (LPARAM)test_create_imagelist); + return ret; } static void test_create(void) { HWND hList; HWND hHeader; + LONG_PTR ret; + LONG r; + LVCOLUMNA col; + RECT rect; WNDCLASSEX cls; cls.cbSize = sizeof(WNDCLASSEX); ok(GetClassInfoEx(GetModuleHandle(NULL), "SysListView32", &cls), "GetClassInfoEx failed\n"); @@ -774,14 +919,158 @@ static void test_create(void) ok((HIMAGELIST)SendMessage(hList, LVM_GETIMAGELIST, 0, 0) == test_create_imagelist, "Image list not obtained\n"); hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); ok(IsWindow(hHeader) && IsWindowVisible(hHeader), "Listview not in report mode\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + + /* header isn't created on LVS_ICON and LVS_LIST styles */ + hList = CreateWindow("SysListView32", "Test", WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(!IsWindow(hHeader), "Header shouldn't be created\n"); + ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + /* insert column */ + memset(&col, 0, sizeof(LVCOLUMNA)); + col.mask = LVCF_WIDTH; + col.cx = 100; + r = SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&col); + ok(r == 0, "Expected 0 column's inserted\n"); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + + hList = CreateWindow("SysListView32", "Test", WS_VISIBLE|LVS_LIST, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(!IsWindow(hHeader), "Header shouldn't be created\n"); + ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + /* insert column */ + memset(&col, 0, sizeof(LVCOLUMNA)); + col.mask = LVCF_WIDTH; + col.cx = 100; + r = SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&col); + ok(r == 0, "Expected 0 column's inserted\n"); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + + /* try to switch LVS_ICON -> LVS_REPORT and back LVS_ICON -> LVS_REPORT */ + hList = CreateWindow("SysListView32", "Test", WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + ret = SetWindowLongPtr(hList, GWL_STYLE, GetWindowLongPtr(hList, GWL_STYLE) | LVS_REPORT); + ok(ret & WS_VISIBLE, "Style wrong, should have WS_VISIBLE\n"); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ret = SetWindowLongPtr(hList, GWL_STYLE, GetWindowLong(hList, GWL_STYLE) & ~LVS_REPORT); + ok((ret & WS_VISIBLE) && (ret & LVS_REPORT), "Style wrong, should have WS_VISIBLE|LVS_REPORT\n"); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + + /* try to switch LVS_LIST -> LVS_REPORT and back LVS_LIST -> LVS_REPORT */ + hList = CreateWindow("SysListView32", "Test", WS_VISIBLE|LVS_LIST, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + ret = SetWindowLongPtr(hList, GWL_STYLE, + (GetWindowLongPtr(hList, GWL_STYLE) & ~LVS_LIST) | LVS_REPORT); + ok(((ret & WS_VISIBLE) && (ret & LVS_LIST)), "Style wrong, should have WS_VISIBLE|LVS_LIST\n"); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + ret = SetWindowLongPtr(hList, GWL_STYLE, + (GetWindowLongPtr(hList, GWL_STYLE) & ~LVS_REPORT) | LVS_LIST); + ok(((ret & WS_VISIBLE) && (ret & LVS_REPORT)), "Style wrong, should have WS_VISIBLE|LVS_REPORT\n"); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + + /* LVS_REPORT without WS_VISIBLE */ + hList = CreateWindow("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(!IsWindow(hHeader), "Header shouldn't be created\n"); + ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + /* insert column */ + memset(&col, 0, sizeof(LVCOLUMNA)); + col.mask = LVCF_WIDTH; + col.cx = 100; + r = SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&col); + ok(r == 0, "Expected 0 column's inserted\n"); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + + /* LVS_REPORT without WS_VISIBLE, try to show it */ + hList = CreateWindow("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(!IsWindow(hHeader), "Header shouldn't be created\n"); + ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + ShowWindow(hList, SW_SHOW); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + + /* LVS_REPORT with LVS_NOCOLUMNHEADER */ + hList = CreateWindow("SysListView32", "Test", LVS_REPORT|LVS_NOCOLUMNHEADER|WS_VISIBLE, + 0, 0, 100, 100, NULL, NULL, GetModuleHandle(NULL), 0); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + /* HDS_DRAGDROP set by default */ + ok(GetWindowLongPtr(hHeader, GWL_STYLE) & HDS_DRAGDROP, "Expected header to have HDS_DRAGDROP\n"); + DestroyWindow(hList); + + /* setting LVS_EX_HEADERDRAGDROP creates header */ + hList = CreateWindow("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(!IsWindow(hHeader), "Header shouldn't be created\n"); + ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_HEADERDRAGDROP); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader), "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + + /* not report style accepts LVS_EX_HEADERDRAGDROP too */ + hList = create_custom_listview_control(0); + SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_HEADERDRAGDROP); + r = SendMessage(hList, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); + ok(r & LVS_EX_HEADERDRAGDROP, "Expected LVS_EX_HEADERDRAGDROP to be set\n"); + DestroyWindow(hList); + + /* requesting header info with LVM_GETSUBITEMRECT doesn't create it */ + hList = CreateWindow("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + ok(!IsWindow(hHeader), "Header shouldn't be created\n"); + ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + + rect.left = LVIR_BOUNDS; + rect.top = 1; + rect.right = rect.bottom = -10; + r = SendMessage(hList, LVM_GETSUBITEMRECT, -1, (LPARAM)&rect); + ok(r != 0, "Expected not-null LRESULT\n"); + + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(!IsWindow(hHeader), "Header shouldn't be created\n"); + ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + DestroyWindow(hList); } static void test_redraw(void) { HWND hwnd, hwndheader; + HDC hdc; + BOOL res; + DWORD r; - hwnd = create_listview_control(); + hwnd = create_listview_control(0); hwndheader = subclass_header(hwnd); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -793,6 +1082,51 @@ static void test_redraw(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); + /* forward WM_ERASEBKGND to parent on CLR_NONE background color */ + /* 1. Without backbuffer */ + res = ListView_SetBkColor(hwnd, CLR_NONE); + expect(TRUE, res); + + hdc = GetWindowDC(hwndparent); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + r = SendMessageA(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0); + ok(r != 0, "Expected not zero result\n"); + ok_sequence(sequences, PARENT_FULL_SEQ_INDEX, forward_erasebkgnd_parent_seq, + "forward WM_ERASEBKGND on CLR_NONE", FALSE); + + res = ListView_SetBkColor(hwnd, CLR_DEFAULT); + expect(TRUE, res); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + r = SendMessageA(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0); + ok(r != 0, "Expected not zero result\n"); + ok_sequence(sequences, PARENT_FULL_SEQ_INDEX, empty_seq, + "don't forward WM_ERASEBKGND on non-CLR_NONE", FALSE); + + /* 2. With backbuffer */ + SendMessageA(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_DOUBLEBUFFER, + LVS_EX_DOUBLEBUFFER); + res = ListView_SetBkColor(hwnd, CLR_NONE); + expect(TRUE, res); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + r = SendMessageA(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0); + ok(r != 0, "Expected not zero result\n"); + ok_sequence(sequences, PARENT_FULL_SEQ_INDEX, forward_erasebkgnd_parent_seq, + "forward WM_ERASEBKGND on CLR_NONE", FALSE); + + res = ListView_SetBkColor(hwnd, CLR_DEFAULT); + expect(TRUE, res); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + r = SendMessageA(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0); + todo_wine ok(r != 0, "Expected not zero result\n"); + ok_sequence(sequences, PARENT_FULL_SEQ_INDEX, empty_seq, + "don't forward WM_ERASEBKGND on non-CLR_NONE", FALSE); + + ReleaseDC(hwndparent, hdc); + DestroyWindow(hwnd); } @@ -833,7 +1167,7 @@ static void test_customdraw(void) HWND hwnd; WNDPROC oldwndproc; - hwnd = create_listview_control(); + hwnd = create_listview_control(0); insert_column(hwnd, 0); insert_column(hwnd, 1); @@ -905,7 +1239,7 @@ static void test_color(void) COLORREF color; COLORREF colors[4] = {RGB(0,0,0), RGB(100,50,200), CLR_NONE, RGB(255,255,255)}; - hwnd = create_listview_control(); + hwnd = create_listview_control(0); ok(hwnd != NULL, "failed to create a listview window\n"); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -951,7 +1285,7 @@ static void test_item_count(void) static CHAR item1text[] = "item1"; static CHAR item2text[] = "item2"; - hwnd = create_listview_control(); + hwnd = create_listview_control(0); ok(hwnd != NULL, "failed to create a listview window\n"); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -1161,6 +1495,7 @@ static void test_multiselect(void) static const int items=5; BYTE kstate[256]; select_task task; + LONG_PTR style; static struct t_select_task task_list[] = { { "using VK_DOWN", 0, VK_DOWN, -1, -1 }, @@ -1170,7 +1505,7 @@ static void test_multiselect(void) }; - hwnd = create_listview_control(); + hwnd = create_listview_control(0); for (i=0;i second ? 1 : -1); +} + +static void test_sorting(void) +{ + HWND hwnd; + LVITEMA item = {0}; + DWORD r; + LONG_PTR style; + static CHAR names[][5] = {"A", "B", "C", "D", "0"}; + CHAR buff[10]; + + hwnd = create_listview_control(0); + ok(hwnd != NULL, "failed to create a listview window\n"); + + /* insert some items */ + item.mask = LVIF_PARAM | LVIF_STATE; + item.state = LVIS_SELECTED; + item.iItem = 0; + item.iSubItem = 0; + item.lParam = 3; + r = SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM) &item); + expect(0, r); + + item.mask = LVIF_PARAM; + item.iItem = 1; + item.iSubItem = 0; + item.lParam = 2; + r = SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM) &item); + expect(1, r); + + item.mask = LVIF_STATE | LVIF_PARAM; + item.state = LVIS_SELECTED; + item.iItem = 2; + item.iSubItem = 0; + item.lParam = 4; + r = SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM) &item); + expect(2, r); + + r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0); + expect(-1, r); + + r = SendMessage(hwnd, LVM_GETSELECTEDCOUNT, 0, 0); + expect(2, r); + + r = SendMessage(hwnd, LVM_SORTITEMS, 0, (LPARAM)test_CallBackCompare); + expect(TRUE, r); + + r = SendMessage(hwnd, LVM_GETSELECTEDCOUNT, 0, 0); + expect(2, r); + r = SendMessage(hwnd, LVM_GETSELECTIONMARK, 0, 0); + expect(-1, r); + r = SendMessage(hwnd, LVM_GETITEMSTATE, 0, LVIS_SELECTED); + expect(0, r); + r = SendMessage(hwnd, LVM_GETITEMSTATE, 1, LVIS_SELECTED); + expect(LVIS_SELECTED, r); + r = SendMessage(hwnd, LVM_GETITEMSTATE, 2, LVIS_SELECTED); + expect(LVIS_SELECTED, r); + + DestroyWindow(hwnd); + + /* switch to LVS_SORTASCENDING when some items added */ + hwnd = create_listview_control(0); + ok(hwnd != NULL, "failed to create a listview window\n"); + + item.mask = LVIF_TEXT; + item.iItem = 0; + item.iSubItem = 0; + item.pszText = names[1]; + r = SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM) &item); + expect(0, r); + + item.mask = LVIF_TEXT; + item.iItem = 1; + item.iSubItem = 0; + item.pszText = names[2]; + r = SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM) &item); + expect(1, r); + + item.mask = LVIF_TEXT; + item.iItem = 2; + item.iSubItem = 0; + item.pszText = names[0]; + r = SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM) &item); + expect(2, r); + + style = GetWindowLongPtrA(hwnd, GWL_STYLE); + SetWindowLongPtrA(hwnd, GWL_STYLE, style | LVS_SORTASCENDING); + style = GetWindowLongPtrA(hwnd, GWL_STYLE); + ok(style & LVS_SORTASCENDING, "Expected LVS_SORTASCENDING to be set\n"); + + /* no sorting performed when switched to LVS_SORTASCENDING */ + item.mask = LVIF_TEXT; + item.iItem = 0; + item.pszText = buff; + item.cchTextMax = sizeof(buff); + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[1]) == 0, "Expected '%s', got '%s'\n", names[1], buff); + + item.iItem = 1; + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[2]) == 0, "Expected '%s', got '%s'\n", names[2], buff); + + item.iItem = 2; + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[0]) == 0, "Expected '%s', got '%s'\n", names[0], buff); + + /* adding new item doesn't resort list */ + item.mask = LVIF_TEXT; + item.iItem = 3; + item.iSubItem = 0; + item.pszText = names[3]; + r = SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM) &item); + expect(3, r); + + item.mask = LVIF_TEXT; + item.iItem = 0; + item.pszText = buff; + item.cchTextMax = sizeof(buff); + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[1]) == 0, "Expected '%s', got '%s'\n", names[1], buff); + + item.iItem = 1; + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[2]) == 0, "Expected '%s', got '%s'\n", names[2], buff); + + item.iItem = 2; + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[0]) == 0, "Expected '%s', got '%s'\n", names[0], buff); + + item.iItem = 3; + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[3]) == 0, "Expected '%s', got '%s'\n", names[3], buff); + + /* corner case - item should be placed at first position */ + item.mask = LVIF_TEXT; + item.iItem = 4; + item.iSubItem = 0; + item.pszText = names[4]; + r = SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM) &item); + expect(0, r); + + item.iItem = 0; + item.pszText = buff; + item.cchTextMax = sizeof(buff); + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[4]) == 0, "Expected '%s', got '%s'\n", names[4], buff); + + item.iItem = 1; + item.pszText = buff; + item.cchTextMax = sizeof(buff); + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[1]) == 0, "Expected '%s', got '%s'\n", names[1], buff); + + item.iItem = 2; + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[2]) == 0, "Expected '%s', got '%s'\n", names[2], buff); + + item.iItem = 3; + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[0]) == 0, "Expected '%s', got '%s'\n", names[0], buff); + + item.iItem = 4; + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); + expect(TRUE, r); + ok(lstrcmp(buff, names[3]) == 0, "Expected '%s', got '%s'\n", names[3], buff); + + DestroyWindow(hwnd); +} + +static void test_ownerdata(void) +{ + HWND hwnd; + LONG_PTR style, ret; + DWORD res; + LVITEMA item; + + /* it isn't possible to set LVS_OWNERDATA after creation */ + hwnd = create_listview_control(0); + ok(hwnd != NULL, "failed to create a listview window\n"); + style = GetWindowLongPtrA(hwnd, GWL_STYLE); + ok(!(style & LVS_OWNERDATA) && style, "LVS_OWNERDATA isn't expected\n"); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + ret = SetWindowLongPtrA(hwnd, GWL_STYLE, style | LVS_OWNERDATA); + ok(ret == style, "Expected set GWL_STYLE to succeed\n"); + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_ownerdata_switchto_seq, + "try to switch to LVS_OWNERDATA seq", FALSE); + + style = GetWindowLongPtrA(hwnd, GWL_STYLE); + ok(!(style & LVS_OWNERDATA), "LVS_OWNERDATA isn't expected\n"); + DestroyWindow(hwnd); + + /* try to set LVS_OWNERDATA after creation just having it */ + hwnd = create_listview_control(LVS_OWNERDATA); + ok(hwnd != NULL, "failed to create a listview window\n"); + style = GetWindowLongPtrA(hwnd, GWL_STYLE); + ok(style & LVS_OWNERDATA, "LVS_OWNERDATA is expected\n"); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + ret = SetWindowLongPtrA(hwnd, GWL_STYLE, style | LVS_OWNERDATA); + ok(ret == style, "Expected set GWL_STYLE to succeed\n"); + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_ownerdata_switchto_seq, + "try to switch to LVS_OWNERDATA seq", FALSE); + DestroyWindow(hwnd); + + /* try to remove LVS_OWNERDATA after creation just having it */ + hwnd = create_listview_control(LVS_OWNERDATA); + ok(hwnd != NULL, "failed to create a listview window\n"); + style = GetWindowLongPtrA(hwnd, GWL_STYLE); + ok(style & LVS_OWNERDATA, "LVS_OWNERDATA is expected\n"); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + ret = SetWindowLongPtrA(hwnd, GWL_STYLE, style & ~LVS_OWNERDATA); + ok(ret == style, "Expected set GWL_STYLE to succeed\n"); + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_ownerdata_switchto_seq, + "try to switch to LVS_OWNERDATA seq", FALSE); + style = GetWindowLongPtrA(hwnd, GWL_STYLE); + ok(style & LVS_OWNERDATA, "LVS_OWNERDATA is expected\n"); + DestroyWindow(hwnd); + + /* try select an item */ + hwnd = create_listview_control(LVS_OWNERDATA); + ok(hwnd != NULL, "failed to create a listview window\n"); + res = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0); + ok(res != 0, "Expected LVM_SETITEMCOUNT to succeed\n"); + res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0); + expect(0, res); + memset(&item, 0, sizeof(item)); + item.stateMask = LVIS_SELECTED; + item.state = LVIS_SELECTED; + res = SendMessageA(hwnd, LVM_SETITEMSTATE, 0, (LPARAM)&item); + expect(TRUE, res); + res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0); + expect(1, res); + res = SendMessageA(hwnd, LVM_GETITEMCOUNT, 0, 0); + expect(1, res); + DestroyWindow(hwnd); + + /* LVM_SETITEM is unsupported on LVS_OWNERDATA */ + hwnd = create_listview_control(LVS_OWNERDATA); + ok(hwnd != NULL, "failed to create a listview window\n"); + res = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0); + ok(res != 0, "Expected LVM_SETITEMCOUNT to succeed\n"); + res = SendMessageA(hwnd, LVM_GETITEMCOUNT, 0, 0); + expect(1, res); + memset(&item, 0, sizeof(item)); + item.mask = LVIF_STATE; + item.iItem = 0; + item.stateMask = LVIS_SELECTED; + item.state = LVIS_SELECTED; + res = SendMessageA(hwnd, LVM_SETITEM, 0, (LPARAM)&item); + expect(FALSE, res); + DestroyWindow(hwnd); +} + +static void test_norecompute(void) +{ + static CHAR testA[] = "test"; + CHAR buff[10]; + LVITEMA item; + HWND hwnd; + DWORD res; + + /* self containing control */ + hwnd = create_listview_control(0); + ok(hwnd != NULL, "failed to create a listview window\n"); + memset(&item, 0, sizeof(item)); + item.mask = LVIF_TEXT | LVIF_STATE; + item.iItem = 0; + item.stateMask = LVIS_SELECTED; + item.state = LVIS_SELECTED; + item.pszText = testA; + res = SendMessageA(hwnd, LVM_INSERTITEM, 0, (LPARAM)&item); + expect(0, res); + /* retrieve with LVIF_NORECOMPUTE */ + item.mask = LVIF_TEXT | LVIF_NORECOMPUTE; + item.iItem = 0; + item.pszText = buff; + item.cchTextMax = sizeof(buff)/sizeof(CHAR); + res = SendMessageA(hwnd, LVM_GETITEM, 0, (LPARAM)&item); + expect(TRUE, res); + ok(lstrcmp(buff, testA) == 0, "Expected (%s), got (%s)\n", testA, buff); + + item.mask = LVIF_TEXT; + item.iItem = 1; + item.pszText = LPSTR_TEXTCALLBACK; + res = SendMessageA(hwnd, LVM_INSERTITEM, 0, (LPARAM)&item); + expect(1, res); + + item.mask = LVIF_TEXT | LVIF_NORECOMPUTE; + item.iItem = 1; + item.pszText = buff; + item.cchTextMax = sizeof(buff)/sizeof(CHAR); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + res = SendMessageA(hwnd, LVM_GETITEM, 0, (LPARAM)&item); + expect(TRUE, res); + ok(item.pszText == LPSTR_TEXTCALLBACK, "Expected (%p), got (%p)\n", + LPSTR_TEXTCALLBACK, (VOID*)item.pszText); + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "retrieve with LVIF_NORECOMPUTE seq", FALSE); + + DestroyWindow(hwnd); + + /* LVS_OWNERDATA */ + hwnd = create_listview_control(LVS_OWNERDATA); + ok(hwnd != NULL, "failed to create a listview window\n"); + + item.mask = LVIF_STATE; + item.stateMask = LVIS_SELECTED; + item.state = LVIS_SELECTED; + item.iItem = 0; + res = SendMessageA(hwnd, LVM_INSERTITEM, 0, (LPARAM)&item); + expect(0, res); + + item.mask = LVIF_TEXT | LVIF_NORECOMPUTE; + item.iItem = 0; + item.pszText = buff; + item.cchTextMax = sizeof(buff)/sizeof(CHAR); + flush_sequences(sequences, NUM_MSG_SEQUENCES); + res = SendMessageA(hwnd, LVM_GETITEM, 0, (LPARAM)&item); + expect(TRUE, res); + ok(item.pszText == LPSTR_TEXTCALLBACK, "Expected (%p), got (%p)\n", + LPSTR_TEXTCALLBACK, (VOID*)item.pszText); + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "retrieve with LVIF_NORECOMPUTE seq 2", FALSE); + + DestroyWindow(hwnd); +} + +static void test_nosortheader(void) +{ + HWND hwnd, header; + LONG_PTR style; + + hwnd = create_listview_control(0); + ok(hwnd != NULL, "failed to create a listview window\n"); + + header = (HWND)SendMessageA(hwnd, LVM_GETHEADER, 0, 0); + ok(IsWindow(header), "header expected\n"); + + style = GetWindowLongPtr(header, GWL_STYLE); + ok(style & HDS_BUTTONS, "expected header to have HDS_BUTTONS\n"); + + style = GetWindowLongPtr(hwnd, GWL_STYLE); + SetWindowLongPtr(hwnd, GWL_STYLE, style | LVS_NOSORTHEADER); + /* HDS_BUTTONS retained */ + style = GetWindowLongPtr(header, GWL_STYLE); + ok(style & HDS_BUTTONS, "expected header to retain HDS_BUTTONS\n"); + + DestroyWindow(hwnd); + + /* create with LVS_NOSORTHEADER */ + hwnd = create_listview_control(LVS_NOSORTHEADER); + ok(hwnd != NULL, "failed to create a listview window\n"); + + header = (HWND)SendMessageA(hwnd, LVM_GETHEADER, 0, 0); + ok(IsWindow(header), "header expected\n"); + + style = GetWindowLongPtr(header, GWL_STYLE); + ok(!(style & HDS_BUTTONS), "expected header to have no HDS_BUTTONS\n"); + + style = GetWindowLongPtr(hwnd, GWL_STYLE); + SetWindowLongPtr(hwnd, GWL_STYLE, style & ~LVS_NOSORTHEADER); + /* not changed here */ + style = GetWindowLongPtr(header, GWL_STYLE); + ok(!(style & HDS_BUTTONS), "expected header to have no HDS_BUTTONS\n"); + + DestroyWindow(hwnd); } START_TEST(listview) @@ -1256,4 +2105,9 @@ START_TEST(listview) test_columns(); test_getorigin(); test_multiselect(); + test_subitem_rect(); + test_sorting(); + test_ownerdata(); + test_norecompute(); + test_nosortheader(); } diff --git a/rostests/winetests/comctl32/monthcal.c b/rostests/winetests/comctl32/monthcal.c index cccb1b9ea0b..1ca1997d720 100644 --- a/rostests/winetests/comctl32/monthcal.c +++ b/rostests/winetests/comctl32/monthcal.c @@ -53,7 +53,8 @@ static const struct message create_parent_window_seq[] = { { WM_SHOWWINDOW, sent|wparam, 1 }, { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, { WM_QUERYNEWPALETTE, sent|optional }, - { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, 0 }, + { WM_WINDOWPOSCHANGED, sent|optional }, { WM_ACTIVATEAPP, sent|wparam, 1 }, { WM_NCACTIVATE, sent|wparam, 1 }, { WM_ACTIVATE, sent|wparam, 1 }, @@ -377,7 +378,7 @@ static void test_monthcal(void) static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; @@ -447,7 +448,7 @@ static HWND create_parent_window(void) assert(hwnd); /* check for message sequences */ - ok_sequence(sequences, PARENT_SEQ_INDEX, create_parent_window_seq, "create parent window", TRUE); + ok_sequence(sequences, PARENT_SEQ_INDEX, create_parent_window_seq, "create parent window", FALSE); return hwnd; } @@ -455,7 +456,7 @@ static HWND create_parent_window(void) static LRESULT WINAPI monthcal_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { struct subclass_info *info = (struct subclass_info *)GetWindowLongPtrA(hwnd, GWLP_USERDATA); - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; diff --git a/rostests/winetests/comctl32/rebar.c b/rostests/winetests/comctl32/rebar.c index e5bea381025..d055d8aec8f 100644 --- a/rostests/winetests/comctl32/rebar.c +++ b/rostests/winetests/comctl32/rebar.c @@ -157,7 +157,7 @@ static void dump_sizes(HWND hRebar) printf("%s{ {%3d, %3d, %3d, %3d}, 0x%02x, %d}, ", (i%2==0 ? "\n " : ""), r.left, r.top, r.right, r.bottom, rbi.fStyle, rbi.cx); } - printf("\n }, }, \n"); + printf("\n }, },\n"); } #define check_sizes() dump_sizes(hRebar); @@ -512,7 +512,7 @@ static void dump_client(HWND hRebar) RECT r; BOOL notify; GetWindowRect(hRebar, &r); - MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); + MapWindowPoints(HWND_DESKTOP, hMainWnd, &r, 2); if (height_change_notify_rect.top != -1) { RECT rcClient; diff --git a/rostests/winetests/comctl32/status.c b/rostests/winetests/comctl32/status.c index e5b91555c3f..f1cbda47f0d 100644 --- a/rostests/winetests/comctl32/status.c +++ b/rostests/winetests/comctl32/status.c @@ -40,6 +40,10 @@ static WNDPROC g_status_wndproc; static RECT g_rcCreated; static HWND g_hMainWnd; static int g_wmsize_count = 0; +static DWORD g_ysize; +static DWORD g_dpisize; +static int g_wmdrawitm_ctr; +static WNDPROC g_wndproc_saved; static HWND create_status_control(DWORD style, DWORD exstyle) { @@ -78,7 +82,7 @@ static LRESULT WINAPI create_test_wndproc(HWND hwnd, UINT msg, WPARAM wParam, LP return ret; } -static void register_subclass() +static void register_subclass(void) { WNDCLASSEX cls; @@ -91,7 +95,7 @@ static void register_subclass() ok(RegisterClassEx(&cls), "RegisterClassEx failed\n"); } -static void test_create() +static void test_create(void) { RECT rc; HWND hwnd; @@ -113,10 +117,16 @@ static int CALLBACK check_height_font_enumproc(ENUMLOGFONTEX *enumlf, NEWTEXTMET { HWND hwndStatus = (HWND)lParam; HDC hdc = GetDC(NULL); - static const int sizes[] = {8, 9, 10, 12, 16, 22, 28, 36, 48, 72}; - int i; + static const int sizes[] = { 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, + 20, 22, 28, 36, 48, 72}; + DWORD i; + DWORD y; + LPSTR facename = (CHAR *)enumlf->elfFullName; + + /* on win9x, enumlf->elfFullName is only valid for truetype fonts */ + if (type != TRUETYPE_FONTTYPE) + facename = enumlf->elfLogFont.lfFaceName; - trace("Font %s\n", enumlf->elfFullName); for (i = 0; i < sizeof(sizes)/sizeof(sizes[0]); i++) { HFONT hFont; @@ -132,7 +142,11 @@ static int CALLBACK check_height_font_enumproc(ENUMLOGFONTEX *enumlf, NEWTEXTMET GetClientRect(hwndStatus, &rcCtrl); GetTextMetrics(hdc, &tm); - expect(max(tm.tmHeight + (tm.tmInternalLeading ? tm.tmInternalLeading : 2) + 4, 20), rcCtrl.bottom); + y = tm.tmHeight + (tm.tmInternalLeading ? tm.tmInternalLeading : 2) + 4; + + ok( (rcCtrl.bottom == max(y, g_ysize)) || (rcCtrl.bottom == max(y, g_dpisize)), + "got %d (expected %d or %d) for %s #%d\n", + rcCtrl.bottom, max(y, g_ysize), max(y, g_dpisize), facename, sizes[i]); SelectObject(hdc, hOldFont); SendMessage(hwndStatus, WM_SETFONT, (WPARAM)hCtrlFont, TRUE); @@ -213,7 +227,19 @@ static void test_height(void) ZeroMemory(&lf, sizeof(lf)); SendMessage(hwndStatus, SB_SETMINHEIGHT, 0, 0); hdc = GetDC(NULL); - trace("dpi=%d\n", GetDeviceCaps(hdc, LOGPIXELSY)); + + /* used only for some fonts (tahoma as example) */ + g_ysize = GetSystemMetrics(SM_CYSIZE) + 2; + if (g_ysize & 1) g_ysize--; /* The min height is always even */ + + g_dpisize = MulDiv(18, GetDeviceCaps(hdc, LOGPIXELSY), 96) + 2; + if (g_dpisize & 1) g_dpisize--; /* The min height is always even */ + + + trace("dpi=%d (min height: %d or %d) SM_CYSIZE: %d\n", + GetDeviceCaps(hdc, LOGPIXELSY), g_ysize, g_dpisize, + GetSystemMetrics(SM_CYSIZE)); + EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)check_height_family_enumproc, (LPARAM)hwndStatus, 0); ReleaseDC(NULL, hdc); @@ -232,6 +258,8 @@ static void test_status_control(void) RECT rc; CHAR charArray[20]; HICON hIcon; + char ch; + char chstr[10] = "Inval id"; hWndStatus = create_status_control(WS_VISIBLE, 0); @@ -281,7 +309,7 @@ static void test_status_control(void) /* Test resetting text with different characters */ r = SendMessage(hWndStatus, SB_SETTEXT, 0, (LPARAM)"First@Again"); expect(TRUE,r); - r = SendMessage(hWndStatus, SB_SETTEXT, 1, (LPARAM)"InvalidChars\\7\7"); + r = SendMessage(hWndStatus, SB_SETTEXT, 1, (LPARAM)"Invalid\tChars\\7\7"); expect(TRUE,r); r = SendMessage(hWndStatus, SB_SETTEXT, 2, (LPARAM)"InvalidChars\\n\n"); expect(TRUE,r); @@ -292,20 +320,28 @@ static void test_status_control(void) expect(11,LOWORD(r)); expect(0,HIWORD(r)); r = SendMessage(hWndStatus, SB_GETTEXT, 1, (LPARAM) charArray); - todo_wine - { - ok(strcmp(charArray,"InvalidChars\\7 ") == 0, "Expected InvalidChars\\7 , got %s\n", charArray); - } - expect(15,LOWORD(r)); + ok(strcmp(charArray,"Invalid\tChars\\7 ") == 0, "Expected Invalid\tChars\\7 , got %s\n", charArray); + + expect(16,LOWORD(r)); expect(0,HIWORD(r)); r = SendMessage(hWndStatus, SB_GETTEXT, 2, (LPARAM) charArray); - todo_wine - { - ok(strcmp(charArray,"InvalidChars\\n ") == 0, "Expected InvalidChars\\n , got %s\n", charArray); - } + ok(strcmp(charArray,"InvalidChars\\n ") == 0, "Expected InvalidChars\\n , got %s\n", charArray); + expect(15,LOWORD(r)); expect(0,HIWORD(r)); + /* test more nonprintable chars */ + for(ch = 0x00; ch < 0x7F; ch++) { + chstr[5] = ch; + r = SendMessage(hWndStatus, SB_SETTEXT, 0, (LPARAM)chstr); + expect(TRUE,r); + r = SendMessage(hWndStatus, SB_GETTEXT, 0, (LPARAM)charArray); + /* substitution with single space */ + if (ch > 0x00 && ch < 0x20 && ch != '\t') + chstr[5] = ' '; + ok(strcmp(charArray, chstr) == 0, "Expected %s, got %s\n", chstr, charArray); + } + /* Set background color */ r = SendMessage(hWndStatus, SB_SETBKCOLOR , 0, RGB(255,0,0)); ok(r == CLR_DEFAULT || @@ -383,6 +419,53 @@ static void test_status_control(void) DestroyWindow(hWndStatus); } +static LRESULT WINAPI ownerdraw_test_wndproc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + LRESULT ret; + if (msg == WM_DRAWITEM) + g_wmdrawitm_ctr++; + ret = CallWindowProc(g_wndproc_saved, hwnd, msg, wParam, lParam); + return ret; +} + +static void test_status_ownerdraw(void) +{ + HWND hWndStatus; + int r; + const char* statustext = "STATUS TEXT"; + LONG oldstyle; + + /* subclass the main window and make sure it is visible */ + g_wndproc_saved = (WNDPROC) SetWindowLongPtr( g_hMainWnd, GWLP_WNDPROC, + (LONG_PTR)ownerdraw_test_wndproc ); + ok( g_wndproc_saved != 0, "failed to set the WndProc\n"); + SetWindowPos( g_hMainWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); + oldstyle = GetWindowLong( g_hMainWnd, GWL_STYLE); + SetWindowLong( g_hMainWnd, GWL_STYLE, oldstyle | WS_VISIBLE); + /* create a status child window */ + ok((hWndStatus = CreateWindowA(SUBCLASS_NAME, "", WS_CHILD|WS_VISIBLE, 0, 0, 100, 100, + g_hMainWnd, NULL, NULL, 0)) != NULL, "CreateWindowA failed\n"); + /* set text */ + g_wmdrawitm_ctr = 0; + r = SendMessage(hWndStatus, SB_SETTEXT, 0, (LPARAM)statustext); + ok( r == TRUE, "Sendmessage returned %d, expected 1\n", r); + ok( 0 == g_wmdrawitm_ctr, "got %d drawitem messages expected none\n", g_wmdrawitm_ctr); + /* set same text, with ownerdraw flag */ + g_wmdrawitm_ctr = 0; + r = SendMessage(hWndStatus, SB_SETTEXT, SBT_OWNERDRAW, (LPARAM)statustext); + ok( r == TRUE, "Sendmessage returned %d, expected 1\n", r); + ok( 1 == g_wmdrawitm_ctr, "got %d drawitem messages expected 1\n", g_wmdrawitm_ctr); + /* ;and again */ + g_wmdrawitm_ctr = 0; + r = SendMessage(hWndStatus, SB_SETTEXT, SBT_OWNERDRAW, (LPARAM)statustext); + ok( r == TRUE, "Sendmessage returned %d, expected 1\n", r); + ok( 1 == g_wmdrawitm_ctr, "got %d drawitem messages expected 1\n", g_wmdrawitm_ctr); + /* clean up */ + DestroyWindow(hWndStatus); + SetWindowLong( g_hMainWnd, GWL_STYLE, oldstyle); + SetWindowLongPtr( g_hMainWnd, GWLP_WNDPROC, (LONG_PTR)g_wndproc_saved ); +} + START_TEST(status) { hinst = GetModuleHandleA(NULL); @@ -399,4 +482,5 @@ START_TEST(status) test_status_control(); test_create(); test_height(); + test_status_ownerdraw(); } diff --git a/rostests/winetests/comctl32/tab.c b/rostests/winetests/comctl32/tab.c index b39f52ea3cf..3bf68945120 100644 --- a/rostests/winetests/comctl32/tab.c +++ b/rostests/winetests/comctl32/tab.c @@ -310,7 +310,7 @@ create_tabcontrol (DWORD style, DWORD mask) static LRESULT WINAPI parentWindowProcess(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; @@ -378,7 +378,7 @@ struct subclass_info static LRESULT WINAPI tabSubclassProcess(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { struct subclass_info *info = (struct subclass_info *)GetWindowLongPtrA(hwnd, GWLP_USERDATA); - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; @@ -492,7 +492,7 @@ static HWND create_tooltip (HWND hTab, char toolTipText[]) ti.rect = rect; /* Add toolinfo structure to the tooltip control */ - SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); + SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) &ti); return hwndTT; } @@ -727,6 +727,7 @@ static void test_getters_setters(HWND parent_wnd, INT nTabs) { INT selectionIndex; INT focusIndex; + TCITEM tcItem; flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -756,6 +757,15 @@ static void test_getters_setters(HWND parent_wnd, INT nTabs) ok_sequence(sequences, TAB_SEQ_INDEX, getset_cur_sel_seq, "Getset curSel test sequence", FALSE); ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Getset curSel test parent sequence", FALSE); + + /* selected item should have TCIS_BUTTONPRESSED state + It doesn't depend on button state */ + memset(&tcItem, 0, sizeof(TCITEM)); + tcItem.mask = TCIF_STATE; + tcItem.dwStateMask = TCIS_BUTTONPRESSED; + selectionIndex = SendMessage(hTab, TCM_GETCURSEL, 0, 0); + SendMessage(hTab, TCM_GETITEM, selectionIndex, (LPARAM) &tcItem); + ok (tcItem.dwState & TCIS_BUTTONPRESSED, "Selected item should have TCIS_BUTTONPRESSED\n"); } /* Testing ExtendedStyle */ @@ -768,12 +778,10 @@ static void test_getters_setters(HWND parent_wnd, INT nTabs) /* Testing Flat Separators */ extendedStyle = SendMessage(hTab, TCM_GETEXTENDEDSTYLE, 0, 0); prevExtendedStyle = SendMessage(hTab, TCM_SETEXTENDEDSTYLE, 0, TCS_EX_FLATSEPARATORS); - expect(extendedStyle, prevExtendedStyle); + expect(extendedStyle, prevExtendedStyle); extendedStyle = SendMessage(hTab, TCM_GETEXTENDEDSTYLE, 0, 0); - todo_wine{ - expect(TCS_EX_FLATSEPARATORS, extendedStyle); - } + expect(TCS_EX_FLATSEPARATORS, extendedStyle); /* Testing Register Drop */ prevExtendedStyle = SendMessage(hTab, TCM_SETEXTENDEDSTYLE, 0, TCS_EX_REGISTERDROP); @@ -833,6 +841,29 @@ static void test_getters_setters(HWND parent_wnd, INT nTabs) ok_sequence(sequences, TAB_SEQ_INDEX, getset_item_seq, "Getset item test sequence", FALSE); ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Getset item test parent sequence", FALSE); + + /* TCIS_BUTTONPRESSED doesn't depend on tab style */ + memset(&tcItem, 0, sizeof(tcItem)); + tcItem.mask = TCIF_STATE; + tcItem.dwStateMask = TCIS_BUTTONPRESSED; + tcItem.dwState = TCIS_BUTTONPRESSED; + ok ( SendMessage(hTab, TCM_SETITEM, 0, (LPARAM) &tcItem), "Setting new item failed.\n"); + tcItem.dwState = 0; + ok ( SendMessage(hTab, TCM_GETITEM, 0, (LPARAM) &tcItem), "Getting item failed.\n"); + ok (tcItem.dwState == TCIS_BUTTONPRESSED, "TCIS_BUTTONPRESSED should be set.\n"); + /* next highlight item, test that dwStateMask actually masks */ + tcItem.mask = TCIF_STATE; + tcItem.dwStateMask = TCIS_HIGHLIGHTED; + tcItem.dwState = TCIS_HIGHLIGHTED; + ok ( SendMessage(hTab, TCM_SETITEM, 0, (LPARAM) &tcItem), "Setting new item failed.\n"); + tcItem.dwState = 0; + ok ( SendMessage(hTab, TCM_GETITEM, 0, (LPARAM) &tcItem), "Getting item failed.\n"); + ok (tcItem.dwState == TCIS_HIGHLIGHTED, "TCIS_HIGHLIGHTED should be set.\n"); + tcItem.mask = TCIF_STATE; + tcItem.dwStateMask = TCIS_BUTTONPRESSED; + tcItem.dwState = 0; + ok ( SendMessage(hTab, TCM_GETITEM, 0, (LPARAM) &tcItem), "Getting item failed.\n"); + ok (tcItem.dwState == TCIS_BUTTONPRESSED, "TCIS_BUTTONPRESSED should be set.\n"); } /* Testing GetSet ToolTip */ @@ -984,6 +1015,69 @@ static void test_delete_focus(HWND parent_wnd) DestroyWindow(hTab); } +static void test_removeimage(HWND parent_wnd) +{ + static const BYTE bits[32]; + HWND hwTab; + INT i; + TCITEM item; + HICON hicon; + HIMAGELIST himl = ImageList_Create(16, 16, ILC_COLOR, 3, 4); + + hicon = CreateIcon(NULL, 16, 16, 1, 1, bits, bits); + ImageList_AddIcon(himl, hicon); + ImageList_AddIcon(himl, hicon); + ImageList_AddIcon(himl, hicon); + + hwTab = create_tabcontrol(TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE); + SendMessage(hwTab, TCM_SETIMAGELIST, 0, (LPARAM)himl); + + memset(&item, 0, sizeof(TCITEM)); + item.mask = TCIF_IMAGE; + + for(i = 0; i < 3; i++) { + SendMessage(hwTab, TCM_GETITEM, i, (LPARAM)&item); + expect(i, item.iImage); + } + + /* remove image middle image */ + SendMessage(hwTab, TCM_REMOVEIMAGE, 1, 0); + expect(2, ImageList_GetImageCount(himl)); + item.iImage = -1; + SendMessage(hwTab, TCM_GETITEM, 0, (LPARAM)&item); + expect(0, item.iImage); + item.iImage = 0; + SendMessage(hwTab, TCM_GETITEM, 1, (LPARAM)&item); + expect(-1, item.iImage); + item.iImage = 0; + SendMessage(hwTab, TCM_GETITEM, 2, (LPARAM)&item); + expect(1, item.iImage); + /* remove first image */ + SendMessage(hwTab, TCM_REMOVEIMAGE, 0, 0); + expect(1, ImageList_GetImageCount(himl)); + item.iImage = 0; + SendMessage(hwTab, TCM_GETITEM, 0, (LPARAM)&item); + expect(-1, item.iImage); + item.iImage = 0; + SendMessage(hwTab, TCM_GETITEM, 1, (LPARAM)&item); + expect(-1, item.iImage); + item.iImage = -1; + SendMessage(hwTab, TCM_GETITEM, 2, (LPARAM)&item); + expect(0, item.iImage); + /* remove the last one */ + SendMessage(hwTab, TCM_REMOVEIMAGE, 0, 0); + expect(0, ImageList_GetImageCount(himl)); + for(i = 0; i < 3; i++) { + item.iImage = 0; + SendMessage(hwTab, TCM_GETITEM, i, (LPARAM)&item); + expect(-1, item.iImage); + } + + DestroyWindow(hwTab); + ImageList_Destroy(himl); + DestroyIcon(hicon); +} + START_TEST(tab) { HWND parent_wnd; @@ -1021,6 +1115,7 @@ START_TEST(tab) test_insert_focus(parent_wnd); test_delete_focus(parent_wnd); + test_removeimage(parent_wnd); DestroyWindow(parent_wnd); } diff --git a/rostests/winetests/comctl32/testlist.c b/rostests/winetests/comctl32/testlist.c index be88bef0a74..7e32af490c3 100644 --- a/rostests/winetests/comctl32/testlist.c +++ b/rostests/winetests/comctl32/testlist.c @@ -27,6 +27,7 @@ extern void func_tooltips(void); extern void func_trackbar(void); extern void func_treeview(void); extern void func_updown(void); +extern void func_ipaddress(void); const struct test winetest_testlist[] = { @@ -51,5 +52,6 @@ const struct test winetest_testlist[] = { "trackbar", func_trackbar }, { "treeview", func_treeview }, { "updown", func_updown }, + { "ipaddress", func_ipaddress }, { 0, 0 } }; diff --git a/rostests/winetests/comctl32/toolbar.c b/rostests/winetests/comctl32/toolbar.c index ee86c1c58a8..19460952349 100644 --- a/rostests/winetests/comctl32/toolbar.c +++ b/rostests/winetests/comctl32/toolbar.c @@ -592,7 +592,7 @@ static void dump_sizes(HWND hToolbar) SendMessageA(hToolbar, TB_GETITEMRECT, i, &r); printf("%s{%3d, %3d, %3d, %3d}, ", (i%3==0 ? "\n " : ""), r.left, r.top, r.right, r.bottom); } - printf("\n }, }, \n"); + printf("\n }, },\n"); } #define check_sizes() dump_sizes(hToolbar); @@ -777,7 +777,7 @@ static TBBUTTON buttons3[] = { static void test_sizes(void) { HWND hToolbar = NULL; - HIMAGELIST himl; + HIMAGELIST himl, himl2; TBBUTTONINFO tbinfo; int style; int i; @@ -928,9 +928,13 @@ static void test_sizes(void) ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(100, 21), "Unexpected button size\n"); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(100, 100)); ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(100, 100), "Unexpected button size\n"); + /* But there are no update when we change imagelist, and image sizes are the same */ + himl2 = ImageList_LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP_128x15), 20, 2, CLR_NONE, IMAGE_BITMAP, LR_DEFAULTCOLOR); + ok(SendMessageA(hToolbar, TB_SETIMAGELIST, 0, (LRESULT)himl2) == (LRESULT)himl, "TB_SETIMAGELIST failed\n"); + ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(100, 100), "Unexpected button size\n"); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(1, 1)); ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(27, 21), "Unexpected button size\n"); - ok(SendMessageA(hToolbar, TB_SETIMAGELIST, 0, 0) == (LRESULT)himl, "TB_SETIMAGELIST failed\n"); + ok(SendMessageA(hToolbar, TB_SETIMAGELIST, 0, 0) == (LRESULT)himl2, "TB_SETIMAGELIST failed\n"); ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(27, 7), "Unexpected button size\n"); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(1, 1)); ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(8, 7), "Unexpected button size\n"); @@ -999,6 +1003,108 @@ static void test_sizes(void) DestroyWindow(hToolbar); } +/* Toolbar control has two ways of reacting to a change. We call them a + * relayout and recalc. A recalc forces a recompute of values like button size + * and top margin (the latter in comctl32 itemOld.hItem); IdentifyItem(pTreeView->itemNew.hItem); return 0; + 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; + } } } return 0; @@ -683,6 +748,76 @@ static LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPa return 0L; } +static void TestExpandInvisible(void) +{ + static CHAR nodeText[][5] = {"0", "1", "2", "3", "4"}; + TVINSERTSTRUCTA ins; + HTREEITEM node[5]; + RECT dummyRect; + BOOL nodeVisible; + + /* The test builds the following tree and expands then node 1, while node 0 is collapsed. + * + * 0 + * |- 1 + * | |- 2 + * | |- 3 + * |- 4 + * + */ + + TreeView_DeleteAllItems(hTree); + + ins.hParent = TVI_ROOT; + ins.hInsertAfter = TVI_ROOT; + U(ins).item.mask = TVIF_TEXT; + U(ins).item.pszText = nodeText[0]; + node[0] = TreeView_InsertItem(hTree, &ins); + assert(node[0]); + + ins.hInsertAfter = TVI_LAST; + U(ins).item.mask = TVIF_TEXT; + ins.hParent = node[0]; + + U(ins).item.pszText = nodeText[1]; + node[1] = TreeView_InsertItem(hTree, &ins); + assert(node[1]); + U(ins).item.pszText = nodeText[4]; + node[4] = TreeView_InsertItem(hTree, &ins); + assert(node[4]); + + ins.hParent = node[1]; + + U(ins).item.pszText = nodeText[2]; + node[2] = TreeView_InsertItem(hTree, &ins); + assert(node[2]); + U(ins).item.pszText = nodeText[3]; + node[3] = TreeView_InsertItem(hTree, &ins); + assert(node[3]); + + + nodeVisible = TreeView_GetItemRect(hTree, node[1], &dummyRect, FALSE); + ok(!nodeVisible, "Node 1 should not be visible.\n"); + nodeVisible = TreeView_GetItemRect(hTree, node[2], &dummyRect, FALSE); + ok(!nodeVisible, "Node 2 should not be visible.\n"); + nodeVisible = TreeView_GetItemRect(hTree, node[3], &dummyRect, FALSE); + ok(!nodeVisible, "Node 3 should not be visible.\n"); + nodeVisible = TreeView_GetItemRect(hTree, node[4], &dummyRect, FALSE); + ok(!nodeVisible, "Node 4 should not be visible.\n"); + + ok(TreeView_Expand(hTree, node[1], TVE_EXPAND), "Expand of node 1 failed.\n"); + + nodeVisible = TreeView_GetItemRect(hTree, node[1], &dummyRect, FALSE); + ok(!nodeVisible, "Node 1 should not be visible.\n"); + nodeVisible = TreeView_GetItemRect(hTree, node[2], &dummyRect, FALSE); + ok(!nodeVisible, "Node 2 should not be visible.\n"); + nodeVisible = TreeView_GetItemRect(hTree, node[3], &dummyRect, FALSE); + ok(!nodeVisible, "Node 3 should not be visible.\n"); + nodeVisible = TreeView_GetItemRect(hTree, node[4], &dummyRect, FALSE); + ok(!nodeVisible, "Node 4 should not be visible.\n"); +} + + START_TEST(treeview) { HMODULE hComctl32; @@ -746,6 +881,12 @@ START_TEST(treeview) /* Sequences tested inside due to number */ TestGetSet(); + /* Clears all the previous items */ + TestCallback(); + + /* Clears all the previous items */ + TestExpandInvisible(); + PostMessageA(hMainWnd, WM_CLOSE, 0, 0); while(GetMessageA(&msg,0,0,0)) { TranslateMessage(&msg); diff --git a/rostests/winetests/comctl32/updown.c b/rostests/winetests/comctl32/updown.c index 2d6d437c300..433c190ae97 100644 --- a/rostests/winetests/comctl32/updown.c +++ b/rostests/winetests/comctl32/updown.c @@ -193,7 +193,7 @@ static const struct message test_updown_destroy_seq[] = { static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; @@ -262,7 +262,7 @@ struct subclass_info static LRESULT WINAPI edit_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { struct subclass_info *info = (struct subclass_info *)GetWindowLongPtrA(hwnd, GWLP_USERDATA); - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; @@ -310,7 +310,7 @@ static HWND create_edit_control(void) static LRESULT WINAPI updown_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { struct subclass_info *info = (struct subclass_info *)GetWindowLongPtrA(hwnd, GWLP_USERDATA); - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; diff --git a/rostests/winetests/comdlg32/filedlg.c b/rostests/winetests/comdlg32/filedlg.c index 9c3487f5ed7..9714dda1fe3 100644 --- a/rostests/winetests/comdlg32/filedlg.c +++ b/rostests/winetests/comdlg32/filedlg.c @@ -29,7 +29,7 @@ /* ##### */ -static UINT CALLBACK OFNHookProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +static UINT_PTR CALLBACK OFNHookProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { LPNMHDR nmh; @@ -111,7 +111,7 @@ static void test_DialogCancel(void) SetLastError(0xdeadbeef); result = GetOpenFileNameW((LPOPENFILENAMEW) &ofn); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - skip("GetOpenFileNameW is not implemented\n"); + win_skip("GetOpenFileNameW is not implemented\n"); else { ok(0 == result, "expected %d, got %d\n", 0, result); @@ -124,7 +124,7 @@ static void test_DialogCancel(void) SetLastError(0xdeadbeef); result = GetSaveFileNameW((LPOPENFILENAMEW) &ofn); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - skip("GetSaveFileNameW is not implemented\n"); + win_skip("GetSaveFileNameW is not implemented\n"); else { ok(0 == result, "expected %d, got %d\n", 0, result); @@ -135,7 +135,7 @@ static void test_DialogCancel(void) } } -static UINT CALLBACK create_view_window2_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) +static UINT_PTR CALLBACK create_view_window2_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_NOTIFY) { @@ -156,7 +156,7 @@ static UINT CALLBACK create_view_window2_hook(HWND dlg, UINT msg, WPARAM wParam, hr = IShellView_QueryInterface(shell_view, &IID_IShellView2, (void **)&shell_view2); if (hr == E_NOINTERFACE) { - skip("IShellView2 not supported\n"); + win_skip("IShellView2 not supported\n"); goto cleanup; } ok(SUCCEEDED(hr), "QueryInterface returned %#x\n", hr); diff --git a/rostests/winetests/comdlg32/printdlg.c b/rostests/winetests/comdlg32/printdlg.c index cb86d62b92b..ec63da9a6c7 100644 --- a/rostests/winetests/comdlg32/printdlg.c +++ b/rostests/winetests/comdlg32/printdlg.c @@ -298,6 +298,7 @@ static void test_abort_proc(void) DOCINFOA doc_info = {0}; PRINTDLGA pd = {0}; char filename[MAX_PATH]; + int job_id; if (!GetTempFileNameA(".", "prn", 0, filename)) { @@ -333,7 +334,18 @@ static void test_abort_proc(void) doc_info.lpszDocName = "Some document"; doc_info.lpszOutput = filename; - ok(StartDocA(print_dc, &doc_info) > 0, "StartDocA failed\n"); + job_id = StartDocA(print_dc, &doc_info); + + ok(job_id > 0 || + GetLastError() == ERROR_SPL_NO_STARTDOC, /* Vista can fail with this error when using the XPS driver */ + "StartDocA failed ret %d gle %d\n", job_id, GetLastError()); + + if(job_id <= 0) + { + skip("StartDoc failed\n"); + goto end; + } + ok(abort_proc_called, "AbortProc didn't get called by StartDoc.\n"); abort_proc_called = FALSE; @@ -357,6 +369,7 @@ static void test_abort_proc(void) ok(!abort_proc_called, "AbortProc got called unexpectedly by DeleteDC.\n"); abort_proc_called = FALSE; +end: ok(DeleteFileA(filename), "Failed to delete temporary file\n"); } @@ -374,7 +387,7 @@ START_TEST(printdlg) /* PrintDlgEx not present before w2k */ if (ptr) { - skip("%s\n", ptr); + win_skip("%s\n", ptr); return; } diff --git a/rostests/winetests/crypt32/chain.c b/rostests/winetests/crypt32/chain.c index f7efe64eec3..c880df95443 100644 --- a/rostests/winetests/crypt32/chain.c +++ b/rostests/winetests/crypt32/chain.c @@ -1184,9 +1184,10 @@ static void checkElementStatus(const CERT_TRUST_STATUS *expected, ok(got->dwErrorStatus == expected->dwErrorStatus || broken((got->dwErrorStatus & ~ignore->dwErrorStatus) == (expected->dwErrorStatus & ~ignore->dwErrorStatus)), - "Chain %d, element [%d,%d]: expected error %08x, got %08x\n", + "Chain %d, element [%d,%d]: expected error %08x, got %08x. %08x is " + "expected if no valid Verisign root certificate is available.\n", testIndex, chainIndex, elementIndex, expected->dwErrorStatus, - got->dwErrorStatus); + got->dwErrorStatus, CERT_TRUST_IS_UNTRUSTED_ROOT); if (got->dwInfoStatus == expected->dwInfoStatus) ok(got->dwInfoStatus == expected->dwInfoStatus, "Chain %d, element [%d,%d]: expected info %08x, got %08x\n", @@ -1264,9 +1265,10 @@ static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, ~chainStatus->statusToIgnore.dwErrorStatus) == (chainStatus->status.dwErrorStatus & ~chainStatus->statusToIgnore.dwErrorStatus)), - "Chain %d: expected error %08x, got %08x\n", + "Chain %d: expected error %08x, got %08x. %08x is expected if no valid " + "Verisign root certificate is available.\n", testIndex, chainStatus->status.dwErrorStatus, - chain->TrustStatus.dwErrorStatus); + chain->TrustStatus.dwErrorStatus, CERT_TRUST_IS_UNTRUSTED_ROOT); if (todo & TODO_INFO && chain->TrustStatus.dwInfoStatus != chainStatus->status.dwInfoStatus) todo_wine ok(chain->TrustStatus.dwInfoStatus == diff --git a/rostests/winetests/crypt32/msg.c b/rostests/winetests/crypt32/msg.c index 7794f359f61..8ab5625fd8e 100644 --- a/rostests/winetests/crypt32/msg.c +++ b/rostests/winetests/crypt32/msg.c @@ -29,7 +29,8 @@ #include "wine/test.h" -static BOOL have_nt; +static BOOL have_nt = TRUE; +static BOOL old_crypt32 = FALSE; static char oid_rsa_md5[] = szOID_RSA_MD5; static BOOL (WINAPI * pCryptAcquireContextA) @@ -196,7 +197,7 @@ static void test_msg_get_param(void) ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &value, &size); ok(ret, "CryptMsgGetParam failed: %x\n", GetLastError()); ok(value == CMSG_DATA, "Expected CMSG_DATA, got %d\n", value); - for (i = CMSG_CONTENT_PARAM; have_nt && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) + for (i = CMSG_CONTENT_PARAM; !old_crypt32 && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) { size = 0; ret = CryptMsgGetParam(msg, i, 0, NULL, &size); @@ -211,7 +212,7 @@ static void test_msg_get_param(void) ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &value, &size); ok(ret, "CryptMsgGetParam failed: %x\n", GetLastError()); ok(value == CMSG_ENVELOPED, "Expected CMSG_ENVELOPED, got %d\n", value); - for (i = CMSG_CONTENT_PARAM; have_nt && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) + for (i = CMSG_CONTENT_PARAM; !old_crypt32 && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) { size = 0; ret = CryptMsgGetParam(msg, i, 0, NULL, &size); @@ -226,7 +227,7 @@ static void test_msg_get_param(void) ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &value, &size); ok(ret, "CryptMsgGetParam failed: %x\n", GetLastError()); ok(value == CMSG_HASHED, "Expected CMSG_HASHED, got %d\n", value); - for (i = CMSG_CONTENT_PARAM; have_nt && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) + for (i = CMSG_CONTENT_PARAM; !old_crypt32 && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) { size = 0; ret = CryptMsgGetParam(msg, i, 0, NULL, &size); @@ -241,7 +242,7 @@ static void test_msg_get_param(void) ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &value, &size); ok(ret, "CryptMsgGetParam failed: %x\n", GetLastError()); ok(value == CMSG_SIGNED, "Expected CMSG_SIGNED, got %d\n", value); - for (i = CMSG_CONTENT_PARAM; have_nt && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) + for (i = CMSG_CONTENT_PARAM; !old_crypt32 && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) { size = 0; ret = CryptMsgGetParam(msg, i, 0, NULL, &size); @@ -295,7 +296,14 @@ static void check_param(LPCSTR test, HCRYPTMSG msg, DWORD param, size = 0xdeadbeef; ret = CryptMsgGetParam(msg, param, 0, NULL, &size); - ok(ret, "%s: CryptMsgGetParam failed: %08x\n", test, GetLastError()); + ok(ret || broken(GetLastError() == OSS_LIMITED /* Win9x */ || + GetLastError() == CRYPT_E_INVALID_MSG_TYPE /* Win9x, for some params */), + "%s: CryptMsgGetParam failed: %08x\n", test, GetLastError()); + if (!ret) + { + win_skip("parameter %d not supported, skipping tests\n", param); + return; + } buf = HeapAlloc(GetProcessHeap(), 0, size); ret = CryptMsgGetParam(msg, param, 0, buf, &size); ok(ret, "%s: CryptMsgGetParam failed: %08x\n", test, GetLastError()); @@ -400,20 +408,32 @@ static void test_data_msg_update(void) msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, CMSG_DATA, NULL, NULL, NULL); - /* Doesn't appear to be able to update CMSG-DATA with non-final updates */ - SetLastError(0xdeadbeef); - ret = CryptMsgUpdate(msg, NULL, 0, FALSE); - ok(!ret && GetLastError() == E_INVALIDARG, - "Expected E_INVALIDARG, got %x\n", GetLastError()); - SetLastError(0xdeadbeef); - ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); - ok(!ret && GetLastError() == E_INVALIDARG, - "Expected E_INVALIDARG, got %x\n", GetLastError()); + if (have_nt) + { + /* Doesn't appear to be able to update CMSG-DATA with non-final updates. + * On Win9x, this sometimes succeeds, sometimes fails with + * GetLastError() == 0, so it's not worth checking there. + */ + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, NULL, 0, FALSE); + ok(!ret && + (GetLastError() == E_INVALIDARG || + broken(GetLastError() == ERROR_SUCCESS)), /* Older NT4 */ + "Expected E_INVALIDARG, got %x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); + ok(!ret && + (GetLastError() == E_INVALIDARG || + broken(GetLastError() == ERROR_SUCCESS)), /* Older NT4 */ + "Expected E_INVALIDARG, got %x\n", GetLastError()); + } + else + skip("not updating CMSG_DATA with a non-final update\n"); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError()); CryptMsgClose(msg); - if (have_nt) + if (!old_crypt32) { /* Calling update after opening with an empty stream info (with a bogus * output function) yields an error: @@ -481,11 +501,11 @@ static void test_data_msg_get_param(void) NULL, &streamInfo); SetLastError(0xdeadbeef); ret = CryptMsgGetParam(msg, CMSG_BARE_CONTENT_PARAM, 0, NULL, &size); - ok(!ret && GetLastError() == E_INVALIDARG, + ok((!ret && GetLastError() == E_INVALIDARG) || broken(ret /* Win9x */), "Expected E_INVALIDARG, got %x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, NULL, &size); - ok(!ret && GetLastError() == E_INVALIDARG, + ok((!ret && GetLastError() == E_INVALIDARG) || broken(ret /* Win9x */), "Expected E_INVALIDARG, got %x\n", GetLastError()); CryptMsgClose(msg); } @@ -798,15 +818,19 @@ static void test_hash_msg_get_param(void) /* Content and bare content are always gettable for non-streamed messages */ size = 0; ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, NULL, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_LIMITED /* Win9x */), + "CryptMsgGetParam failed: %08x\n", GetLastError()); size = 0; ret = CryptMsgGetParam(msg, CMSG_BARE_CONTENT_PARAM, 0, NULL, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_LIMITED /* Win9x */), + "CryptMsgGetParam failed: %08x\n", GetLastError()); /* For an encoded hash message, the hash data aren't available */ SetLastError(0xdeadbeef); ret = CryptMsgGetParam(msg, CMSG_HASH_DATA_PARAM, 0, NULL, &size); - ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE, - "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_INVALID_MSG_TYPE || + GetLastError() == OSS_LIMITED /* Win9x */), + "Expected CRYPT_E_INVALID_MSG_TYPE or OSS_LIMITED, got %08x\n", + GetLastError()); /* The hash is also available. */ size = 0; ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, NULL, &size); @@ -821,7 +845,8 @@ static void test_hash_msg_get_param(void) ok(!ret && (GetLastError() == NTE_BAD_HASH_STATE /* NT */ || GetLastError() == NTE_BAD_ALGID /* 9x */ || - GetLastError() == CRYPT_E_MSG_ERROR /* Vista */), + GetLastError() == CRYPT_E_MSG_ERROR /* Vista */ || + broken(GetLastError() == ERROR_SUCCESS) /* Some Win9x */), "Expected NTE_BAD_HASH_STATE or NTE_BAD_ALGID or CRYPT_E_MSG_ERROR, got 0x%x\n", GetLastError()); /* Even after a final update, the hash data aren't available */ @@ -832,11 +857,14 @@ static void test_hash_msg_get_param(void) /* The version is also available, and should be zero for this message. */ size = 0; ret = CryptMsgGetParam(msg, CMSG_VERSION_PARAM, 0, NULL, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == CRYPT_E_INVALID_MSG_TYPE /* Win9x */), + "CryptMsgGetParam failed: %08x\n", GetLastError()); size = sizeof(value); ret = CryptMsgGetParam(msg, CMSG_VERSION_PARAM, 0, &value, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - ok(value == 0, "Expected version 0, got %d\n", value); + ok(ret || broken(GetLastError() == CRYPT_E_INVALID_MSG_TYPE /* Win9x */), + "CryptMsgGetParam failed: %08x\n", GetLastError()); + if (ret) + ok(value == 0, "Expected version 0, got %d\n", value); /* As usual, the type isn't available. */ ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, NULL, &size); ok(!ret, "Expected failure\n"); @@ -847,12 +875,14 @@ static void test_hash_msg_get_param(void) /* Streamed messages don't allow you to get the content or bare content. */ SetLastError(0xdeadbeef); ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, NULL, &size); - ok(!ret && GetLastError() == E_INVALIDARG, - "Expected E_INVALIDARG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == E_INVALIDARG || + GetLastError() == OSS_LIMITED /* Win9x */), + "Expected E_INVALIDARG or OSS_LIMITED, got %x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgGetParam(msg, CMSG_BARE_CONTENT_PARAM, 0, NULL, &size); - ok(!ret && GetLastError() == E_INVALIDARG, - "Expected E_INVALIDARG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == E_INVALIDARG || + GetLastError() == OSS_LIMITED /* Win9x */), + "Expected E_INVALIDARG or OSS_LIMITED, got %x\n", GetLastError()); /* The hash is still available. */ size = 0; ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, NULL, &size); @@ -870,7 +900,8 @@ static void test_hash_msg_get_param(void) ok(!ret && (GetLastError() == NTE_BAD_HASH_STATE /* NT */ || GetLastError() == NTE_BAD_ALGID /* 9x */ || - GetLastError() == CRYPT_E_MSG_ERROR /* Vista */), + GetLastError() == CRYPT_E_MSG_ERROR /* Vista */ || + broken(GetLastError() == ERROR_SUCCESS) /* Some Win9x */), "Expected NTE_BAD_HASH_STATE or NTE_BAD_ALGID or CRYPT_E_MSG_ERROR, got 0x%x\n", GetLastError()); CryptMsgClose(msg); @@ -1055,26 +1086,31 @@ static void test_signed_msg_open(void) SetLastError(0xdeadbeef); msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo, NULL, NULL); - /* NT: E_INVALIDARG, 9x: unchanged */ - ok(!msg && (GetLastError() == E_INVALIDARG || GetLastError() == 0xdeadbeef), - "Expected E_INVALIDARG or 0xdeadbeef, got 0x%x\n", GetLastError()); + /* NT: E_INVALIDARG, 9x: unchanged or CRYPT_E_UNKNOWN_ALGO */ + ok(!msg && (GetLastError() == E_INVALIDARG || GetLastError() == 0xdeadbeef + || GetLastError() == CRYPT_E_UNKNOWN_ALGO), + "Expected E_INVALIDARG or 0xdeadbeef or CRYPT_E_UNKNOWN_ALGO, got 0x%x\n", + GetLastError()); certInfo.SerialNumber.cbData = sizeof(serialNum); certInfo.SerialNumber.pbData = serialNum; SetLastError(0xdeadbeef); msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo, NULL, NULL); - /* NT: E_INVALIDARG, 9x: unchanged */ - ok(!msg && (GetLastError() == E_INVALIDARG || GetLastError() == 0xdeadbeef), - "Expected E_INVALIDARG or 0xdeadbeef, got 0x%x\n", GetLastError()); + /* NT: E_INVALIDARG, 9x: unchanged or CRYPT_E_UNKNOWN_ALGO */ + ok(!msg && (GetLastError() == E_INVALIDARG || GetLastError() == 0xdeadbeef + || GetLastError() == CRYPT_E_UNKNOWN_ALGO), + "Expected E_INVALIDARG or 0xdeadbeef or CRYPT_E_UNKNOWN_ALGO, got 0x%x\n", + GetLastError()); certInfo.Issuer.cbData = sizeof(encodedCommonName); certInfo.Issuer.pbData = encodedCommonName; SetLastError(0xdeadbeef); msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo, NULL, NULL); - ok(!msg && GetLastError() == E_INVALIDARG, - "Expected E_INVALIDARG, got %x\n", GetLastError()); + ok(!msg && (GetLastError() == E_INVALIDARG || + GetLastError() == CRYPT_E_UNKNOWN_ALGO), + "Expected E_INVALIDARG or CRYPT_E_UNKNOWN_ALGO, got %x\n", GetLastError()); /* The signer's hCryptProv must be set to something. Whether it's usable * or not will be checked after the hash algorithm is checked (see next @@ -1211,8 +1247,10 @@ static void test_signed_msg_update(void) */ SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, NULL, 0, TRUE); - ok(!ret && (GetLastError() == NTE_BAD_KEYSET || - GetLastError() == NTE_NO_KEY), + ok(!ret && + (GetLastError() == NTE_BAD_KEYSET || + GetLastError() == NTE_NO_KEY || + broken(GetLastError() == ERROR_SUCCESS)), /* Some Win9x */ "Expected NTE_BAD_KEYSET or NTE_NO_KEY, got %x\n", GetLastError()); ret = CryptImportKey(signer.hCryptProv, privKey, sizeof(privKey), 0, 0, &key); @@ -1656,7 +1694,8 @@ static void test_signed_msg_encoding(void) detachedSignedContent, sizeof(detachedSignedContent)); SetLastError(0xdeadbeef); ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 1, NULL, &size); - ok(!ret && GetLastError() == CRYPT_E_INVALID_INDEX, + ok(!ret && (GetLastError() == CRYPT_E_INVALID_INDEX || + broken(GetLastError() == CRYPT_E_INVALID_MSG_TYPE /* Win9x */)), "Expected CRYPT_E_INVALID_INDEX, got %x\n", GetLastError()); check_param("detached signed encoded signer", msg, CMSG_ENCODED_SIGNER, signedEncodedSigner, sizeof(signedEncodedSigner)); @@ -1808,7 +1847,13 @@ static void test_signed_msg_get_param(void) /* Content and bare content are always gettable */ size = 0; ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, NULL, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + ok(ret || broken(!ret /* Win9x */), "CryptMsgGetParam failed: %08x\n", + GetLastError()); + if (!ret) + { + skip("message parameters are broken, skipping tests\n"); + return; + } size = 0; ret = CryptMsgGetParam(msg, CMSG_BARE_CONTENT_PARAM, 0, NULL, &size); ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); @@ -1913,8 +1958,10 @@ static void test_signed_msg_get_param(void) */ size = sizeof(value); ret = CryptMsgGetParam(msg, CMSG_VERSION_PARAM, 0, &value, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - ok(value == CMSG_SIGNED_DATA_V1, "expected version 1, got %d\n", value); + ok(ret || broken(GetLastError() == CRYPT_E_INVALID_MSG_TYPE), + "CryptMsgGetParam failed: %08x\n", GetLastError()); + if (ret) + ok(value == CMSG_SIGNED_DATA_V1, "expected version 1, got %d\n", value); /* Apparently the encoded signer can be retrieved.. */ ret = CryptMsgGetParam(msg, CMSG_ENCODED_SIGNER, 0, NULL, &size); ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); @@ -1950,7 +1997,9 @@ static void test_signed_msg_get_param(void) ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError()); size = sizeof(value); ret = CryptMsgGetParam(msg, CMSG_VERSION_PARAM, 0, &value, &size); - ok(value == CMSG_SIGNED_DATA_V3, "expected version 3, got %d\n", value); + ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + if (ret) + ok(value == CMSG_SIGNED_DATA_V3, "expected version 3, got %d\n", value); /* Even for a CMS message, the signer can be retrieved.. */ ret = CryptMsgGetParam(msg, CMSG_ENCODED_SIGNER, 0, NULL, &size); ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); @@ -2026,7 +2075,7 @@ static void test_decode_msg_update(void) ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError()); CryptMsgClose(msg); - if (have_nt) + if (!old_crypt32) { msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, &streamInfo); /* Updating a message that has a NULL stream callback fails */ @@ -2084,16 +2133,20 @@ static void test_decode_msg_update(void) msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH, got %x\n", + GetLastError()); CryptMsgClose(msg); /* and as the final update in streaming mode.. */ streamInfo.pfnStreamOutput = nop_stream_output; msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, &streamInfo); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH, got %x\n", + GetLastError()); CryptMsgClose(msg); /* and even as a non-final update in streaming mode. */ streamInfo.pfnStreamOutput = nop_stream_output; @@ -2101,8 +2154,10 @@ static void test_decode_msg_update(void) SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); todo_wine - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH, got %x\n", + GetLastError()); CryptMsgClose(msg); /* An empty message can be opened with undetermined type.. */ @@ -2117,8 +2172,10 @@ static void test_decode_msg_update(void) SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent), TRUE); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH, got %x\n", + GetLastError()); CryptMsgClose(msg); /* On the other hand, decoding the bare content of an empty message fails * with unspecified type.. @@ -2127,8 +2184,10 @@ static void test_decode_msg_update(void) SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, dataEmptyBareContent, sizeof(dataEmptyBareContent), TRUE); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH, got %x\n", + GetLastError()); CryptMsgClose(msg); /* but succeeds with explicit type. */ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_DATA, 0, NULL, @@ -2150,15 +2209,19 @@ static void test_decode_msg_update(void) msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, hashEmptyContent, sizeof(hashEmptyContent), TRUE); - ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), + "CryptMsgUpdate failed: %08x\n", GetLastError()); CryptMsgClose(msg); /* while with specified type it fails. */ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL, NULL); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, hashEmptyContent, sizeof(hashEmptyContent), TRUE); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* some Win9x */ || + GetLastError() == OSS_DATA_ERROR /* some Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH or OSS_DATA_ERROR, got %x\n", + GetLastError()); CryptMsgClose(msg); /* On the other hand, decoding the bare content of an empty hash message * fails with unspecified type.. @@ -2167,15 +2230,19 @@ static void test_decode_msg_update(void) SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, hashEmptyBareContent, sizeof(hashEmptyBareContent), TRUE); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* some Win9x */ || + GetLastError() == OSS_DATA_ERROR /* some Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH or OSS_DATA_ERROR, got %x\n", + GetLastError()); CryptMsgClose(msg); /* but succeeds with explicit type. */ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL, NULL); ret = CryptMsgUpdate(msg, hashEmptyBareContent, sizeof(hashEmptyBareContent), TRUE); - ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* win9x */), + "CryptMsgUpdate failed: %x\n", GetLastError()); CryptMsgClose(msg); /* And again, opening a (non-empty) hash message with unspecified type @@ -2191,8 +2258,11 @@ static void test_decode_msg_update(void) NULL); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, hashContent, sizeof(hashContent), TRUE); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* some Win9x */ || + GetLastError() == OSS_DATA_ERROR /* some Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH or OSS_DATA_ERROR, got %x\n", + GetLastError()); CryptMsgClose(msg); /* and decoding the bare content of a non-empty hash message fails with * unspecified type.. @@ -2200,8 +2270,11 @@ static void test_decode_msg_update(void) msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, hashBareContent, sizeof(hashBareContent), TRUE); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* some Win9x */ || + GetLastError() == OSS_DATA_ERROR /* some Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH or OSS_DATA_ERROR, got %x\n", + GetLastError()); CryptMsgClose(msg); /* but succeeds with explicit type. */ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL, @@ -2227,8 +2300,10 @@ static void test_decode_msg_update(void) SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, signedWithCertAndCrlBareContent, sizeof(signedWithCertAndCrlBareContent), TRUE); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, - "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_DATA_ERROR /* Win9x */), + "Expected CRYPT_E_ASN1_BADTAG or OSS_DATA_ERROR, got %08x\n", + GetLastError()); CryptMsgClose(msg); msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, 0, NULL, NULL); @@ -2378,12 +2453,16 @@ static void test_decode_msg_get_param(void) sizeof(hashParam)); check_param("hash computed hash", msg, CMSG_COMPUTED_HASH_PARAM, hashParam, sizeof(hashParam)); - /* Curiously, getting the hash of index 1 succeeds, even though there's - * only one hash. + /* Curiously, on NT-like systems, getting the hash of index 1 succeeds, + * even though there's only one hash. */ ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 1, NULL, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - buf = CryptMemAlloc(size); + ok(ret || GetLastError() == OSS_DATA_ERROR /* Win9x */, + "CryptMsgGetParam failed: %08x\n", GetLastError()); + if (ret) + buf = CryptMemAlloc(size); + else + buf = NULL; if (buf) { ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 1, buf, &size); @@ -2412,7 +2491,8 @@ static void test_decode_msg_get_param(void) ok(value == 1, "Expected 1 signer, got %d\n", value); size = 0; ret = CryptMsgGetParam(msg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), + "CryptMsgGetParam failed: %08x\n", GetLastError()); if (ret) buf = CryptMemAlloc(size); else @@ -2434,7 +2514,8 @@ static void test_decode_msg_get_param(void) /* Getting the CMS signer info of a PKCS7 message is possible. */ size = 0; ret = CryptMsgGetParam(msg, CMSG_CMS_SIGNER_INFO_PARAM, 0, NULL, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == CRYPT_E_INVALID_MSG_TYPE /* Win9x */), + "CryptMsgGetParam failed: %08x\n", GetLastError()); if (ret) buf = CryptMemAlloc(size); else @@ -2589,7 +2670,7 @@ static void test_msg_control(void) msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_DATA, NULL, NULL, NULL); /* either with no prior update.. */ - for (i = 1; have_nt && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) + for (i = 1; !old_crypt32 && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) { SetLastError(0xdeadbeef); ret = CryptMsgControl(msg, 0, i, NULL); @@ -2598,7 +2679,7 @@ static void test_msg_control(void) } ret = CryptMsgUpdate(msg, NULL, 0, TRUE); /* or after an update. */ - for (i = 1; have_nt && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) + for (i = 1; !old_crypt32 && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) { SetLastError(0xdeadbeef); ret = CryptMsgControl(msg, 0, i, NULL); @@ -2613,7 +2694,7 @@ static void test_msg_control(void) msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, &hashInfo, NULL, NULL); /* either with no prior update.. */ - for (i = 1; have_nt && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) + for (i = 1; !old_crypt32 && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) { SetLastError(0xdeadbeef); ret = CryptMsgControl(msg, 0, i, NULL); @@ -2622,7 +2703,7 @@ static void test_msg_control(void) } ret = CryptMsgUpdate(msg, NULL, 0, TRUE); /* or after an update. */ - for (i = 1; have_nt && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) + for (i = 1; !old_crypt32 && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) { SetLastError(0xdeadbeef); ret = CryptMsgControl(msg, 0, i, NULL); @@ -2636,7 +2717,7 @@ static void test_msg_control(void) msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo, NULL, NULL); /* either before an update.. */ - for (i = 1; have_nt && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) + for (i = 1; !old_crypt32 && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) { SetLastError(0xdeadbeef); ret = CryptMsgControl(msg, 0, i, NULL); @@ -2645,7 +2726,7 @@ static void test_msg_control(void) } ret = CryptMsgUpdate(msg, NULL, 0, TRUE); /* or after an update. */ - for (i = 1; have_nt && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) + for (i = 1; !old_crypt32 && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) { SetLastError(0xdeadbeef); ret = CryptMsgControl(msg, 0, i, NULL); @@ -2679,7 +2760,7 @@ static void test_msg_control(void) "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError()); CryptMsgClose(msg); - if (have_nt) + if (!old_crypt32) { msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL, NULL); @@ -2788,8 +2869,10 @@ static void test_msg_control(void) */ SetLastError(0xdeadbeef); ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(!ret && GetLastError() == CRYPT_E_SIGNER_NOT_FOUND, - "Expected CRYPT_E_SIGNER_NOT_FOUND, got %08x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_SIGNER_NOT_FOUND || + GetLastError() == OSS_DATA_ERROR /* Win9x */), + "Expected CRYPT_E_SIGNER_NOT_FOUND or OSS_DATA_ERROR, got %08x\n", + GetLastError()); /* The cert info is expected to have an issuer, serial number, and public * key info set. */ @@ -2799,8 +2882,9 @@ static void test_msg_control(void) certInfo.Issuer.pbData = encodedCommonName; SetLastError(0xdeadbeef); ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD, - "Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_DATA_ERROR /* Win9x */), + "Expected CRYPT_E_ASN1_EOD or OSS_DATA_ERROR, got %08x\n", GetLastError()); CryptMsgClose(msg); /* This cert has a public key, but it's not in a usable form */ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, 0, NULL, @@ -2876,7 +2960,8 @@ static void test_msg_control(void) CryptMsgUpdate(msg, signedWithCertWithValidPubKeyContent, sizeof(signedWithCertWithValidPubKeyContent), TRUE); ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(ret, "CryptMsgControl failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), + "CryptMsgControl failed: %08x\n", GetLastError()); CryptMsgClose(msg); /* Test verifying signature of a detached signed message */ @@ -2888,15 +2973,19 @@ static void test_msg_control(void) /* Can't verify the sig without having updated the data */ SetLastError(0xdeadbeef); ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(!ret && GetLastError() == NTE_BAD_SIGNATURE, - "expected NTE_BAD_SIGNATURE, got %08x\n", GetLastError()); + ok(!ret && (GetLastError() == NTE_BAD_SIGNATURE || + GetLastError() == OSS_DATA_ERROR /* Win9x */), + "expected NTE_BAD_SIGNATURE or OSS_DATA_ERROR, got %08x\n", + GetLastError()); /* Now that the signature's been checked, can't do the final update */ + SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); todo_wine - ok(!ret && + ok((!ret && (GetLastError() == NTE_BAD_HASH_STATE || GetLastError() == NTE_BAD_ALGID || /* Win9x */ - GetLastError() == CRYPT_E_MSG_ERROR), /* Vista */ + GetLastError() == CRYPT_E_MSG_ERROR)) || /* Vista */ + broken(ret), /* Win9x */ "expected NTE_BAD_HASH_STATE or NTE_BAD_ALGID or CRYPT_E_MSG_ERROR, " "got %08x\n", GetLastError()); CryptMsgClose(msg); @@ -2911,7 +3000,8 @@ static void test_msg_control(void) ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(ret, "CryptMsgControl failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), + "CryptMsgControl failed: %08x\n", GetLastError()); CryptMsgClose(msg); } @@ -3013,17 +3103,22 @@ static void test_msg_get_and_verify_signer(void) CryptMsgUpdate(msg, signedWithCertWithValidPubKeyContent, sizeof(signedWithCertWithValidPubKeyContent), TRUE); ret = CryptMsgGetAndVerifySigner(msg, 0, NULL, 0, NULL, NULL); - ok(ret, "CryptMsgGetAndVerifySigner failed: 0x%08x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), + "CryptMsgGetAndVerifySigner failed: 0x%08x\n", GetLastError()); /* the signer index can be retrieved, .. */ signerIndex = 0xdeadbeef; ret = CryptMsgGetAndVerifySigner(msg, 0, NULL, 0, NULL, &signerIndex); - ok(ret, "CryptMsgGetAndVerifySigner failed: 0x%08x\n", GetLastError()); - ok(signerIndex == 0, "expected 0, got %d\n", signerIndex); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), + "CryptMsgGetAndVerifySigner failed: 0x%08x\n", GetLastError()); + if (ret) + ok(signerIndex == 0, "expected 0, got %d\n", signerIndex); /* as can the signer cert. */ signer = (PCCERT_CONTEXT)0xdeadbeef; ret = CryptMsgGetAndVerifySigner(msg, 0, NULL, 0, &signer, NULL); - ok(ret, "CryptMsgGetAndVerifySigner failed: 0x%08x\n", GetLastError()); - ok(signer != NULL && signer != (PCCERT_CONTEXT)0xdeadbeef, + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), + "CryptMsgGetAndVerifySigner failed: 0x%08x\n", GetLastError()); + if (ret) + ok(signer != NULL && signer != (PCCERT_CONTEXT)0xdeadbeef, "expected a valid signer\n"); if (signer && signer != (PCCERT_CONTEXT)0xdeadbeef) CertFreeCertificateContext(signer); @@ -3041,7 +3136,8 @@ static void test_msg_get_and_verify_signer(void) SetLastError(0xdeadbeef); ret = CryptMsgGetAndVerifySigner(msg, 0, NULL, CMSG_TRUSTED_SIGNER_FLAG, NULL, NULL); - ok(!ret && GetLastError() == CRYPT_E_NO_TRUSTED_SIGNER, + ok(!ret && (GetLastError() == CRYPT_E_NO_TRUSTED_SIGNER || + broken(GetLastError() == OSS_DATA_ERROR /* Win9x */)), "expected CRYPT_E_NO_TRUSTED_SIGNER, got 0x%08x\n", GetLastError()); /* Specifying CMSG_TRUSTED_SIGNER_FLAG and an empty cert store also causes * the message signer not to be found. @@ -3051,20 +3147,22 @@ static void test_msg_get_and_verify_signer(void) SetLastError(0xdeadbeef); ret = CryptMsgGetAndVerifySigner(msg, 1, &store, CMSG_TRUSTED_SIGNER_FLAG, NULL, NULL); - ok(!ret && GetLastError() == CRYPT_E_NO_TRUSTED_SIGNER, + ok(!ret && (GetLastError() == CRYPT_E_NO_TRUSTED_SIGNER || + broken(GetLastError() == OSS_DATA_ERROR /* Win9x */)), "expected CRYPT_E_NO_TRUSTED_SIGNER, got 0x%08x\n", GetLastError()); ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, v1CertWithValidPubKey, sizeof(v1CertWithValidPubKey), CERT_STORE_ADD_ALWAYS, NULL); - ok(ret, "CertAddEncodedCertificateToStore failed: 0x%08x\n", - GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win98 */), + "CertAddEncodedCertificateToStore failed: 0x%08x\n", GetLastError()); /* Specifying CMSG_TRUSTED_SIGNER_FLAG with a cert store that contains * the signer succeeds. */ SetLastError(0xdeadbeef); ret = CryptMsgGetAndVerifySigner(msg, 1, &store, CMSG_TRUSTED_SIGNER_FLAG, NULL, NULL); - ok(ret, "CryptMsgGetAndVerifySigner failed: 0x%08x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), + "CryptMsgGetAndVerifySigner failed: 0x%08x\n", GetLastError()); CertCloseStore(store, 0); CryptMsgClose(msg); } @@ -3076,6 +3174,13 @@ START_TEST(msg) if (!have_nt) win_skip("Win9x crashes on some parameter checks\n"); + /* I_CertUpdateStore can be used for verification if crypt32 is new enough */ + if (!GetProcAddress(GetModuleHandleA("crypt32.dll"), "I_CertUpdateStore")) + { + win_skip("Some tests will crash on older crypt32 implementations\n"); + old_crypt32 = TRUE; + } + /* Basic parameter checking tests */ test_msg_open_to_encode(); test_msg_open_to_decode(); diff --git a/rostests/winetests/fusion/asmcache.c b/rostests/winetests/fusion/asmcache.c index 727f98d2015..81c0e762d4f 100644 --- a/rostests/winetests/fusion/asmcache.c +++ b/rostests/winetests/fusion/asmcache.c @@ -306,7 +306,7 @@ static struct _tagASSEMBLY }, /* IMAGE_OPTIONAL_HEADER32 */ { - IMAGE_NT_OPTIONAL_HDR_MAGIC, /* Magic */ + IMAGE_NT_OPTIONAL_HDR32_MAGIC, /* Magic */ 8, /* MajorLinkerVersion */ 0, /* MinorLinkerVersion */ 0x400, /* SizeOfCode */ diff --git a/rostests/winetests/fusion/asmenum.c b/rostests/winetests/fusion/asmenum.c index 54c134004bc..48f7b2a97b1 100644 --- a/rostests/winetests/fusion/asmenum.c +++ b/rostests/winetests/fusion/asmenum.c @@ -240,11 +240,19 @@ static BOOL enum_gac_assemblies(struct list *assemblies, int depth, LPSTR path) if (depth == 0) { - sprintf(parent, "%s, ", ffd.cFileName); + lstrcpyA(parent, ffd.cFileName); } else if (depth == 1) { char culture[MAX_PATH]; + char dll[MAX_PATH], exe[MAX_PATH]; + + /* Directories with no dll or exe will not be enumerated */ + sprintf(dll, "%s\\%s\\%s.dll", path, ffd.cFileName, parent); + sprintf(exe, "%s\\%s\\%s.exe", path, ffd.cFileName, parent); + if (GetFileAttributesA(dll) == INVALID_FILE_ATTRIBUTES && + GetFileAttributesA(exe) == INVALID_FILE_ATTRIBUTES) + continue; ptr = strstr(ffd.cFileName, "_"); *ptr = '\0'; @@ -260,7 +268,7 @@ static BOOL enum_gac_assemblies(struct list *assemblies, int depth, LPSTR path) ptr = strchr(ptr, '_'); ptr++; - sprintf(buf, "Version=%s, Culture=%s, PublicKeyToken=%s", + sprintf(buf, ", Version=%s, Culture=%s, PublicKeyToken=%s", ffd.cFileName, culture, ptr); lstrcpyA(disp, parent); lstrcatA(disp, buf); @@ -434,8 +442,7 @@ static void test_enumerate_name(void) hr = IAssemblyName_GetDisplayName(next, buf, &size, 0); to_multibyte(disp, buf); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(!lstrcmpA(disp, exp[0]) || - !lstrcmpA(disp, exp[1]), + ok(!lstrcmpA(disp, exp[0]), "Expected \"%s\" or \"%s\", got \"%s\"\n", exp[0], exp[1], disp); IAssemblyName_Release(next); @@ -450,7 +457,7 @@ static void test_enumerate_name(void) to_multibyte(disp, buf); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpA(disp, exp[1]) || - !lstrcmpA(disp, exp[2]), + !lstrcmpA(disp, exp[2]), /* Win98 */ "Expected \"%s\" or \"%s\", got \"%s\"\n", exp[1], exp[2], disp); IAssemblyName_Release(next); @@ -464,7 +471,9 @@ static void test_enumerate_name(void) hr = IAssemblyName_GetDisplayName(next, buf, &size, 0); to_multibyte(disp, buf); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(!lstrcmpA(disp, exp[2]), "Expected \"%s\", got \"%s\"\n", exp[2], disp); + ok(!lstrcmpA(disp, exp[2]) || + !lstrcmpA(disp, exp[1]), /* Win98 */ + "Expected \"%s\" or \"%s\", got \"%s\"\n", exp[2], exp[1], disp); IAssemblyName_Release(next); @@ -498,7 +507,9 @@ static void test_enumerate_name(void) hr = IAssemblyName_GetDisplayName(next, buf, &size, 0); to_multibyte(disp, buf); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(!lstrcmpA(disp, exp[4]), "Expected \"%s\", got \"%s\"\n", exp[4], disp); + ok(!lstrcmpA(disp, exp[4]) || + !lstrcmpA(disp, exp[5]), /* Win98 */ + "Expected \"%s\" or \"%s\", got \"%s\"\n", exp[4], exp[5], disp); IAssemblyName_Release(next); @@ -511,7 +522,9 @@ static void test_enumerate_name(void) hr = IAssemblyName_GetDisplayName(next, buf, &size, 0); to_multibyte(disp, buf); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(!lstrcmpA(disp, exp[5]), "Expected \"%s\", got \"%s\"\n", exp[5], disp); + ok(!lstrcmpA(disp, exp[5]) || + !lstrcmpA(disp, exp[4]), /* Win98 */ + "Expected \"%s\" or \"%s\", got \"%s\"\n", exp[5], exp[4], disp); IAssemblyName_Release(next); @@ -606,7 +619,7 @@ static void test_enumerate_name(void) to_multibyte(disp, buf); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpA(disp, exp[1]) || - !lstrcmpA(disp, exp[2]), + !lstrcmpA(disp, exp[2]), /* Win98 */ "Expected \"%s\" or \"%s\", got \"%s\"\n", exp[1], exp[2], disp); IAssemblyName_Release(next); @@ -620,9 +633,9 @@ static void test_enumerate_name(void) hr = IAssemblyName_GetDisplayName(next, buf, &size, 0); to_multibyte(disp, buf); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(!lstrcmpA(disp, exp[1]) || - !lstrcmpA(disp, exp[2]), - "Expected \"%s\" or \"%s\", got \"%s\"\n", exp[1], exp[2], disp); + ok(!lstrcmpA(disp, exp[2]) || + !lstrcmpA(disp, exp[1]), /* Win98 */ + "Expected \"%s\" or \"%s\", got \"%s\"\n", exp[2], exp[1], disp); IAssemblyName_Release(next); diff --git a/rostests/winetests/fusion/asmname.c b/rostests/winetests/fusion/asmname.c index a926b8757c8..442f00f7c45 100644 --- a/rostests/winetests/fusion/asmname.c +++ b/rostests/winetests/fusion/asmname.c @@ -417,7 +417,8 @@ static void test_CreateAssemblyNameObject(void) size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == E_INVALIDARG), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); size = MAX_PATH; @@ -430,12 +431,17 @@ static void test_CreateAssemblyNameObject(void) hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); - test_assembly_name_props(name, defaults); + if (hr == S_OK) + win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY" + " and ASM_NAME_OSINFO_ARRAY correctly\n"); + else + test_assembly_name_props(name, defaults); IAssemblyName_Release(name); @@ -447,7 +453,8 @@ static void test_CreateAssemblyNameObject(void) size = MAX_PATH; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); size = MAX_PATH; @@ -460,12 +467,17 @@ static void test_CreateAssemblyNameObject(void) hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); - test_assembly_name_props(name, emptyname); + if (hr == S_OK) + win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY" + " and ASM_NAME_OSINFO_ARRAY correctly\n"); + else + test_assembly_name_props(name, emptyname); IAssemblyName_Release(name); @@ -492,12 +504,17 @@ static void test_CreateAssemblyNameObject(void) hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); - test_assembly_name_props(name, winename); + if (hr == S_OK) + win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY" + " and ASM_NAME_OSINFO_ARRAY correctly\n"); + else + test_assembly_name_props(name, winename); IAssemblyName_Release(name); @@ -526,7 +543,8 @@ static void test_CreateAssemblyNameObject(void) hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); @@ -589,9 +607,12 @@ static void test_CreateAssemblyNameObject(void) hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); - ok(hi == 0, "Expected 0, got %08x\n", hi); + ok(hi == 0 || + broken(hi == 0x10005), /* .NET 1.x */ + "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); test_assembly_name_props(name, badvername); @@ -621,7 +642,8 @@ static void test_CreateAssemblyNameObject(void) hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); @@ -653,7 +675,8 @@ static void test_CreateAssemblyNameObject(void) hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); @@ -685,7 +708,8 @@ static void test_CreateAssemblyNameObject(void) hi = 0xbeefcace; lo = 0xcafebabe; hr = IAssemblyName_GetVersion(name, &hi, &lo); - ok(hr == FUSION_E_INVALID_NAME, + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(hi == 0, "Expected 0, got %08x\n", hi); ok(lo == 0, "Expected 0, got %08x\n", lo); @@ -694,10 +718,52 @@ static void test_CreateAssemblyNameObject(void) IAssemblyName_Release(name); + /* invalid property */ + to_widechar(namestr, "wine, BadProp=42"); + name = NULL; + hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(name != NULL, "Expected non-NULL name\n"); + + size = MAX_PATH; + hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + todo_wine + { + ok_aw("wine", str); + ok(size == 5, "Expected 5, got %d\n", size); + } + + size = MAX_PATH; + str[0] = '\0'; + hr = IAssemblyName_GetName(name, &size, str); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok_aw("wine", str); + ok(size == 5, "Expected 5, got %d\n", size); + + hi = 0xbeefcace; + lo = 0xcafebabe; + hr = IAssemblyName_GetVersion(name, &hi, &lo); + ok(hr == FUSION_E_INVALID_NAME || + broken(hr == S_OK), /* .NET 1.x */ + "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); + ok(hi == 0, "Expected 0, got %08x\n", hi); + ok(lo == 0, "Expected 0, got %08x\n", lo); + + test_assembly_name_props(name, winename); + + IAssemblyName_Release(name); + /* PublicKeyToken is not 16 chars long */ to_widechar(namestr, "wine, PublicKeyToken=567890abcdef"); name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); + if (hr == S_OK && name != (IAssemblyName *)0xdeadbeef) + { + win_skip(".NET 1.x doesn't check PublicKeyToken correctly\n"); + IAssemblyName_Release(name); + return; + } ok(hr == FUSION_E_INVALID_NAME, "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); @@ -736,41 +802,6 @@ static void test_CreateAssemblyNameObject(void) ok(hr == FUSION_E_INVALID_NAME, "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); - - /* invalid property */ - to_widechar(namestr, "wine, BadProp=42"); - name = NULL; - hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(name != NULL, "Expected non-NULL name\n"); - - size = MAX_PATH; - hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - todo_wine - { - ok_aw("wine", str); - ok(size == 5, "Expected 5, got %d\n", size); - } - - size = MAX_PATH; - str[0] = '\0'; - hr = IAssemblyName_GetName(name, &size, str); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok_aw("wine", str); - ok(size == 5, "Expected 5, got %d\n", size); - - hi = 0xbeefcace; - lo = 0xcafebabe; - hr = IAssemblyName_GetVersion(name, &hi, &lo); - ok(hr == FUSION_E_INVALID_NAME, - "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); - ok(hi == 0, "Expected 0, got %08x\n", hi); - ok(lo == 0, "Expected 0, got %08x\n", lo); - - test_assembly_name_props(name, winename); - - IAssemblyName_Release(name); } START_TEST(asmname) diff --git a/rostests/winetests/gdi32/bitmap.c b/rostests/winetests/gdi32/bitmap.c index a47dc3898a5..a0d4531d511 100755 --- a/rostests/winetests/gdi32/bitmap.c +++ b/rostests/winetests/gdi32/bitmap.c @@ -72,7 +72,7 @@ static void test_bitmap_info(HBITMAP hbm, INT expected_depth, const BITMAPINFOHE BITMAP bm; BITMAP bma[2]; INT ret, width_bytes; - char buf[512], buf_cmp[512]; + BYTE buf[512], buf_cmp[512]; DWORD gle; ret = GetObject(hbm, sizeof(bm), &bm); @@ -101,7 +101,9 @@ static void test_bitmap_info(HBITMAP hbm, INT expected_depth, const BITMAPINFOHE memset(buf, 0xAA, sizeof(buf)); ret = GetBitmapBits(hbm, sizeof(buf), buf); ok(ret == bm.bmWidthBytes * bm.bmHeight, "%d != %d\n", ret, bm.bmWidthBytes * bm.bmHeight); - ok(!memcmp(buf, buf_cmp, sizeof(buf)), "buffers do not match\n"); + ok(!memcmp(buf, buf_cmp, sizeof(buf)) || + broken(memcmp(buf, buf_cmp, sizeof(buf))), /* win9x doesn't init the bitmap bits */ + "buffers do not match, depth %d\n", bmih->biBitCount); /* test various buffer sizes for GetObject */ ret = GetObject(hbm, sizeof(*bma) * 2, bma); @@ -142,7 +144,12 @@ static void test_createdibitmap(void) bmih.biPlanes = 1; bmih.biBitCount = 32; bmih.biCompression = BI_RGB; - + + hbm = CreateDIBitmap(hdc, NULL, CBM_INIT, NULL, NULL, 0); + ok(hbm == NULL, "CreateDIBitmap should fail\n"); + hbm = CreateDIBitmap(hdc, NULL, 0, NULL, NULL, 0); + ok(hbm == NULL, "CreateDIBitmap should fail\n"); + /* First create an un-initialised bitmap. The depth of the bitmap should match that of the hdc and not that supplied in bmih. */ @@ -339,7 +346,7 @@ static void test_dib_info(HBITMAP hbm, const void *bits, const BITMAPINFOHEADER /* test various buffer sizes for GetObject */ ret = GetObject(hbm, 0, NULL); - ok(ret == sizeof(bm), "wrong size %d\n", ret); + ok(ret == sizeof(bm) || broken(ret == sizeof(DIBSECTION) /* Win9x */), "wrong size %d\n", ret); ret = GetObject(hbm, sizeof(*dsa) * 2, dsa); ok(ret == sizeof(*dsa) || broken(ret == sizeof(*dsa) * 2 /* Win9x */), "wrong size %d\n", ret); @@ -367,7 +374,7 @@ static void test_dib_info(HBITMAP hbm, const void *bits, const BITMAPINFOHEADER memset(&ds, 0xAA, sizeof(ds)); ret = GetObject(hbm, sizeof(ds) - 4, &ds); - ok(ret == sizeof(ds.dsBm), "wrong size %d\n", ret); + ok(ret == sizeof(ds.dsBm) || broken(ret == (sizeof(ds) - 4) /* Win9x */), "wrong size %d\n", ret); ok(ds.dsBm.bmWidth == bmih->biWidth, "%u != %u\n", ds.dsBmih.biWidth, bmih->biWidth); ok(ds.dsBm.bmHeight == bmih->biHeight, "%u != %u\n", ds.dsBmih.biHeight, bmih->biHeight); ok(ds.dsBm.bmBits == bits, "%p != %p\n", ds.dsBm.bmBits, bits); @@ -376,7 +383,7 @@ static void test_dib_info(HBITMAP hbm, const void *bits, const BITMAPINFOHEADER ok(ret == 0, "%d != 0\n", ret); ret = GetObject(hbm, 1, &ds); - ok(ret == 0, "%d != 0\n", ret); + ok(ret == 0 || broken(ret == 1 /* Win9x */), "%d != 0\n", ret); } #define test_color_todo(got, exp, txt, todo) \ @@ -396,6 +403,64 @@ static void test_dib_info(HBITMAP hbm, const void *bits, const BITMAPINFOHEADER test_color_todo(c, exp, GetPixel, todo_getp); \ } +static void test_dib_bits_access( HBITMAP hdib, void *bits ) +{ + MEMORY_BASIC_INFORMATION info; + char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)]; + DWORD data[256]; + BITMAPINFO *pbmi = (BITMAPINFO *)bmibuf; + HDC hdc = GetDC(0); + char filename[MAX_PATH]; + HANDLE file; + DWORD written; + INT ret; + + ok(VirtualQuery(bits, &info, sizeof(info)) == sizeof(info), + "VirtualQuery failed\n"); + ok(info.BaseAddress == bits, "%p != %p\n", info.BaseAddress, bits); + ok(info.AllocationBase == bits, "%p != %p\n", info.AllocationBase, bits); + ok(info.AllocationProtect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.AllocationProtect); + ok(info.State == MEM_COMMIT, "%x != MEM_COMMIT\n", info.State); + ok(info.Protect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.Protect); + ok(info.Type == MEM_PRIVATE, "%x != MEM_PRIVATE\n", info.Type); + + memset( pbmi, 0, sizeof(bmibuf) ); + memset( data, 0xcc, sizeof(data) ); + pbmi->bmiHeader.biSize = sizeof(pbmi->bmiHeader); + pbmi->bmiHeader.biHeight = 16; + pbmi->bmiHeader.biWidth = 16; + pbmi->bmiHeader.biBitCount = 32; + pbmi->bmiHeader.biPlanes = 1; + pbmi->bmiHeader.biCompression = BI_RGB; + + ret = SetDIBits( hdc, hdib, 0, 16, data, pbmi, DIB_RGB_COLORS ); + ok(ret == 16 || + broken(ret == 0), /* win9x */ + "SetDIBits failed: expected 16 got %d\n", ret); + + ok(VirtualQuery(bits, &info, sizeof(info)) == sizeof(info), + "VirtualQuery failed\n"); + ok(info.BaseAddress == bits, "%p != %p\n", info.BaseAddress, bits); + ok(info.AllocationBase == bits, "%p != %p\n", info.AllocationBase, bits); + ok(info.AllocationProtect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.AllocationProtect); + ok(info.State == MEM_COMMIT, "%x != MEM_COMMIT\n", info.State); + ok(info.Type == MEM_PRIVATE, "%x != MEM_PRIVATE\n", info.Type); + /* it has been protected now */ + todo_wine ok(info.Protect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.Protect); + + /* try writing protected bits to a file */ + + GetTempFileNameA( ".", "dib", 0, filename ); + file = CreateFileA( filename, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, + CREATE_ALWAYS, 0, 0 ); + ok( file != INVALID_HANDLE_VALUE, "failed to open %s error %u\n", filename, GetLastError() ); + ret = WriteFile( file, bits, 8192, &written, NULL ); + ok( ret, "WriteFile failed error %u\n", GetLastError() ); + if (ret) ok( written == 8192, "only wrote %u bytes\n", written ); + CloseHandle( file ); + DeleteFileA( filename ); +} + static void test_dibsections(void) { HDC hdc, hdcmem, hdcmem2; @@ -455,6 +520,8 @@ static void test_dibsections(void) ok(info.Protect == PAGE_READWRITE, "%x != PAGE_READWRITE\n", info.Protect); ok(info.Type == MEM_PRIVATE, "%x != MEM_PRIVATE\n", info.Type); + test_dib_bits_access( hdib, bits ); + test_dib_info(hdib, bits, &pbmi->bmiHeader); DeleteObject(hdib); @@ -658,7 +725,8 @@ static void test_dibsections(void) hdib = CreateDIBSection(hdc, pbmi, DIB_PAL_COLORS, (void**)&bits, NULL, 0); ok(hdib != NULL, "CreateDIBSection failed\n"); ok(GetObject(hdib, sizeof(DIBSECTION), &dibsec) != 0, "GetObject failed for DIB Section\n"); - ok(dibsec.dsBmih.biClrUsed == 2, + ok(dibsec.dsBmih.biClrUsed == 2 || + broken(dibsec.dsBmih.biClrUsed == 0), /* win9x */ "created DIBSection: wrong biClrUsed field: %u, should be: %u\n", dibsec.dsBmih.biClrUsed, 2); /* The colour table has already been grabbed from the dc, so we select back the @@ -750,7 +818,8 @@ static void test_dibsections(void) hdib = CreateDIBSection(hdc, pbmi, DIB_PAL_COLORS, (void**)&bits, NULL, 0); ok(hdib != NULL, "CreateDIBSection failed\n"); ok(GetObject(hdib, sizeof(DIBSECTION), &dibsec) != 0, "GetObject failed for DIB Section\n"); - ok(dibsec.dsBmih.biClrUsed == 256, + ok(dibsec.dsBmih.biClrUsed == 256 || + broken(dibsec.dsBmih.biClrUsed == 0), /* win9x */ "created DIBSection: wrong biClrUsed field: %u, should be: %u\n", dibsec.dsBmih.biClrUsed, 256); test_dib_info(hdib, bits, &pbmi->bmiHeader); @@ -1018,9 +1087,12 @@ static void test_bitmap(void) SetLastError(0xdeadbeef); hbmp = CreateBitmap(0x7ffffff + 1, 1, 1, 1, NULL); - ok(!hbmp, "CreateBitmap should fail\n"); - ok(GetLastError() == ERROR_INVALID_PARAMETER, - "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + ok(!hbmp || broken(hbmp != NULL /* Win9x */), "CreateBitmap should fail\n"); + if (!hbmp) + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + else + DeleteObject(hbmp); hbmp = CreateBitmap(15, 15, 1, 1, NULL); assert(hbmp != NULL); @@ -1040,7 +1112,8 @@ static void test_bitmap(void) assert(sizeof(buf) == sizeof(buf_cmp)); ret = GetBitmapBits(hbmp, 0, NULL); - ok(ret == bm.bmWidthBytes * bm.bmHeight, "%d != %d\n", ret, bm.bmWidthBytes * bm.bmHeight); + ok(ret == bm.bmWidthBytes * bm.bmHeight || broken(ret == 0 /* Win9x */), + "%d != %d\n", ret, bm.bmWidthBytes * bm.bmHeight); memset(buf_cmp, 0xAA, sizeof(buf_cmp)); memset(buf_cmp, 0, bm.bmWidthBytes * bm.bmHeight); @@ -1048,7 +1121,9 @@ static void test_bitmap(void) memset(buf, 0xAA, sizeof(buf)); ret = GetBitmapBits(hbmp, sizeof(buf), buf); ok(ret == bm.bmWidthBytes * bm.bmHeight, "%d != %d\n", ret, bm.bmWidthBytes * bm.bmHeight); - ok(!memcmp(buf, buf_cmp, sizeof(buf)), "buffers do not match\n"); + ok(!memcmp(buf, buf_cmp, sizeof(buf)) || + broken(memcmp(buf, buf_cmp, sizeof(buf))), /* win9x doesn't init the bitmap bits */ + "buffers do not match\n"); hbmp_old = SelectObject(hdc, hbmp); @@ -1066,7 +1141,9 @@ static void test_bitmap(void) memset(buf, 0xAA, sizeof(buf)); ret = GetBitmapBits(hbmp, sizeof(buf), buf); ok(ret == bm.bmWidthBytes * bm.bmHeight, "%d != %d\n", ret, bm.bmWidthBytes * bm.bmHeight); - ok(!memcmp(buf, buf_cmp, sizeof(buf)), "buffers do not match\n"); + ok(!memcmp(buf, buf_cmp, sizeof(buf)) || + broken(memcmp(buf, buf_cmp, sizeof(buf))), /* win9x doesn't init the bitmap bits */ + "buffers do not match\n"); hbmp_old = SelectObject(hdc, hbmp_old); ok(hbmp_old == hbmp, "wrong old bitmap %p\n", hbmp_old); @@ -1323,6 +1400,8 @@ static void test_GetDIBits_selected_DDB(BOOL monochrome) /* Get the palette indices */ res = GetDIBits(dc, ddb, 0, 0, NULL, info2, DIB_PAL_COLORS); + if (res == 0 && GetLastError() == ERROR_INVALID_PARAMETER) /* Win9x */ + res = GetDIBits(dc, ddb, 0, height, NULL, info2, DIB_PAL_COLORS); ok(res, "GetDIBits failed\n"); for (i=0;i < 1 << info->bmiHeader.biSizeImage; i++) @@ -1367,6 +1446,13 @@ static void test_GetDIBits(void) 0,0,0,0, 0xff,0xff,0,0, 0,0,0,0, 0xff,0xff,0,0, 0,0,0,0, 0xff,0xff,0,0, 0,0,0,0, 0xff,0xff,0,0 }; + static const BYTE dib_bits_1_9x[16 * 4] = + { + 0,0,0xaa,0xaa, 0xff,0xff,0xaa,0xaa, 0,0,0xaa,0xaa, 0xff,0xff,0xaa,0xaa, + 0,0,0xaa,0xaa, 0xff,0xff,0xaa,0xaa, 0,0,0xaa,0xaa, 0xff,0xff,0xaa,0xaa, + 0,0,0xaa,0xaa, 0xff,0xff,0xaa,0xaa, 0,0,0xaa,0xaa, 0xff,0xff,0xaa,0xaa, + 0,0,0xaa,0xaa, 0xff,0xff,0xaa,0xaa, 0,0,0xaa,0xaa, 0xff,0xff,0xaa,0xaa + }; /* 2-bytes aligned 24-bit bitmap data: 16x16 */ static const BYTE bmp_bits_24[16 * 16*3] = { @@ -1465,7 +1551,7 @@ static void test_GetDIBits(void) ok(!bm.bmBits, "wrong bmBits %p\n", bm.bmBits); bytes = GetBitmapBits(hbmp, 0, NULL); - ok(bytes == sizeof(bmp_bits_1), "expected 16*2 got %d bytes\n", bytes); + ok(bytes == sizeof(bmp_bits_1) || broken(bytes == 0 /* Win9x */), "expected 16*2 got %d bytes\n", bytes); bytes = GetBitmapBits(hbmp, sizeof(buf), buf); ok(bytes == sizeof(bmp_bits_1), "expected 16*2 got %d bytes\n", bytes); ok(!memcmp(buf, bmp_bits_1, sizeof(bmp_bits_1)), "bitmap bits don't match\n"); @@ -1483,7 +1569,9 @@ static void test_GetDIBits(void) SetLastError(0xdeadbeef); lines = GetDIBits(0, hbmp, 0, bm.bmHeight, buf, bi, DIB_RGB_COLORS); ok(lines == 0, "GetDIBits copied %d lines with hdc = 0\n", lines); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError()); + ok(GetLastError() == ERROR_INVALID_PARAMETER || + broken(GetLastError() == 0xdeadbeef), /* winnt */ + "wrong error %u\n", GetLastError()); ok(bi->bmiHeader.biSizeImage == 0, "expected 0, got %u\n", bi->bmiHeader.biSizeImage); memset(buf, 0xAA, sizeof(buf)); @@ -1491,7 +1579,9 @@ static void test_GetDIBits(void) lines = GetDIBits(hdc, hbmp, 0, bm.bmHeight, buf, bi, DIB_RGB_COLORS); ok(lines == bm.bmHeight, "GetDIBits copied %d lines of %d, error %u\n", lines, bm.bmHeight, GetLastError()); - ok(bi->bmiHeader.biSizeImage == sizeof(dib_bits_1), "expected 16*4, got %u\n", bi->bmiHeader.biSizeImage); + ok(bi->bmiHeader.biSizeImage == sizeof(dib_bits_1) || + broken(bi->bmiHeader.biSizeImage == 0), /* win9x */ + "expected 16*4, got %u\n", bi->bmiHeader.biSizeImage); /* the color table consists of black and white */ ok(bi->bmiColors[0].rgbRed == 0 && bi->bmiColors[0].rgbGreen == 0 && @@ -1514,16 +1604,21 @@ static void test_GetDIBits(void) } /* returned bits are DWORD aligned and upside down */ -todo_wine - ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)), "DIB bits don't match\n"); + ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)) || + broken(!memcmp(buf, dib_bits_1_9x, sizeof(dib_bits_1_9x))), /* Win9x, WinME */ + "DIB bits don't match\n"); /* Test the palette indices */ memset(bi->bmiColors, 0xAA, sizeof(RGBQUAD) * 256); SetLastError(0xdeadbeef); lines = GetDIBits(hdc, hbmp, 0, 0, NULL, bi, DIB_PAL_COLORS); - - ok(((WORD*)bi->bmiColors)[0] == 0, "Color 0 is %d\n", ((WORD*)bi->bmiColors)[0]); - ok(((WORD*)bi->bmiColors)[1] == 1, "Color 1 is %d\n", ((WORD*)bi->bmiColors)[1]); + if (lines == 0 && GetLastError() == ERROR_INVALID_PARAMETER) + win_skip("Win9x/WinMe doesn't handle 0 for the number of scan lines\n"); + else + { + ok(((WORD*)bi->bmiColors)[0] == 0, "Color 0 is %d\n", ((WORD*)bi->bmiColors)[0]); + ok(((WORD*)bi->bmiColors)[1] == 1, "Color 1 is %d\n", ((WORD*)bi->bmiColors)[1]); + } for (i = 2; i < 256; i++) ok(((WORD*)bi->bmiColors)[i] == 0xAAAA, "Color %d is %d\n", i, ((WORD*)bi->bmiColors)[1]); @@ -1542,7 +1637,9 @@ todo_wine lines = GetDIBits(hdc, hbmp, 0, bm.bmHeight, buf, bi, DIB_RGB_COLORS); ok(lines == bm.bmHeight, "GetDIBits copied %d lines of %d, error %u\n", lines, bm.bmHeight, GetLastError()); - ok(bi->bmiHeader.biSizeImage == sizeof(dib_bits_24), "expected 16*16*3, got %u\n", bi->bmiHeader.biSizeImage); + ok(bi->bmiHeader.biSizeImage == sizeof(dib_bits_24) || + broken(bi->bmiHeader.biSizeImage == 0), /* win9x */ + "expected 16*16*3, got %u\n", bi->bmiHeader.biSizeImage); /* the color table doesn't exist for 24-bit images */ for (i = 0; i < 256; i++) @@ -1570,7 +1667,9 @@ todo_wine memset(&bm, 0xAA, sizeof(bm)); bytes = GetObject(hbmp, sizeof(bm), &bm); ok(bytes == sizeof(bm), "GetObject returned %d\n", bytes); - ok(bm.bmType == 0, "wrong bmType %d\n", bm.bmType); + ok(bm.bmType == 0 || + broken(bm.bmType == 21072), /* win9x */ + "wrong bmType %d\n", bm.bmType); ok(bm.bmWidth == 16, "wrong bmWidth %d\n", bm.bmWidth); ok(bm.bmHeight == 16, "wrong bmHeight %d\n", bm.bmHeight); ok(bm.bmWidthBytes == BITMAP_GetWidthBytes(bm.bmWidth, bm.bmBitsPixel), "wrong bmWidthBytes %d\n", bm.bmWidthBytes); @@ -1579,8 +1678,9 @@ todo_wine ok(!bm.bmBits, "wrong bmBits %p\n", bm.bmBits); bytes = GetBitmapBits(hbmp, 0, NULL); - ok(bytes == bm.bmWidthBytes * bm.bmHeight, "expected %d got %d bytes\n", - bm.bmWidthBytes * bm.bmHeight, bytes); + ok(bytes == bm.bmWidthBytes * bm.bmHeight || + broken(bytes == 0), /* win9x */ + "expected %d got %d bytes\n", bm.bmWidthBytes * bm.bmHeight, bytes); bytes = GetBitmapBits(hbmp, sizeof(buf), buf); ok(bytes == bm.bmWidthBytes * bm.bmHeight, "expected %d got %d bytes\n", bm.bmWidthBytes * bm.bmHeight, bytes); @@ -1600,7 +1700,9 @@ todo_wine lines = GetDIBits(hdc, hbmp, 0, bm.bmHeight, buf, bi, DIB_RGB_COLORS); ok(lines == bm.bmHeight, "GetDIBits copied %d lines of %d, error %u\n", lines, bm.bmHeight, GetLastError()); - ok(bi->bmiHeader.biSizeImage == sizeof(dib_bits_1), "expected 16*4, got %u\n", bi->bmiHeader.biSizeImage); + ok(bi->bmiHeader.biSizeImage == sizeof(dib_bits_1) || + broken(bi->bmiHeader.biSizeImage == 0), /* win9x */ + "expected 16*4, got %u\n", bi->bmiHeader.biSizeImage); /* the color table consists of black and white */ ok(bi->bmiColors[0].rgbRed == 0 && bi->bmiColors[0].rgbGreen == 0 && @@ -1624,15 +1726,21 @@ todo_wine /* returned bits are DWORD aligned and upside down */ todo_wine - ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)), "DIB bits don't match\n"); + ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)) || + broken(!memcmp(buf, dib_bits_1_9x, sizeof(dib_bits_1_9x))), /* Win9x, WinME */ + "DIB bits don't match\n"); /* Test the palette indices */ memset(bi->bmiColors, 0xAA, sizeof(RGBQUAD) * 256); SetLastError(0xdeadbeef); lines = GetDIBits(hdc, hbmp, 0, 0, NULL, bi, DIB_PAL_COLORS); - - ok(((WORD*)bi->bmiColors)[0] == 0, "Color 0 is %d\n", ((WORD*)bi->bmiColors)[0]); - ok(((WORD*)bi->bmiColors)[1] == 1, "Color 1 is %d\n", ((WORD*)bi->bmiColors)[1]); + if (lines == 0 && GetLastError() == ERROR_INVALID_PARAMETER) + win_skip("Win9x/WinMe doesn't handle 0 for the number of scan lines\n"); + else + { + ok(((WORD*)bi->bmiColors)[0] == 0, "Color 0 is %d\n", ((WORD*)bi->bmiColors)[0]); + ok(((WORD*)bi->bmiColors)[1] == 1, "Color 1 is %d\n", ((WORD*)bi->bmiColors)[1]); + } for (i = 2; i < 256; i++) ok(((WORD*)bi->bmiColors)[i] == 0xAAAA, "Color %d is %d\n", i, ((WORD*)bi->bmiColors)[i]); @@ -1651,7 +1759,9 @@ todo_wine lines = GetDIBits(hdc, hbmp, 0, bm.bmHeight, buf, bi, DIB_RGB_COLORS); ok(lines == bm.bmHeight, "GetDIBits copied %d lines of %d, error %u\n", lines, bm.bmHeight, GetLastError()); - ok(bi->bmiHeader.biSizeImage == sizeof(dib_bits_24), "expected 16*16*3, got %u\n", bi->bmiHeader.biSizeImage); + ok(bi->bmiHeader.biSizeImage == sizeof(dib_bits_24) || + broken(bi->bmiHeader.biSizeImage == 0), /* win9x */ + "expected 16*16*3, got %u\n", bi->bmiHeader.biSizeImage); /* the color table doesn't exist for 24-bit images */ for (i = 0; i < 256; i++) @@ -1731,7 +1841,9 @@ static void test_GetDIBits_BI_BITFIELDS(void) ok( bitmasks[0] != 0, "red mask is not set\n" ); ok( bitmasks[1] != 0, "green mask is not set\n" ); ok( bitmasks[2] != 0, "blue mask is not set\n" ); - ok( dibinfo->bmiHeader.biSizeImage != 0xdeadbeef, "size image not set\n" ); + ok( dibinfo->bmiHeader.biSizeImage != 0xdeadbeef || + broken(dibinfo->bmiHeader.biSizeImage == 0xdeadbeef), /* win9x */ + "size image not set\n" ); /* now with bits and 0 lines */ memset(dibinfo, 0, sizeof(dibinfo_buf)); @@ -1834,7 +1946,9 @@ static void test_select_object(void) memset(&bm, 0xAA, sizeof(bm)); bytes = GetObject(hbm, sizeof(bm), &bm); ok(bytes == sizeof(bm), "GetObject returned %d\n", bytes); - ok(bm.bmType == 0, "wrong bmType %d\n", bm.bmType); + ok(bm.bmType == 0 || + broken(bm.bmType == 21072), /* win9x */ + "wrong bmType %d\n", bm.bmType); ok(bm.bmWidth == 10, "wrong bmWidth %d\n", bm.bmWidth); ok(bm.bmHeight == 10, "wrong bmHeight %d\n", bm.bmHeight); ok(bm.bmWidthBytes == BITMAP_GetWidthBytes(bm.bmWidth, bm.bmBitsPixel), "wrong bmWidthBytes %d\n", bm.bmWidthBytes); @@ -1910,7 +2024,9 @@ static void test_CreateBitmap(void) "0: %p, 1: %p, 4: %p, 5: %p, curObj1 %p, old1 %p\n", bm, bm1, bm4, bm5, curObj1, old1); ok(bm != bm2 && bm != bm3, "0: %p, 2: %p, 3: %p\n", bm, bm2, bm3); - ok(bm != curObj2 /* XP */ || bm == curObj2 /* Win9x */, +todo_wine + ok(bm != curObj2 || /* WinXP */ + broken(bm == curObj2) /* Win9x */, "0: %p, curObj2 %p\n", bm, curObj2); ok(old2 == 0, "old2 %p\n", old2); @@ -1922,7 +2038,6 @@ static void test_CreateBitmap(void) test_mono_1x1_bmp(bm5); test_mono_1x1_bmp(old1); test_mono_1x1_bmp(curObj1); - test_mono_1x1_bmp(curObj2); DeleteObject(bm); DeleteObject(bm1); @@ -1956,11 +2071,17 @@ static void test_CreateBitmap(void) bmp.bmPlanes = 1; bmp.bmBitsPixel = i; bmp.bmBits = NULL; + SetLastError(0xdeadbeef); bm = CreateBitmapIndirect(&bmp); if(i > 32) { DWORD error = GetLastError(); - ok(bm == 0, "CreateBitmapIndirect for %d bpp succeeded\n", i); - ok(error == ERROR_INVALID_PARAMETER, "Got error %d, expected ERROR_INVALID_PARAMETER\n", error); + ok(bm == 0 || + broken(bm != 0), /* Win9x and WinMe */ + "CreateBitmapIndirect for %d bpp succeeded\n", i); + ok(error == ERROR_INVALID_PARAMETER || + broken(error == 0xdeadbeef), /* Win9x and WinME */ + "Got error %d, expected ERROR_INVALID_PARAMETER\n", error); + DeleteObject(bm); continue; } ok(bm != 0, "CreateBitmapIndirect error %u\n", GetLastError()); @@ -1978,7 +2099,9 @@ static void test_CreateBitmap(void) } else if(i <= 32) { expect = 32; } - ok(bmp.bmBitsPixel == expect, "CreateBitmapIndirect for a %d bpp bitmap created a %d bpp bitmap, expected %d\n", + ok(bmp.bmBitsPixel == expect || + broken(bmp.bmBitsPixel == i), /* Win9x and WinMe */ + "CreateBitmapIndirect for a %d bpp bitmap created a %d bpp bitmap, expected %d\n", i, bmp.bmBitsPixel, expect); DeleteObject(bm); } @@ -2013,21 +2136,27 @@ static void test_bitmapinfoheadersize(void) SetLastError(0xdeadbeef); hdib = CreateDIBSection(hdc, &bmi, 0, NULL, NULL, 0); - ok(hdib != NULL, "CreateDIBSection error %d\n", GetLastError()); + ok(hdib != NULL || + broken(!hdib), /* Win98, WinMe */ + "CreateDIBSection error %d\n", GetLastError()); DeleteObject(hdib); bmi.bmiHeader.biSize = sizeof(BITMAPINFO); SetLastError(0xdeadbeef); hdib = CreateDIBSection(hdc, &bmi, 0, NULL, NULL, 0); - ok(hdib != NULL, "CreateDIBSection error %d\n", GetLastError()); + ok(hdib != NULL || + broken(!hdib), /* Win98, WinMe */ + "CreateDIBSection error %d\n", GetLastError()); DeleteObject(hdib); bmi.bmiHeader.biSize++; SetLastError(0xdeadbeef); hdib = CreateDIBSection(hdc, &bmi, 0, NULL, NULL, 0); - ok(hdib != NULL, "CreateDIBSection error %d\n", GetLastError()); + ok(hdib != NULL || + broken(!hdib), /* Win98, WinMe */ + "CreateDIBSection error %d\n", GetLastError()); DeleteObject(hdib); bmi.bmiHeader.biSize = sizeof(BITMAPV4HEADER); @@ -2041,7 +2170,9 @@ static void test_bitmapinfoheadersize(void) SetLastError(0xdeadbeef); hdib = CreateDIBSection(hdc, &bmi, 0, NULL, NULL, 0); - ok(hdib != NULL, "CreateDIBSection error %d\n", GetLastError()); + ok(hdib != NULL || + broken(!hdib), /* Win95 */ + "CreateDIBSection error %d\n", GetLastError()); DeleteObject(hdib); memset(&bci, 0, sizeof(BITMAPCOREINFO)); @@ -2103,7 +2234,9 @@ static void test_get16dibits(void) info->bmiHeader.biCompression = BI_RGB; ret = GetDIBits(screen_dc, hbmp, 0, 0, NULL, info, 0); - ok(ret != 0, "GetDIBits failed\n"); + ok(ret != 0 || + broken(ret == 0), /* win9x */ + "GetDIBits failed got %d\n", ret); for (p = ((BYTE *) info) + sizeof(info->bmiHeader); (p - ((BYTE *) info)) < info_len; p++) if (*p != '!') @@ -2115,7 +2248,7 @@ static void test_get16dibits(void) ReleaseDC(NULL, screen_dc); } -void test_GdiAlphaBlend() +static void test_GdiAlphaBlend(void) { /* test out-of-bound parameters for GdiAlphaBlend */ HDC hdcNull; @@ -2134,7 +2267,7 @@ void test_GdiAlphaBlend() if (!pGdiAlphaBlend) { - skip("GdiAlphaBlend() is not implemented\n"); + win_skip("GdiAlphaBlend() is not implemented\n"); return; } diff --git a/rostests/winetests/gdi32/clipping.c b/rostests/winetests/gdi32/clipping.c index 0ae3eb6ff56..eff87c3c463 100644 --- a/rostests/winetests/gdi32/clipping.c +++ b/rostests/winetests/gdi32/clipping.c @@ -162,12 +162,16 @@ static void verify_region(HRGN hrgn, const RECT *rc) if (IsRectEmpty(rc)) { ok(rgn.data.rdh.nCount == 0, "expected 0, got %u\n", rgn.data.rdh.nCount); - ok(rgn.data.rdh.nRgnSize == 0, "expected 0, got %u\n", rgn.data.rdh.nRgnSize); + ok(rgn.data.rdh.nRgnSize == 0 || + broken(rgn.data.rdh.nRgnSize == 168), /* NT4 */ + "expected 0, got %u\n", rgn.data.rdh.nRgnSize); } else { ok(rgn.data.rdh.nCount == 1, "expected 1, got %u\n", rgn.data.rdh.nCount); - ok(rgn.data.rdh.nRgnSize == sizeof(RECT), "expected sizeof(RECT), got %u\n", rgn.data.rdh.nRgnSize); + ok(rgn.data.rdh.nRgnSize == sizeof(RECT) || + broken(rgn.data.rdh.nRgnSize == 168), /* NT4 */ + "expected sizeof(RECT), got %u\n", rgn.data.rdh.nRgnSize); } ok(EqualRect(&rgn.data.rdh.rcBound, rc), "rects don't match\n"); } @@ -236,9 +240,14 @@ if (0) /* crashes under Win9x */ SetLastError(0xdeadbeef); hrgn = ExtCreateRegion(NULL, 1, &rgn.data); - ok(hrgn != 0, "ExtCreateRegion error %u\n", GetLastError()); - verify_region(hrgn, &rc); - DeleteObject(hrgn); + ok(hrgn != 0 || + broken(GetLastError() == 0xdeadbeef), /* NT4 */ + "ExtCreateRegion error %u\n", GetLastError()); + if(hrgn) + { + verify_region(hrgn, &rc); + DeleteObject(hrgn); + } xform.eM11 = 0.5; /* 50% width */ xform.eM12 = 0.0; diff --git a/rostests/winetests/gdi32/dc.c b/rostests/winetests/gdi32/dc.c index 9e0048e4fce..1efde38b134 100644 --- a/rostests/winetests/gdi32/dc.c +++ b/rostests/winetests/gdi32/dc.c @@ -185,7 +185,7 @@ static void test_GdiConvertToDevmodeW(void) pGdiConvertToDevmodeW = (void *)GetProcAddress(GetModuleHandleA("gdi32.dll"), "GdiConvertToDevmodeW"); if (!pGdiConvertToDevmodeW) { - skip("GdiConvertToDevmodeW is not available on this platform\n"); + win_skip("GdiConvertToDevmodeW is not available on this platform\n"); return; } @@ -253,10 +253,86 @@ static void test_CreateCompatibleDC(void) ok(hNewDC == NULL, "CreateCompatibleDC returned %p\n", hNewDC); } +static void test_DC_bitmap(void) +{ + HDC hdc, hdcmem; + DWORD bits[64]; + HBITMAP hbmp, oldhbmp; + COLORREF col; + int i, bitspixel; + + /* fill bitmap data with b&w pattern */ + for( i = 0; i < 64; i++) bits[i] = i & 1 ? 0 : 0xffffff; + + hdc = GetDC(0); + ok( hdc != NULL, "CreateDC rets %p\n", hdc); + bitspixel = GetDeviceCaps( hdc, BITSPIXEL); + /* create a memory dc */ + hdcmem = CreateCompatibleDC( hdc); + ok( hdcmem != NULL, "CreateCompatibleDC rets %p\n", hdcmem); + /* tests */ + /* test monochrome bitmap: should always work */ + hbmp = CreateBitmap(32, 32, 1, 1, bits); + ok( hbmp != NULL, "CreateBitmap returns %p\n", hbmp); + oldhbmp = SelectObject( hdcmem, hbmp); + ok( oldhbmp != NULL, "SelectObject returned NULL\n" ); /* a memdc always has a bitmap selected */ + col = GetPixel( hdcmem, 0, 0); + ok( col == 0xffffff, "GetPixel returned %08x, expected 00ffffff\n", col); + col = GetPixel( hdcmem, 1, 1); + ok( col == 0x000000, "GetPixel returned %08x, expected 00000000\n", col); + col = GetPixel( hdcmem, 100, 1); + ok( col == CLR_INVALID, "GetPixel returned %08x, expected ffffffff\n", col); + SelectObject( hdcmem, oldhbmp); + DeleteObject( hbmp); + + /* test with 2 bits color depth, not likely to succeed */ + hbmp = CreateBitmap(16, 16, 1, 2, bits); + ok( hbmp != NULL, "CreateBitmap returns %p\n", hbmp); + oldhbmp = SelectObject( hdcmem, hbmp); + if( bitspixel != 2) + ok( !oldhbmp, "SelectObject of a bitmap with 2 bits/pixel should return NULL\n"); + if( oldhbmp) SelectObject( hdcmem, oldhbmp); + DeleteObject( hbmp); + + /* test with 16 bits color depth, might succeed */ + hbmp = CreateBitmap(6, 6, 1, 16, bits); + ok( hbmp != NULL, "CreateBitmap returns %p\n", hbmp); + oldhbmp = SelectObject( hdcmem, hbmp); + if( bitspixel == 16) { + ok( oldhbmp != NULL, "SelectObject returned NULL\n" ); + col = GetPixel( hdcmem, 0, 0); + ok( col == 0xffffff, + "GetPixel of a bitmap with 16 bits/pixel returned %08x, expected 00ffffff\n", col); + col = GetPixel( hdcmem, 1, 1); + ok( col == 0x000000, + "GetPixel of a bitmap with 16 bits/pixel returned returned %08x, expected 00000000\n", col); + } + if( oldhbmp) SelectObject( hdcmem, oldhbmp); + DeleteObject( hbmp); + + /* test with 32 bits color depth, probably succeed */ + hbmp = CreateBitmap(4, 4, 1, 32, bits); + ok( hbmp != NULL, "CreateBitmap returns %p\n", hbmp); + oldhbmp = SelectObject( hdcmem, hbmp); + if( bitspixel == 32) { + ok( oldhbmp != NULL, "SelectObject returned NULL\n" ); + col = GetPixel( hdcmem, 0, 0); + ok( col == 0xffffff, + "GetPixel of a bitmap with 32 bits/pixel returned %08x, expected 00ffffff\n", col); + col = GetPixel( hdcmem, 1, 1); + ok( col == 0x000000, + "GetPixel of a bitmap with 32 bits/pixel returned returned %08x, expected 00000000\n", col); + } + if( oldhbmp) SelectObject( hdcmem, oldhbmp); + DeleteObject( hbmp); + ReleaseDC( 0, hdc ); +} + START_TEST(dc) { test_savedc(); test_savedc_2(); test_GdiConvertToDevmodeW(); test_CreateCompatibleDC(); + test_DC_bitmap(); } diff --git a/rostests/winetests/gdi32/font.c b/rostests/winetests/gdi32/font.c index 1d9b4fc9b0f..88e1797bacc 100644 --- a/rostests/winetests/gdi32/font.c +++ b/rostests/winetests/gdi32/font.c @@ -106,8 +106,31 @@ static void check_font(const char* test, const LOGFONTA* lf, HFONT hfont) minlen++; minlen += FIELD_OFFSET(LOGFONTA, lfFaceName) + 1; ok(ret == sizeof(LOGFONTA) || ret == minlen, "%s: GetObject returned %d\n", test, ret); - ok(!memcmp(lf, &getobj_lf, FIELD_OFFSET(LOGFONTA, lfFaceName)), "%s: fonts don't match\n", test); - ok(!lstrcmpA(lf->lfFaceName, getobj_lf.lfFaceName), + ok(lf->lfHeight == getobj_lf.lfHeight || + broken((SHORT)lf->lfHeight == getobj_lf.lfHeight), /* win9x */ + "lfHeight: expect %08x got %08x\n", lf->lfHeight, getobj_lf.lfHeight); + ok(lf->lfWidth == getobj_lf.lfWidth || + broken((SHORT)lf->lfWidth == getobj_lf.lfWidth), /* win9x */ + "lfWidth: expect %08x got %08x\n", lf->lfWidth, getobj_lf.lfWidth); + ok(lf->lfEscapement == getobj_lf.lfEscapement || + broken((SHORT)lf->lfEscapement == getobj_lf.lfEscapement), /* win9x */ + "lfEscapement: expect %08x got %08x\n", lf->lfEscapement, getobj_lf.lfEscapement); + ok(lf->lfOrientation == getobj_lf.lfOrientation || + broken((SHORT)lf->lfOrientation == getobj_lf.lfOrientation), /* win9x */ + "lfOrientation: expect %08x got %08x\n", lf->lfOrientation, getobj_lf.lfOrientation); + ok(lf->lfWeight == getobj_lf.lfWeight || + broken((SHORT)lf->lfWeight == getobj_lf.lfWeight), /* win9x */ + "lfWeight: expect %08x got %08x\n", lf->lfWeight, getobj_lf.lfWeight); + ok(lf->lfItalic == getobj_lf.lfItalic, "lfItalic: expect %02x got %02x\n", lf->lfItalic, getobj_lf.lfItalic); + ok(lf->lfUnderline == getobj_lf.lfUnderline, "lfUnderline: expect %02x got %02x\n", lf->lfUnderline, getobj_lf.lfUnderline); + ok(lf->lfStrikeOut == getobj_lf.lfStrikeOut, "lfStrikeOut: expect %02x got %02x\n", lf->lfStrikeOut, getobj_lf.lfStrikeOut); + ok(lf->lfCharSet == getobj_lf.lfCharSet, "lfCharSet: expect %02x got %02x\n", lf->lfCharSet, getobj_lf.lfCharSet); + ok(lf->lfOutPrecision == getobj_lf.lfOutPrecision, "lfOutPrecision: expect %02x got %02x\n", lf->lfOutPrecision, getobj_lf.lfOutPrecision); + ok(lf->lfClipPrecision == getobj_lf.lfClipPrecision, "lfClipPrecision: expect %02x got %02x\n", lf->lfClipPrecision, getobj_lf.lfClipPrecision); + ok(lf->lfQuality == getobj_lf.lfQuality, "lfQuality: expect %02x got %02x\n", lf->lfQuality, getobj_lf.lfQuality); + ok(lf->lfPitchAndFamily == getobj_lf.lfPitchAndFamily, "lfPitchAndFamily: expect %02x got %02x\n", lf->lfPitchAndFamily, getobj_lf.lfPitchAndFamily); + ok(!lstrcmpA(lf->lfFaceName, getobj_lf.lfFaceName) || + broken(!memcmp(lf->lfFaceName, getobj_lf.lfFaceName, LF_FACESIZE-1)), /* win9x doesn't ensure '\0' termination */ "%s: font names don't match: %s != %s\n", test, lf->lfFaceName, getobj_lf.lfFaceName); } @@ -247,8 +270,8 @@ if (0) /* these metrics are scaled too, but with rounding errors */ cx = tm.tmAveCharWidth / tm_orig->tmAveCharWidth; cy = tm.tmHeight / tm_orig->tmHeight; - ok(cx == scale_x && cy == scale_y, "expected scale_x %d, scale_y %d, got cx %d, cy %d\n", - scale_x, scale_y, cx, cy); + ok(cx == scale_x && cy == scale_y, "height %d: expected scale_x %d, scale_y %d, got cx %d, cy %d\n", + lfHeight, scale_x, scale_y, cx, cy); ok(tm.tmHeight == tm_orig->tmHeight * scale_y, "height %d != %d\n", tm.tmHeight, tm_orig->tmHeight * scale_y); ok(tm.tmAscent == tm_orig->tmAscent * scale_y, "ascent %d != %d\n", tm.tmAscent, tm_orig->tmAscent * scale_y); ok(tm.tmDescent == tm_orig->tmDescent * scale_y, "descent %d != %d\n", tm.tmDescent, tm_orig->tmDescent * scale_y); @@ -285,9 +308,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 */ @@ -324,7 +344,7 @@ static void test_bitmap_font(void) bitmap_lf.lfWidth = lfWidth; /* test fractional scaling */ - for (i = 1; i <= height_orig * 3; i++) + for (i = 1; i <= height_orig * 6; i++) { INT nearest_height; @@ -332,8 +352,12 @@ static void test_bitmap_font(void) hfont = create_font("fractional", &bitmap_lf); scale = (i + height_orig - 1) / height_orig; nearest_height = scale * height_orig; - /* XP allows not more than 10% deviation */ - if (scale > 1 && nearest_height - i > nearest_height / 10) scale--; + /* Only jump to the next height if the difference <= 25% original height */ + if (scale > 2 && nearest_height - i > height_orig / 4) scale--; + /* The jump between unscaled and doubled is delayed by 1 in winnt+ but not in win9x, + so we'll not test this particular height. */ + else if(scale == 2 && nearest_height - i == (height_orig / 4)) continue; + else if(scale == 2 && nearest_height - i > (height_orig / 4 - 1)) scale--; old_hfont = SelectObject(hdc, hfont); test_font_metrics(hdc, hfont, bitmap_lf.lfHeight, 0, test_str, sizeof(test_str), &tm_orig, &size_orig, width_orig, 1, scale); SelectObject(hdc, old_hfont); @@ -631,68 +655,117 @@ static void test_bitmap_font_metrics(void) { const char face_name[LF_FACESIZE]; int weight, height, ascent, descent, int_leading, ext_leading; - int ave_char_width, max_char_width; + int ave_char_width, max_char_width, dpi; DWORD ansi_bitfield; } fd[] = { - { "MS Sans Serif", FW_NORMAL, 13, 11, 2, 2, 0, 5, 11, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, - { "MS Sans Serif", FW_NORMAL, 16, 13, 3, 3, 0, 7, 14, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, - { "MS Sans Serif", FW_NORMAL, 20, 16, 4, 4, 0, 8, 16, FS_LATIN1 | FS_CYRILLIC }, - { "MS Sans Serif", FW_NORMAL, 20, 16, 4, 4, 0, 8, 18, FS_LATIN2 }, - { "MS Sans Serif", FW_NORMAL, 24, 19, 5, 6, 0, 9, 19, FS_LATIN1 }, - { "MS Sans Serif", FW_NORMAL, 24, 19, 5, 6, 0, 9, 24, FS_LATIN2 }, - { "MS Sans Serif", FW_NORMAL, 24, 19, 5, 6, 0, 9, 20, FS_CYRILLIC }, - { "MS Sans Serif", FW_NORMAL, 29, 23, 6, 5, 0, 12, 24, FS_LATIN1 }, - { "MS Sans Serif", FW_NORMAL, 29, 23, 6, 6, 0, 12, 24, FS_LATIN2 }, - { "MS Sans Serif", FW_NORMAL, 29, 23, 6, 5, 0, 12, 25, FS_CYRILLIC }, - { "MS Sans Serif", FW_NORMAL, 37, 29, 8, 5, 0, 16, 32, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, - { "MS Serif", FW_NORMAL, 10, 8, 2, 2, 0, 4, 8, FS_LATIN1 | FS_LATIN2 }, - { "MS Serif", FW_NORMAL, 10, 8, 2, 2, 0, 5, 8, FS_CYRILLIC }, - { "MS Serif", FW_NORMAL, 11, 9, 2, 2, 0, 5, 9, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, - { "MS Serif", FW_NORMAL, 13, 11, 2, 2, 0, 5, 11, FS_LATIN1 }, - { "MS Serif", FW_NORMAL, 13, 11, 2, 2, 0, 5, 12, FS_LATIN2 | FS_CYRILLIC }, - { "MS Serif", FW_NORMAL, 16, 13, 3, 3, 0, 6, 14, FS_LATIN1 | FS_LATIN2 }, - { "MS Serif", FW_NORMAL, 16, 13, 3, 3, 0, 6, 16, FS_CYRILLIC }, - { "MS Serif", FW_NORMAL, 19, 15, 4, 3, 0, 8, 18, FS_LATIN1 | FS_LATIN2 }, - { "MS Serif", FW_NORMAL, 19, 15, 4, 3, 0, 8, 19, FS_CYRILLIC }, - { "MS Serif", FW_NORMAL, 21, 16, 5, 3, 0, 9, 17, FS_LATIN1 }, - { "MS Serif", FW_NORMAL, 21, 16, 5, 3, 0, 9, 22, FS_LATIN2 }, - { "MS Serif", FW_NORMAL, 21, 16, 5, 3, 0, 9, 23, FS_CYRILLIC }, - { "MS Serif", FW_NORMAL, 27, 21, 6, 3, 0, 12, 23, FS_LATIN1 }, - { "MS Serif", FW_NORMAL, 27, 21, 6, 3, 0, 12, 26, FS_LATIN2 }, - { "MS Serif", FW_NORMAL, 27, 21, 6, 3, 0, 12, 27, FS_CYRILLIC }, - { "MS Serif", FW_NORMAL, 35, 27, 8, 3, 0, 16, 33, FS_LATIN1 | FS_LATIN2 }, - { "MS Serif", FW_NORMAL, 35, 27, 8, 3, 0, 16, 34, FS_CYRILLIC }, - { "Courier", FW_NORMAL, 13, 11, 2, 0, 0, 8, 8, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, - { "Courier", FW_NORMAL, 16, 13, 3, 0, 0, 9, 9, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, - { "Courier", FW_NORMAL, 20, 16, 4, 0, 0, 12, 12, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, - { "System", FW_BOLD, 16, 13, 3, 3, 0, 7, 14, FS_LATIN1 }, - { "System", FW_BOLD, 16, 13, 3, 3, 0, 7, 15, FS_LATIN2 | FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 13, 11, 2, 2, 0, 5, 11, 96, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 16, 13, 3, 3, 0, 7, 14, 96, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 20, 16, 4, 4, 0, 8, 16, 96, FS_LATIN1 | FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 20, 16, 4, 4, 0, 8, 18, 96, FS_LATIN2 }, + { "MS Sans Serif", FW_NORMAL, 24, 19, 5, 6, 0, 9, 19, 96, FS_LATIN1 }, + { "MS Sans Serif", FW_NORMAL, 24, 19, 5, 6, 0, 9, 24, 96, FS_LATIN2 }, + { "MS Sans Serif", FW_NORMAL, 24, 19, 5, 6, 0, 9, 20, 96, FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 29, 23, 6, 5, 0, 12, 24, 96, FS_LATIN1 }, + { "MS Sans Serif", FW_NORMAL, 29, 23, 6, 6, 0, 12, 24, 96, FS_LATIN2 }, + { "MS Sans Serif", FW_NORMAL, 29, 23, 6, 5, 0, 12, 25, 96, FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 37, 29, 8, 5, 0, 16, 32, 96, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + + { "MS Sans Serif", FW_NORMAL, 16, 13, 3, 3, 0, 7, 14, 120, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 20, 16, 4, 4, 0, 8, 18, 120, FS_LATIN1 | FS_LATIN2 }, + { "MS Sans Serif", FW_NORMAL, 20, 16, 4, 4, 0, 8, 17, 120, FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 25, 20, 5, 5, 0, 10, 21, 120, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 29, 23, 6, 6, 0, 12, 24, 120, FS_LATIN1 | FS_LATIN2 }, + { "MS Sans Serif", FW_NORMAL, 29, 23, 6, 5, 0, 12, 24, 120, FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 36, 29, 7, 6, 0, 15, 30, 120, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "MS Sans Serif", FW_NORMAL, 46, 37, 9, 6, 0, 20, 40, 120, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + + { "MS Serif", FW_NORMAL, 10, 8, 2, 2, 0, 4, 8, 96, FS_LATIN1 | FS_LATIN2 }, + { "MS Serif", FW_NORMAL, 10, 8, 2, 2, 0, 5, 8, 96, FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 11, 9, 2, 2, 0, 5, 9, 96, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 13, 11, 2, 2, 0, 5, 11, 96, FS_LATIN1 }, + { "MS Serif", FW_NORMAL, 13, 11, 2, 2, 0, 5, 12, 96, FS_LATIN2 | FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 16, 13, 3, 3, 0, 6, 14, 96, FS_LATIN1 | FS_LATIN2 }, + { "MS Serif", FW_NORMAL, 16, 13, 3, 3, 0, 6, 16, 96, FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 19, 15, 4, 3, 0, 8, 18, 96, FS_LATIN1 | FS_LATIN2 }, + { "MS Serif", FW_NORMAL, 19, 15, 4, 3, 0, 8, 19, 96, FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 21, 16, 5, 3, 0, 9, 17, 96, FS_LATIN1 }, + { "MS Serif", FW_NORMAL, 21, 16, 5, 3, 0, 9, 22, 96, FS_LATIN2 }, + { "MS Serif", FW_NORMAL, 21, 16, 5, 3, 0, 9, 23, 96, FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 27, 21, 6, 3, 0, 12, 23, 96, FS_LATIN1 }, + { "MS Serif", FW_NORMAL, 27, 21, 6, 3, 0, 12, 26, 96, FS_LATIN2 }, + { "MS Serif", FW_NORMAL, 27, 21, 6, 3, 0, 12, 27, 96, FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 35, 27, 8, 3, 0, 16, 33, 96, FS_LATIN1 | FS_LATIN2 }, + { "MS Serif", FW_NORMAL, 35, 27, 8, 3, 0, 16, 34, 96, FS_CYRILLIC }, + + { "MS Serif", FW_NORMAL, 16, 13, 3, 3, 0, 6, 14, 120, FS_LATIN1 | FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 16, 13, 3, 3, 0, 6, 13, 120, FS_LATIN2 }, + { "MS Serif", FW_NORMAL, 20, 16, 4, 4, 0, 8, 18, 120, FS_LATIN1 | FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 20, 16, 4, 4, 0, 8, 15, 120, FS_LATIN2 }, + { "MS Serif", FW_NORMAL, 23, 18, 5, 3, 0, 10, 21, 120, FS_LATIN1 | FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 23, 18, 5, 3, 0, 10, 19, 120, FS_LATIN2 }, + { "MS Serif", FW_NORMAL, 27, 21, 6, 4, 0, 12, 23, 120, FS_LATIN1 | FS_LATIN2 }, + { "MS Serif", FW_MEDIUM, 27, 22, 5, 2, 0, 12, 30, 120, FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 33, 26, 7, 3, 0, 14, 30, 120, FS_LATIN1 | FS_LATIN2 }, + { "MS Serif", FW_MEDIUM, 32, 25, 7, 2, 0, 14, 32, 120, FS_CYRILLIC }, + { "MS Serif", FW_NORMAL, 43, 34, 9, 3, 0, 19, 39, 120, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + + { "Courier", FW_NORMAL, 13, 11, 2, 0, 0, 8, 8, 96, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "Courier", FW_NORMAL, 16, 13, 3, 0, 0, 9, 9, 96, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "Courier", FW_NORMAL, 20, 16, 4, 0, 0, 12, 12, 96, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + + { "Courier", FW_NORMAL, 16, 13, 3, 0, 0, 9, 9, 120, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "Courier", FW_NORMAL, 20, 16, 4, 0, 0, 12, 12, 120, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "Courier", FW_NORMAL, 25, 20, 5, 0, 0, 15, 15, 120, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + + { "System", FW_BOLD, 16, 13, 3, 3, 0, 7, 14, 96, FS_LATIN1 }, + { "System", FW_BOLD, 16, 13, 3, 3, 0, 7, 15, 96, FS_LATIN2 | FS_CYRILLIC }, /* * TODO: the system for CP932 should be NORMAL, not BOLD. However that would * require a new system.sfd for that font */ - { "System", FW_BOLD, 18, 16, 2, 0, 2, 8, 16, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 1, 2, FS_LATIN1 }, - { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 1, 8, FS_LATIN2 | FS_CYRILLIC }, - { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 2, 4, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 5, 4, 1, 1, 0, 3, 4, FS_LATIN1 }, - { "Small Fonts", FW_NORMAL, 5, 4, 1, 1, 0, 2, 8, FS_LATIN2 | FS_CYRILLIC }, - { "Small Fonts", FW_NORMAL, 5, 4, 1, 0, 0, 3, 6, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 13, FS_LATIN1 }, - { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 8, FS_LATIN2 | FS_CYRILLIC }, - { "Small Fonts", FW_NORMAL, 6, 5, 1, 0, 0, 4, 8, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 7, FS_LATIN1 }, - { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 8, FS_LATIN2 | FS_CYRILLIC }, - { "Small Fonts", FW_NORMAL, 8, 7, 1, 0, 0, 5, 10, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 4, 8, FS_LATIN1 | FS_LATIN2 }, - { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 5, 8, FS_CYRILLIC }, - { "Small Fonts", FW_NORMAL, 10, 8, 2, 0, 0, 6, 12, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 11, 9, 2, 2, 0, 5, 9, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, - { "Small Fonts", FW_NORMAL, 11, 9, 2, 0, 0, 7, 14, FS_JISJAPAN }, - { "Fixedsys", FW_NORMAL, 15, 12, 3, 3, 0, 8, 8, FS_LATIN1 | FS_LATIN2 }, - { "Fixedsys", FW_NORMAL, 16, 12, 4, 3, 0, 8, 8, FS_CYRILLIC }, - { "FixedSys", FW_NORMAL, 18, 16, 2, 0, 0, 8, 16, FS_JISJAPAN } + { "System", FW_BOLD, 18, 16, 2, 0, 2, 8, 16, 96, FS_JISJAPAN }, + + { "System", FW_BOLD, 20, 16, 4, 4, 0, 9, 14, 120, FS_LATIN1 }, + { "System", FW_BOLD, 20, 16, 4, 4, 0, 9, 17, 120, FS_LATIN2 | FS_CYRILLIC }, + + { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 1, 2, 96, FS_LATIN1 }, + { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 1, 8, 96, FS_LATIN2 | FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 2, 4, 96, FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 5, 4, 1, 1, 0, 3, 4, 96, FS_LATIN1 }, + { "Small Fonts", FW_NORMAL, 5, 4, 1, 1, 0, 2, 8, 96, FS_LATIN2 | FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 5, 4, 1, 0, 0, 3, 6, 96, FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 13, 96, FS_LATIN1 }, + { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 8, 96, FS_LATIN2 | FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 6, 5, 1, 0, 0, 4, 8, 96, FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 7, 96, FS_LATIN1 }, + { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 8, 96, FS_LATIN2 | FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 8, 7, 1, 0, 0, 5, 10, 96, FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 4, 8, 96, FS_LATIN1 | FS_LATIN2 }, + { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 5, 8, 96, FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 10, 8, 2, 0, 0, 6, 12, 96, FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 11, 9, 2, 2, 0, 5, 9, 96, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 11, 9, 2, 0, 0, 7, 14, 96, FS_JISJAPAN }, + + { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 1, 2, 120, FS_LATIN1 | FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 1, 8, 120, FS_LATIN2 | FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 5, 120, FS_LATIN1 | FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 8, 120, FS_LATIN2 | FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 7, 120, FS_LATIN1 | FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 8, 120, FS_LATIN2 | FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 5, 9, 120, FS_LATIN1 | FS_LATIN2 | FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 5, 8, 120, FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 12, 10, 2, 2, 0, 5, 10, 120, FS_LATIN1 | FS_LATIN2 | FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 12, 10, 2, 2, 0, 6, 10, 120, FS_CYRILLIC }, + { "Small Fonts", FW_NORMAL, 13, 11, 2, 2, 0, 6, 12, 120, FS_LATIN1 | FS_LATIN2 | FS_JISJAPAN }, + { "Small Fonts", FW_NORMAL, 13, 11, 2, 2, 0, 6, 11, 120, FS_CYRILLIC }, + + { "Fixedsys", FW_NORMAL, 15, 12, 3, 3, 0, 8, 8, 96, FS_LATIN1 | FS_LATIN2 }, + { "Fixedsys", FW_NORMAL, 16, 12, 4, 3, 0, 8, 8, 96, FS_CYRILLIC }, + { "FixedSys", FW_NORMAL, 18, 16, 2, 0, 0, 8, 16, 96, FS_JISJAPAN }, + + /* The 120dpi version still has its dpi marked as 96 */ + { "Fixedsys", FW_NORMAL, 20, 16, 4, 2, 0, 10, 10, 96, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC } /* FIXME: add "Terminal" */ }; @@ -728,25 +801,25 @@ static void test_bitmap_font_metrics(void) ret = EnumFontFamiliesEx(hdc, &lf, find_font_proc, (LPARAM)&lf, 0); if (ret) continue; - trace("found font %s, height %d charset %x\n", lf.lfFaceName, lf.lfHeight, lf.lfCharSet); - hfont = create_font(lf.lfFaceName, &lf); old_hfont = SelectObject(hdc, hfont); ok(GetTextMetrics(hdc, &tm), "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].height, tm.tmWeight, fd[i].weight); + ok(tm.tmHeight == fd[i].height, "%s(%d): tm.tmHeight %d != %d\n", fd[i].face_name, fd[i].height, tm.tmHeight, fd[i].height); + ok(tm.tmAscent == fd[i].ascent, "%s(%d): tm.tmAscent %d != %d\n", fd[i].face_name, fd[i].height, tm.tmAscent, fd[i].ascent); + ok(tm.tmDescent == fd[i].descent, "%s(%d): tm.tmDescent %d != %d\n", fd[i].face_name, fd[i].height, tm.tmDescent, fd[i].descent); + ok(tm.tmInternalLeading == fd[i].int_leading, "%s(%d): tm.tmInternalLeading %d != %d\n", fd[i].face_name, fd[i].height, tm.tmInternalLeading, fd[i].int_leading); + ok(tm.tmExternalLeading == fd[i].ext_leading, "%s(%d): tm.tmExternalLeading %d != %d\n", fd[i].face_name, fd[i].height, tm.tmExternalLeading, fd[i].ext_leading); + ok(tm.tmAveCharWidth == fd[i].ave_char_width, "%s(%d): tm.tmAveCharWidth %d != %d\n", fd[i].face_name, fd[i].height, tm.tmAveCharWidth, fd[i].ave_char_width); - ok(tm.tmWeight == fd[i].weight, "%s(%d): tm.tmWeight %d != %d\n", fd[i].face_name, fd[i].height, tm.tmWeight, fd[i].weight); - ok(tm.tmHeight == fd[i].height, "%s(%d): tm.tmHeight %d != %d\n", fd[i].face_name, fd[i].height, tm.tmHeight, fd[i].height); - ok(tm.tmAscent == fd[i].ascent, "%s(%d): tm.tmAscent %d != %d\n", fd[i].face_name, fd[i].height, tm.tmAscent, fd[i].ascent); - ok(tm.tmDescent == fd[i].descent, "%s(%d): tm.tmDescent %d != %d\n", fd[i].face_name, fd[i].height, tm.tmDescent, fd[i].descent); - ok(tm.tmInternalLeading == fd[i].int_leading, "%s(%d): tm.tmInternalLeading %d != %d\n", fd[i].face_name, fd[i].height, tm.tmInternalLeading, fd[i].int_leading); - ok(tm.tmExternalLeading == fd[i].ext_leading, "%s(%d): tm.tmExternalLeading %d != %d\n", fd[i].face_name, fd[i].height, tm.tmExternalLeading, fd[i].ext_leading); - ok(tm.tmAveCharWidth == fd[i].ave_char_width, "%s(%d): tm.tmAveCharWidth %d != %d\n", fd[i].face_name, fd[i].height, tm.tmAveCharWidth, fd[i].ave_char_width); - - /* Don't run the max char width test on System/ANSI_CHARSET. We have extra characters in our font - that make the max width bigger */ - if(strcmp(lf.lfFaceName, "System") || lf.lfCharSet != ANSI_CHARSET) - ok(tm.tmMaxCharWidth == fd[i].max_char_width, "%s(%d): tm.tmMaxCharWidth %d != %d\n", fd[i].face_name, fd[i].height, tm.tmMaxCharWidth, fd[i].max_char_width); - + /* Don't run the max char width test on System/ANSI_CHARSET. We have extra characters in our font + that make the max width bigger */ + if(strcmp(lf.lfFaceName, "System") || lf.lfCharSet != ANSI_CHARSET) + ok(tm.tmMaxCharWidth == fd[i].max_char_width, "%s(%d): tm.tmMaxCharWidth %d != %d\n", fd[i].face_name, fd[i].height, tm.tmMaxCharWidth, fd[i].max_char_width); + } SelectObject(hdc, old_hfont); DeleteObject(hfont); } @@ -766,7 +839,7 @@ static void test_GdiGetCharDimensions(void) if (!pGdiGetCharDimensions) { - skip("GdiGetCharDimensions not available on this platform\n"); + win_skip("GdiGetCharDimensions not available on this platform\n"); return; } @@ -806,7 +879,7 @@ static void test_GetCharABCWidths(void) if (!pGetCharABCWidthsW || !pGetCharABCWidthsI) { - skip("GetCharABCWidthsW/I not available on this platform\n"); + win_skip("GetCharABCWidthsW/I not available on this platform\n"); return; } @@ -871,7 +944,7 @@ static void test_text_extents(void) GetTextExtentExPointW(hdc, wt, 1, 1, &fit1, &fit2, &sz1); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("Skipping remainder of text extents test on a Win9x platform\n"); + win_skip("Skipping remainder of text extents test on a Win9x platform\n"); hfont = SelectObject(hdc, hfont); DeleteObject(hfont); ReleaseDC(0, hdc); @@ -929,7 +1002,7 @@ static void test_GetGlyphIndices(void) HFONT hOldFont; if (!pGetGlyphIndicesW) { - skip("GetGlyphIndicesW not available on platform\n"); + win_skip("GetGlyphIndicesW not available on platform\n"); return; } @@ -966,7 +1039,7 @@ static void test_GetGlyphIndices(void) testtext[0] = textm.tmDefaultChar; charcount = pGetGlyphIndicesW(hdc, testtext, (sizeof(testtext)/2)-1, glyphs, flags); ok(charcount == 5, "GetGlyphIndicesW count of glyphs should = 5 not %d\n", charcount); - todo_wine ok(glyphs[0] == 0, "GetGlyphIndicesW for tmDefaultChar should be 0 not %04x\n", glyphs[0]); + ok(glyphs[0] == 0, "GetGlyphIndicesW for tmDefaultChar should be 0 not %04x\n", glyphs[0]); ok(glyphs[4] == 0, "GetGlyphIndicesW should have returned 0 not %04x\n", glyphs[4]); DeleteObject(SelectObject(hdc, hOldFont)); } @@ -1064,7 +1137,7 @@ static void test_GetKerningPairs(void) GetKerningPairsW(hdc, 0, NULL); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("Skipping the GetKerningPairs test on a Win9x platform\n"); + win_skip("Skipping the GetKerningPairs test on a Win9x platform\n"); ReleaseDC(0, hdc); return; } @@ -1188,6 +1261,7 @@ static void test_GetOutlineTextMetrics(void) HFONT hfont, hfont_old; HDC hdc; DWORD ret, otm_size; + LPSTR unset_ptr; if (!is_font_installed("Arial")) { @@ -1244,6 +1318,7 @@ static void test_GetOutlineTextMetrics(void) /* ask about truncated data */ memset(otm, 0xAA, otm_size); + memset(&unset_ptr, 0xAA, sizeof(unset_ptr)); SetLastError(0xdeadbeef); otm->otmSize = sizeof(*otm) - sizeof(LPSTR); /* just in case for Win9x compatibility */ ret = GetOutlineTextMetrics(hdc, otm->otmSize, otm); @@ -1256,7 +1331,7 @@ static void test_GetOutlineTextMetrics(void) ok(otm->otmpFaceName == NULL, "expected NULL got %p\n", otm->otmpFaceName); ok(otm->otmpStyleName == NULL, "expected NULL got %p\n", otm->otmpStyleName); } - ok(otm->otmpFullName == (LPSTR)0xAAAAAAAA, "expected 0xAAAAAAAA got %p\n", otm->otmpFullName); + ok(otm->otmpFullName == unset_ptr, "expected %p got %p\n", unset_ptr, otm->otmpFullName); HeapFree(GetProcessHeap(), 0, otm); @@ -1270,7 +1345,6 @@ static void testJustification(HDC hdc, PSTR str, RECT *clientArea) { INT x, y, breakCount, - outputWidth = 0, /* to test TabbedTextOut() */ justifiedWidth = 0, /* to test GetTextExtentExPointW() */ areaWidth = clientArea->right - clientArea->left, nErrors = 0, e; @@ -1282,7 +1356,6 @@ static void testJustification(HDC hdc, PSTR str, RECT *clientArea) { char extent[100]; int GetTextExtentExPointWWidth; - int TabbedTextOutWidth; } error[10]; GetTextMetricsA(hdc, &tm); @@ -1328,15 +1401,11 @@ static void testJustification(HDC hdc, PSTR str, RECT *clientArea) x = clientArea->left; - outputWidth = LOWORD(TabbedTextOut( - hdc, x, y, pFirstChar, pLastChar - pFirstChar, - 0, NULL, 0)); /* catch errors and report them */ - if (!lastExtent && ((outputWidth != areaWidth) || (justifiedWidth != areaWidth))) + if (!lastExtent && (justifiedWidth != areaWidth)) { memset(error[nErrors].extent, 0, 100); memcpy(error[nErrors].extent, pFirstChar, pLastChar - pFirstChar); - error[nErrors].TabbedTextOutWidth = outputWidth; error[nErrors].GetTextExtentExPointWWidth = justifiedWidth; nErrors++; } @@ -1347,9 +1416,6 @@ static void testJustification(HDC hdc, PSTR str, RECT *clientArea) for (e = 0; e < nErrors; e++) { - ok(near_match(error[e].TabbedTextOutWidth, areaWidth), - "The output text (\"%s\") width should be %d, not %d.\n", - error[e].extent, areaWidth, error[e].TabbedTextOutWidth); /* The width returned by GetTextExtentPoint32() is exactly the same returned by GetTextExtentExPointW() - see dlls/gdi32/font.c */ ok(error[e].GetTextExtentExPointWWidth == areaWidth, @@ -1438,7 +1504,7 @@ static BOOL get_glyph_indices(INT charset, UINT code_page, WORD *idx, UINT count ok(!(fs.fsCsb[0] & (1 << 31)), "symbol encoding should NOT be available\n"); } - if (!TranslateCharsetInfo((DWORD *)cs, &csi, TCI_SRCCHARSET)) + if (!TranslateCharsetInfo((DWORD *)(INT_PTR)cs, &csi, TCI_SRCCHARSET)) { trace("Can't find codepage for charset %d\n", cs); ReleaseDC(0, hdc); @@ -1495,7 +1561,7 @@ static void test_font_charset(void) if (!pGetGlyphIndicesA || !pGetGlyphIndicesW) { - skip("Skipping the font charset test on a Win9x platform\n"); + win_skip("Skipping the font charset test on a Win9x platform\n"); return; } @@ -1540,7 +1606,7 @@ static void test_GetFontUnicodeRanges(void) if (!pGetFontUnicodeRanges) { - skip("GetFontUnicodeRanges not available before W2K\n"); + win_skip("GetFontUnicodeRanges not available before W2K\n"); return; } @@ -1719,7 +1785,9 @@ static void test_EnumFontFamilies(const char *font_name, INT font_charset) ok(efdw.total > 0, "fonts enumerated: NULL\n"); ok(ansi_charset > 0, "NULL family should enumerate ANSI_CHARSET\n"); ok(symbol_charset > 0, "NULL family should enumerate SYMBOL_CHARSET\n"); - ok(russian_charset > 0, "NULL family should enumerate RUSSIAN_CHARSET\n"); + ok(russian_charset > 0 || + broken(russian_charset == 0), /* NT4 */ + "NULL family should enumerate RUSSIAN_CHARSET\n"); } efdw.total = 0; @@ -1898,10 +1966,7 @@ static void test_negative_width(HDC hdc, const LOGFONTA *lf) MAT2 mat = { {0,1}, {0,0}, {0,0}, {0,1} }; if(!pGetGlyphIndicesA) - { - skip("GetGlyphIndicesA is unavailable\n"); return; - } /* negative widths are handled just as positive ones */ lf2.lfWidth = -lf->lfWidth; @@ -2011,27 +2076,222 @@ typedef struct #ifdef WORDS_BIGENDIAN #define GET_BE_WORD(x) (x) +#define GET_BE_DWORD(x) (x) #else #define GET_BE_WORD(x) MAKEWORD(HIBYTE(x), LOBYTE(x)) +#define GET_BE_DWORD(x) MAKELONG(GET_BE_WORD(HIWORD(x)), GET_BE_WORD(LOWORD(x))); #endif #define MS_MAKE_TAG(ch0, ch1, ch2, ch3) \ ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \ ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24)) #define MS_OS2_TAG MS_MAKE_TAG('O','S','/','2') +#define MS_CMAP_TAG MS_MAKE_TAG('c','m','a','p') + +typedef struct +{ + USHORT version; + USHORT num_tables; +} cmap_header; + +typedef struct +{ + USHORT plat_id; + USHORT enc_id; + ULONG offset; +} cmap_encoding_record; + +typedef struct +{ + USHORT format; + USHORT length; + USHORT language; + + BYTE glyph_ids[256]; +} cmap_format_0; + +typedef struct +{ + USHORT format; + USHORT length; + USHORT language; + + USHORT seg_countx2; + USHORT search_range; + USHORT entry_selector; + USHORT range_shift; + + USHORT end_count[1]; /* this is a variable-sized array of length seg_countx2 / 2 */ +/* Then follows: + USHORT pad; + USHORT start_count[seg_countx2 / 2]; + USHORT id_delta[seg_countx2 / 2]; + USHORT id_range_offset[seg_countx2 / 2]; + USHORT glyph_ids[]; +*/ +} cmap_format_4; + +typedef struct +{ + USHORT end_count; + USHORT start_count; + USHORT id_delta; + USHORT id_range_offset; +} cmap_format_4_seg; + +static void expect_ff(const TEXTMETRICA *tmA, const TT_OS2_V2 *os2, WORD family, const char *name) +{ + ok((tmA->tmPitchAndFamily & 0xf0) == family, "%s: expected family %02x got %02x. panose %d-%d-%d-%d-...\n", + name, family, tmA->tmPitchAndFamily, os2->panose.bFamilyType, os2->panose.bSerifStyle, + os2->panose.bWeight, os2->panose.bProportion); +} + +static BOOL get_first_last_from_cmap0(void *ptr, DWORD *first, DWORD *last) +{ + int i; + cmap_format_0 *cmap = (cmap_format_0*)ptr; + + *first = 256; + + for(i = 0; i < 256; i++) + { + if(cmap->glyph_ids[i] == 0) continue; + *last = i; + if(*first == 256) *first = i; + } + if(*first == 256) return FALSE; + return TRUE; +} + +static void get_seg4(cmap_format_4 *cmap, USHORT seg_num, cmap_format_4_seg *seg) +{ + USHORT segs = GET_BE_WORD(cmap->seg_countx2) / 2; + seg->end_count = GET_BE_WORD(cmap->end_count[seg_num]); + seg->start_count = GET_BE_WORD(cmap->end_count[segs + 1 + seg_num]); + seg->id_delta = GET_BE_WORD(cmap->end_count[2 * segs + 1 + seg_num]); + seg->id_range_offset = GET_BE_WORD(cmap->end_count[3 * segs + 1 + seg_num]); +} + +static BOOL get_first_last_from_cmap4(void *ptr, DWORD *first, DWORD *last) +{ + int i; + cmap_format_4 *cmap = (cmap_format_4*)ptr; + USHORT seg_count = GET_BE_WORD(cmap->seg_countx2) / 2; + USHORT const *glyph_ids = cmap->end_count + 4 * seg_count + 1; + + *first = 0x10000; + + for(i = 0; i < seg_count; i++) + { + DWORD code, index; + cmap_format_4_seg seg; + + get_seg4(cmap, i, &seg); + for(code = seg.start_count; code <= seg.end_count; code++) + { + if(seg.id_range_offset == 0) + index = (seg.id_delta + code) & 0xffff; + else + { + index = seg.id_range_offset / 2 + + code - seg.start_count + + i - seg_count; + + index = GET_BE_WORD(glyph_ids[index]); + if(index) index += seg.id_delta; + } + if(*first == 0x10000) + *last = *first = code; + else if(index) + *last = code; + } + } + + if(*first == 0x10000) return FALSE; + return TRUE; +} + +static void *get_cmap(cmap_header *header, USHORT plat_id, USHORT enc_id) +{ + USHORT i; + cmap_encoding_record *record = (cmap_encoding_record *)(header + 1); + + for(i = 0; i < GET_BE_WORD(header->num_tables); i++) + { + if(GET_BE_WORD(record->plat_id) == plat_id && GET_BE_WORD(record->enc_id) == enc_id) + return (BYTE *)header + GET_BE_DWORD(record->offset); + record++; + } + return NULL; +} + +typedef enum +{ + cmap_none, + cmap_ms_unicode, + cmap_ms_symbol +} cmap_type; + +static BOOL get_first_last_from_cmap(HDC hdc, DWORD *first, DWORD *last, cmap_type *cmap_type) +{ + LONG size, ret; + cmap_header *header; + void *cmap; + BOOL r = FALSE; + WORD format; + + size = GetFontData(hdc, MS_CMAP_TAG, 0, NULL, 0); + ok(size != GDI_ERROR, "no cmap table found\n"); + if(size == GDI_ERROR) return FALSE; + + header = HeapAlloc(GetProcessHeap(), 0, size); + ret = GetFontData(hdc, MS_CMAP_TAG, 0, header, size); + ok(ret == size, "GetFontData should return %u not %u\n", size, ret); + ok(GET_BE_WORD(header->version) == 0, "got cmap version %d\n", GET_BE_WORD(header->version)); + + cmap = get_cmap(header, 3, 1); + if(cmap) + *cmap_type = cmap_ms_unicode; + else + { + cmap = get_cmap(header, 3, 0); + if(cmap) *cmap_type = cmap_ms_symbol; + } + if(!cmap) + { + *cmap_type = cmap_none; + goto end; + } + + format = GET_BE_WORD(*(WORD *)cmap); + switch(format) + { + case 0: + r = get_first_last_from_cmap0(cmap, first, last); + break; + case 4: + r = get_first_last_from_cmap4(cmap, first, last); + break; + default: + trace("unhandled cmap format %d\n", format); + break; + } + +end: + HeapFree(GetProcessHeap(), 0, header); + return r; +} static void test_text_metrics(const LOGFONTA *lf) { HDC hdc; HFONT hfont, hfont_old; TEXTMETRICA tmA; - TEXTMETRICW tmW; - UINT first_unicode_char, last_unicode_char, default_char, break_char; - INT test_char; TT_OS2_V2 tt_os2; - USHORT version; LONG size, ret; const char *font_name = lf->lfFaceName; + DWORD cmap_first = 0, cmap_last = 0; + cmap_type cmap_type; hdc = GetDC(0); @@ -2057,78 +2317,171 @@ static void test_text_metrics(const LOGFONTA *lf) ret = GetFontData(hdc, MS_OS2_TAG, 0, &tt_os2, size); ok(ret == size, "GetFontData should return %u not %u\n", size, ret); - version = GET_BE_WORD(tt_os2.version); - - first_unicode_char = GET_BE_WORD(tt_os2.usFirstCharIndex); - last_unicode_char = GET_BE_WORD(tt_os2.usLastCharIndex); - default_char = GET_BE_WORD(tt_os2.usDefaultChar); - break_char = GET_BE_WORD(tt_os2.usBreakChar); - - trace("font %s charset %u: %x-%x default %x break %x OS/2 version %u vendor %4.4s\n", - font_name, lf->lfCharSet, first_unicode_char, last_unicode_char, default_char, break_char, - version, (LPCSTR)&tt_os2.achVendID); - SetLastError(0xdeadbeef); ret = GetTextMetricsA(hdc, &tmA); ok(ret, "GetTextMetricsA error %u\n", GetLastError()); -#if 0 /* FIXME: This doesn't appear to be what Windows does */ - test_char = min(first_unicode_char - 1, 255); - ok(tmA.tmFirstChar == test_char, "A: tmFirstChar for %s %02x != %02x\n", - font_name, tmA.tmFirstChar, test_char); -#endif - if (lf->lfCharSet == SYMBOL_CHARSET) + if(!get_first_last_from_cmap(hdc, &cmap_first, &cmap_last, &cmap_type)) { - test_char = min(last_unicode_char - 0xf000, 255); - ok(tmA.tmLastChar == test_char, "A: tmLastChar for %s %02x != %02x\n", - font_name, tmA.tmLastChar, test_char); + skip("Unable to retrieve first and last glyphs from cmap\n"); } else { - test_char = min(last_unicode_char, 255); - ok(tmA.tmLastChar == test_char, "A: tmLastChar for %s %02x != %02x\n", - font_name, tmA.tmLastChar, test_char); - } + USHORT expect_first_A, expect_last_A, expect_break_A, expect_default_A; + USHORT expect_first_W, expect_last_W, expect_break_W, expect_default_W; + UINT os2_first_char, os2_last_char, default_char, break_char; + USHORT version; + TEXTMETRICW tmW; - SetLastError(0xdeadbeef); - ret = GetTextMetricsW(hdc, &tmW); - ok(ret || GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, - "GetTextMetricsW error %u\n", GetLastError()); - if (ret) - { - trace("%04x-%04x (%02x-%02x) default %x (%x) break %x (%x)\n", - tmW.tmFirstChar, tmW.tmLastChar, tmA.tmFirstChar, tmA.tmLastChar, - tmW.tmDefaultChar, tmA.tmDefaultChar, tmW.tmBreakChar, tmA.tmBreakChar); + version = GET_BE_WORD(tt_os2.version); - if (lf->lfCharSet == SYMBOL_CHARSET) + os2_first_char = GET_BE_WORD(tt_os2.usFirstCharIndex); + os2_last_char = GET_BE_WORD(tt_os2.usLastCharIndex); + default_char = GET_BE_WORD(tt_os2.usDefaultChar); + break_char = GET_BE_WORD(tt_os2.usBreakChar); + + trace("font %s charset %u: %x-%x (%x-%x) default %x break %x OS/2 version %u vendor %4.4s\n", + font_name, lf->lfCharSet, os2_first_char, os2_last_char, cmap_first, cmap_last, + default_char, break_char, version, (LPCSTR)&tt_os2.achVendID); + + if (cmap_type == cmap_ms_symbol || (cmap_first >= 0xf000 && cmap_first < 0xf100)) { - /* It appears that for fonts with SYMBOL_CHARSET Windows always - * sets symbol range to 0 - f0ff - */ - ok(tmW.tmFirstChar == 0, "W: tmFirstChar for %s %02x != 0\n", - font_name, tmW.tmFirstChar); - /* FIXME: Windows returns f0ff here, while Wine f0xx */ - ok(tmW.tmLastChar >= 0xf000, "W: tmLastChar for %s %02x < 0xf000\n", - font_name, tmW.tmLastChar); - - ok(tmW.tmDefaultChar == 0x1f, "W: tmDefaultChar for %s %02x != 0x1f\n", - font_name, tmW.tmDefaultChar); - ok(tmW.tmBreakChar == 0x20, "W: tmBreakChar for %s %02x != 0x20\n", - font_name, tmW.tmBreakChar); + expect_first_W = 0; + switch(GetACP()) + { + case 1257: /* Baltic */ + expect_last_W = 0xf8fd; + break; + default: + expect_last_W = 0xf0ff; + } + expect_break_W = 0x20; + expect_default_W = expect_break_W - 1; + expect_first_A = 0x1e; + expect_last_A = min(os2_last_char - os2_first_char + 0x20, 0xff); } else { - ok(tmW.tmFirstChar == first_unicode_char, "W: tmFirstChar for %s %02x != %02x\n", - font_name, tmW.tmFirstChar, first_unicode_char); - ok(tmW.tmLastChar == last_unicode_char, "W: tmLastChar for %s %02x != %02x\n", - font_name, tmW.tmLastChar, last_unicode_char); + expect_first_W = cmap_first; + expect_last_W = min(cmap_last, os2_last_char); + if(os2_first_char <= 1) + expect_break_W = os2_first_char + 2; + else if(os2_first_char > 0xff) + expect_break_W = 0x20; + else + expect_break_W = os2_first_char; + expect_default_W = expect_break_W - 1; + expect_first_A = expect_default_W - 1; + expect_last_A = min(expect_last_W, 0xff); } - ret = GetDeviceCaps(hdc, LOGPIXELSX); - ok(tmW.tmDigitizedAspectX == ret, "W: tmDigitizedAspectX %u != %u\n", - tmW.tmDigitizedAspectX, ret); - ret = GetDeviceCaps(hdc, LOGPIXELSY); - ok(tmW.tmDigitizedAspectX == ret, "W: tmDigitizedAspectY %u != %u\n", - tmW.tmDigitizedAspectX, ret); + expect_break_A = expect_break_W; + expect_default_A = expect_default_W; + + /* Wine currently uses SYMBOL_CHARSET to identify whether the ANSI metrics need special handling */ + if(cmap_type != cmap_ms_symbol && tmA.tmCharSet == SYMBOL_CHARSET && expect_first_A != 0x1e) + todo_wine ok(tmA.tmFirstChar == expect_first_A || + tmA.tmFirstChar == expect_first_A + 1 /* win9x */, + "A: tmFirstChar for %s got %02x expected %02x\n", font_name, tmA.tmFirstChar, expect_first_A); + else + ok(tmA.tmFirstChar == expect_first_A || + tmA.tmFirstChar == expect_first_A + 1 /* win9x */, + "A: tmFirstChar for %s got %02x expected %02x\n", font_name, tmA.tmFirstChar, expect_first_A); + ok(tmA.tmLastChar == expect_last_A || + tmA.tmLastChar == 0xff /* win9x */, + "A: tmLastChar for %s got %02x expected %02x\n", font_name, tmA.tmLastChar, expect_last_A); + ok(tmA.tmBreakChar == expect_break_A, "A: tmBreakChar for %s got %02x expected %02x\n", + font_name, tmA.tmBreakChar, expect_break_A); + ok(tmA.tmDefaultChar == expect_default_A, "A: tmDefaultChar for %s got %02x expected %02x\n", + font_name, tmA.tmDefaultChar, expect_default_A); + + + SetLastError(0xdeadbeef); + ret = GetTextMetricsW(hdc, &tmW); + ok(ret || GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, + "GetTextMetricsW error %u\n", GetLastError()); + if (ret) + { + /* Wine uses the os2 first char */ + if(cmap_first != os2_first_char && cmap_type != cmap_ms_symbol) + todo_wine ok(tmW.tmFirstChar == expect_first_W, "W: tmFirstChar for %s got %02x expected %02x\n", + font_name, tmW.tmFirstChar, expect_first_W); + else + ok(tmW.tmFirstChar == expect_first_W, "W: tmFirstChar for %s got %02x expected %02x\n", + font_name, tmW.tmFirstChar, expect_first_W); + + /* Wine uses the os2 last char */ + if(expect_last_W != os2_last_char && cmap_type != cmap_ms_symbol) + todo_wine ok(tmW.tmLastChar == expect_last_W, "W: tmLastChar for %s got %02x expected %02x\n", + font_name, tmW.tmLastChar, expect_last_W); + else + ok(tmW.tmLastChar == expect_last_W, "W: tmLastChar for %s got %02x expected %02x\n", + font_name, tmW.tmLastChar, expect_last_W); + ok(tmW.tmBreakChar == expect_break_W, "W: tmBreakChar for %s got %02x expected %02x\n", + font_name, tmW.tmBreakChar, expect_break_W); + ok(tmW.tmDefaultChar == expect_default_W, "W: tmDefaultChar for %s got %02x expected %02x\n", + font_name, tmW.tmDefaultChar, expect_default_W); + + /* Test the aspect ratio while we have tmW */ + ret = GetDeviceCaps(hdc, LOGPIXELSX); + ok(tmW.tmDigitizedAspectX == ret, "W: tmDigitizedAspectX %u != %u\n", + tmW.tmDigitizedAspectX, ret); + ret = GetDeviceCaps(hdc, LOGPIXELSY); + ok(tmW.tmDigitizedAspectX == ret, "W: tmDigitizedAspectY %u != %u\n", + tmW.tmDigitizedAspectX, ret); + } + } + + /* test FF_ values */ + switch(tt_os2.panose.bFamilyType) + { + case PAN_ANY: + case PAN_NO_FIT: + case PAN_FAMILY_TEXT_DISPLAY: + case PAN_FAMILY_PICTORIAL: + default: + if((tmA.tmPitchAndFamily & 1) == 0 || /* fixed */ + tt_os2.panose.bProportion == PAN_PROP_MONOSPACED) + { + expect_ff(&tmA, &tt_os2, FF_MODERN, font_name); + break; + } + switch(tt_os2.panose.bSerifStyle) + { + case PAN_ANY: + case PAN_NO_FIT: + default: + expect_ff(&tmA, &tt_os2, FF_DONTCARE, font_name); + break; + + case PAN_SERIF_COVE: + case PAN_SERIF_OBTUSE_COVE: + case PAN_SERIF_SQUARE_COVE: + case PAN_SERIF_OBTUSE_SQUARE_COVE: + case PAN_SERIF_SQUARE: + case PAN_SERIF_THIN: + case PAN_SERIF_BONE: + case PAN_SERIF_EXAGGERATED: + case PAN_SERIF_TRIANGLE: + expect_ff(&tmA, &tt_os2, FF_ROMAN, font_name); + break; + + case PAN_SERIF_NORMAL_SANS: + case PAN_SERIF_OBTUSE_SANS: + case PAN_SERIF_PERP_SANS: + case PAN_SERIF_FLARED: + case PAN_SERIF_ROUNDED: + expect_ff(&tmA, &tt_os2, FF_SWISS, font_name); + break; + } + break; + + case PAN_FAMILY_SCRIPT: + expect_ff(&tmA, &tt_os2, FF_SCRIPT, font_name); + break; + + case PAN_FAMILY_DECORATIVE: + expect_ff(&tmA, &tt_os2, FF_DECORATIVE, font_name); + break; } test_negative_width(hdc, lf); @@ -2158,6 +2511,10 @@ static void test_GetTextMetrics(void) HDC hdc; INT enumed; + /* Report only once */ + if(!pGetGlyphIndicesA) + win_skip("GetGlyphIndicesA is unavailable, negative width will not be checked\n"); + hdc = GetDC(0); memset(&lf, 0, sizeof(lf)); @@ -2274,16 +2631,16 @@ todo_wine /* Wine uses Arial for all substitutions */ cs = GetTextCharset(hdc); if (font_subst[i].charset == expected_cs) { - ok(cs == expected_cs, "expected %d, got %d\n", expected_cs, cs); + ok(cs == expected_cs, "expected %d, got %d for font %s\n", expected_cs, cs, font_subst[i].name); GetTextFaceA(hdc, sizeof(buf), buf); ok(!lstrcmpiA(buf, font_subst[i].name), "expected %s, got %s\n", font_subst[i].name, buf); } else { - ok(cs == ANSI_CHARSET, "expected ANSI_CHARSET, got %d\n", cs); + ok(cs == ANSI_CHARSET, "expected ANSI_CHARSET, got %d for font %s\n", cs, font_subst[i].name); GetTextFaceA(hdc, sizeof(buf), buf); ok(!lstrcmpiA(buf, "Arial") /* XP, Vista */ || - !lstrcmpiA(buf, "Times New Roman") /* Win9x */, "got %s\n", buf); + !lstrcmpiA(buf, "Times New Roman") /* Win9x */, "got %s for font %s\n", buf, font_subst[i].name); } DeleteObject(SelectObject(hdc, hfont)); @@ -2298,9 +2655,9 @@ todo_wine /* Wine uses Arial for all substitutions */ !lstrcmpiA(buf, font_subst[i].name) /* XP, Vista */ || !lstrcmpiA(buf, "MS Serif") /* Win9x */ || !lstrcmpiA(buf, "MS Sans Serif"), /* win2k3 */ - "got %s\n", buf); + "got %s for font %s\n", buf, font_subst[i].name); cs = GetTextCharset(hdc); - ok(cs == expected_cs, "expected %d, got %d\n", expected_cs, cs); + ok(cs == expected_cs, "expected %d, got %d for font %s\n", expected_cs, cs, font_subst[i].name); DeleteObject(SelectObject(hdc, hfont)); } @@ -2317,7 +2674,7 @@ static void test_GdiRealizationInfo(void) if(!pGdiRealizationInfo) { - skip("GdiRealizationInfo not available\n"); + win_skip("GdiRealizationInfo not available\n"); return; } @@ -2326,7 +2683,7 @@ static void test_GdiRealizationInfo(void) memset(info, 0xcc, sizeof(info)); r = pGdiRealizationInfo(hdc, info); ok(r != 0, "ret 0\n"); - ok(info[0] == 1, "info[0] = %x for the system font\n", info[0]); + ok((info[0] & 0xf) == 1, "info[0] = %x for the system font\n", info[0]); ok(info[3] == 0xcccccccc, "structure longer than 3 dwords\n"); if (!is_truetype_font_installed("Arial")) @@ -2345,7 +2702,7 @@ static void test_GdiRealizationInfo(void) memset(info, 0xcc, sizeof(info)); r = pGdiRealizationInfo(hdc, info); ok(r != 0, "ret 0\n"); - ok(info[0] == 3, "info[0] = %x for arial\n", info[0]); + ok((info[0] & 0xf) == 3, "info[0] = %x for arial\n", info[0]); ok(info[3] == 0xcccccccc, "structure longer than 3 dwords\n"); DeleteObject(SelectObject(hdc, hfont_old)); @@ -2404,7 +2761,9 @@ static void test_GetTextFace(void) ok(bufA[0] == faceA[0] && bufA[1] == '\0', "GetTextFaceA didn't copy\n"); n = GetTextFaceA(dc, 0, NULL); - ok(n == sizeof faceA, "GetTextFaceA returned %d\n", n); + ok(n == sizeof faceA || + broken(n == 0), /* win98, winMe */ + "GetTextFaceA returned %d\n", n); DeleteObject(SelectObject(dc, g)); ReleaseDC(NULL, dc); @@ -2478,6 +2837,80 @@ static void test_orientation(void) DeleteDC(hdc); } +static void test_GetGlyphOutline(void) +{ + MAT2 mat = { {0,1}, {0,0}, {0,0}, {0,1} }; + HDC hdc; + GLYPHMETRICS gm; + LOGFONTA lf; + HFONT hfont, old_hfont; + INT ret; + + if (!is_truetype_font_installed("Tahoma")) + { + skip("Tahoma is not installed\n"); + return; + } + + hdc = CreateCompatibleDC(0); + memset(&lf, 0, sizeof(lf)); + lf.lfHeight = 72; + lstrcpyA(lf.lfFaceName, "Tahoma"); + SetLastError(0xdeadbeef); + hfont = CreateFontIndirectA(&lf); + ok(hfont != 0, "CreateFontIndirectA error %u\n", GetLastError()); + old_hfont = SelectObject(hdc, hfont); + + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineA(hdc, 'A', GGO_METRICS, &gm, 0, NULL, &mat); + ok(ret != GDI_ERROR, "GetGlyphOutlineA error %u\n", GetLastError()); + + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineA(hdc, 'A', GGO_METRICS, &gm, 0, NULL, NULL); + ok(ret == GDI_ERROR, "GetGlyphOutlineA should fail\n"); + ok(GetLastError() == 0xdeadbeef || + GetLastError() == ERROR_INVALID_PARAMETER, /* win98, winMe */ + "expected 0xdeadbeef, got %u\n", GetLastError()); + + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineW(hdc, 'A', GGO_METRICS, &gm, 0, NULL, &mat); + if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + ok(ret != GDI_ERROR, "GetGlyphOutlineW error %u\n", GetLastError()); + + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineW(hdc, 'A', GGO_METRICS, &gm, 0, NULL, NULL); + if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + { + ok(ret == GDI_ERROR, "GetGlyphOutlineW should fail\n"); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", GetLastError()); + } + + /* test for needed buffer size request on space char */ + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineW(hdc, ' ', GGO_NATIVE, &gm, 0, NULL, &mat); + if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + ok(ret == 0, "GetGlyphOutlineW should return 0 buffer size for space char\n"); + + /* requesting buffer size for space char + error */ + memset(&gm, 0, sizeof(gm)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineW(0, ' ', GGO_NATIVE, &gm, 0, NULL, NULL); + if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + { + ok(ret == GDI_ERROR, "GetGlyphOutlineW should return GDI_ERROR\n"); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", GetLastError()); + } + + SelectObject(hdc, old_hfont); + DeleteObject(hfont); + DeleteDC(hdc); +} + START_TEST(font) { init(); @@ -2515,4 +2948,5 @@ START_TEST(font) test_GetTextMetrics(); test_GdiRealizationInfo(); test_GetTextFace(); + test_GetGlyphOutline(); } diff --git a/rostests/winetests/gdi32/gdiobj.c b/rostests/winetests/gdi32/gdiobj.c index 6f051b0fffa..67a135e3cb9 100755 --- a/rostests/winetests/gdi32/gdiobj.c +++ b/rostests/winetests/gdi32/gdiobj.c @@ -110,7 +110,7 @@ struct hgdiobj_event static DWORD WINAPI thread_proc(void *param) { LOGPEN lp; - struct hgdiobj_event *hgdiobj_event = (struct hgdiobj_event *)param; + struct hgdiobj_event *hgdiobj_event = param; hgdiobj_event->hdc = CreateDC("display", NULL, NULL, NULL); ok(hgdiobj_event->hdc != NULL, "CreateDC error %u\n", GetLastError()); diff --git a/rostests/winetests/gdi32/generated.c b/rostests/winetests/gdi32/generated.c index 9a35f24070b..2bd6376e9e5 100644 --- a/rostests/winetests/gdi32/generated.c +++ b/rostests/winetests/gdi32/generated.c @@ -1,4 +1,4 @@ -/* File generated automatically from tools/winapi/test.dat; do not edit! */ +/* File generated automatically from tools/winapi/tests.dat; do not edit! */ /* This file can be copied, modified and distributed without restriction. */ /* @@ -27,22 +27,14 @@ * Windows API extension */ -#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) -# define FIELD_ALIGNMENT(type, field) __alignof(((type*)0)->field) -#elif defined(__GNUC__) -# define FIELD_ALIGNMENT(type, field) __alignof__(((type*)0)->field) -#else -/* FIXME: Not sure if is possible to do without compiler extension */ -#endif - #if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) # define _TYPE_ALIGNMENT(type) __alignof(type) #elif defined(__GNUC__) # define _TYPE_ALIGNMENT(type) __alignof__(type) #else /* - * FIXME: Not sure if is possible to do without compiler extension - * (if type is not just a name that is, if so the normal) + * FIXME: May not be possible without a compiler extension + * (if type is not just a name that is, otherwise the normal * TYPE_ALIGNMENT can be used) */ #endif @@ -59,3877 +51,6568 @@ * Test helper macros */ -#ifdef FIELD_ALIGNMENT -# define TEST_FIELD_ALIGNMENT(type, field, align) \ - ok(FIELD_ALIGNMENT(type, field) == align, \ - "FIELD_ALIGNMENT(" #type ", " #field ") == %d (expected " #align ")\n", \ - (int)FIELD_ALIGNMENT(type, field)) +#ifdef _WIN64 + +# define TEST_TYPE_SIZE(type, size) +# define TEST_TYPE_ALIGN(type, align) +# define TEST_TARGET_ALIGN(type, align) +# define TEST_FIELD_ALIGN(type, field, align) +# define TEST_FIELD_OFFSET(type, field, offset) + #else -# define TEST_FIELD_ALIGNMENT(type, field, align) do { } while (0) + +# 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) \ - ok(FIELD_OFFSET(type, field) == offset, \ - "FIELD_OFFSET(" #type ", " #field ") == %ld (expected " #offset ")\n", \ - (long int)FIELD_OFFSET(type, field)) +#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 _TYPE_ALIGNMENT -#define TEST__TYPE_ALIGNMENT(type, align) \ - ok(_TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)_TYPE_ALIGNMENT(type)) -#else -# define TEST__TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#ifdef TYPE_ALIGNMENT -#define TEST_TYPE_ALIGNMENT(type, align) \ - ok(TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)TYPE_ALIGNMENT(type)) -#else -# define TEST_TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#define TEST_TYPE_SIZE(type, size) \ - ok(sizeof(type) == size, "sizeof(" #type ") == %d (expected " #size ")\n", ((int) sizeof(type))) - -/*********************************************************************** - * Test macros - */ - -#define TEST_FIELD(type, field_type, field_name, field_offset, field_size, field_align) \ - TEST_TYPE_SIZE(field_type, field_size); \ - TEST_FIELD_ALIGNMENT(type, field_name, field_align); \ - TEST_FIELD_OFFSET(type, field_name, field_offset); \ - -#define TEST_TYPE(type, size, align) \ - TEST_TYPE_ALIGNMENT(type, align); \ - TEST_TYPE_SIZE(type, size) - -#define TEST_TYPE_POINTER(type, size, align) \ - TEST__TYPE_ALIGNMENT(*(type)0, align); \ - TEST_TYPE_SIZE(*(type)0, size) - -#define TEST_TYPE_SIGNED(type) \ - ok((type) -1 < 0, "(" #type ") -1 < 0\n"); - -#define TEST_TYPE_UNSIGNED(type) \ - ok((type) -1 > 0, "(" #type ") -1 > 0\n"); static void test_pack_ABC(void) { /* ABC (pack 4) */ - TEST_TYPE(ABC, 12, 4); - TEST_FIELD(ABC, INT, abcA, 0, 4, 4); - TEST_FIELD(ABC, UINT, abcB, 4, 4, 4); - TEST_FIELD(ABC, INT, abcC, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(ABCFLOAT, 12, 4); - TEST_FIELD(ABCFLOAT, FLOAT, abcfA, 0, 4, 4); - TEST_FIELD(ABCFLOAT, FLOAT, abcfB, 4, 4, 4); - TEST_FIELD(ABCFLOAT, FLOAT, abcfC, 8, 4, 4); + 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(ABORTPROC, 4, 4); + TEST_TYPE_SIZE (ABORTPROC, 4) + TEST_TYPE_ALIGN (ABORTPROC, 4) } static void test_pack_BITMAP(void) { /* BITMAP (pack 4) */ - TEST_TYPE(BITMAP, 24, 4); - TEST_FIELD(BITMAP, INT, bmType, 0, 4, 4); - TEST_FIELD(BITMAP, INT, bmWidth, 4, 4, 4); - TEST_FIELD(BITMAP, INT, bmHeight, 8, 4, 4); - TEST_FIELD(BITMAP, INT, bmWidthBytes, 12, 4, 4); - TEST_FIELD(BITMAP, WORD, bmPlanes, 16, 2, 2); - TEST_FIELD(BITMAP, WORD, bmBitsPixel, 18, 2, 2); - TEST_FIELD(BITMAP, LPVOID, bmBits, 20, 4, 4); + 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 (pack 4) */ - TEST_TYPE(BITMAPCOREHEADER, 12, 4); - TEST_FIELD(BITMAPCOREHEADER, DWORD, bcSize, 0, 4, 4); - TEST_FIELD(BITMAPCOREHEADER, WORD, bcWidth, 4, 2, 2); - TEST_FIELD(BITMAPCOREHEADER, WORD, bcHeight, 6, 2, 2); - TEST_FIELD(BITMAPCOREHEADER, WORD, bcPlanes, 8, 2, 2); - TEST_FIELD(BITMAPCOREHEADER, WORD, bcBitCount, 10, 2, 2); + 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 (pack 4) */ - TEST_TYPE(BITMAPCOREINFO, 16, 4); - TEST_FIELD(BITMAPCOREINFO, BITMAPCOREHEADER, bmciHeader, 0, 12, 4); - TEST_FIELD(BITMAPCOREINFO, RGBTRIPLE[1], bmciColors, 12, 3, 1); + 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(BITMAPFILEHEADER, 14, 2); - TEST_FIELD(BITMAPFILEHEADER, WORD, bfType, 0, 2, 2); - TEST_FIELD(BITMAPFILEHEADER, DWORD, bfSize, 2, 4, 2); - TEST_FIELD(BITMAPFILEHEADER, WORD, bfReserved1, 6, 2, 2); - TEST_FIELD(BITMAPFILEHEADER, WORD, bfReserved2, 8, 2, 2); - TEST_FIELD(BITMAPFILEHEADER, DWORD, bfOffBits, 10, 4, 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 (pack 4) */ - TEST_TYPE(BITMAPINFO, 44, 4); - TEST_FIELD(BITMAPINFO, BITMAPINFOHEADER, bmiHeader, 0, 40, 4); - TEST_FIELD(BITMAPINFO, RGBQUAD[1], bmiColors, 40, 4, 1); + 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 (pack 4) */ - TEST_TYPE(BITMAPINFOHEADER, 40, 4); - TEST_FIELD(BITMAPINFOHEADER, DWORD, biSize, 0, 4, 4); - TEST_FIELD(BITMAPINFOHEADER, LONG, biWidth, 4, 4, 4); - TEST_FIELD(BITMAPINFOHEADER, LONG, biHeight, 8, 4, 4); - TEST_FIELD(BITMAPINFOHEADER, WORD, biPlanes, 12, 2, 2); - TEST_FIELD(BITMAPINFOHEADER, WORD, biBitCount, 14, 2, 2); - TEST_FIELD(BITMAPINFOHEADER, DWORD, biCompression, 16, 4, 4); - TEST_FIELD(BITMAPINFOHEADER, DWORD, biSizeImage, 20, 4, 4); - TEST_FIELD(BITMAPINFOHEADER, LONG, biXPelsPerMeter, 24, 4, 4); - TEST_FIELD(BITMAPINFOHEADER, LONG, biYPelsPerMeter, 28, 4, 4); - TEST_FIELD(BITMAPINFOHEADER, DWORD, biClrUsed, 32, 4, 4); - TEST_FIELD(BITMAPINFOHEADER, DWORD, biClrImportant, 36, 4, 4); + 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 (pack 4) */ - TEST_TYPE(BITMAPV4HEADER, 108, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4Size, 0, 4, 4); - TEST_FIELD(BITMAPV4HEADER, LONG, bV4Width, 4, 4, 4); - TEST_FIELD(BITMAPV4HEADER, LONG, bV4Height, 8, 4, 4); - TEST_FIELD(BITMAPV4HEADER, WORD, bV4Planes, 12, 2, 2); - TEST_FIELD(BITMAPV4HEADER, WORD, bV4BitCount, 14, 2, 2); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4V4Compression, 16, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4SizeImage, 20, 4, 4); - TEST_FIELD(BITMAPV4HEADER, LONG, bV4XPelsPerMeter, 24, 4, 4); - TEST_FIELD(BITMAPV4HEADER, LONG, bV4YPelsPerMeter, 28, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4ClrUsed, 32, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4ClrImportant, 36, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4RedMask, 40, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4GreenMask, 44, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4BlueMask, 48, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4AlphaMask, 52, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4CSType, 56, 4, 4); - TEST_FIELD(BITMAPV4HEADER, CIEXYZTRIPLE, bV4Endpoints, 60, 36, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4GammaRed, 96, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4GammaGreen, 100, 4, 4); - TEST_FIELD(BITMAPV4HEADER, DWORD, bV4GammaBlue, 104, 4, 4); + 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 (pack 4) */ - TEST_TYPE(BITMAPV5HEADER, 124, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5Size, 0, 4, 4); - TEST_FIELD(BITMAPV5HEADER, LONG, bV5Width, 4, 4, 4); - TEST_FIELD(BITMAPV5HEADER, LONG, bV5Height, 8, 4, 4); - TEST_FIELD(BITMAPV5HEADER, WORD, bV5Planes, 12, 2, 2); - TEST_FIELD(BITMAPV5HEADER, WORD, bV5BitCount, 14, 2, 2); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5Compression, 16, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5SizeImage, 20, 4, 4); - TEST_FIELD(BITMAPV5HEADER, LONG, bV5XPelsPerMeter, 24, 4, 4); - TEST_FIELD(BITMAPV5HEADER, LONG, bV5YPelsPerMeter, 28, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5ClrUsed, 32, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5ClrImportant, 36, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5RedMask, 40, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5GreenMask, 44, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5BlueMask, 48, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5AlphaMask, 52, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5CSType, 56, 4, 4); - TEST_FIELD(BITMAPV5HEADER, CIEXYZTRIPLE, bV5Endpoints, 60, 36, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5GammaRed, 96, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5GammaGreen, 100, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5GammaBlue, 104, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5Intent, 108, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5ProfileData, 112, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5ProfileSize, 116, 4, 4); - TEST_FIELD(BITMAPV5HEADER, DWORD, bV5Reserved, 120, 4, 4); + 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 (pack 4) */ - TEST_TYPE(BLENDFUNCTION, 4, 1); - TEST_FIELD(BLENDFUNCTION, BYTE, BlendOp, 0, 1, 1); - TEST_FIELD(BLENDFUNCTION, BYTE, BlendFlags, 1, 1, 1); - TEST_FIELD(BLENDFUNCTION, BYTE, SourceConstantAlpha, 2, 1, 1); - TEST_FIELD(BLENDFUNCTION, BYTE, AlphaFormat, 3, 1, 1); + 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 (pack 4) */ - TEST_TYPE(CHARSETINFO, 32, 4); - TEST_FIELD(CHARSETINFO, UINT, ciCharset, 0, 4, 4); - TEST_FIELD(CHARSETINFO, UINT, ciACP, 4, 4, 4); - TEST_FIELD(CHARSETINFO, FONTSIGNATURE, fs, 8, 24, 4); + 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 (pack 4) */ - TEST_TYPE(CIEXYZ, 12, 4); - TEST_FIELD(CIEXYZ, FXPT2DOT30, ciexyzX, 0, 4, 4); - TEST_FIELD(CIEXYZ, FXPT2DOT30, ciexyzY, 4, 4, 4); - TEST_FIELD(CIEXYZ, FXPT2DOT30, ciexyzZ, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(CIEXYZTRIPLE, 36, 4); - TEST_FIELD(CIEXYZTRIPLE, CIEXYZ, ciexyzRed, 0, 12, 4); - TEST_FIELD(CIEXYZTRIPLE, CIEXYZ, ciexyzGreen, 12, 12, 4); - TEST_FIELD(CIEXYZTRIPLE, CIEXYZ, ciexyzBlue, 24, 12, 4); + 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(COLOR16, 2, 2); + TEST_TYPE_SIZE (COLOR16, 2) + TEST_TYPE_ALIGN (COLOR16, 2) } static void test_pack_COLORADJUSTMENT(void) { /* COLORADJUSTMENT (pack 4) */ - TEST_TYPE(COLORADJUSTMENT, 24, 2); - TEST_FIELD(COLORADJUSTMENT, WORD, caSize, 0, 2, 2); - TEST_FIELD(COLORADJUSTMENT, WORD, caFlags, 2, 2, 2); - TEST_FIELD(COLORADJUSTMENT, WORD, caIlluminantIndex, 4, 2, 2); - TEST_FIELD(COLORADJUSTMENT, WORD, caRedGamma, 6, 2, 2); - TEST_FIELD(COLORADJUSTMENT, WORD, caGreenGamma, 8, 2, 2); - TEST_FIELD(COLORADJUSTMENT, WORD, caBlueGamma, 10, 2, 2); - TEST_FIELD(COLORADJUSTMENT, WORD, caReferenceBlack, 12, 2, 2); - TEST_FIELD(COLORADJUSTMENT, WORD, caReferenceWhite, 14, 2, 2); - TEST_FIELD(COLORADJUSTMENT, SHORT, caContrast, 16, 2, 2); - TEST_FIELD(COLORADJUSTMENT, SHORT, caBrightness, 18, 2, 2); - TEST_FIELD(COLORADJUSTMENT, SHORT, caColorfulness, 20, 2, 2); - TEST_FIELD(COLORADJUSTMENT, SHORT, caRedGreenTint, 22, 2, 2); + 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 (pack 4) */ - TEST_FIELD(DEVMODEA, BYTE[CCHDEVICENAME], dmDeviceName, 0, 32, 1); - TEST_FIELD(DEVMODEA, WORD, dmSpecVersion, 32, 2, 2); - TEST_FIELD(DEVMODEA, WORD, dmDriverVersion, 34, 2, 2); - TEST_FIELD(DEVMODEA, WORD, dmSize, 36, 2, 2); - TEST_FIELD(DEVMODEA, WORD, dmDriverExtra, 38, 2, 2); - TEST_FIELD(DEVMODEA, DWORD, dmFields, 40, 4, 4); + 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 (pack 4) */ - TEST_FIELD(DEVMODEW, WCHAR[CCHDEVICENAME], dmDeviceName, 0, 64, 2); - TEST_FIELD(DEVMODEW, WORD, dmSpecVersion, 64, 2, 2); - TEST_FIELD(DEVMODEW, WORD, dmDriverVersion, 66, 2, 2); - TEST_FIELD(DEVMODEW, WORD, dmSize, 68, 2, 2); - TEST_FIELD(DEVMODEW, WORD, dmDriverExtra, 70, 2, 2); - TEST_FIELD(DEVMODEW, DWORD, dmFields, 72, 4, 4); + 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 (pack 4) */ - TEST_TYPE(DIBSECTION, 84, 4); - TEST_FIELD(DIBSECTION, BITMAP, dsBm, 0, 24, 4); - TEST_FIELD(DIBSECTION, BITMAPINFOHEADER, dsBmih, 24, 40, 4); - TEST_FIELD(DIBSECTION, DWORD[3], dsBitfields, 64, 12, 4); - TEST_FIELD(DIBSECTION, HANDLE, dshSection, 76, 4, 4); - TEST_FIELD(DIBSECTION, DWORD, dsOffset, 80, 4, 4); + 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 (pack 4) */ - TEST_TYPE(DISPLAY_DEVICEA, 424, 4); - TEST_FIELD(DISPLAY_DEVICEA, DWORD, cb, 0, 4, 4); - TEST_FIELD(DISPLAY_DEVICEA, CHAR[32], DeviceName, 4, 32, 1); - TEST_FIELD(DISPLAY_DEVICEA, CHAR[128], DeviceString, 36, 128, 1); - TEST_FIELD(DISPLAY_DEVICEA, DWORD, StateFlags, 164, 4, 4); - TEST_FIELD(DISPLAY_DEVICEA, CHAR[128], DeviceID, 168, 128, 1); - TEST_FIELD(DISPLAY_DEVICEA, CHAR[128], DeviceKey, 296, 128, 1); + 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 (pack 4) */ - TEST_TYPE(DISPLAY_DEVICEW, 840, 4); - TEST_FIELD(DISPLAY_DEVICEW, DWORD, cb, 0, 4, 4); - TEST_FIELD(DISPLAY_DEVICEW, WCHAR[32], DeviceName, 4, 64, 2); - TEST_FIELD(DISPLAY_DEVICEW, WCHAR[128], DeviceString, 68, 256, 2); - TEST_FIELD(DISPLAY_DEVICEW, DWORD, StateFlags, 324, 4, 4); - TEST_FIELD(DISPLAY_DEVICEW, WCHAR[128], DeviceID, 328, 256, 2); - TEST_FIELD(DISPLAY_DEVICEW, WCHAR[128], DeviceKey, 584, 256, 2); + 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 (pack 4) */ - TEST_TYPE(DOCINFOA, 20, 4); - TEST_FIELD(DOCINFOA, INT, cbSize, 0, 4, 4); - TEST_FIELD(DOCINFOA, LPCSTR, lpszDocName, 4, 4, 4); - TEST_FIELD(DOCINFOA, LPCSTR, lpszOutput, 8, 4, 4); - TEST_FIELD(DOCINFOA, LPCSTR, lpszDatatype, 12, 4, 4); - TEST_FIELD(DOCINFOA, DWORD, fwType, 16, 4, 4); + 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 (pack 4) */ - TEST_TYPE(DOCINFOW, 20, 4); - TEST_FIELD(DOCINFOW, INT, cbSize, 0, 4, 4); - TEST_FIELD(DOCINFOW, LPCWSTR, lpszDocName, 4, 4, 4); - TEST_FIELD(DOCINFOW, LPCWSTR, lpszOutput, 8, 4, 4); - TEST_FIELD(DOCINFOW, LPCWSTR, lpszDatatype, 12, 4, 4); - TEST_FIELD(DOCINFOW, DWORD, fwType, 16, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMR, 8, 4); - TEST_FIELD(EMR, DWORD, iType, 0, 4, 4); - TEST_FIELD(EMR, DWORD, nSize, 4, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRABORTPATH, 8, 4); - TEST_FIELD(EMRABORTPATH, EMR, emr, 0, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRANGLEARC, 28, 4); - TEST_FIELD(EMRANGLEARC, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRANGLEARC, POINTL, ptlCenter, 8, 8, 4); - TEST_FIELD(EMRANGLEARC, DWORD, nRadius, 16, 4, 4); - TEST_FIELD(EMRANGLEARC, FLOAT, eStartAngle, 20, 4, 4); - TEST_FIELD(EMRANGLEARC, FLOAT, eSweepAngle, 24, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRARC, 40, 4); - TEST_FIELD(EMRARC, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRARC, RECTL, rclBox, 8, 16, 4); - TEST_FIELD(EMRARC, POINTL, ptlStart, 24, 8, 4); - TEST_FIELD(EMRARC, POINTL, ptlEnd, 32, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRARCTO, 40, 4); - TEST_FIELD(EMRARCTO, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRARCTO, RECTL, rclBox, 8, 16, 4); - TEST_FIELD(EMRARCTO, POINTL, ptlStart, 24, 8, 4); - TEST_FIELD(EMRARCTO, POINTL, ptlEnd, 32, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRBEGINPATH, 8, 4); - TEST_FIELD(EMRBEGINPATH, EMR, emr, 0, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRBITBLT, 100, 4); - TEST_FIELD(EMRBITBLT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRBITBLT, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRBITBLT, LONG, xDest, 24, 4, 4); - TEST_FIELD(EMRBITBLT, LONG, yDest, 28, 4, 4); - TEST_FIELD(EMRBITBLT, LONG, cxDest, 32, 4, 4); - TEST_FIELD(EMRBITBLT, LONG, cyDest, 36, 4, 4); - TEST_FIELD(EMRBITBLT, DWORD, dwRop, 40, 4, 4); - TEST_FIELD(EMRBITBLT, LONG, xSrc, 44, 4, 4); - TEST_FIELD(EMRBITBLT, LONG, ySrc, 48, 4, 4); - TEST_FIELD(EMRBITBLT, XFORM, xformSrc, 52, 24, 4); - TEST_FIELD(EMRBITBLT, COLORREF, crBkColorSrc, 76, 4, 4); - TEST_FIELD(EMRBITBLT, DWORD, iUsageSrc, 80, 4, 4); - TEST_FIELD(EMRBITBLT, DWORD, offBmiSrc, 84, 4, 4); - TEST_FIELD(EMRBITBLT, DWORD, cbBmiSrc, 88, 4, 4); - TEST_FIELD(EMRBITBLT, DWORD, offBitsSrc, 92, 4, 4); - TEST_FIELD(EMRBITBLT, DWORD, cbBitsSrc, 96, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRCHORD, 40, 4); - TEST_FIELD(EMRCHORD, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRCHORD, RECTL, rclBox, 8, 16, 4); - TEST_FIELD(EMRCHORD, POINTL, ptlStart, 24, 8, 4); - TEST_FIELD(EMRCHORD, POINTL, ptlEnd, 32, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRCLOSEFIGURE, 8, 4); - TEST_FIELD(EMRCLOSEFIGURE, EMR, emr, 0, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRCREATEBRUSHINDIRECT, 24, 4); - TEST_FIELD(EMRCREATEBRUSHINDIRECT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRCREATEBRUSHINDIRECT, DWORD, ihBrush, 8, 4, 4); - TEST_FIELD(EMRCREATEBRUSHINDIRECT, LOGBRUSH32, lb, 12, 12, 4); + 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 (pack 4) */ - TEST_TYPE(EMRCREATECOLORSPACE, 340, 4); - TEST_FIELD(EMRCREATECOLORSPACE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRCREATECOLORSPACE, DWORD, ihCS, 8, 4, 4); - TEST_FIELD(EMRCREATECOLORSPACE, LOGCOLORSPACEA, lcs, 12, 328, 4); + 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 (pack 4) */ - TEST_TYPE(EMRCREATECOLORSPACEW, 612, 4); - TEST_FIELD(EMRCREATECOLORSPACEW, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRCREATECOLORSPACEW, DWORD, ihCS, 8, 4, 4); - TEST_FIELD(EMRCREATECOLORSPACEW, LOGCOLORSPACEW, lcs, 12, 588, 4); - TEST_FIELD(EMRCREATECOLORSPACEW, DWORD, dwFlags, 600, 4, 4); - TEST_FIELD(EMRCREATECOLORSPACEW, DWORD, cbData, 604, 4, 4); - TEST_FIELD(EMRCREATECOLORSPACEW, BYTE[1], Data, 608, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRCREATEDIBPATTERNBRUSHPT, 32, 4); - TEST_FIELD(EMRCREATEDIBPATTERNBRUSHPT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRCREATEDIBPATTERNBRUSHPT, DWORD, ihBrush, 8, 4, 4); - TEST_FIELD(EMRCREATEDIBPATTERNBRUSHPT, DWORD, iUsage, 12, 4, 4); - TEST_FIELD(EMRCREATEDIBPATTERNBRUSHPT, DWORD, offBmi, 16, 4, 4); - TEST_FIELD(EMRCREATEDIBPATTERNBRUSHPT, DWORD, cbBmi, 20, 4, 4); - TEST_FIELD(EMRCREATEDIBPATTERNBRUSHPT, DWORD, offBits, 24, 4, 4); - TEST_FIELD(EMRCREATEDIBPATTERNBRUSHPT, DWORD, cbBits, 28, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRCREATEMONOBRUSH, 32, 4); - TEST_FIELD(EMRCREATEMONOBRUSH, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRCREATEMONOBRUSH, DWORD, ihBrush, 8, 4, 4); - TEST_FIELD(EMRCREATEMONOBRUSH, DWORD, iUsage, 12, 4, 4); - TEST_FIELD(EMRCREATEMONOBRUSH, DWORD, offBmi, 16, 4, 4); - TEST_FIELD(EMRCREATEMONOBRUSH, DWORD, cbBmi, 20, 4, 4); - TEST_FIELD(EMRCREATEMONOBRUSH, DWORD, offBits, 24, 4, 4); - TEST_FIELD(EMRCREATEMONOBRUSH, DWORD, cbBits, 28, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRCREATEPEN, 28, 4); - TEST_FIELD(EMRCREATEPEN, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRCREATEPEN, DWORD, ihPen, 8, 4, 4); - TEST_FIELD(EMRCREATEPEN, LOGPEN, lopn, 12, 16, 4); + 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 (pack 4) */ - TEST_TYPE(EMRDELETECOLORSPACE, 12, 4); - TEST_FIELD(EMRDELETECOLORSPACE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRDELETECOLORSPACE, DWORD, ihCS, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRDELETEOBJECT, 12, 4); - TEST_FIELD(EMRDELETEOBJECT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRDELETEOBJECT, DWORD, ihObject, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRELLIPSE, 24, 4); - TEST_FIELD(EMRELLIPSE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRELLIPSE, RECTL, rclBox, 8, 16, 4); + 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 (pack 4) */ - TEST_TYPE(EMRENDPATH, 8, 4); - TEST_FIELD(EMRENDPATH, EMR, emr, 0, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMREOF, 20, 4); - TEST_FIELD(EMREOF, EMR, emr, 0, 8, 4); - TEST_FIELD(EMREOF, DWORD, nPalEntries, 8, 4, 4); - TEST_FIELD(EMREOF, DWORD, offPalEntries, 12, 4, 4); - TEST_FIELD(EMREOF, DWORD, nSizeLast, 16, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMREXCLUDECLIPRECT, 24, 4); - TEST_FIELD(EMREXCLUDECLIPRECT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMREXCLUDECLIPRECT, RECTL, rclClip, 8, 16, 4); + 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 (pack 4) */ - TEST_TYPE(EMREXTCREATEFONTINDIRECTW, 332, 4); - TEST_FIELD(EMREXTCREATEFONTINDIRECTW, EMR, emr, 0, 8, 4); - TEST_FIELD(EMREXTCREATEFONTINDIRECTW, DWORD, ihFont, 8, 4, 4); - TEST_FIELD(EMREXTCREATEFONTINDIRECTW, EXTLOGFONTW, elfw, 12, 320, 4); + 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 (pack 4) */ - TEST_TYPE(EMREXTCREATEPEN, 56, 4); - TEST_FIELD(EMREXTCREATEPEN, EMR, emr, 0, 8, 4); - TEST_FIELD(EMREXTCREATEPEN, DWORD, ihPen, 8, 4, 4); - TEST_FIELD(EMREXTCREATEPEN, DWORD, offBmi, 12, 4, 4); - TEST_FIELD(EMREXTCREATEPEN, DWORD, cbBmi, 16, 4, 4); - TEST_FIELD(EMREXTCREATEPEN, DWORD, offBits, 20, 4, 4); - TEST_FIELD(EMREXTCREATEPEN, DWORD, cbBits, 24, 4, 4); - TEST_FIELD(EMREXTCREATEPEN, EXTLOGPEN, elp, 28, 28, 4); + 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 (pack 4) */ - TEST_TYPE(EMREXTFLOODFILL, 24, 4); - TEST_FIELD(EMREXTFLOODFILL, EMR, emr, 0, 8, 4); - TEST_FIELD(EMREXTFLOODFILL, POINTL, ptlStart, 8, 8, 4); - TEST_FIELD(EMREXTFLOODFILL, COLORREF, crColor, 16, 4, 4); - TEST_FIELD(EMREXTFLOODFILL, DWORD, iMode, 20, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMREXTSELECTCLIPRGN, 20, 4); - TEST_FIELD(EMREXTSELECTCLIPRGN, EMR, emr, 0, 8, 4); - TEST_FIELD(EMREXTSELECTCLIPRGN, DWORD, cbRgnData, 8, 4, 4); - TEST_FIELD(EMREXTSELECTCLIPRGN, DWORD, iMode, 12, 4, 4); - TEST_FIELD(EMREXTSELECTCLIPRGN, BYTE[1], RgnData, 16, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMREXTTEXTOUTA, 76, 4); - TEST_FIELD(EMREXTTEXTOUTA, EMR, emr, 0, 8, 4); - TEST_FIELD(EMREXTTEXTOUTA, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMREXTTEXTOUTA, DWORD, iGraphicsMode, 24, 4, 4); - TEST_FIELD(EMREXTTEXTOUTA, FLOAT, exScale, 28, 4, 4); - TEST_FIELD(EMREXTTEXTOUTA, FLOAT, eyScale, 32, 4, 4); - TEST_FIELD(EMREXTTEXTOUTA, EMRTEXT, emrtext, 36, 40, 4); + 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 (pack 4) */ - TEST_TYPE(EMREXTTEXTOUTW, 76, 4); - TEST_FIELD(EMREXTTEXTOUTW, EMR, emr, 0, 8, 4); - TEST_FIELD(EMREXTTEXTOUTW, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMREXTTEXTOUTW, DWORD, iGraphicsMode, 24, 4, 4); - TEST_FIELD(EMREXTTEXTOUTW, FLOAT, exScale, 28, 4, 4); - TEST_FIELD(EMREXTTEXTOUTW, FLOAT, eyScale, 32, 4, 4); - TEST_FIELD(EMREXTTEXTOUTW, EMRTEXT, emrtext, 36, 40, 4); + 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 (pack 4) */ - TEST_TYPE(EMRFILLPATH, 24, 4); - TEST_FIELD(EMRFILLPATH, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRFILLPATH, RECTL, rclBounds, 8, 16, 4); + 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 (pack 4) */ - TEST_TYPE(EMRFILLRGN, 36, 4); - TEST_FIELD(EMRFILLRGN, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRFILLRGN, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRFILLRGN, DWORD, cbRgnData, 24, 4, 4); - TEST_FIELD(EMRFILLRGN, DWORD, ihBrush, 28, 4, 4); - TEST_FIELD(EMRFILLRGN, BYTE[1], RgnData, 32, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRFLATTENPATH, 8, 4); - TEST_FIELD(EMRFLATTENPATH, EMR, emr, 0, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRFORMAT, 16, 4); - TEST_FIELD(EMRFORMAT, DWORD, dSignature, 0, 4, 4); - TEST_FIELD(EMRFORMAT, DWORD, nVersion, 4, 4, 4); - TEST_FIELD(EMRFORMAT, DWORD, cbData, 8, 4, 4); - TEST_FIELD(EMRFORMAT, DWORD, offData, 12, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRFRAMERGN, 44, 4); - TEST_FIELD(EMRFRAMERGN, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRFRAMERGN, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRFRAMERGN, DWORD, cbRgnData, 24, 4, 4); - TEST_FIELD(EMRFRAMERGN, DWORD, ihBrush, 28, 4, 4); - TEST_FIELD(EMRFRAMERGN, SIZEL, szlStroke, 32, 8, 4); - TEST_FIELD(EMRFRAMERGN, BYTE[1], RgnData, 40, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRGDICOMMENT, 16, 4); - TEST_FIELD(EMRGDICOMMENT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRGDICOMMENT, DWORD, cbData, 8, 4, 4); - TEST_FIELD(EMRGDICOMMENT, BYTE[1], Data, 12, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRGLSBOUNDEDRECORD, 32, 4); - TEST_FIELD(EMRGLSBOUNDEDRECORD, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRGLSBOUNDEDRECORD, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRGLSBOUNDEDRECORD, DWORD, cbData, 24, 4, 4); - TEST_FIELD(EMRGLSBOUNDEDRECORD, BYTE[1], Data, 28, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRGLSRECORD, 16, 4); - TEST_FIELD(EMRGLSRECORD, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRGLSRECORD, DWORD, cbData, 8, 4, 4); - TEST_FIELD(EMRGLSRECORD, BYTE[1], Data, 12, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRINTERSECTCLIPRECT, 24, 4); - TEST_FIELD(EMRINTERSECTCLIPRECT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRINTERSECTCLIPRECT, RECTL, rclClip, 8, 16, 4); + 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 (pack 4) */ - TEST_TYPE(EMRINVERTRGN, 32, 4); - TEST_FIELD(EMRINVERTRGN, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRINVERTRGN, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRINVERTRGN, DWORD, cbRgnData, 24, 4, 4); - TEST_FIELD(EMRINVERTRGN, BYTE[1], RgnData, 28, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRLINETO, 16, 4); - TEST_FIELD(EMRLINETO, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRLINETO, POINTL, ptl, 8, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRMASKBLT, 128, 4); - TEST_FIELD(EMRMASKBLT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRMASKBLT, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRMASKBLT, LONG, xDest, 24, 4, 4); - TEST_FIELD(EMRMASKBLT, LONG, yDest, 28, 4, 4); - TEST_FIELD(EMRMASKBLT, LONG, cxDest, 32, 4, 4); - TEST_FIELD(EMRMASKBLT, LONG, cyDest, 36, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, dwRop, 40, 4, 4); - TEST_FIELD(EMRMASKBLT, LONG, xSrc, 44, 4, 4); - TEST_FIELD(EMRMASKBLT, LONG, ySrc, 48, 4, 4); - TEST_FIELD(EMRMASKBLT, XFORM, xformSrc, 52, 24, 4); - TEST_FIELD(EMRMASKBLT, COLORREF, crBkColorSrc, 76, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, iUsageSrc, 80, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, offBmiSrc, 84, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, cbBmiSrc, 88, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, offBitsSrc, 92, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, cbBitsSrc, 96, 4, 4); - TEST_FIELD(EMRMASKBLT, LONG, xMask, 100, 4, 4); - TEST_FIELD(EMRMASKBLT, LONG, yMask, 104, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, iUsageMask, 108, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, offBmiMask, 112, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, cbBmiMask, 116, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, offBitsMask, 120, 4, 4); - TEST_FIELD(EMRMASKBLT, DWORD, cbBitsMask, 124, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRMODIFYWORLDTRANSFORM, 36, 4); - TEST_FIELD(EMRMODIFYWORLDTRANSFORM, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRMODIFYWORLDTRANSFORM, XFORM, xform, 8, 24, 4); - TEST_FIELD(EMRMODIFYWORLDTRANSFORM, DWORD, iMode, 32, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRMOVETOEX, 16, 4); - TEST_FIELD(EMRMOVETOEX, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRMOVETOEX, POINTL, ptl, 8, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMROFFSETCLIPRGN, 16, 4); - TEST_FIELD(EMROFFSETCLIPRGN, EMR, emr, 0, 8, 4); - TEST_FIELD(EMROFFSETCLIPRGN, POINTL, ptlOffset, 8, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPAINTRGN, 32, 4); - TEST_FIELD(EMRPAINTRGN, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPAINTRGN, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPAINTRGN, DWORD, cbRgnData, 24, 4, 4); - TEST_FIELD(EMRPAINTRGN, BYTE[1], RgnData, 28, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRPIE, 40, 4); - TEST_FIELD(EMRPIE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPIE, RECTL, rclBox, 8, 16, 4); - TEST_FIELD(EMRPIE, POINTL, ptlStart, 24, 8, 4); - TEST_FIELD(EMRPIE, POINTL, ptlEnd, 32, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPIXELFORMAT, 48, 4); - TEST_FIELD(EMRPIXELFORMAT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPIXELFORMAT, PIXELFORMATDESCRIPTOR, pfd, 8, 40, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPLGBLT, 140, 4); - TEST_FIELD(EMRPLGBLT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPLGBLT, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPLGBLT, POINTL[3], aptlDest, 24, 24, 4); - TEST_FIELD(EMRPLGBLT, LONG, xSrc, 48, 4, 4); - TEST_FIELD(EMRPLGBLT, LONG, ySrc, 52, 4, 4); - TEST_FIELD(EMRPLGBLT, LONG, cxSrc, 56, 4, 4); - TEST_FIELD(EMRPLGBLT, LONG, cySrc, 60, 4, 4); - TEST_FIELD(EMRPLGBLT, XFORM, xformSrc, 64, 24, 4); - TEST_FIELD(EMRPLGBLT, COLORREF, crBkColorSrc, 88, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, iUsageSrc, 92, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, offBmiSrc, 96, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, cbBmiSrc, 100, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, offBitsSrc, 104, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, cbBitsSrc, 108, 4, 4); - TEST_FIELD(EMRPLGBLT, LONG, xMask, 112, 4, 4); - TEST_FIELD(EMRPLGBLT, LONG, yMask, 116, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, iUsageMask, 120, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, offBmiMask, 124, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, cbBmiMask, 128, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, offBitsMask, 132, 4, 4); - TEST_FIELD(EMRPLGBLT, DWORD, cbBitsMask, 136, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYBEZIER, 36, 4); - TEST_FIELD(EMRPOLYBEZIER, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYBEZIER, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYBEZIER, DWORD, cptl, 24, 4, 4); - TEST_FIELD(EMRPOLYBEZIER, POINTL[1], aptl, 28, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYBEZIER16, 32, 4); - TEST_FIELD(EMRPOLYBEZIER16, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYBEZIER16, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYBEZIER16, DWORD, cpts, 24, 4, 4); - TEST_FIELD(EMRPOLYBEZIER16, POINTS[1], apts, 28, 4, 2); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYBEZIERTO, 36, 4); - TEST_FIELD(EMRPOLYBEZIERTO, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYBEZIERTO, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYBEZIERTO, DWORD, cptl, 24, 4, 4); - TEST_FIELD(EMRPOLYBEZIERTO, POINTL[1], aptl, 28, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYBEZIERTO16, 32, 4); - TEST_FIELD(EMRPOLYBEZIERTO16, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYBEZIERTO16, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYBEZIERTO16, DWORD, cpts, 24, 4, 4); - TEST_FIELD(EMRPOLYBEZIERTO16, POINTS[1], apts, 28, 4, 2); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYDRAW, 40, 4); - TEST_FIELD(EMRPOLYDRAW, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYDRAW, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYDRAW, DWORD, cptl, 24, 4, 4); - TEST_FIELD(EMRPOLYDRAW, POINTL[1], aptl, 28, 8, 4); - TEST_FIELD(EMRPOLYDRAW, BYTE[1], abTypes, 36, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYDRAW16, 36, 4); - TEST_FIELD(EMRPOLYDRAW16, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYDRAW16, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYDRAW16, DWORD, cpts, 24, 4, 4); - TEST_FIELD(EMRPOLYDRAW16, POINTS[1], apts, 28, 4, 2); - TEST_FIELD(EMRPOLYDRAW16, BYTE[1], abTypes, 32, 1, 1); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYGON, 36, 4); - TEST_FIELD(EMRPOLYGON, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYGON, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYGON, DWORD, cptl, 24, 4, 4); - TEST_FIELD(EMRPOLYGON, POINTL[1], aptl, 28, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYGON16, 32, 4); - TEST_FIELD(EMRPOLYGON16, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYGON16, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYGON16, DWORD, cpts, 24, 4, 4); - TEST_FIELD(EMRPOLYGON16, POINTS[1], apts, 28, 4, 2); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYLINE, 36, 4); - TEST_FIELD(EMRPOLYLINE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYLINE, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYLINE, DWORD, cptl, 24, 4, 4); - TEST_FIELD(EMRPOLYLINE, POINTL[1], aptl, 28, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYLINE16, 32, 4); - TEST_FIELD(EMRPOLYLINE16, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYLINE16, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYLINE16, DWORD, cpts, 24, 4, 4); - TEST_FIELD(EMRPOLYLINE16, POINTS[1], apts, 28, 4, 2); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYLINETO, 36, 4); - TEST_FIELD(EMRPOLYLINETO, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYLINETO, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYLINETO, DWORD, cptl, 24, 4, 4); - TEST_FIELD(EMRPOLYLINETO, POINTL[1], aptl, 28, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYLINETO16, 32, 4); - TEST_FIELD(EMRPOLYLINETO16, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYLINETO16, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYLINETO16, DWORD, cpts, 24, 4, 4); - TEST_FIELD(EMRPOLYLINETO16, POINTS[1], apts, 28, 4, 2); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYPOLYGON, 44, 4); - TEST_FIELD(EMRPOLYPOLYGON, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYPOLYGON, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYPOLYGON, DWORD, nPolys, 24, 4, 4); - TEST_FIELD(EMRPOLYPOLYGON, DWORD, cptl, 28, 4, 4); - TEST_FIELD(EMRPOLYPOLYGON, DWORD[1], aPolyCounts, 32, 4, 4); - TEST_FIELD(EMRPOLYPOLYGON, POINTL[1], aptl, 36, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYPOLYGON16, 40, 4); - TEST_FIELD(EMRPOLYPOLYGON16, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYPOLYGON16, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYPOLYGON16, DWORD, nPolys, 24, 4, 4); - TEST_FIELD(EMRPOLYPOLYGON16, DWORD, cpts, 28, 4, 4); - TEST_FIELD(EMRPOLYPOLYGON16, DWORD[1], aPolyCounts, 32, 4, 4); - TEST_FIELD(EMRPOLYPOLYGON16, POINTS[1], apts, 36, 4, 2); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYPOLYLINE, 44, 4); - TEST_FIELD(EMRPOLYPOLYLINE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYPOLYLINE, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYPOLYLINE, DWORD, nPolys, 24, 4, 4); - TEST_FIELD(EMRPOLYPOLYLINE, DWORD, cptl, 28, 4, 4); - TEST_FIELD(EMRPOLYPOLYLINE, DWORD[1], aPolyCounts, 32, 4, 4); - TEST_FIELD(EMRPOLYPOLYLINE, POINTL[1], aptl, 36, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYPOLYLINE16, 40, 4); - TEST_FIELD(EMRPOLYPOLYLINE16, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYPOLYLINE16, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYPOLYLINE16, DWORD, nPolys, 24, 4, 4); - TEST_FIELD(EMRPOLYPOLYLINE16, DWORD, cpts, 28, 4, 4); - TEST_FIELD(EMRPOLYPOLYLINE16, DWORD[1], aPolyCounts, 32, 4, 4); - TEST_FIELD(EMRPOLYPOLYLINE16, POINTS[1], apts, 36, 4, 2); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYTEXTOUTA, 80, 4); - TEST_FIELD(EMRPOLYTEXTOUTA, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYTEXTOUTA, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYTEXTOUTA, DWORD, iGraphicsMode, 24, 4, 4); - TEST_FIELD(EMRPOLYTEXTOUTA, FLOAT, exScale, 28, 4, 4); - TEST_FIELD(EMRPOLYTEXTOUTA, FLOAT, eyScale, 32, 4, 4); - TEST_FIELD(EMRPOLYTEXTOUTA, LONG, cStrings, 36, 4, 4); - TEST_FIELD(EMRPOLYTEXTOUTA, EMRTEXT[1], aemrtext, 40, 40, 4); + 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 (pack 4) */ - TEST_TYPE(EMRPOLYTEXTOUTW, 80, 4); - TEST_FIELD(EMRPOLYTEXTOUTW, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRPOLYTEXTOUTW, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRPOLYTEXTOUTW, DWORD, iGraphicsMode, 24, 4, 4); - TEST_FIELD(EMRPOLYTEXTOUTW, FLOAT, exScale, 28, 4, 4); - TEST_FIELD(EMRPOLYTEXTOUTW, FLOAT, eyScale, 32, 4, 4); - TEST_FIELD(EMRPOLYTEXTOUTW, LONG, cStrings, 36, 4, 4); - TEST_FIELD(EMRPOLYTEXTOUTW, EMRTEXT[1], aemrtext, 40, 40, 4); + 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 (pack 4) */ - TEST_TYPE(EMRREALIZEPALETTE, 8, 4); - TEST_FIELD(EMRREALIZEPALETTE, EMR, emr, 0, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRRECTANGLE, 24, 4); - TEST_FIELD(EMRRECTANGLE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRRECTANGLE, RECTL, rclBox, 8, 16, 4); + 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 (pack 4) */ - TEST_TYPE(EMRRESIZEPALETTE, 16, 4); - TEST_FIELD(EMRRESIZEPALETTE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRRESIZEPALETTE, DWORD, ihPal, 8, 4, 4); - TEST_FIELD(EMRRESIZEPALETTE, DWORD, cEntries, 12, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRRESTOREDC, 12, 4); - TEST_FIELD(EMRRESTOREDC, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRRESTOREDC, LONG, iRelative, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRROUNDRECT, 32, 4); - TEST_FIELD(EMRROUNDRECT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRROUNDRECT, RECTL, rclBox, 8, 16, 4); - TEST_FIELD(EMRROUNDRECT, SIZEL, szlCorner, 24, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSAVEDC, 8, 4); - TEST_FIELD(EMRSAVEDC, EMR, emr, 0, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSCALEVIEWPORTEXTEX, 24, 4); - TEST_FIELD(EMRSCALEVIEWPORTEXTEX, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSCALEVIEWPORTEXTEX, LONG, xNum, 8, 4, 4); - TEST_FIELD(EMRSCALEVIEWPORTEXTEX, LONG, xDenom, 12, 4, 4); - TEST_FIELD(EMRSCALEVIEWPORTEXTEX, LONG, yNum, 16, 4, 4); - TEST_FIELD(EMRSCALEVIEWPORTEXTEX, LONG, yDenom, 20, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSCALEWINDOWEXTEX, 24, 4); - TEST_FIELD(EMRSCALEWINDOWEXTEX, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSCALEWINDOWEXTEX, LONG, xNum, 8, 4, 4); - TEST_FIELD(EMRSCALEWINDOWEXTEX, LONG, xDenom, 12, 4, 4); - TEST_FIELD(EMRSCALEWINDOWEXTEX, LONG, yNum, 16, 4, 4); - TEST_FIELD(EMRSCALEWINDOWEXTEX, LONG, yDenom, 20, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSELECTCLIPPATH, 12, 4); - TEST_FIELD(EMRSELECTCLIPPATH, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSELECTCLIPPATH, DWORD, iMode, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSELECTCOLORSPACE, 12, 4); - TEST_FIELD(EMRSELECTCOLORSPACE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSELECTCOLORSPACE, DWORD, ihCS, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSELECTOBJECT, 12, 4); - TEST_FIELD(EMRSELECTOBJECT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSELECTOBJECT, DWORD, ihObject, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSELECTPALETTE, 12, 4); - TEST_FIELD(EMRSELECTPALETTE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSELECTPALETTE, DWORD, ihPal, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETARCDIRECTION, 12, 4); - TEST_FIELD(EMRSETARCDIRECTION, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETARCDIRECTION, DWORD, iArcDirection, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETBKCOLOR, 12, 4); - TEST_FIELD(EMRSETBKCOLOR, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETBKCOLOR, COLORREF, crColor, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETBKMODE, 12, 4); - TEST_FIELD(EMRSETBKMODE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETBKMODE, DWORD, iMode, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETBRUSHORGEX, 16, 4); - TEST_FIELD(EMRSETBRUSHORGEX, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETBRUSHORGEX, POINTL, ptlOrigin, 8, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETCOLORADJUSTMENT, 32, 4); - TEST_FIELD(EMRSETCOLORADJUSTMENT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETCOLORADJUSTMENT, COLORADJUSTMENT, ColorAdjustment, 8, 24, 2); + 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 (pack 4) */ - TEST_TYPE(EMRSETCOLORSPACE, 12, 4); - TEST_FIELD(EMRSETCOLORSPACE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETCOLORSPACE, DWORD, ihCS, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETDIBITSTODEVICE, 76, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, LONG, xDest, 24, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, LONG, yDest, 28, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, LONG, xSrc, 32, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, LONG, ySrc, 36, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, LONG, cxSrc, 40, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, LONG, cySrc, 44, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, DWORD, offBmiSrc, 48, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, DWORD, cbBmiSrc, 52, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, DWORD, offBitsSrc, 56, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, DWORD, cbBitsSrc, 60, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, DWORD, iUsageSrc, 64, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, DWORD, iStartScan, 68, 4, 4); - TEST_FIELD(EMRSETDIBITSTODEVICE, DWORD, cScans, 72, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETICMMODE, 12, 4); - TEST_FIELD(EMRSETICMMODE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETICMMODE, DWORD, iMode, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETLAYOUT, 12, 4); - TEST_FIELD(EMRSETLAYOUT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETLAYOUT, DWORD, iMode, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETMAPMODE, 12, 4); - TEST_FIELD(EMRSETMAPMODE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETMAPMODE, DWORD, iMode, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETMAPPERFLAGS, 12, 4); - TEST_FIELD(EMRSETMAPPERFLAGS, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETMAPPERFLAGS, DWORD, dwFlags, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETMETARGN, 8, 4); - TEST_FIELD(EMRSETMETARGN, EMR, emr, 0, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETMITERLIMIT, 12, 4); - TEST_FIELD(EMRSETMITERLIMIT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETMITERLIMIT, FLOAT, eMiterLimit, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETPIXELV, 20, 4); - TEST_FIELD(EMRSETPIXELV, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETPIXELV, POINTL, ptlPixel, 8, 8, 4); - TEST_FIELD(EMRSETPIXELV, COLORREF, crColor, 16, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETPOLYFILLMODE, 12, 4); - TEST_FIELD(EMRSETPOLYFILLMODE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETPOLYFILLMODE, DWORD, iMode, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETROP2, 12, 4); - TEST_FIELD(EMRSETROP2, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETROP2, DWORD, iMode, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETSTRETCHBLTMODE, 12, 4); - TEST_FIELD(EMRSETSTRETCHBLTMODE, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETSTRETCHBLTMODE, DWORD, iMode, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETTEXTALIGN, 12, 4); - TEST_FIELD(EMRSETTEXTALIGN, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETTEXTALIGN, DWORD, iMode, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETTEXTCOLOR, 12, 4); - TEST_FIELD(EMRSETTEXTCOLOR, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETTEXTCOLOR, COLORREF, crColor, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETVIEWPORTEXTEX, 16, 4); - TEST_FIELD(EMRSETVIEWPORTEXTEX, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETVIEWPORTEXTEX, SIZEL, szlExtent, 8, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETVIEWPORTORGEX, 16, 4); - TEST_FIELD(EMRSETVIEWPORTORGEX, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETVIEWPORTORGEX, POINTL, ptlOrigin, 8, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETWINDOWEXTEX, 16, 4); - TEST_FIELD(EMRSETWINDOWEXTEX, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETWINDOWEXTEX, SIZEL, szlExtent, 8, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETWINDOWORGEX, 16, 4); - TEST_FIELD(EMRSETWINDOWORGEX, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETWINDOWORGEX, POINTL, ptlOrigin, 8, 8, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSETWORLDTRANSFORM, 32, 4); - TEST_FIELD(EMRSETWORLDTRANSFORM, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSETWORLDTRANSFORM, XFORM, xform, 8, 24, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSTRETCHBLT, 108, 4); - TEST_FIELD(EMRSTRETCHBLT, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSTRETCHBLT, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRSTRETCHBLT, LONG, xDest, 24, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, LONG, yDest, 28, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, LONG, cxDest, 32, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, LONG, cyDest, 36, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, DWORD, dwRop, 40, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, LONG, xSrc, 44, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, LONG, ySrc, 48, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, XFORM, xformSrc, 52, 24, 4); - TEST_FIELD(EMRSTRETCHBLT, COLORREF, crBkColorSrc, 76, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, DWORD, iUsageSrc, 80, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, DWORD, offBmiSrc, 84, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, DWORD, cbBmiSrc, 88, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, DWORD, offBitsSrc, 92, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, DWORD, cbBitsSrc, 96, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, LONG, cxSrc, 100, 4, 4); - TEST_FIELD(EMRSTRETCHBLT, LONG, cySrc, 104, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSTRETCHDIBITS, 80, 4); - TEST_FIELD(EMRSTRETCHDIBITS, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSTRETCHDIBITS, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(EMRSTRETCHDIBITS, LONG, xDest, 24, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, LONG, yDest, 28, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, LONG, xSrc, 32, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, LONG, ySrc, 36, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, LONG, cxSrc, 40, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, LONG, cySrc, 44, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, DWORD, offBmiSrc, 48, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, DWORD, cbBmiSrc, 52, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, DWORD, offBitsSrc, 56, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, DWORD, cbBitsSrc, 60, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, DWORD, iUsageSrc, 64, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, DWORD, dwRop, 68, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, LONG, cxDest, 72, 4, 4); - TEST_FIELD(EMRSTRETCHDIBITS, LONG, cyDest, 76, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSTROKEANDFILLPATH, 24, 4); - TEST_FIELD(EMRSTROKEANDFILLPATH, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSTROKEANDFILLPATH, RECTL, rclBounds, 8, 16, 4); + 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 (pack 4) */ - TEST_TYPE(EMRSTROKEPATH, 24, 4); - TEST_FIELD(EMRSTROKEPATH, EMR, emr, 0, 8, 4); - TEST_FIELD(EMRSTROKEPATH, RECTL, rclBounds, 8, 16, 4); + 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 (pack 4) */ - TEST_TYPE(EMRTEXT, 40, 4); - TEST_FIELD(EMRTEXT, POINTL, ptlReference, 0, 8, 4); - TEST_FIELD(EMRTEXT, DWORD, nChars, 8, 4, 4); - TEST_FIELD(EMRTEXT, DWORD, offString, 12, 4, 4); - TEST_FIELD(EMRTEXT, DWORD, fOptions, 16, 4, 4); - TEST_FIELD(EMRTEXT, RECTL, rcl, 20, 16, 4); - TEST_FIELD(EMRTEXT, DWORD, offDx, 36, 4, 4); + 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 (pack 4) */ - TEST_TYPE(EMRWIDENPATH, 8, 4); - TEST_FIELD(EMRWIDENPATH, EMR, emr, 0, 8, 4); + 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 (pack 4) */ - TEST_TYPE(ENHMETAHEADER, 108, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, iType, 0, 4, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, nSize, 4, 4, 4); - TEST_FIELD(ENHMETAHEADER, RECTL, rclBounds, 8, 16, 4); - TEST_FIELD(ENHMETAHEADER, RECTL, rclFrame, 24, 16, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, dSignature, 40, 4, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, nVersion, 44, 4, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, nBytes, 48, 4, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, nRecords, 52, 4, 4); - TEST_FIELD(ENHMETAHEADER, WORD, nHandles, 56, 2, 2); - TEST_FIELD(ENHMETAHEADER, WORD, sReserved, 58, 2, 2); - TEST_FIELD(ENHMETAHEADER, DWORD, nDescription, 60, 4, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, offDescription, 64, 4, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, nPalEntries, 68, 4, 4); - TEST_FIELD(ENHMETAHEADER, SIZEL, szlDevice, 72, 8, 4); - TEST_FIELD(ENHMETAHEADER, SIZEL, szlMillimeters, 80, 8, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, cbPixelFormat, 88, 4, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, offPixelFormat, 92, 4, 4); - TEST_FIELD(ENHMETAHEADER, DWORD, bOpenGL, 96, 4, 4); - TEST_FIELD(ENHMETAHEADER, SIZEL, szlMicrometers, 100, 8, 4); + 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 (pack 4) */ - TEST_TYPE(ENHMETARECORD, 12, 4); - TEST_FIELD(ENHMETARECORD, DWORD, iType, 0, 4, 4); - TEST_FIELD(ENHMETARECORD, DWORD, nSize, 4, 4, 4); - TEST_FIELD(ENHMETARECORD, DWORD[1], dParm, 8, 4, 4); + 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(ENHMFENUMPROC, 4, 4); + TEST_TYPE_SIZE (ENHMFENUMPROC, 4) + TEST_TYPE_ALIGN (ENHMFENUMPROC, 4) } static void test_pack_ENUMLOGFONTA(void) { /* ENUMLOGFONTA (pack 4) */ - TEST_TYPE(ENUMLOGFONTA, 156, 4); - TEST_FIELD(ENUMLOGFONTA, LOGFONTA, elfLogFont, 0, 60, 4); - TEST_FIELD(ENUMLOGFONTA, BYTE[LF_FULLFACESIZE], elfFullName, 60, 64, 1); - TEST_FIELD(ENUMLOGFONTA, BYTE[LF_FACESIZE], elfStyle, 124, 32, 1); + 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 (pack 4) */ - TEST_TYPE(ENUMLOGFONTEXA, 188, 4); - TEST_FIELD(ENUMLOGFONTEXA, LOGFONTA, elfLogFont, 0, 60, 4); - TEST_FIELD(ENUMLOGFONTEXA, BYTE[LF_FULLFACESIZE], elfFullName, 60, 64, 1); - TEST_FIELD(ENUMLOGFONTEXA, BYTE[LF_FACESIZE], elfStyle, 124, 32, 1); - TEST_FIELD(ENUMLOGFONTEXA, BYTE[LF_FACESIZE], elfScript, 156, 32, 1); + 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 (pack 4) */ - TEST_TYPE(ENUMLOGFONTEXW, 348, 4); - TEST_FIELD(ENUMLOGFONTEXW, LOGFONTW, elfLogFont, 0, 92, 4); - TEST_FIELD(ENUMLOGFONTEXW, WCHAR[LF_FULLFACESIZE], elfFullName, 92, 128, 2); - TEST_FIELD(ENUMLOGFONTEXW, WCHAR[LF_FACESIZE], elfStyle, 220, 64, 2); - TEST_FIELD(ENUMLOGFONTEXW, WCHAR[LF_FACESIZE], elfScript, 284, 64, 2); + 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 (pack 4) */ - TEST_TYPE(ENUMLOGFONTW, 284, 4); - TEST_FIELD(ENUMLOGFONTW, LOGFONTW, elfLogFont, 0, 92, 4); - TEST_FIELD(ENUMLOGFONTW, WCHAR[LF_FULLFACESIZE], elfFullName, 92, 128, 2); - TEST_FIELD(ENUMLOGFONTW, WCHAR[LF_FACESIZE], elfStyle, 220, 64, 2); + 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 (pack 4) */ - TEST_TYPE(EXTLOGFONTA, 192, 4); - TEST_FIELD(EXTLOGFONTA, LOGFONTA, elfLogFont, 0, 60, 4); - TEST_FIELD(EXTLOGFONTA, BYTE[LF_FULLFACESIZE], elfFullName, 60, 64, 1); - TEST_FIELD(EXTLOGFONTA, BYTE[LF_FACESIZE], elfStyle, 124, 32, 1); - TEST_FIELD(EXTLOGFONTA, DWORD, elfVersion, 156, 4, 4); - TEST_FIELD(EXTLOGFONTA, DWORD, elfStyleSize, 160, 4, 4); - TEST_FIELD(EXTLOGFONTA, DWORD, elfMatch, 164, 4, 4); - TEST_FIELD(EXTLOGFONTA, DWORD, elfReserved, 168, 4, 4); - TEST_FIELD(EXTLOGFONTA, BYTE[ELF_VENDOR_SIZE], elfVendorId, 172, 4, 1); - TEST_FIELD(EXTLOGFONTA, DWORD, elfCulture, 176, 4, 4); - TEST_FIELD(EXTLOGFONTA, PANOSE, elfPanose, 180, 10, 1); + 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 (pack 4) */ - TEST_TYPE(EXTLOGFONTW, 320, 4); - TEST_FIELD(EXTLOGFONTW, LOGFONTW, elfLogFont, 0, 92, 4); - TEST_FIELD(EXTLOGFONTW, WCHAR[LF_FULLFACESIZE], elfFullName, 92, 128, 2); - TEST_FIELD(EXTLOGFONTW, WCHAR[LF_FACESIZE], elfStyle, 220, 64, 2); - TEST_FIELD(EXTLOGFONTW, DWORD, elfVersion, 284, 4, 4); - TEST_FIELD(EXTLOGFONTW, DWORD, elfStyleSize, 288, 4, 4); - TEST_FIELD(EXTLOGFONTW, DWORD, elfMatch, 292, 4, 4); - TEST_FIELD(EXTLOGFONTW, DWORD, elfReserved, 296, 4, 4); - TEST_FIELD(EXTLOGFONTW, BYTE[ELF_VENDOR_SIZE], elfVendorId, 300, 4, 1); - TEST_FIELD(EXTLOGFONTW, DWORD, elfCulture, 304, 4, 4); - TEST_FIELD(EXTLOGFONTW, PANOSE, elfPanose, 308, 10, 1); + 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 (pack 4) */ - TEST_TYPE(EXTLOGPEN, 28, 4); - TEST_FIELD(EXTLOGPEN, DWORD, elpPenStyle, 0, 4, 4); - TEST_FIELD(EXTLOGPEN, DWORD, elpWidth, 4, 4, 4); - TEST_FIELD(EXTLOGPEN, UINT, elpBrushStyle, 8, 4, 4); - TEST_FIELD(EXTLOGPEN, COLORREF, elpColor, 12, 4, 4); - TEST_FIELD(EXTLOGPEN, ULONG_PTR, elpHatch, 16, 4, 4); - TEST_FIELD(EXTLOGPEN, DWORD, elpNumEntries, 20, 4, 4); - TEST_FIELD(EXTLOGPEN, DWORD[1], elpStyleEntry, 24, 4, 4); + TEST_TYPE_SIZE (EXTLOGPEN, 28) + TEST_TYPE_ALIGN (EXTLOGPEN, 4) + 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, 4) + TEST_FIELD_ALIGN (EXTLOGPEN, elpHatch, 4) + TEST_FIELD_OFFSET(EXTLOGPEN, elpHatch, 16) + TEST_FIELD_SIZE (EXTLOGPEN, elpNumEntries, 4) + TEST_FIELD_ALIGN (EXTLOGPEN, elpNumEntries, 4) + TEST_FIELD_OFFSET(EXTLOGPEN, elpNumEntries, 20) + TEST_FIELD_SIZE (EXTLOGPEN, elpStyleEntry, 4) + TEST_FIELD_ALIGN (EXTLOGPEN, elpStyleEntry, 4) + TEST_FIELD_OFFSET(EXTLOGPEN, elpStyleEntry, 24) } static void test_pack_FIXED(void) { /* FIXED (pack 4) */ - TEST_TYPE(FIXED, 4, 2); - TEST_FIELD(FIXED, WORD, fract, 0, 2, 2); - TEST_FIELD(FIXED, SHORT, value, 2, 2, 2); + 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(FONTENUMPROCA, 4, 4); + TEST_TYPE_SIZE (FONTENUMPROCA, 4) + TEST_TYPE_ALIGN (FONTENUMPROCA, 4) } static void test_pack_FONTENUMPROCW(void) { /* FONTENUMPROCW */ - TEST_TYPE(FONTENUMPROCW, 4, 4); + TEST_TYPE_SIZE (FONTENUMPROCW, 4) + TEST_TYPE_ALIGN (FONTENUMPROCW, 4) } static void test_pack_FONTSIGNATURE(void) { /* FONTSIGNATURE (pack 4) */ - TEST_TYPE(FONTSIGNATURE, 24, 4); - TEST_FIELD(FONTSIGNATURE, DWORD[4], fsUsb, 0, 16, 4); - TEST_FIELD(FONTSIGNATURE, DWORD[2], fsCsb, 16, 8, 4); + 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(FXPT16DOT16, 4, 4); + TEST_TYPE_SIZE (FXPT16DOT16, 4) + TEST_TYPE_ALIGN (FXPT16DOT16, 4) } static void test_pack_FXPT2DOT30(void) { /* FXPT2DOT30 */ - TEST_TYPE(FXPT2DOT30, 4, 4); + TEST_TYPE_SIZE (FXPT2DOT30, 4) + TEST_TYPE_ALIGN (FXPT2DOT30, 4) } static void test_pack_GCP_RESULTSA(void) { /* GCP_RESULTSA (pack 4) */ - TEST_TYPE(GCP_RESULTSA, 36, 4); - TEST_FIELD(GCP_RESULTSA, DWORD, lStructSize, 0, 4, 4); - TEST_FIELD(GCP_RESULTSA, LPSTR, lpOutString, 4, 4, 4); - TEST_FIELD(GCP_RESULTSA, UINT *, lpOrder, 8, 4, 4); - TEST_FIELD(GCP_RESULTSA, INT *, lpDx, 12, 4, 4); - TEST_FIELD(GCP_RESULTSA, INT *, lpCaretPos, 16, 4, 4); - TEST_FIELD(GCP_RESULTSA, LPSTR, lpClass, 20, 4, 4); - TEST_FIELD(GCP_RESULTSA, LPWSTR, lpGlyphs, 24, 4, 4); - TEST_FIELD(GCP_RESULTSA, UINT, nGlyphs, 28, 4, 4); - TEST_FIELD(GCP_RESULTSA, UINT, nMaxFit, 32, 4, 4); + TEST_TYPE_SIZE (GCP_RESULTSA, 36) + TEST_TYPE_ALIGN (GCP_RESULTSA, 4) + 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, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpOutString, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpOutString, 4) + TEST_FIELD_SIZE (GCP_RESULTSA, lpOrder, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpOrder, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpOrder, 8) + TEST_FIELD_SIZE (GCP_RESULTSA, lpDx, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpDx, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpDx, 12) + TEST_FIELD_SIZE (GCP_RESULTSA, lpCaretPos, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpCaretPos, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpCaretPos, 16) + TEST_FIELD_SIZE (GCP_RESULTSA, lpClass, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpClass, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpClass, 20) + TEST_FIELD_SIZE (GCP_RESULTSA, lpGlyphs, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, lpGlyphs, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, lpGlyphs, 24) + TEST_FIELD_SIZE (GCP_RESULTSA, nGlyphs, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, nGlyphs, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, nGlyphs, 28) + TEST_FIELD_SIZE (GCP_RESULTSA, nMaxFit, 4) + TEST_FIELD_ALIGN (GCP_RESULTSA, nMaxFit, 4) + TEST_FIELD_OFFSET(GCP_RESULTSA, nMaxFit, 32) } static void test_pack_GCP_RESULTSW(void) { /* GCP_RESULTSW (pack 4) */ - TEST_TYPE(GCP_RESULTSW, 36, 4); - TEST_FIELD(GCP_RESULTSW, DWORD, lStructSize, 0, 4, 4); - TEST_FIELD(GCP_RESULTSW, LPWSTR, lpOutString, 4, 4, 4); - TEST_FIELD(GCP_RESULTSW, UINT *, lpOrder, 8, 4, 4); - TEST_FIELD(GCP_RESULTSW, INT *, lpDx, 12, 4, 4); - TEST_FIELD(GCP_RESULTSW, INT *, lpCaretPos, 16, 4, 4); - TEST_FIELD(GCP_RESULTSW, LPSTR, lpClass, 20, 4, 4); - TEST_FIELD(GCP_RESULTSW, LPWSTR, lpGlyphs, 24, 4, 4); - TEST_FIELD(GCP_RESULTSW, UINT, nGlyphs, 28, 4, 4); - TEST_FIELD(GCP_RESULTSW, UINT, nMaxFit, 32, 4, 4); + TEST_TYPE_SIZE (GCP_RESULTSW, 36) + TEST_TYPE_ALIGN (GCP_RESULTSW, 4) + 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, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpOutString, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpOutString, 4) + TEST_FIELD_SIZE (GCP_RESULTSW, lpOrder, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpOrder, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpOrder, 8) + TEST_FIELD_SIZE (GCP_RESULTSW, lpDx, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpDx, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpDx, 12) + TEST_FIELD_SIZE (GCP_RESULTSW, lpCaretPos, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpCaretPos, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpCaretPos, 16) + TEST_FIELD_SIZE (GCP_RESULTSW, lpClass, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpClass, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpClass, 20) + TEST_FIELD_SIZE (GCP_RESULTSW, lpGlyphs, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, lpGlyphs, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, lpGlyphs, 24) + TEST_FIELD_SIZE (GCP_RESULTSW, nGlyphs, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, nGlyphs, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, nGlyphs, 28) + TEST_FIELD_SIZE (GCP_RESULTSW, nMaxFit, 4) + TEST_FIELD_ALIGN (GCP_RESULTSW, nMaxFit, 4) + TEST_FIELD_OFFSET(GCP_RESULTSW, nMaxFit, 32) } static void test_pack_GLYPHMETRICS(void) { /* GLYPHMETRICS (pack 4) */ - TEST_TYPE(GLYPHMETRICS, 20, 4); - TEST_FIELD(GLYPHMETRICS, UINT, gmBlackBoxX, 0, 4, 4); - TEST_FIELD(GLYPHMETRICS, UINT, gmBlackBoxY, 4, 4, 4); - TEST_FIELD(GLYPHMETRICS, POINT, gmptGlyphOrigin, 8, 8, 4); - TEST_FIELD(GLYPHMETRICS, SHORT, gmCellIncX, 16, 2, 2); - TEST_FIELD(GLYPHMETRICS, SHORT, gmCellIncY, 18, 2, 2); + 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 (pack 4) */ - TEST_TYPE(GLYPHMETRICSFLOAT, 24, 4); - TEST_FIELD(GLYPHMETRICSFLOAT, FLOAT, gmfBlackBoxX, 0, 4, 4); - TEST_FIELD(GLYPHMETRICSFLOAT, FLOAT, gmfBlackBoxY, 4, 4, 4); - TEST_FIELD(GLYPHMETRICSFLOAT, POINTFLOAT, gmfptGlyphOrigin, 8, 8, 4); - TEST_FIELD(GLYPHMETRICSFLOAT, FLOAT, gmfCellIncX, 16, 4, 4); - TEST_FIELD(GLYPHMETRICSFLOAT, FLOAT, gmfCellIncY, 20, 4, 4); + 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(GOBJENUMPROC, 4, 4); + TEST_TYPE_SIZE (GOBJENUMPROC, 4) + TEST_TYPE_ALIGN (GOBJENUMPROC, 4) } static void test_pack_GRADIENT_RECT(void) { /* GRADIENT_RECT (pack 4) */ - TEST_TYPE(GRADIENT_RECT, 8, 4); - TEST_FIELD(GRADIENT_RECT, ULONG, UpperLeft, 0, 4, 4); - TEST_FIELD(GRADIENT_RECT, ULONG, LowerRight, 4, 4, 4); + 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 (pack 4) */ - TEST_TYPE(GRADIENT_TRIANGLE, 12, 4); - TEST_FIELD(GRADIENT_TRIANGLE, ULONG, Vertex1, 0, 4, 4); - TEST_FIELD(GRADIENT_TRIANGLE, ULONG, Vertex2, 4, 4, 4); - TEST_FIELD(GRADIENT_TRIANGLE, ULONG, Vertex3, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(HANDLETABLE, 4, 4); - TEST_FIELD(HANDLETABLE, HGDIOBJ[1], objectHandle, 0, 4, 4); + TEST_TYPE_SIZE (HANDLETABLE, 4) + TEST_TYPE_ALIGN (HANDLETABLE, 4) + TEST_FIELD_SIZE (HANDLETABLE, objectHandle, 4) + TEST_FIELD_ALIGN (HANDLETABLE, objectHandle, 4) + TEST_FIELD_OFFSET(HANDLETABLE, objectHandle, 0) } static void test_pack_ICMENUMPROCA(void) { /* ICMENUMPROCA */ - TEST_TYPE(ICMENUMPROCA, 4, 4); + TEST_TYPE_SIZE (ICMENUMPROCA, 4) + TEST_TYPE_ALIGN (ICMENUMPROCA, 4) } static void test_pack_ICMENUMPROCW(void) { /* ICMENUMPROCW */ - TEST_TYPE(ICMENUMPROCW, 4, 4); + TEST_TYPE_SIZE (ICMENUMPROCW, 4) + TEST_TYPE_ALIGN (ICMENUMPROCW, 4) } static void test_pack_KERNINGPAIR(void) { /* KERNINGPAIR (pack 4) */ - TEST_TYPE(KERNINGPAIR, 8, 4); - TEST_FIELD(KERNINGPAIR, WORD, wFirst, 0, 2, 2); - TEST_FIELD(KERNINGPAIR, WORD, wSecond, 2, 2, 2); - TEST_FIELD(KERNINGPAIR, INT, iKernAmount, 4, 4, 4); + 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 (pack 4) */ - TEST_TYPE(LAYERPLANEDESCRIPTOR, 32, 4); - TEST_FIELD(LAYERPLANEDESCRIPTOR, WORD, nSize, 0, 2, 2); - TEST_FIELD(LAYERPLANEDESCRIPTOR, WORD, nVersion, 2, 2, 2); - TEST_FIELD(LAYERPLANEDESCRIPTOR, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, iPixelType, 8, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cColorBits, 9, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cRedBits, 10, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cRedShift, 11, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cGreenBits, 12, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cGreenShift, 13, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cBlueBits, 14, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cBlueShift, 15, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cAlphaBits, 16, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cAlphaShift, 17, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cAccumBits, 18, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cAccumRedBits, 19, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cAccumGreenBits, 20, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cAccumBlueBits, 21, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cAccumAlphaBits, 22, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cDepthBits, 23, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cStencilBits, 24, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, cAuxBuffers, 25, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, iLayerPlane, 26, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, BYTE, bReserved, 27, 1, 1); - TEST_FIELD(LAYERPLANEDESCRIPTOR, COLORREF, crTransparent, 28, 4, 4); + 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(LCSCSTYPE, 4, 4); + TEST_TYPE_SIZE (LCSCSTYPE, 4) + TEST_TYPE_ALIGN (LCSCSTYPE, 4) } static void test_pack_LCSGAMUTMATCH(void) { /* LCSGAMUTMATCH */ - TEST_TYPE(LCSGAMUTMATCH, 4, 4); + TEST_TYPE_SIZE (LCSGAMUTMATCH, 4) + TEST_TYPE_ALIGN (LCSGAMUTMATCH, 4) } static void test_pack_LINEDDAPROC(void) { /* LINEDDAPROC */ - TEST_TYPE(LINEDDAPROC, 4, 4); + TEST_TYPE_SIZE (LINEDDAPROC, 4) + TEST_TYPE_ALIGN (LINEDDAPROC, 4) } static void test_pack_LOCALESIGNATURE(void) { /* LOCALESIGNATURE (pack 4) */ - TEST_TYPE(LOCALESIGNATURE, 32, 4); - TEST_FIELD(LOCALESIGNATURE, DWORD[4], lsUsb, 0, 16, 4); - TEST_FIELD(LOCALESIGNATURE, DWORD[2], lsCsbDefault, 16, 8, 4); - TEST_FIELD(LOCALESIGNATURE, DWORD[2], lsCsbSupported, 24, 8, 4); + 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 (pack 4) */ - TEST_TYPE(LOGBRUSH, 12, 4); - TEST_FIELD(LOGBRUSH, UINT, lbStyle, 0, 4, 4); - TEST_FIELD(LOGBRUSH, COLORREF, lbColor, 4, 4, 4); - TEST_FIELD(LOGBRUSH, ULONG_PTR, lbHatch, 8, 4, 4); + TEST_TYPE_SIZE (LOGBRUSH, 12) + TEST_TYPE_ALIGN (LOGBRUSH, 4) + 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, 4) + TEST_FIELD_ALIGN (LOGBRUSH, lbHatch, 4) + TEST_FIELD_OFFSET(LOGBRUSH, lbHatch, 8) } static void test_pack_LOGCOLORSPACEA(void) { /* LOGCOLORSPACEA (pack 4) */ - TEST_TYPE(LOGCOLORSPACEA, 328, 4); - TEST_FIELD(LOGCOLORSPACEA, DWORD, lcsSignature, 0, 4, 4); - TEST_FIELD(LOGCOLORSPACEA, DWORD, lcsVersion, 4, 4, 4); - TEST_FIELD(LOGCOLORSPACEA, DWORD, lcsSize, 8, 4, 4); - TEST_FIELD(LOGCOLORSPACEA, LCSCSTYPE, lcsCSType, 12, 4, 4); - TEST_FIELD(LOGCOLORSPACEA, LCSGAMUTMATCH, lcsIntent, 16, 4, 4); - TEST_FIELD(LOGCOLORSPACEA, CIEXYZTRIPLE, lcsEndpoints, 20, 36, 4); - TEST_FIELD(LOGCOLORSPACEA, DWORD, lcsGammaRed, 56, 4, 4); - TEST_FIELD(LOGCOLORSPACEA, DWORD, lcsGammaGreen, 60, 4, 4); - TEST_FIELD(LOGCOLORSPACEA, DWORD, lcsGammaBlue, 64, 4, 4); - TEST_FIELD(LOGCOLORSPACEA, CHAR[MAX_PATH], lcsFilename, 68, 260, 1); + 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 (pack 4) */ - TEST_TYPE(LOGCOLORSPACEW, 588, 4); - TEST_FIELD(LOGCOLORSPACEW, DWORD, lcsSignature, 0, 4, 4); - TEST_FIELD(LOGCOLORSPACEW, DWORD, lcsVersion, 4, 4, 4); - TEST_FIELD(LOGCOLORSPACEW, DWORD, lcsSize, 8, 4, 4); - TEST_FIELD(LOGCOLORSPACEW, LCSCSTYPE, lcsCSType, 12, 4, 4); - TEST_FIELD(LOGCOLORSPACEW, LCSGAMUTMATCH, lcsIntent, 16, 4, 4); - TEST_FIELD(LOGCOLORSPACEW, CIEXYZTRIPLE, lcsEndpoints, 20, 36, 4); - TEST_FIELD(LOGCOLORSPACEW, DWORD, lcsGammaRed, 56, 4, 4); - TEST_FIELD(LOGCOLORSPACEW, DWORD, lcsGammaGreen, 60, 4, 4); - TEST_FIELD(LOGCOLORSPACEW, DWORD, lcsGammaBlue, 64, 4, 4); - TEST_FIELD(LOGCOLORSPACEW, WCHAR[MAX_PATH], lcsFilename, 68, 520, 2); + 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 (pack 4) */ - TEST_TYPE(LOGFONTA, 60, 4); - TEST_FIELD(LOGFONTA, LONG, lfHeight, 0, 4, 4); - TEST_FIELD(LOGFONTA, LONG, lfWidth, 4, 4, 4); - TEST_FIELD(LOGFONTA, LONG, lfEscapement, 8, 4, 4); - TEST_FIELD(LOGFONTA, LONG, lfOrientation, 12, 4, 4); - TEST_FIELD(LOGFONTA, LONG, lfWeight, 16, 4, 4); - TEST_FIELD(LOGFONTA, BYTE, lfItalic, 20, 1, 1); - TEST_FIELD(LOGFONTA, BYTE, lfUnderline, 21, 1, 1); - TEST_FIELD(LOGFONTA, BYTE, lfStrikeOut, 22, 1, 1); - TEST_FIELD(LOGFONTA, BYTE, lfCharSet, 23, 1, 1); - TEST_FIELD(LOGFONTA, BYTE, lfOutPrecision, 24, 1, 1); - TEST_FIELD(LOGFONTA, BYTE, lfClipPrecision, 25, 1, 1); - TEST_FIELD(LOGFONTA, BYTE, lfQuality, 26, 1, 1); - TEST_FIELD(LOGFONTA, BYTE, lfPitchAndFamily, 27, 1, 1); - TEST_FIELD(LOGFONTA, CHAR[LF_FACESIZE], lfFaceName, 28, 32, 1); + 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 (pack 4) */ - TEST_TYPE(LOGFONTW, 92, 4); - TEST_FIELD(LOGFONTW, LONG, lfHeight, 0, 4, 4); - TEST_FIELD(LOGFONTW, LONG, lfWidth, 4, 4, 4); - TEST_FIELD(LOGFONTW, LONG, lfEscapement, 8, 4, 4); - TEST_FIELD(LOGFONTW, LONG, lfOrientation, 12, 4, 4); - TEST_FIELD(LOGFONTW, LONG, lfWeight, 16, 4, 4); - TEST_FIELD(LOGFONTW, BYTE, lfItalic, 20, 1, 1); - TEST_FIELD(LOGFONTW, BYTE, lfUnderline, 21, 1, 1); - TEST_FIELD(LOGFONTW, BYTE, lfStrikeOut, 22, 1, 1); - TEST_FIELD(LOGFONTW, BYTE, lfCharSet, 23, 1, 1); - TEST_FIELD(LOGFONTW, BYTE, lfOutPrecision, 24, 1, 1); - TEST_FIELD(LOGFONTW, BYTE, lfClipPrecision, 25, 1, 1); - TEST_FIELD(LOGFONTW, BYTE, lfQuality, 26, 1, 1); - TEST_FIELD(LOGFONTW, BYTE, lfPitchAndFamily, 27, 1, 1); - TEST_FIELD(LOGFONTW, WCHAR[LF_FACESIZE], lfFaceName, 28, 64, 2); + 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 (pack 4) */ - TEST_TYPE(LOGPEN, 16, 4); - TEST_FIELD(LOGPEN, UINT, lopnStyle, 0, 4, 4); - TEST_FIELD(LOGPEN, POINT, lopnWidth, 4, 8, 4); - TEST_FIELD(LOGPEN, COLORREF, lopnColor, 12, 4, 4); + 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(LPABC, 4, 4); - TEST_TYPE_POINTER(LPABC, 12, 4); + TEST_TYPE_SIZE (LPABC, 4) + TEST_TYPE_ALIGN (LPABC, 4) + TEST_TARGET_SIZE (LPABC, 12) + TEST_TARGET_ALIGN(LPABC, 4) } static void test_pack_LPABCFLOAT(void) { /* LPABCFLOAT */ - TEST_TYPE(LPABCFLOAT, 4, 4); - TEST_TYPE_POINTER(LPABCFLOAT, 12, 4); + TEST_TYPE_SIZE (LPABCFLOAT, 4) + TEST_TYPE_ALIGN (LPABCFLOAT, 4) + TEST_TARGET_SIZE (LPABCFLOAT, 12) + TEST_TARGET_ALIGN(LPABCFLOAT, 4) } static void test_pack_LPBITMAP(void) { /* LPBITMAP */ - TEST_TYPE(LPBITMAP, 4, 4); - TEST_TYPE_POINTER(LPBITMAP, 24, 4); + TEST_TYPE_SIZE (LPBITMAP, 4) + TEST_TYPE_ALIGN (LPBITMAP, 4) + TEST_TARGET_SIZE (LPBITMAP, 24) + TEST_TARGET_ALIGN(LPBITMAP, 4) } static void test_pack_LPBITMAPCOREHEADER(void) { /* LPBITMAPCOREHEADER */ - TEST_TYPE(LPBITMAPCOREHEADER, 4, 4); - TEST_TYPE_POINTER(LPBITMAPCOREHEADER, 12, 4); + TEST_TYPE_SIZE (LPBITMAPCOREHEADER, 4) + TEST_TYPE_ALIGN (LPBITMAPCOREHEADER, 4) + TEST_TARGET_SIZE (LPBITMAPCOREHEADER, 12) + TEST_TARGET_ALIGN(LPBITMAPCOREHEADER, 4) } static void test_pack_LPBITMAPCOREINFO(void) { /* LPBITMAPCOREINFO */ - TEST_TYPE(LPBITMAPCOREINFO, 4, 4); - TEST_TYPE_POINTER(LPBITMAPCOREINFO, 16, 4); + TEST_TYPE_SIZE (LPBITMAPCOREINFO, 4) + TEST_TYPE_ALIGN (LPBITMAPCOREINFO, 4) + TEST_TARGET_SIZE (LPBITMAPCOREINFO, 16) + TEST_TARGET_ALIGN(LPBITMAPCOREINFO, 4) } static void test_pack_LPBITMAPFILEHEADER(void) { /* LPBITMAPFILEHEADER */ - TEST_TYPE(LPBITMAPFILEHEADER, 4, 4); - TEST_TYPE_POINTER(LPBITMAPFILEHEADER, 14, 2); + TEST_TYPE_SIZE (LPBITMAPFILEHEADER, 4) + TEST_TYPE_ALIGN (LPBITMAPFILEHEADER, 4) + TEST_TARGET_SIZE (LPBITMAPFILEHEADER, 14) + TEST_TARGET_ALIGN(LPBITMAPFILEHEADER, 2) } static void test_pack_LPBITMAPINFO(void) { /* LPBITMAPINFO */ - TEST_TYPE(LPBITMAPINFO, 4, 4); - TEST_TYPE_POINTER(LPBITMAPINFO, 44, 4); + TEST_TYPE_SIZE (LPBITMAPINFO, 4) + TEST_TYPE_ALIGN (LPBITMAPINFO, 4) + TEST_TARGET_SIZE (LPBITMAPINFO, 44) + TEST_TARGET_ALIGN(LPBITMAPINFO, 4) } static void test_pack_LPBITMAPINFOHEADER(void) { /* LPBITMAPINFOHEADER */ - TEST_TYPE(LPBITMAPINFOHEADER, 4, 4); - TEST_TYPE_POINTER(LPBITMAPINFOHEADER, 40, 4); + TEST_TYPE_SIZE (LPBITMAPINFOHEADER, 4) + TEST_TYPE_ALIGN (LPBITMAPINFOHEADER, 4) + TEST_TARGET_SIZE (LPBITMAPINFOHEADER, 40) + TEST_TARGET_ALIGN(LPBITMAPINFOHEADER, 4) } static void test_pack_LPBITMAPV5HEADER(void) { /* LPBITMAPV5HEADER */ - TEST_TYPE(LPBITMAPV5HEADER, 4, 4); - TEST_TYPE_POINTER(LPBITMAPV5HEADER, 124, 4); + TEST_TYPE_SIZE (LPBITMAPV5HEADER, 4) + TEST_TYPE_ALIGN (LPBITMAPV5HEADER, 4) + TEST_TARGET_SIZE (LPBITMAPV5HEADER, 124) + TEST_TARGET_ALIGN(LPBITMAPV5HEADER, 4) } static void test_pack_LPCHARSETINFO(void) { /* LPCHARSETINFO */ - TEST_TYPE(LPCHARSETINFO, 4, 4); - TEST_TYPE_POINTER(LPCHARSETINFO, 32, 4); + TEST_TYPE_SIZE (LPCHARSETINFO, 4) + TEST_TYPE_ALIGN (LPCHARSETINFO, 4) + TEST_TARGET_SIZE (LPCHARSETINFO, 32) + TEST_TARGET_ALIGN(LPCHARSETINFO, 4) } static void test_pack_LPCIEXYZ(void) { /* LPCIEXYZ */ - TEST_TYPE(LPCIEXYZ, 4, 4); - TEST_TYPE_POINTER(LPCIEXYZ, 12, 4); + TEST_TYPE_SIZE (LPCIEXYZ, 4) + TEST_TYPE_ALIGN (LPCIEXYZ, 4) + TEST_TARGET_SIZE (LPCIEXYZ, 12) + TEST_TARGET_ALIGN(LPCIEXYZ, 4) } static void test_pack_LPCIEXYZTRIPLE(void) { /* LPCIEXYZTRIPLE */ - TEST_TYPE(LPCIEXYZTRIPLE, 4, 4); - TEST_TYPE_POINTER(LPCIEXYZTRIPLE, 36, 4); + TEST_TYPE_SIZE (LPCIEXYZTRIPLE, 4) + TEST_TYPE_ALIGN (LPCIEXYZTRIPLE, 4) + TEST_TARGET_SIZE (LPCIEXYZTRIPLE, 36) + TEST_TARGET_ALIGN(LPCIEXYZTRIPLE, 4) } static void test_pack_LPCOLORADJUSTMENT(void) { /* LPCOLORADJUSTMENT */ - TEST_TYPE(LPCOLORADJUSTMENT, 4, 4); - TEST_TYPE_POINTER(LPCOLORADJUSTMENT, 24, 2); + TEST_TYPE_SIZE (LPCOLORADJUSTMENT, 4) + TEST_TYPE_ALIGN (LPCOLORADJUSTMENT, 4) + TEST_TARGET_SIZE (LPCOLORADJUSTMENT, 24) + TEST_TARGET_ALIGN(LPCOLORADJUSTMENT, 2) } static void test_pack_LPDEVMODEA(void) { /* LPDEVMODEA */ - TEST_TYPE(LPDEVMODEA, 4, 4); + TEST_TYPE_SIZE (LPDEVMODEA, 4) + TEST_TYPE_ALIGN (LPDEVMODEA, 4) } static void test_pack_LPDEVMODEW(void) { /* LPDEVMODEW */ - TEST_TYPE(LPDEVMODEW, 4, 4); + TEST_TYPE_SIZE (LPDEVMODEW, 4) + TEST_TYPE_ALIGN (LPDEVMODEW, 4) } static void test_pack_LPDIBSECTION(void) { /* LPDIBSECTION */ - TEST_TYPE(LPDIBSECTION, 4, 4); - TEST_TYPE_POINTER(LPDIBSECTION, 84, 4); + TEST_TYPE_SIZE (LPDIBSECTION, 4) + TEST_TYPE_ALIGN (LPDIBSECTION, 4) + TEST_TARGET_SIZE (LPDIBSECTION, 84) + TEST_TARGET_ALIGN(LPDIBSECTION, 4) } static void test_pack_LPDISPLAY_DEVICEA(void) { /* LPDISPLAY_DEVICEA */ - TEST_TYPE(LPDISPLAY_DEVICEA, 4, 4); - TEST_TYPE_POINTER(LPDISPLAY_DEVICEA, 424, 4); + TEST_TYPE_SIZE (LPDISPLAY_DEVICEA, 4) + TEST_TYPE_ALIGN (LPDISPLAY_DEVICEA, 4) + TEST_TARGET_SIZE (LPDISPLAY_DEVICEA, 424) + TEST_TARGET_ALIGN(LPDISPLAY_DEVICEA, 4) } static void test_pack_LPDISPLAY_DEVICEW(void) { /* LPDISPLAY_DEVICEW */ - TEST_TYPE(LPDISPLAY_DEVICEW, 4, 4); - TEST_TYPE_POINTER(LPDISPLAY_DEVICEW, 840, 4); + TEST_TYPE_SIZE (LPDISPLAY_DEVICEW, 4) + TEST_TYPE_ALIGN (LPDISPLAY_DEVICEW, 4) + TEST_TARGET_SIZE (LPDISPLAY_DEVICEW, 840) + TEST_TARGET_ALIGN(LPDISPLAY_DEVICEW, 4) } static void test_pack_LPDOCINFOA(void) { /* LPDOCINFOA */ - TEST_TYPE(LPDOCINFOA, 4, 4); - TEST_TYPE_POINTER(LPDOCINFOA, 20, 4); + TEST_TYPE_SIZE (LPDOCINFOA, 4) + TEST_TYPE_ALIGN (LPDOCINFOA, 4) + TEST_TARGET_SIZE (LPDOCINFOA, 20) + TEST_TARGET_ALIGN(LPDOCINFOA, 4) } static void test_pack_LPDOCINFOW(void) { /* LPDOCINFOW */ - TEST_TYPE(LPDOCINFOW, 4, 4); - TEST_TYPE_POINTER(LPDOCINFOW, 20, 4); + TEST_TYPE_SIZE (LPDOCINFOW, 4) + TEST_TYPE_ALIGN (LPDOCINFOW, 4) + TEST_TARGET_SIZE (LPDOCINFOW, 20) + TEST_TARGET_ALIGN(LPDOCINFOW, 4) } static void test_pack_LPENHMETAHEADER(void) { /* LPENHMETAHEADER */ - TEST_TYPE(LPENHMETAHEADER, 4, 4); - TEST_TYPE_POINTER(LPENHMETAHEADER, 108, 4); + TEST_TYPE_SIZE (LPENHMETAHEADER, 4) + TEST_TYPE_ALIGN (LPENHMETAHEADER, 4) + TEST_TARGET_SIZE (LPENHMETAHEADER, 108) + TEST_TARGET_ALIGN(LPENHMETAHEADER, 4) } static void test_pack_LPENHMETARECORD(void) { /* LPENHMETARECORD */ - TEST_TYPE(LPENHMETARECORD, 4, 4); - TEST_TYPE_POINTER(LPENHMETARECORD, 12, 4); + TEST_TYPE_SIZE (LPENHMETARECORD, 4) + TEST_TYPE_ALIGN (LPENHMETARECORD, 4) + TEST_TARGET_SIZE (LPENHMETARECORD, 12) + TEST_TARGET_ALIGN(LPENHMETARECORD, 4) } static void test_pack_LPENUMLOGFONTA(void) { /* LPENUMLOGFONTA */ - TEST_TYPE(LPENUMLOGFONTA, 4, 4); - TEST_TYPE_POINTER(LPENUMLOGFONTA, 156, 4); + TEST_TYPE_SIZE (LPENUMLOGFONTA, 4) + TEST_TYPE_ALIGN (LPENUMLOGFONTA, 4) + TEST_TARGET_SIZE (LPENUMLOGFONTA, 156) + TEST_TARGET_ALIGN(LPENUMLOGFONTA, 4) } static void test_pack_LPENUMLOGFONTEXA(void) { /* LPENUMLOGFONTEXA */ - TEST_TYPE(LPENUMLOGFONTEXA, 4, 4); - TEST_TYPE_POINTER(LPENUMLOGFONTEXA, 188, 4); + TEST_TYPE_SIZE (LPENUMLOGFONTEXA, 4) + TEST_TYPE_ALIGN (LPENUMLOGFONTEXA, 4) + TEST_TARGET_SIZE (LPENUMLOGFONTEXA, 188) + TEST_TARGET_ALIGN(LPENUMLOGFONTEXA, 4) } static void test_pack_LPENUMLOGFONTEXW(void) { /* LPENUMLOGFONTEXW */ - TEST_TYPE(LPENUMLOGFONTEXW, 4, 4); - TEST_TYPE_POINTER(LPENUMLOGFONTEXW, 348, 4); + TEST_TYPE_SIZE (LPENUMLOGFONTEXW, 4) + TEST_TYPE_ALIGN (LPENUMLOGFONTEXW, 4) + TEST_TARGET_SIZE (LPENUMLOGFONTEXW, 348) + TEST_TARGET_ALIGN(LPENUMLOGFONTEXW, 4) } static void test_pack_LPENUMLOGFONTW(void) { /* LPENUMLOGFONTW */ - TEST_TYPE(LPENUMLOGFONTW, 4, 4); - TEST_TYPE_POINTER(LPENUMLOGFONTW, 284, 4); + TEST_TYPE_SIZE (LPENUMLOGFONTW, 4) + TEST_TYPE_ALIGN (LPENUMLOGFONTW, 4) + TEST_TARGET_SIZE (LPENUMLOGFONTW, 284) + TEST_TARGET_ALIGN(LPENUMLOGFONTW, 4) } static void test_pack_LPEXTLOGFONTA(void) { /* LPEXTLOGFONTA */ - TEST_TYPE(LPEXTLOGFONTA, 4, 4); - TEST_TYPE_POINTER(LPEXTLOGFONTA, 192, 4); + TEST_TYPE_SIZE (LPEXTLOGFONTA, 4) + TEST_TYPE_ALIGN (LPEXTLOGFONTA, 4) + TEST_TARGET_SIZE (LPEXTLOGFONTA, 192) + TEST_TARGET_ALIGN(LPEXTLOGFONTA, 4) } static void test_pack_LPEXTLOGFONTW(void) { /* LPEXTLOGFONTW */ - TEST_TYPE(LPEXTLOGFONTW, 4, 4); - TEST_TYPE_POINTER(LPEXTLOGFONTW, 320, 4); + TEST_TYPE_SIZE (LPEXTLOGFONTW, 4) + TEST_TYPE_ALIGN (LPEXTLOGFONTW, 4) + TEST_TARGET_SIZE (LPEXTLOGFONTW, 320) + TEST_TARGET_ALIGN(LPEXTLOGFONTW, 4) } static void test_pack_LPEXTLOGPEN(void) { /* LPEXTLOGPEN */ - TEST_TYPE(LPEXTLOGPEN, 4, 4); - TEST_TYPE_POINTER(LPEXTLOGPEN, 28, 4); + TEST_TYPE_SIZE (LPEXTLOGPEN, 4) + TEST_TYPE_ALIGN (LPEXTLOGPEN, 4) + TEST_TARGET_SIZE (LPEXTLOGPEN, 28) + TEST_TARGET_ALIGN(LPEXTLOGPEN, 4) } static void test_pack_LPFONTSIGNATURE(void) { /* LPFONTSIGNATURE */ - TEST_TYPE(LPFONTSIGNATURE, 4, 4); - TEST_TYPE_POINTER(LPFONTSIGNATURE, 24, 4); + TEST_TYPE_SIZE (LPFONTSIGNATURE, 4) + TEST_TYPE_ALIGN (LPFONTSIGNATURE, 4) + TEST_TARGET_SIZE (LPFONTSIGNATURE, 24) + TEST_TARGET_ALIGN(LPFONTSIGNATURE, 4) } static void test_pack_LPGCP_RESULTSA(void) { /* LPGCP_RESULTSA */ - TEST_TYPE(LPGCP_RESULTSA, 4, 4); - TEST_TYPE_POINTER(LPGCP_RESULTSA, 36, 4); + TEST_TYPE_SIZE (LPGCP_RESULTSA, 4) + TEST_TYPE_ALIGN (LPGCP_RESULTSA, 4) + TEST_TARGET_SIZE (LPGCP_RESULTSA, 36) + TEST_TARGET_ALIGN(LPGCP_RESULTSA, 4) } static void test_pack_LPGCP_RESULTSW(void) { /* LPGCP_RESULTSW */ - TEST_TYPE(LPGCP_RESULTSW, 4, 4); - TEST_TYPE_POINTER(LPGCP_RESULTSW, 36, 4); + TEST_TYPE_SIZE (LPGCP_RESULTSW, 4) + TEST_TYPE_ALIGN (LPGCP_RESULTSW, 4) + TEST_TARGET_SIZE (LPGCP_RESULTSW, 36) + TEST_TARGET_ALIGN(LPGCP_RESULTSW, 4) } static void test_pack_LPGLYPHMETRICS(void) { /* LPGLYPHMETRICS */ - TEST_TYPE(LPGLYPHMETRICS, 4, 4); - TEST_TYPE_POINTER(LPGLYPHMETRICS, 20, 4); + TEST_TYPE_SIZE (LPGLYPHMETRICS, 4) + TEST_TYPE_ALIGN (LPGLYPHMETRICS, 4) + TEST_TARGET_SIZE (LPGLYPHMETRICS, 20) + TEST_TARGET_ALIGN(LPGLYPHMETRICS, 4) } static void test_pack_LPGLYPHMETRICSFLOAT(void) { /* LPGLYPHMETRICSFLOAT */ - TEST_TYPE(LPGLYPHMETRICSFLOAT, 4, 4); - TEST_TYPE_POINTER(LPGLYPHMETRICSFLOAT, 24, 4); + TEST_TYPE_SIZE (LPGLYPHMETRICSFLOAT, 4) + TEST_TYPE_ALIGN (LPGLYPHMETRICSFLOAT, 4) + TEST_TARGET_SIZE (LPGLYPHMETRICSFLOAT, 24) + TEST_TARGET_ALIGN(LPGLYPHMETRICSFLOAT, 4) } static void test_pack_LPGRADIENT_RECT(void) { /* LPGRADIENT_RECT */ - TEST_TYPE(LPGRADIENT_RECT, 4, 4); - TEST_TYPE_POINTER(LPGRADIENT_RECT, 8, 4); + TEST_TYPE_SIZE (LPGRADIENT_RECT, 4) + TEST_TYPE_ALIGN (LPGRADIENT_RECT, 4) + TEST_TARGET_SIZE (LPGRADIENT_RECT, 8) + TEST_TARGET_ALIGN(LPGRADIENT_RECT, 4) } static void test_pack_LPGRADIENT_TRIANGLE(void) { /* LPGRADIENT_TRIANGLE */ - TEST_TYPE(LPGRADIENT_TRIANGLE, 4, 4); - TEST_TYPE_POINTER(LPGRADIENT_TRIANGLE, 12, 4); + TEST_TYPE_SIZE (LPGRADIENT_TRIANGLE, 4) + TEST_TYPE_ALIGN (LPGRADIENT_TRIANGLE, 4) + TEST_TARGET_SIZE (LPGRADIENT_TRIANGLE, 12) + TEST_TARGET_ALIGN(LPGRADIENT_TRIANGLE, 4) } static void test_pack_LPHANDLETABLE(void) { /* LPHANDLETABLE */ - TEST_TYPE(LPHANDLETABLE, 4, 4); - TEST_TYPE_POINTER(LPHANDLETABLE, 4, 4); + TEST_TYPE_SIZE (LPHANDLETABLE, 4) + TEST_TYPE_ALIGN (LPHANDLETABLE, 4) + TEST_TARGET_SIZE (LPHANDLETABLE, 4) + TEST_TARGET_ALIGN(LPHANDLETABLE, 4) } static void test_pack_LPKERNINGPAIR(void) { /* LPKERNINGPAIR */ - TEST_TYPE(LPKERNINGPAIR, 4, 4); - TEST_TYPE_POINTER(LPKERNINGPAIR, 8, 4); + TEST_TYPE_SIZE (LPKERNINGPAIR, 4) + TEST_TYPE_ALIGN (LPKERNINGPAIR, 4) + TEST_TARGET_SIZE (LPKERNINGPAIR, 8) + TEST_TARGET_ALIGN(LPKERNINGPAIR, 4) } static void test_pack_LPLAYERPLANEDESCRIPTOR(void) { /* LPLAYERPLANEDESCRIPTOR */ - TEST_TYPE(LPLAYERPLANEDESCRIPTOR, 4, 4); - TEST_TYPE_POINTER(LPLAYERPLANEDESCRIPTOR, 32, 4); + TEST_TYPE_SIZE (LPLAYERPLANEDESCRIPTOR, 4) + TEST_TYPE_ALIGN (LPLAYERPLANEDESCRIPTOR, 4) + TEST_TARGET_SIZE (LPLAYERPLANEDESCRIPTOR, 32) + TEST_TARGET_ALIGN(LPLAYERPLANEDESCRIPTOR, 4) } static void test_pack_LPLOCALESIGNATURE(void) { /* LPLOCALESIGNATURE */ - TEST_TYPE(LPLOCALESIGNATURE, 4, 4); - TEST_TYPE_POINTER(LPLOCALESIGNATURE, 32, 4); + TEST_TYPE_SIZE (LPLOCALESIGNATURE, 4) + TEST_TYPE_ALIGN (LPLOCALESIGNATURE, 4) + TEST_TARGET_SIZE (LPLOCALESIGNATURE, 32) + TEST_TARGET_ALIGN(LPLOCALESIGNATURE, 4) } static void test_pack_LPLOGBRUSH(void) { /* LPLOGBRUSH */ - TEST_TYPE(LPLOGBRUSH, 4, 4); - TEST_TYPE_POINTER(LPLOGBRUSH, 12, 4); + TEST_TYPE_SIZE (LPLOGBRUSH, 4) + TEST_TYPE_ALIGN (LPLOGBRUSH, 4) + TEST_TARGET_SIZE (LPLOGBRUSH, 12) + TEST_TARGET_ALIGN(LPLOGBRUSH, 4) } static void test_pack_LPLOGCOLORSPACEA(void) { /* LPLOGCOLORSPACEA */ - TEST_TYPE(LPLOGCOLORSPACEA, 4, 4); - TEST_TYPE_POINTER(LPLOGCOLORSPACEA, 328, 4); + TEST_TYPE_SIZE (LPLOGCOLORSPACEA, 4) + TEST_TYPE_ALIGN (LPLOGCOLORSPACEA, 4) + TEST_TARGET_SIZE (LPLOGCOLORSPACEA, 328) + TEST_TARGET_ALIGN(LPLOGCOLORSPACEA, 4) } static void test_pack_LPLOGCOLORSPACEW(void) { /* LPLOGCOLORSPACEW */ - TEST_TYPE(LPLOGCOLORSPACEW, 4, 4); - TEST_TYPE_POINTER(LPLOGCOLORSPACEW, 588, 4); + TEST_TYPE_SIZE (LPLOGCOLORSPACEW, 4) + TEST_TYPE_ALIGN (LPLOGCOLORSPACEW, 4) + TEST_TARGET_SIZE (LPLOGCOLORSPACEW, 588) + TEST_TARGET_ALIGN(LPLOGCOLORSPACEW, 4) } static void test_pack_LPLOGFONTA(void) { /* LPLOGFONTA */ - TEST_TYPE(LPLOGFONTA, 4, 4); - TEST_TYPE_POINTER(LPLOGFONTA, 60, 4); + TEST_TYPE_SIZE (LPLOGFONTA, 4) + TEST_TYPE_ALIGN (LPLOGFONTA, 4) + TEST_TARGET_SIZE (LPLOGFONTA, 60) + TEST_TARGET_ALIGN(LPLOGFONTA, 4) } static void test_pack_LPLOGFONTW(void) { /* LPLOGFONTW */ - TEST_TYPE(LPLOGFONTW, 4, 4); - TEST_TYPE_POINTER(LPLOGFONTW, 92, 4); + TEST_TYPE_SIZE (LPLOGFONTW, 4) + TEST_TYPE_ALIGN (LPLOGFONTW, 4) + TEST_TARGET_SIZE (LPLOGFONTW, 92) + TEST_TARGET_ALIGN(LPLOGFONTW, 4) } static void test_pack_LPLOGPEN(void) { /* LPLOGPEN */ - TEST_TYPE(LPLOGPEN, 4, 4); - TEST_TYPE_POINTER(LPLOGPEN, 16, 4); + TEST_TYPE_SIZE (LPLOGPEN, 4) + TEST_TYPE_ALIGN (LPLOGPEN, 4) + TEST_TARGET_SIZE (LPLOGPEN, 16) + TEST_TARGET_ALIGN(LPLOGPEN, 4) } static void test_pack_LPMAT2(void) { /* LPMAT2 */ - TEST_TYPE(LPMAT2, 4, 4); - TEST_TYPE_POINTER(LPMAT2, 16, 2); + TEST_TYPE_SIZE (LPMAT2, 4) + TEST_TYPE_ALIGN (LPMAT2, 4) + TEST_TARGET_SIZE (LPMAT2, 16) + TEST_TARGET_ALIGN(LPMAT2, 2) } static void test_pack_LPMETAFILEPICT(void) { /* LPMETAFILEPICT */ - TEST_TYPE(LPMETAFILEPICT, 4, 4); - TEST_TYPE_POINTER(LPMETAFILEPICT, 16, 4); + TEST_TYPE_SIZE (LPMETAFILEPICT, 4) + TEST_TYPE_ALIGN (LPMETAFILEPICT, 4) + TEST_TARGET_SIZE (LPMETAFILEPICT, 16) + TEST_TARGET_ALIGN(LPMETAFILEPICT, 4) } static void test_pack_LPMETAHEADER(void) { /* LPMETAHEADER */ - TEST_TYPE(LPMETAHEADER, 4, 4); - TEST_TYPE_POINTER(LPMETAHEADER, 18, 2); + TEST_TYPE_SIZE (LPMETAHEADER, 4) + TEST_TYPE_ALIGN (LPMETAHEADER, 4) + TEST_TARGET_SIZE (LPMETAHEADER, 18) + TEST_TARGET_ALIGN(LPMETAHEADER, 2) } static void test_pack_LPMETARECORD(void) { /* LPMETARECORD */ - TEST_TYPE(LPMETARECORD, 4, 4); - TEST_TYPE_POINTER(LPMETARECORD, 8, 4); + TEST_TYPE_SIZE (LPMETARECORD, 4) + TEST_TYPE_ALIGN (LPMETARECORD, 4) + TEST_TARGET_SIZE (LPMETARECORD, 8) + TEST_TARGET_ALIGN(LPMETARECORD, 4) } static void test_pack_LPNEWTEXTMETRICA(void) { /* LPNEWTEXTMETRICA */ - TEST_TYPE(LPNEWTEXTMETRICA, 4, 4); - TEST_TYPE_POINTER(LPNEWTEXTMETRICA, 72, 4); + TEST_TYPE_SIZE (LPNEWTEXTMETRICA, 4) + TEST_TYPE_ALIGN (LPNEWTEXTMETRICA, 4) + TEST_TARGET_SIZE (LPNEWTEXTMETRICA, 72) + TEST_TARGET_ALIGN(LPNEWTEXTMETRICA, 4) } static void test_pack_LPNEWTEXTMETRICW(void) { /* LPNEWTEXTMETRICW */ - TEST_TYPE(LPNEWTEXTMETRICW, 4, 4); - TEST_TYPE_POINTER(LPNEWTEXTMETRICW, 76, 4); + TEST_TYPE_SIZE (LPNEWTEXTMETRICW, 4) + TEST_TYPE_ALIGN (LPNEWTEXTMETRICW, 4) + TEST_TARGET_SIZE (LPNEWTEXTMETRICW, 76) + TEST_TARGET_ALIGN(LPNEWTEXTMETRICW, 4) } static void test_pack_LPOUTLINETEXTMETRICA(void) { /* LPOUTLINETEXTMETRICA */ - TEST_TYPE(LPOUTLINETEXTMETRICA, 4, 4); - TEST_TYPE_POINTER(LPOUTLINETEXTMETRICA, 212, 4); + TEST_TYPE_SIZE (LPOUTLINETEXTMETRICA, 4) + TEST_TYPE_ALIGN (LPOUTLINETEXTMETRICA, 4) + TEST_TARGET_SIZE (LPOUTLINETEXTMETRICA, 212) + TEST_TARGET_ALIGN(LPOUTLINETEXTMETRICA, 4) } static void test_pack_LPOUTLINETEXTMETRICW(void) { /* LPOUTLINETEXTMETRICW */ - TEST_TYPE(LPOUTLINETEXTMETRICW, 4, 4); - TEST_TYPE_POINTER(LPOUTLINETEXTMETRICW, 216, 4); + TEST_TYPE_SIZE (LPOUTLINETEXTMETRICW, 4) + TEST_TYPE_ALIGN (LPOUTLINETEXTMETRICW, 4) + TEST_TARGET_SIZE (LPOUTLINETEXTMETRICW, 216) + TEST_TARGET_ALIGN(LPOUTLINETEXTMETRICW, 4) } static void test_pack_LPPANOSE(void) { /* LPPANOSE */ - TEST_TYPE(LPPANOSE, 4, 4); - TEST_TYPE_POINTER(LPPANOSE, 10, 1); + TEST_TYPE_SIZE (LPPANOSE, 4) + TEST_TYPE_ALIGN (LPPANOSE, 4) + TEST_TARGET_SIZE (LPPANOSE, 10) + TEST_TARGET_ALIGN(LPPANOSE, 1) } static void test_pack_LPPELARRAY(void) { /* LPPELARRAY */ - TEST_TYPE(LPPELARRAY, 4, 4); - TEST_TYPE_POINTER(LPPELARRAY, 20, 4); + TEST_TYPE_SIZE (LPPELARRAY, 4) + TEST_TYPE_ALIGN (LPPELARRAY, 4) + TEST_TARGET_SIZE (LPPELARRAY, 20) + TEST_TARGET_ALIGN(LPPELARRAY, 4) } static void test_pack_LPPIXELFORMATDESCRIPTOR(void) { /* LPPIXELFORMATDESCRIPTOR */ - TEST_TYPE(LPPIXELFORMATDESCRIPTOR, 4, 4); - TEST_TYPE_POINTER(LPPIXELFORMATDESCRIPTOR, 40, 4); + TEST_TYPE_SIZE (LPPIXELFORMATDESCRIPTOR, 4) + TEST_TYPE_ALIGN (LPPIXELFORMATDESCRIPTOR, 4) + TEST_TARGET_SIZE (LPPIXELFORMATDESCRIPTOR, 40) + TEST_TARGET_ALIGN(LPPIXELFORMATDESCRIPTOR, 4) } static void test_pack_LPPOINTFX(void) { /* LPPOINTFX */ - TEST_TYPE(LPPOINTFX, 4, 4); - TEST_TYPE_POINTER(LPPOINTFX, 8, 2); + TEST_TYPE_SIZE (LPPOINTFX, 4) + TEST_TYPE_ALIGN (LPPOINTFX, 4) + TEST_TARGET_SIZE (LPPOINTFX, 8) + TEST_TARGET_ALIGN(LPPOINTFX, 2) } static void test_pack_LPPOLYTEXTA(void) { /* LPPOLYTEXTA */ - TEST_TYPE(LPPOLYTEXTA, 4, 4); - TEST_TYPE_POINTER(LPPOLYTEXTA, 40, 4); + TEST_TYPE_SIZE (LPPOLYTEXTA, 4) + TEST_TYPE_ALIGN (LPPOLYTEXTA, 4) + TEST_TARGET_SIZE (LPPOLYTEXTA, 40) + TEST_TARGET_ALIGN(LPPOLYTEXTA, 4) } static void test_pack_LPPOLYTEXTW(void) { /* LPPOLYTEXTW */ - TEST_TYPE(LPPOLYTEXTW, 4, 4); - TEST_TYPE_POINTER(LPPOLYTEXTW, 40, 4); + TEST_TYPE_SIZE (LPPOLYTEXTW, 4) + TEST_TYPE_ALIGN (LPPOLYTEXTW, 4) + TEST_TARGET_SIZE (LPPOLYTEXTW, 40) + TEST_TARGET_ALIGN(LPPOLYTEXTW, 4) } static void test_pack_LPRASTERIZER_STATUS(void) { /* LPRASTERIZER_STATUS */ - TEST_TYPE(LPRASTERIZER_STATUS, 4, 4); - TEST_TYPE_POINTER(LPRASTERIZER_STATUS, 6, 2); + TEST_TYPE_SIZE (LPRASTERIZER_STATUS, 4) + TEST_TYPE_ALIGN (LPRASTERIZER_STATUS, 4) + TEST_TARGET_SIZE (LPRASTERIZER_STATUS, 6) + TEST_TARGET_ALIGN(LPRASTERIZER_STATUS, 2) } static void test_pack_LPRGBQUAD(void) { /* LPRGBQUAD */ - TEST_TYPE(LPRGBQUAD, 4, 4); - TEST_TYPE_POINTER(LPRGBQUAD, 4, 1); + TEST_TYPE_SIZE (LPRGBQUAD, 4) + TEST_TYPE_ALIGN (LPRGBQUAD, 4) + TEST_TARGET_SIZE (LPRGBQUAD, 4) + TEST_TARGET_ALIGN(LPRGBQUAD, 1) } static void test_pack_LPRGNDATA(void) { /* LPRGNDATA */ - TEST_TYPE(LPRGNDATA, 4, 4); - TEST_TYPE_POINTER(LPRGNDATA, 36, 4); + TEST_TYPE_SIZE (LPRGNDATA, 4) + TEST_TYPE_ALIGN (LPRGNDATA, 4) + TEST_TARGET_SIZE (LPRGNDATA, 36) + TEST_TARGET_ALIGN(LPRGNDATA, 4) } static void test_pack_LPTEXTMETRICA(void) { /* LPTEXTMETRICA */ - TEST_TYPE(LPTEXTMETRICA, 4, 4); - TEST_TYPE_POINTER(LPTEXTMETRICA, 56, 4); + TEST_TYPE_SIZE (LPTEXTMETRICA, 4) + TEST_TYPE_ALIGN (LPTEXTMETRICA, 4) + TEST_TARGET_SIZE (LPTEXTMETRICA, 56) + TEST_TARGET_ALIGN(LPTEXTMETRICA, 4) } static void test_pack_LPTEXTMETRICW(void) { /* LPTEXTMETRICW */ - TEST_TYPE(LPTEXTMETRICW, 4, 4); - TEST_TYPE_POINTER(LPTEXTMETRICW, 60, 4); + TEST_TYPE_SIZE (LPTEXTMETRICW, 4) + TEST_TYPE_ALIGN (LPTEXTMETRICW, 4) + TEST_TARGET_SIZE (LPTEXTMETRICW, 60) + TEST_TARGET_ALIGN(LPTEXTMETRICW, 4) } static void test_pack_LPTRIVERTEX(void) { /* LPTRIVERTEX */ - TEST_TYPE(LPTRIVERTEX, 4, 4); - TEST_TYPE_POINTER(LPTRIVERTEX, 16, 4); + TEST_TYPE_SIZE (LPTRIVERTEX, 4) + TEST_TYPE_ALIGN (LPTRIVERTEX, 4) + TEST_TARGET_SIZE (LPTRIVERTEX, 16) + TEST_TARGET_ALIGN(LPTRIVERTEX, 4) } static void test_pack_LPTTPOLYCURVE(void) { /* LPTTPOLYCURVE */ - TEST_TYPE(LPTTPOLYCURVE, 4, 4); - TEST_TYPE_POINTER(LPTTPOLYCURVE, 12, 2); + TEST_TYPE_SIZE (LPTTPOLYCURVE, 4) + TEST_TYPE_ALIGN (LPTTPOLYCURVE, 4) + TEST_TARGET_SIZE (LPTTPOLYCURVE, 12) + TEST_TARGET_ALIGN(LPTTPOLYCURVE, 2) } static void test_pack_LPTTPOLYGONHEADER(void) { /* LPTTPOLYGONHEADER */ - TEST_TYPE(LPTTPOLYGONHEADER, 4, 4); - TEST_TYPE_POINTER(LPTTPOLYGONHEADER, 16, 4); + TEST_TYPE_SIZE (LPTTPOLYGONHEADER, 4) + TEST_TYPE_ALIGN (LPTTPOLYGONHEADER, 4) + TEST_TARGET_SIZE (LPTTPOLYGONHEADER, 16) + TEST_TARGET_ALIGN(LPTTPOLYGONHEADER, 4) } static void test_pack_LPXFORM(void) { /* LPXFORM */ - TEST_TYPE(LPXFORM, 4, 4); - TEST_TYPE_POINTER(LPXFORM, 24, 4); + TEST_TYPE_SIZE (LPXFORM, 4) + TEST_TYPE_ALIGN (LPXFORM, 4) + TEST_TARGET_SIZE (LPXFORM, 24) + TEST_TARGET_ALIGN(LPXFORM, 4) } static void test_pack_MAT2(void) { /* MAT2 (pack 4) */ - TEST_TYPE(MAT2, 16, 2); - TEST_FIELD(MAT2, FIXED, eM11, 0, 4, 2); - TEST_FIELD(MAT2, FIXED, eM12, 4, 4, 2); - TEST_FIELD(MAT2, FIXED, eM21, 8, 4, 2); - TEST_FIELD(MAT2, FIXED, eM22, 12, 4, 2); + 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 (pack 4) */ - TEST_TYPE(METAFILEPICT, 16, 4); - TEST_FIELD(METAFILEPICT, LONG, mm, 0, 4, 4); - TEST_FIELD(METAFILEPICT, LONG, xExt, 4, 4, 4); - TEST_FIELD(METAFILEPICT, LONG, yExt, 8, 4, 4); - TEST_FIELD(METAFILEPICT, HMETAFILE, hMF, 12, 4, 4); + TEST_TYPE_SIZE (METAFILEPICT, 16) + TEST_TYPE_ALIGN (METAFILEPICT, 4) + 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, 4) + TEST_FIELD_ALIGN (METAFILEPICT, hMF, 4) + TEST_FIELD_OFFSET(METAFILEPICT, hMF, 12) } static void test_pack_METAHEADER(void) { /* METAHEADER (pack 2) */ - TEST_TYPE(METAHEADER, 18, 2); - TEST_FIELD(METAHEADER, WORD, mtType, 0, 2, 2); - TEST_FIELD(METAHEADER, WORD, mtHeaderSize, 2, 2, 2); - TEST_FIELD(METAHEADER, WORD, mtVersion, 4, 2, 2); - TEST_FIELD(METAHEADER, DWORD, mtSize, 6, 4, 2); - TEST_FIELD(METAHEADER, WORD, mtNoObjects, 10, 2, 2); - TEST_FIELD(METAHEADER, DWORD, mtMaxRecord, 12, 4, 2); - TEST_FIELD(METAHEADER, WORD, mtNoParameters, 16, 2, 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 (pack 4) */ - TEST_TYPE(METARECORD, 8, 4); - TEST_FIELD(METARECORD, DWORD, rdSize, 0, 4, 4); - TEST_FIELD(METARECORD, WORD, rdFunction, 4, 2, 2); - TEST_FIELD(METARECORD, WORD[1], rdParm, 6, 2, 2); + 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(MFENUMPROC, 4, 4); + TEST_TYPE_SIZE (MFENUMPROC, 4) + TEST_TYPE_ALIGN (MFENUMPROC, 4) } static void test_pack_NEWTEXTMETRICA(void) { /* NEWTEXTMETRICA (pack 4) */ - TEST_TYPE(NEWTEXTMETRICA, 72, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmHeight, 0, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmAscent, 4, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmDescent, 8, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmInternalLeading, 12, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmExternalLeading, 16, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmAveCharWidth, 20, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmMaxCharWidth, 24, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmWeight, 28, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmOverhang, 32, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmDigitizedAspectX, 36, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, LONG, tmDigitizedAspectY, 40, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, BYTE, tmFirstChar, 44, 1, 1); - TEST_FIELD(NEWTEXTMETRICA, BYTE, tmLastChar, 45, 1, 1); - TEST_FIELD(NEWTEXTMETRICA, BYTE, tmDefaultChar, 46, 1, 1); - TEST_FIELD(NEWTEXTMETRICA, BYTE, tmBreakChar, 47, 1, 1); - TEST_FIELD(NEWTEXTMETRICA, BYTE, tmItalic, 48, 1, 1); - TEST_FIELD(NEWTEXTMETRICA, BYTE, tmUnderlined, 49, 1, 1); - TEST_FIELD(NEWTEXTMETRICA, BYTE, tmStruckOut, 50, 1, 1); - TEST_FIELD(NEWTEXTMETRICA, BYTE, tmPitchAndFamily, 51, 1, 1); - TEST_FIELD(NEWTEXTMETRICA, BYTE, tmCharSet, 52, 1, 1); - TEST_FIELD(NEWTEXTMETRICA, DWORD, ntmFlags, 56, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, UINT, ntmSizeEM, 60, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, UINT, ntmCellHeight, 64, 4, 4); - TEST_FIELD(NEWTEXTMETRICA, UINT, ntmAvgWidth, 68, 4, 4); + 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 (pack 4) */ - TEST_TYPE(NEWTEXTMETRICEXA, 96, 4); - TEST_FIELD(NEWTEXTMETRICEXA, NEWTEXTMETRICA, ntmTm, 0, 72, 4); - TEST_FIELD(NEWTEXTMETRICEXA, FONTSIGNATURE, ntmFontSig, 72, 24, 4); + 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 (pack 4) */ - TEST_TYPE(NEWTEXTMETRICEXW, 100, 4); - TEST_FIELD(NEWTEXTMETRICEXW, NEWTEXTMETRICW, ntmTm, 0, 76, 4); - TEST_FIELD(NEWTEXTMETRICEXW, FONTSIGNATURE, ntmFontSig, 76, 24, 4); + 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 (pack 4) */ - TEST_TYPE(NEWTEXTMETRICW, 76, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmHeight, 0, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmAscent, 4, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmDescent, 8, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmInternalLeading, 12, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmExternalLeading, 16, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmAveCharWidth, 20, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmMaxCharWidth, 24, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmWeight, 28, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmOverhang, 32, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmDigitizedAspectX, 36, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, LONG, tmDigitizedAspectY, 40, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, WCHAR, tmFirstChar, 44, 2, 2); - TEST_FIELD(NEWTEXTMETRICW, WCHAR, tmLastChar, 46, 2, 2); - TEST_FIELD(NEWTEXTMETRICW, WCHAR, tmDefaultChar, 48, 2, 2); - TEST_FIELD(NEWTEXTMETRICW, WCHAR, tmBreakChar, 50, 2, 2); - TEST_FIELD(NEWTEXTMETRICW, BYTE, tmItalic, 52, 1, 1); - TEST_FIELD(NEWTEXTMETRICW, BYTE, tmUnderlined, 53, 1, 1); - TEST_FIELD(NEWTEXTMETRICW, BYTE, tmStruckOut, 54, 1, 1); - TEST_FIELD(NEWTEXTMETRICW, BYTE, tmPitchAndFamily, 55, 1, 1); - TEST_FIELD(NEWTEXTMETRICW, BYTE, tmCharSet, 56, 1, 1); - TEST_FIELD(NEWTEXTMETRICW, DWORD, ntmFlags, 60, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, UINT, ntmSizeEM, 64, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, UINT, ntmCellHeight, 68, 4, 4); - TEST_FIELD(NEWTEXTMETRICW, UINT, ntmAvgWidth, 72, 4, 4); + 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(NPEXTLOGPEN, 4, 4); - TEST_TYPE_POINTER(NPEXTLOGPEN, 28, 4); + TEST_TYPE_SIZE (NPEXTLOGPEN, 4) + TEST_TYPE_ALIGN (NPEXTLOGPEN, 4) + TEST_TARGET_SIZE (NPEXTLOGPEN, 28) + TEST_TARGET_ALIGN(NPEXTLOGPEN, 4) } static void test_pack_OLDFONTENUMPROC(void) { /* OLDFONTENUMPROC */ - TEST_TYPE(OLDFONTENUMPROC, 4, 4); + TEST_TYPE_SIZE (OLDFONTENUMPROC, 4) + TEST_TYPE_ALIGN (OLDFONTENUMPROC, 4) } static void test_pack_OLDFONTENUMPROCA(void) { /* OLDFONTENUMPROCA */ - TEST_TYPE(OLDFONTENUMPROCA, 4, 4); + TEST_TYPE_SIZE (OLDFONTENUMPROCA, 4) + TEST_TYPE_ALIGN (OLDFONTENUMPROCA, 4) } static void test_pack_OLDFONTENUMPROCW(void) { /* OLDFONTENUMPROCW */ - TEST_TYPE(OLDFONTENUMPROCW, 4, 4); + TEST_TYPE_SIZE (OLDFONTENUMPROCW, 4) + TEST_TYPE_ALIGN (OLDFONTENUMPROCW, 4) } static void test_pack_OUTLINETEXTMETRICA(void) { /* OUTLINETEXTMETRICA (pack 4) */ - TEST_TYPE(OUTLINETEXTMETRICA, 212, 4); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmSize, 0, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, TEXTMETRICA, otmTextMetrics, 4, 56, 4); - TEST_FIELD(OUTLINETEXTMETRICA, BYTE, otmFiller, 60, 1, 1); - TEST_FIELD(OUTLINETEXTMETRICA, PANOSE, otmPanoseNumber, 61, 10, 1); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmfsSelection, 72, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmfsType, 76, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmsCharSlopeRise, 80, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmsCharSlopeRun, 84, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmItalicAngle, 88, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmEMSquare, 92, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmAscent, 96, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmDescent, 100, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmLineGap, 104, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmsCapEmHeight, 108, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmsXHeight, 112, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, RECT, otmrcFontBox, 116, 16, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmMacAscent, 132, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmMacDescent, 136, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmMacLineGap, 140, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmusMinimumPPEM, 144, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, POINT, otmptSubscriptSize, 148, 8, 4); - TEST_FIELD(OUTLINETEXTMETRICA, POINT, otmptSubscriptOffset, 156, 8, 4); - TEST_FIELD(OUTLINETEXTMETRICA, POINT, otmptSuperscriptSize, 164, 8, 4); - TEST_FIELD(OUTLINETEXTMETRICA, POINT, otmptSuperscriptOffset, 172, 8, 4); - TEST_FIELD(OUTLINETEXTMETRICA, UINT, otmsStrikeoutSize, 180, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmsStrikeoutPosition, 184, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmsUnderscoreSize, 188, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, INT, otmsUnderscorePosition, 192, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, LPSTR, otmpFamilyName, 196, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, LPSTR, otmpFaceName, 200, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, LPSTR, otmpStyleName, 204, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICA, LPSTR, otmpFullName, 208, 4, 4); + TEST_TYPE_SIZE (OUTLINETEXTMETRICA, 212) + TEST_TYPE_ALIGN (OUTLINETEXTMETRICA, 4) + 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, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmpFamilyName, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmpFamilyName, 196) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmpFaceName, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmpFaceName, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmpFaceName, 200) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmpStyleName, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmpStyleName, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmpStyleName, 204) + TEST_FIELD_SIZE (OUTLINETEXTMETRICA, otmpFullName, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICA, otmpFullName, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICA, otmpFullName, 208) } static void test_pack_OUTLINETEXTMETRICW(void) { /* OUTLINETEXTMETRICW (pack 4) */ - TEST_TYPE(OUTLINETEXTMETRICW, 216, 4); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmSize, 0, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, TEXTMETRICW, otmTextMetrics, 4, 60, 4); - TEST_FIELD(OUTLINETEXTMETRICW, BYTE, otmFiller, 64, 1, 1); - TEST_FIELD(OUTLINETEXTMETRICW, PANOSE, otmPanoseNumber, 65, 10, 1); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmfsSelection, 76, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmfsType, 80, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmsCharSlopeRise, 84, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmsCharSlopeRun, 88, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmItalicAngle, 92, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmEMSquare, 96, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmAscent, 100, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmDescent, 104, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmLineGap, 108, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmsCapEmHeight, 112, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmsXHeight, 116, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, RECT, otmrcFontBox, 120, 16, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmMacAscent, 136, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmMacDescent, 140, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmMacLineGap, 144, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmusMinimumPPEM, 148, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, POINT, otmptSubscriptSize, 152, 8, 4); - TEST_FIELD(OUTLINETEXTMETRICW, POINT, otmptSubscriptOffset, 160, 8, 4); - TEST_FIELD(OUTLINETEXTMETRICW, POINT, otmptSuperscriptSize, 168, 8, 4); - TEST_FIELD(OUTLINETEXTMETRICW, POINT, otmptSuperscriptOffset, 176, 8, 4); - TEST_FIELD(OUTLINETEXTMETRICW, UINT, otmsStrikeoutSize, 184, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmsStrikeoutPosition, 188, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmsUnderscoreSize, 192, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, INT, otmsUnderscorePosition, 196, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, LPSTR, otmpFamilyName, 200, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, LPSTR, otmpFaceName, 204, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, LPSTR, otmpStyleName, 208, 4, 4); - TEST_FIELD(OUTLINETEXTMETRICW, LPSTR, otmpFullName, 212, 4, 4); + TEST_TYPE_SIZE (OUTLINETEXTMETRICW, 216) + TEST_TYPE_ALIGN (OUTLINETEXTMETRICW, 4) + 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, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmpFamilyName, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmpFamilyName, 200) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmpFaceName, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmpFaceName, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmpFaceName, 204) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmpStyleName, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmpStyleName, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmpStyleName, 208) + TEST_FIELD_SIZE (OUTLINETEXTMETRICW, otmpFullName, 4) + TEST_FIELD_ALIGN (OUTLINETEXTMETRICW, otmpFullName, 4) + TEST_FIELD_OFFSET(OUTLINETEXTMETRICW, otmpFullName, 212) } static void test_pack_PABC(void) { /* PABC */ - TEST_TYPE(PABC, 4, 4); - TEST_TYPE_POINTER(PABC, 12, 4); + TEST_TYPE_SIZE (PABC, 4) + TEST_TYPE_ALIGN (PABC, 4) + TEST_TARGET_SIZE (PABC, 12) + TEST_TARGET_ALIGN(PABC, 4) } static void test_pack_PABCFLOAT(void) { /* PABCFLOAT */ - TEST_TYPE(PABCFLOAT, 4, 4); - TEST_TYPE_POINTER(PABCFLOAT, 12, 4); + TEST_TYPE_SIZE (PABCFLOAT, 4) + TEST_TYPE_ALIGN (PABCFLOAT, 4) + TEST_TARGET_SIZE (PABCFLOAT, 12) + TEST_TARGET_ALIGN(PABCFLOAT, 4) } static void test_pack_PANOSE(void) { /* PANOSE (pack 4) */ - TEST_TYPE(PANOSE, 10, 1); - TEST_FIELD(PANOSE, BYTE, bFamilyType, 0, 1, 1); - TEST_FIELD(PANOSE, BYTE, bSerifStyle, 1, 1, 1); - TEST_FIELD(PANOSE, BYTE, bWeight, 2, 1, 1); - TEST_FIELD(PANOSE, BYTE, bProportion, 3, 1, 1); - TEST_FIELD(PANOSE, BYTE, bContrast, 4, 1, 1); - TEST_FIELD(PANOSE, BYTE, bStrokeVariation, 5, 1, 1); - TEST_FIELD(PANOSE, BYTE, bArmStyle, 6, 1, 1); - TEST_FIELD(PANOSE, BYTE, bLetterform, 7, 1, 1); - TEST_FIELD(PANOSE, BYTE, bMidline, 8, 1, 1); - TEST_FIELD(PANOSE, BYTE, bXHeight, 9, 1, 1); + 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(PATTERN, 12, 4); + TEST_TYPE_SIZE (PATTERN, 12) + TEST_TYPE_ALIGN (PATTERN, 4) } static void test_pack_PBITMAP(void) { /* PBITMAP */ - TEST_TYPE(PBITMAP, 4, 4); - TEST_TYPE_POINTER(PBITMAP, 24, 4); + TEST_TYPE_SIZE (PBITMAP, 4) + TEST_TYPE_ALIGN (PBITMAP, 4) + TEST_TARGET_SIZE (PBITMAP, 24) + TEST_TARGET_ALIGN(PBITMAP, 4) } static void test_pack_PBITMAPCOREHEADER(void) { /* PBITMAPCOREHEADER */ - TEST_TYPE(PBITMAPCOREHEADER, 4, 4); - TEST_TYPE_POINTER(PBITMAPCOREHEADER, 12, 4); + TEST_TYPE_SIZE (PBITMAPCOREHEADER, 4) + TEST_TYPE_ALIGN (PBITMAPCOREHEADER, 4) + TEST_TARGET_SIZE (PBITMAPCOREHEADER, 12) + TEST_TARGET_ALIGN(PBITMAPCOREHEADER, 4) } static void test_pack_PBITMAPCOREINFO(void) { /* PBITMAPCOREINFO */ - TEST_TYPE(PBITMAPCOREINFO, 4, 4); - TEST_TYPE_POINTER(PBITMAPCOREINFO, 16, 4); + TEST_TYPE_SIZE (PBITMAPCOREINFO, 4) + TEST_TYPE_ALIGN (PBITMAPCOREINFO, 4) + TEST_TARGET_SIZE (PBITMAPCOREINFO, 16) + TEST_TARGET_ALIGN(PBITMAPCOREINFO, 4) } static void test_pack_PBITMAPFILEHEADER(void) { /* PBITMAPFILEHEADER */ - TEST_TYPE(PBITMAPFILEHEADER, 4, 4); - TEST_TYPE_POINTER(PBITMAPFILEHEADER, 14, 2); + TEST_TYPE_SIZE (PBITMAPFILEHEADER, 4) + TEST_TYPE_ALIGN (PBITMAPFILEHEADER, 4) + TEST_TARGET_SIZE (PBITMAPFILEHEADER, 14) + TEST_TARGET_ALIGN(PBITMAPFILEHEADER, 2) } static void test_pack_PBITMAPINFO(void) { /* PBITMAPINFO */ - TEST_TYPE(PBITMAPINFO, 4, 4); - TEST_TYPE_POINTER(PBITMAPINFO, 44, 4); + TEST_TYPE_SIZE (PBITMAPINFO, 4) + TEST_TYPE_ALIGN (PBITMAPINFO, 4) + TEST_TARGET_SIZE (PBITMAPINFO, 44) + TEST_TARGET_ALIGN(PBITMAPINFO, 4) } static void test_pack_PBITMAPINFOHEADER(void) { /* PBITMAPINFOHEADER */ - TEST_TYPE(PBITMAPINFOHEADER, 4, 4); - TEST_TYPE_POINTER(PBITMAPINFOHEADER, 40, 4); + TEST_TYPE_SIZE (PBITMAPINFOHEADER, 4) + TEST_TYPE_ALIGN (PBITMAPINFOHEADER, 4) + TEST_TARGET_SIZE (PBITMAPINFOHEADER, 40) + TEST_TARGET_ALIGN(PBITMAPINFOHEADER, 4) } static void test_pack_PBITMAPV4HEADER(void) { /* PBITMAPV4HEADER */ - TEST_TYPE(PBITMAPV4HEADER, 4, 4); - TEST_TYPE_POINTER(PBITMAPV4HEADER, 108, 4); + TEST_TYPE_SIZE (PBITMAPV4HEADER, 4) + TEST_TYPE_ALIGN (PBITMAPV4HEADER, 4) + TEST_TARGET_SIZE (PBITMAPV4HEADER, 108) + TEST_TARGET_ALIGN(PBITMAPV4HEADER, 4) } static void test_pack_PBITMAPV5HEADER(void) { /* PBITMAPV5HEADER */ - TEST_TYPE(PBITMAPV5HEADER, 4, 4); - TEST_TYPE_POINTER(PBITMAPV5HEADER, 124, 4); + TEST_TYPE_SIZE (PBITMAPV5HEADER, 4) + TEST_TYPE_ALIGN (PBITMAPV5HEADER, 4) + TEST_TARGET_SIZE (PBITMAPV5HEADER, 124) + TEST_TARGET_ALIGN(PBITMAPV5HEADER, 4) } static void test_pack_PBLENDFUNCTION(void) { /* PBLENDFUNCTION */ - TEST_TYPE(PBLENDFUNCTION, 4, 4); - TEST_TYPE_POINTER(PBLENDFUNCTION, 4, 1); + TEST_TYPE_SIZE (PBLENDFUNCTION, 4) + TEST_TYPE_ALIGN (PBLENDFUNCTION, 4) + TEST_TARGET_SIZE (PBLENDFUNCTION, 4) + TEST_TARGET_ALIGN(PBLENDFUNCTION, 1) } static void test_pack_PCHARSETINFO(void) { /* PCHARSETINFO */ - TEST_TYPE(PCHARSETINFO, 4, 4); - TEST_TYPE_POINTER(PCHARSETINFO, 32, 4); + TEST_TYPE_SIZE (PCHARSETINFO, 4) + TEST_TYPE_ALIGN (PCHARSETINFO, 4) + TEST_TARGET_SIZE (PCHARSETINFO, 32) + TEST_TARGET_ALIGN(PCHARSETINFO, 4) } static void test_pack_PCOLORADJUSTMENT(void) { /* PCOLORADJUSTMENT */ - TEST_TYPE(PCOLORADJUSTMENT, 4, 4); - TEST_TYPE_POINTER(PCOLORADJUSTMENT, 24, 2); + TEST_TYPE_SIZE (PCOLORADJUSTMENT, 4) + TEST_TYPE_ALIGN (PCOLORADJUSTMENT, 4) + TEST_TARGET_SIZE (PCOLORADJUSTMENT, 24) + TEST_TARGET_ALIGN(PCOLORADJUSTMENT, 2) } static void test_pack_PDEVMODEA(void) { /* PDEVMODEA */ - TEST_TYPE(PDEVMODEA, 4, 4); + TEST_TYPE_SIZE (PDEVMODEA, 4) + TEST_TYPE_ALIGN (PDEVMODEA, 4) } static void test_pack_PDEVMODEW(void) { /* PDEVMODEW */ - TEST_TYPE(PDEVMODEW, 4, 4); + TEST_TYPE_SIZE (PDEVMODEW, 4) + TEST_TYPE_ALIGN (PDEVMODEW, 4) } static void test_pack_PDIBSECTION(void) { /* PDIBSECTION */ - TEST_TYPE(PDIBSECTION, 4, 4); - TEST_TYPE_POINTER(PDIBSECTION, 84, 4); + TEST_TYPE_SIZE (PDIBSECTION, 4) + TEST_TYPE_ALIGN (PDIBSECTION, 4) + TEST_TARGET_SIZE (PDIBSECTION, 84) + TEST_TARGET_ALIGN(PDIBSECTION, 4) } static void test_pack_PDISPLAY_DEVICEA(void) { /* PDISPLAY_DEVICEA */ - TEST_TYPE(PDISPLAY_DEVICEA, 4, 4); - TEST_TYPE_POINTER(PDISPLAY_DEVICEA, 424, 4); + TEST_TYPE_SIZE (PDISPLAY_DEVICEA, 4) + TEST_TYPE_ALIGN (PDISPLAY_DEVICEA, 4) + TEST_TARGET_SIZE (PDISPLAY_DEVICEA, 424) + TEST_TARGET_ALIGN(PDISPLAY_DEVICEA, 4) } static void test_pack_PDISPLAY_DEVICEW(void) { /* PDISPLAY_DEVICEW */ - TEST_TYPE(PDISPLAY_DEVICEW, 4, 4); - TEST_TYPE_POINTER(PDISPLAY_DEVICEW, 840, 4); + TEST_TYPE_SIZE (PDISPLAY_DEVICEW, 4) + TEST_TYPE_ALIGN (PDISPLAY_DEVICEW, 4) + TEST_TARGET_SIZE (PDISPLAY_DEVICEW, 840) + TEST_TARGET_ALIGN(PDISPLAY_DEVICEW, 4) } static void test_pack_PELARRAY(void) { /* PELARRAY (pack 4) */ - TEST_TYPE(PELARRAY, 20, 4); - TEST_FIELD(PELARRAY, LONG, paXCount, 0, 4, 4); - TEST_FIELD(PELARRAY, LONG, paYCount, 4, 4, 4); - TEST_FIELD(PELARRAY, LONG, paXExt, 8, 4, 4); - TEST_FIELD(PELARRAY, LONG, paYExt, 12, 4, 4); - TEST_FIELD(PELARRAY, BYTE, paRGBs, 16, 1, 1); + 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(PEMR, 4, 4); - TEST_TYPE_POINTER(PEMR, 8, 4); + TEST_TYPE_SIZE (PEMR, 4) + TEST_TYPE_ALIGN (PEMR, 4) + TEST_TARGET_SIZE (PEMR, 8) + TEST_TARGET_ALIGN(PEMR, 4) } static void test_pack_PEMRABORTPATH(void) { /* PEMRABORTPATH */ - TEST_TYPE(PEMRABORTPATH, 4, 4); - TEST_TYPE_POINTER(PEMRABORTPATH, 8, 4); + TEST_TYPE_SIZE (PEMRABORTPATH, 4) + TEST_TYPE_ALIGN (PEMRABORTPATH, 4) + TEST_TARGET_SIZE (PEMRABORTPATH, 8) + TEST_TARGET_ALIGN(PEMRABORTPATH, 4) } static void test_pack_PEMRANGLEARC(void) { /* PEMRANGLEARC */ - TEST_TYPE(PEMRANGLEARC, 4, 4); - TEST_TYPE_POINTER(PEMRANGLEARC, 28, 4); + TEST_TYPE_SIZE (PEMRANGLEARC, 4) + TEST_TYPE_ALIGN (PEMRANGLEARC, 4) + TEST_TARGET_SIZE (PEMRANGLEARC, 28) + TEST_TARGET_ALIGN(PEMRANGLEARC, 4) } static void test_pack_PEMRARC(void) { /* PEMRARC */ - TEST_TYPE(PEMRARC, 4, 4); - TEST_TYPE_POINTER(PEMRARC, 40, 4); + TEST_TYPE_SIZE (PEMRARC, 4) + TEST_TYPE_ALIGN (PEMRARC, 4) + TEST_TARGET_SIZE (PEMRARC, 40) + TEST_TARGET_ALIGN(PEMRARC, 4) } static void test_pack_PEMRARCTO(void) { /* PEMRARCTO */ - TEST_TYPE(PEMRARCTO, 4, 4); - TEST_TYPE_POINTER(PEMRARCTO, 40, 4); + TEST_TYPE_SIZE (PEMRARCTO, 4) + TEST_TYPE_ALIGN (PEMRARCTO, 4) + TEST_TARGET_SIZE (PEMRARCTO, 40) + TEST_TARGET_ALIGN(PEMRARCTO, 4) } static void test_pack_PEMRBEGINPATH(void) { /* PEMRBEGINPATH */ - TEST_TYPE(PEMRBEGINPATH, 4, 4); - TEST_TYPE_POINTER(PEMRBEGINPATH, 8, 4); + TEST_TYPE_SIZE (PEMRBEGINPATH, 4) + TEST_TYPE_ALIGN (PEMRBEGINPATH, 4) + TEST_TARGET_SIZE (PEMRBEGINPATH, 8) + TEST_TARGET_ALIGN(PEMRBEGINPATH, 4) } static void test_pack_PEMRBITBLT(void) { /* PEMRBITBLT */ - TEST_TYPE(PEMRBITBLT, 4, 4); - TEST_TYPE_POINTER(PEMRBITBLT, 100, 4); + TEST_TYPE_SIZE (PEMRBITBLT, 4) + TEST_TYPE_ALIGN (PEMRBITBLT, 4) + TEST_TARGET_SIZE (PEMRBITBLT, 100) + TEST_TARGET_ALIGN(PEMRBITBLT, 4) } static void test_pack_PEMRCHORD(void) { /* PEMRCHORD */ - TEST_TYPE(PEMRCHORD, 4, 4); - TEST_TYPE_POINTER(PEMRCHORD, 40, 4); + TEST_TYPE_SIZE (PEMRCHORD, 4) + TEST_TYPE_ALIGN (PEMRCHORD, 4) + TEST_TARGET_SIZE (PEMRCHORD, 40) + TEST_TARGET_ALIGN(PEMRCHORD, 4) } static void test_pack_PEMRCLOSEFIGURE(void) { /* PEMRCLOSEFIGURE */ - TEST_TYPE(PEMRCLOSEFIGURE, 4, 4); - TEST_TYPE_POINTER(PEMRCLOSEFIGURE, 8, 4); + TEST_TYPE_SIZE (PEMRCLOSEFIGURE, 4) + TEST_TYPE_ALIGN (PEMRCLOSEFIGURE, 4) + TEST_TARGET_SIZE (PEMRCLOSEFIGURE, 8) + TEST_TARGET_ALIGN(PEMRCLOSEFIGURE, 4) } static void test_pack_PEMRCREATEBRUSHINDIRECT(void) { /* PEMRCREATEBRUSHINDIRECT */ - TEST_TYPE(PEMRCREATEBRUSHINDIRECT, 4, 4); - TEST_TYPE_POINTER(PEMRCREATEBRUSHINDIRECT, 24, 4); + TEST_TYPE_SIZE (PEMRCREATEBRUSHINDIRECT, 4) + TEST_TYPE_ALIGN (PEMRCREATEBRUSHINDIRECT, 4) + TEST_TARGET_SIZE (PEMRCREATEBRUSHINDIRECT, 24) + TEST_TARGET_ALIGN(PEMRCREATEBRUSHINDIRECT, 4) } static void test_pack_PEMRCREATECOLORSPACE(void) { /* PEMRCREATECOLORSPACE */ - TEST_TYPE(PEMRCREATECOLORSPACE, 4, 4); - TEST_TYPE_POINTER(PEMRCREATECOLORSPACE, 340, 4); + TEST_TYPE_SIZE (PEMRCREATECOLORSPACE, 4) + TEST_TYPE_ALIGN (PEMRCREATECOLORSPACE, 4) + TEST_TARGET_SIZE (PEMRCREATECOLORSPACE, 340) + TEST_TARGET_ALIGN(PEMRCREATECOLORSPACE, 4) } static void test_pack_PEMRCREATECOLORSPACEW(void) { /* PEMRCREATECOLORSPACEW */ - TEST_TYPE(PEMRCREATECOLORSPACEW, 4, 4); - TEST_TYPE_POINTER(PEMRCREATECOLORSPACEW, 612, 4); + TEST_TYPE_SIZE (PEMRCREATECOLORSPACEW, 4) + TEST_TYPE_ALIGN (PEMRCREATECOLORSPACEW, 4) + TEST_TARGET_SIZE (PEMRCREATECOLORSPACEW, 612) + TEST_TARGET_ALIGN(PEMRCREATECOLORSPACEW, 4) } static void test_pack_PEMRCREATEDIBPATTERNBRUSHPT(void) { /* PEMRCREATEDIBPATTERNBRUSHPT */ - TEST_TYPE(PEMRCREATEDIBPATTERNBRUSHPT, 4, 4); - TEST_TYPE_POINTER(PEMRCREATEDIBPATTERNBRUSHPT, 32, 4); + TEST_TYPE_SIZE (PEMRCREATEDIBPATTERNBRUSHPT, 4) + TEST_TYPE_ALIGN (PEMRCREATEDIBPATTERNBRUSHPT, 4) + TEST_TARGET_SIZE (PEMRCREATEDIBPATTERNBRUSHPT, 32) + TEST_TARGET_ALIGN(PEMRCREATEDIBPATTERNBRUSHPT, 4) } static void test_pack_PEMRCREATEMONOBRUSH(void) { /* PEMRCREATEMONOBRUSH */ - TEST_TYPE(PEMRCREATEMONOBRUSH, 4, 4); - TEST_TYPE_POINTER(PEMRCREATEMONOBRUSH, 32, 4); + TEST_TYPE_SIZE (PEMRCREATEMONOBRUSH, 4) + TEST_TYPE_ALIGN (PEMRCREATEMONOBRUSH, 4) + TEST_TARGET_SIZE (PEMRCREATEMONOBRUSH, 32) + TEST_TARGET_ALIGN(PEMRCREATEMONOBRUSH, 4) } static void test_pack_PEMRCREATEPALETTE(void) { /* PEMRCREATEPALETTE */ - TEST_TYPE(PEMRCREATEPALETTE, 4, 4); - TEST_TYPE_POINTER(PEMRCREATEPALETTE, 20, 4); + TEST_TYPE_SIZE (PEMRCREATEPALETTE, 4) + TEST_TYPE_ALIGN (PEMRCREATEPALETTE, 4) + TEST_TARGET_SIZE (PEMRCREATEPALETTE, 20) + TEST_TARGET_ALIGN(PEMRCREATEPALETTE, 4) } static void test_pack_PEMRCREATEPEN(void) { /* PEMRCREATEPEN */ - TEST_TYPE(PEMRCREATEPEN, 4, 4); - TEST_TYPE_POINTER(PEMRCREATEPEN, 28, 4); + TEST_TYPE_SIZE (PEMRCREATEPEN, 4) + TEST_TYPE_ALIGN (PEMRCREATEPEN, 4) + TEST_TARGET_SIZE (PEMRCREATEPEN, 28) + TEST_TARGET_ALIGN(PEMRCREATEPEN, 4) } static void test_pack_PEMRDELETECOLORSPACE(void) { /* PEMRDELETECOLORSPACE */ - TEST_TYPE(PEMRDELETECOLORSPACE, 4, 4); - TEST_TYPE_POINTER(PEMRDELETECOLORSPACE, 12, 4); + TEST_TYPE_SIZE (PEMRDELETECOLORSPACE, 4) + TEST_TYPE_ALIGN (PEMRDELETECOLORSPACE, 4) + TEST_TARGET_SIZE (PEMRDELETECOLORSPACE, 12) + TEST_TARGET_ALIGN(PEMRDELETECOLORSPACE, 4) } static void test_pack_PEMRDELETEOBJECT(void) { /* PEMRDELETEOBJECT */ - TEST_TYPE(PEMRDELETEOBJECT, 4, 4); - TEST_TYPE_POINTER(PEMRDELETEOBJECT, 12, 4); + TEST_TYPE_SIZE (PEMRDELETEOBJECT, 4) + TEST_TYPE_ALIGN (PEMRDELETEOBJECT, 4) + TEST_TARGET_SIZE (PEMRDELETEOBJECT, 12) + TEST_TARGET_ALIGN(PEMRDELETEOBJECT, 4) } static void test_pack_PEMRELLIPSE(void) { /* PEMRELLIPSE */ - TEST_TYPE(PEMRELLIPSE, 4, 4); - TEST_TYPE_POINTER(PEMRELLIPSE, 24, 4); + TEST_TYPE_SIZE (PEMRELLIPSE, 4) + TEST_TYPE_ALIGN (PEMRELLIPSE, 4) + TEST_TARGET_SIZE (PEMRELLIPSE, 24) + TEST_TARGET_ALIGN(PEMRELLIPSE, 4) } static void test_pack_PEMRENDPATH(void) { /* PEMRENDPATH */ - TEST_TYPE(PEMRENDPATH, 4, 4); - TEST_TYPE_POINTER(PEMRENDPATH, 8, 4); + TEST_TYPE_SIZE (PEMRENDPATH, 4) + TEST_TYPE_ALIGN (PEMRENDPATH, 4) + TEST_TARGET_SIZE (PEMRENDPATH, 8) + TEST_TARGET_ALIGN(PEMRENDPATH, 4) } static void test_pack_PEMREOF(void) { /* PEMREOF */ - TEST_TYPE(PEMREOF, 4, 4); - TEST_TYPE_POINTER(PEMREOF, 20, 4); + TEST_TYPE_SIZE (PEMREOF, 4) + TEST_TYPE_ALIGN (PEMREOF, 4) + TEST_TARGET_SIZE (PEMREOF, 20) + TEST_TARGET_ALIGN(PEMREOF, 4) } static void test_pack_PEMREXCLUDECLIPRECT(void) { /* PEMREXCLUDECLIPRECT */ - TEST_TYPE(PEMREXCLUDECLIPRECT, 4, 4); - TEST_TYPE_POINTER(PEMREXCLUDECLIPRECT, 24, 4); + TEST_TYPE_SIZE (PEMREXCLUDECLIPRECT, 4) + TEST_TYPE_ALIGN (PEMREXCLUDECLIPRECT, 4) + TEST_TARGET_SIZE (PEMREXCLUDECLIPRECT, 24) + TEST_TARGET_ALIGN(PEMREXCLUDECLIPRECT, 4) } static void test_pack_PEMREXTCREATEFONTINDIRECTW(void) { /* PEMREXTCREATEFONTINDIRECTW */ - TEST_TYPE(PEMREXTCREATEFONTINDIRECTW, 4, 4); - TEST_TYPE_POINTER(PEMREXTCREATEFONTINDIRECTW, 332, 4); + TEST_TYPE_SIZE (PEMREXTCREATEFONTINDIRECTW, 4) + TEST_TYPE_ALIGN (PEMREXTCREATEFONTINDIRECTW, 4) + TEST_TARGET_SIZE (PEMREXTCREATEFONTINDIRECTW, 332) + TEST_TARGET_ALIGN(PEMREXTCREATEFONTINDIRECTW, 4) } static void test_pack_PEMREXTCREATEPEN(void) { /* PEMREXTCREATEPEN */ - TEST_TYPE(PEMREXTCREATEPEN, 4, 4); - TEST_TYPE_POINTER(PEMREXTCREATEPEN, 56, 4); + TEST_TYPE_SIZE (PEMREXTCREATEPEN, 4) + TEST_TYPE_ALIGN (PEMREXTCREATEPEN, 4) + TEST_TARGET_SIZE (PEMREXTCREATEPEN, 56) + TEST_TARGET_ALIGN(PEMREXTCREATEPEN, 4) } static void test_pack_PEMREXTFLOODFILL(void) { /* PEMREXTFLOODFILL */ - TEST_TYPE(PEMREXTFLOODFILL, 4, 4); - TEST_TYPE_POINTER(PEMREXTFLOODFILL, 24, 4); + TEST_TYPE_SIZE (PEMREXTFLOODFILL, 4) + TEST_TYPE_ALIGN (PEMREXTFLOODFILL, 4) + TEST_TARGET_SIZE (PEMREXTFLOODFILL, 24) + TEST_TARGET_ALIGN(PEMREXTFLOODFILL, 4) } static void test_pack_PEMREXTSELECTCLIPRGN(void) { /* PEMREXTSELECTCLIPRGN */ - TEST_TYPE(PEMREXTSELECTCLIPRGN, 4, 4); - TEST_TYPE_POINTER(PEMREXTSELECTCLIPRGN, 20, 4); + TEST_TYPE_SIZE (PEMREXTSELECTCLIPRGN, 4) + TEST_TYPE_ALIGN (PEMREXTSELECTCLIPRGN, 4) + TEST_TARGET_SIZE (PEMREXTSELECTCLIPRGN, 20) + TEST_TARGET_ALIGN(PEMREXTSELECTCLIPRGN, 4) } static void test_pack_PEMREXTTEXTOUTA(void) { /* PEMREXTTEXTOUTA */ - TEST_TYPE(PEMREXTTEXTOUTA, 4, 4); - TEST_TYPE_POINTER(PEMREXTTEXTOUTA, 76, 4); + TEST_TYPE_SIZE (PEMREXTTEXTOUTA, 4) + TEST_TYPE_ALIGN (PEMREXTTEXTOUTA, 4) + TEST_TARGET_SIZE (PEMREXTTEXTOUTA, 76) + TEST_TARGET_ALIGN(PEMREXTTEXTOUTA, 4) } static void test_pack_PEMREXTTEXTOUTW(void) { /* PEMREXTTEXTOUTW */ - TEST_TYPE(PEMREXTTEXTOUTW, 4, 4); - TEST_TYPE_POINTER(PEMREXTTEXTOUTW, 76, 4); + TEST_TYPE_SIZE (PEMREXTTEXTOUTW, 4) + TEST_TYPE_ALIGN (PEMREXTTEXTOUTW, 4) + TEST_TARGET_SIZE (PEMREXTTEXTOUTW, 76) + TEST_TARGET_ALIGN(PEMREXTTEXTOUTW, 4) } static void test_pack_PEMRFILLPATH(void) { /* PEMRFILLPATH */ - TEST_TYPE(PEMRFILLPATH, 4, 4); - TEST_TYPE_POINTER(PEMRFILLPATH, 24, 4); + TEST_TYPE_SIZE (PEMRFILLPATH, 4) + TEST_TYPE_ALIGN (PEMRFILLPATH, 4) + TEST_TARGET_SIZE (PEMRFILLPATH, 24) + TEST_TARGET_ALIGN(PEMRFILLPATH, 4) } static void test_pack_PEMRFILLRGN(void) { /* PEMRFILLRGN */ - TEST_TYPE(PEMRFILLRGN, 4, 4); - TEST_TYPE_POINTER(PEMRFILLRGN, 36, 4); + TEST_TYPE_SIZE (PEMRFILLRGN, 4) + TEST_TYPE_ALIGN (PEMRFILLRGN, 4) + TEST_TARGET_SIZE (PEMRFILLRGN, 36) + TEST_TARGET_ALIGN(PEMRFILLRGN, 4) } static void test_pack_PEMRFLATTENPATH(void) { /* PEMRFLATTENPATH */ - TEST_TYPE(PEMRFLATTENPATH, 4, 4); - TEST_TYPE_POINTER(PEMRFLATTENPATH, 8, 4); + TEST_TYPE_SIZE (PEMRFLATTENPATH, 4) + TEST_TYPE_ALIGN (PEMRFLATTENPATH, 4) + TEST_TARGET_SIZE (PEMRFLATTENPATH, 8) + TEST_TARGET_ALIGN(PEMRFLATTENPATH, 4) } static void test_pack_PEMRFORMAT(void) { /* PEMRFORMAT */ - TEST_TYPE(PEMRFORMAT, 4, 4); - TEST_TYPE_POINTER(PEMRFORMAT, 16, 4); + TEST_TYPE_SIZE (PEMRFORMAT, 4) + TEST_TYPE_ALIGN (PEMRFORMAT, 4) + TEST_TARGET_SIZE (PEMRFORMAT, 16) + TEST_TARGET_ALIGN(PEMRFORMAT, 4) } static void test_pack_PEMRFRAMERGN(void) { /* PEMRFRAMERGN */ - TEST_TYPE(PEMRFRAMERGN, 4, 4); - TEST_TYPE_POINTER(PEMRFRAMERGN, 44, 4); + TEST_TYPE_SIZE (PEMRFRAMERGN, 4) + TEST_TYPE_ALIGN (PEMRFRAMERGN, 4) + TEST_TARGET_SIZE (PEMRFRAMERGN, 44) + TEST_TARGET_ALIGN(PEMRFRAMERGN, 4) } static void test_pack_PEMRGDICOMMENT(void) { /* PEMRGDICOMMENT */ - TEST_TYPE(PEMRGDICOMMENT, 4, 4); - TEST_TYPE_POINTER(PEMRGDICOMMENT, 16, 4); + TEST_TYPE_SIZE (PEMRGDICOMMENT, 4) + TEST_TYPE_ALIGN (PEMRGDICOMMENT, 4) + TEST_TARGET_SIZE (PEMRGDICOMMENT, 16) + TEST_TARGET_ALIGN(PEMRGDICOMMENT, 4) } static void test_pack_PEMRGLSBOUNDEDRECORD(void) { /* PEMRGLSBOUNDEDRECORD */ - TEST_TYPE(PEMRGLSBOUNDEDRECORD, 4, 4); - TEST_TYPE_POINTER(PEMRGLSBOUNDEDRECORD, 32, 4); + TEST_TYPE_SIZE (PEMRGLSBOUNDEDRECORD, 4) + TEST_TYPE_ALIGN (PEMRGLSBOUNDEDRECORD, 4) + TEST_TARGET_SIZE (PEMRGLSBOUNDEDRECORD, 32) + TEST_TARGET_ALIGN(PEMRGLSBOUNDEDRECORD, 4) } static void test_pack_PEMRGLSRECORD(void) { /* PEMRGLSRECORD */ - TEST_TYPE(PEMRGLSRECORD, 4, 4); - TEST_TYPE_POINTER(PEMRGLSRECORD, 16, 4); + TEST_TYPE_SIZE (PEMRGLSRECORD, 4) + TEST_TYPE_ALIGN (PEMRGLSRECORD, 4) + TEST_TARGET_SIZE (PEMRGLSRECORD, 16) + TEST_TARGET_ALIGN(PEMRGLSRECORD, 4) } static void test_pack_PEMRINTERSECTCLIPRECT(void) { /* PEMRINTERSECTCLIPRECT */ - TEST_TYPE(PEMRINTERSECTCLIPRECT, 4, 4); - TEST_TYPE_POINTER(PEMRINTERSECTCLIPRECT, 24, 4); + TEST_TYPE_SIZE (PEMRINTERSECTCLIPRECT, 4) + TEST_TYPE_ALIGN (PEMRINTERSECTCLIPRECT, 4) + TEST_TARGET_SIZE (PEMRINTERSECTCLIPRECT, 24) + TEST_TARGET_ALIGN(PEMRINTERSECTCLIPRECT, 4) } static void test_pack_PEMRINVERTRGN(void) { /* PEMRINVERTRGN */ - TEST_TYPE(PEMRINVERTRGN, 4, 4); - TEST_TYPE_POINTER(PEMRINVERTRGN, 32, 4); + TEST_TYPE_SIZE (PEMRINVERTRGN, 4) + TEST_TYPE_ALIGN (PEMRINVERTRGN, 4) + TEST_TARGET_SIZE (PEMRINVERTRGN, 32) + TEST_TARGET_ALIGN(PEMRINVERTRGN, 4) } static void test_pack_PEMRLINETO(void) { /* PEMRLINETO */ - TEST_TYPE(PEMRLINETO, 4, 4); - TEST_TYPE_POINTER(PEMRLINETO, 16, 4); + TEST_TYPE_SIZE (PEMRLINETO, 4) + TEST_TYPE_ALIGN (PEMRLINETO, 4) + TEST_TARGET_SIZE (PEMRLINETO, 16) + TEST_TARGET_ALIGN(PEMRLINETO, 4) } static void test_pack_PEMRMASKBLT(void) { /* PEMRMASKBLT */ - TEST_TYPE(PEMRMASKBLT, 4, 4); - TEST_TYPE_POINTER(PEMRMASKBLT, 128, 4); + TEST_TYPE_SIZE (PEMRMASKBLT, 4) + TEST_TYPE_ALIGN (PEMRMASKBLT, 4) + TEST_TARGET_SIZE (PEMRMASKBLT, 128) + TEST_TARGET_ALIGN(PEMRMASKBLT, 4) } static void test_pack_PEMRMODIFYWORLDTRANSFORM(void) { /* PEMRMODIFYWORLDTRANSFORM */ - TEST_TYPE(PEMRMODIFYWORLDTRANSFORM, 4, 4); - TEST_TYPE_POINTER(PEMRMODIFYWORLDTRANSFORM, 36, 4); + TEST_TYPE_SIZE (PEMRMODIFYWORLDTRANSFORM, 4) + TEST_TYPE_ALIGN (PEMRMODIFYWORLDTRANSFORM, 4) + TEST_TARGET_SIZE (PEMRMODIFYWORLDTRANSFORM, 36) + TEST_TARGET_ALIGN(PEMRMODIFYWORLDTRANSFORM, 4) } static void test_pack_PEMRMOVETOEX(void) { /* PEMRMOVETOEX */ - TEST_TYPE(PEMRMOVETOEX, 4, 4); - TEST_TYPE_POINTER(PEMRMOVETOEX, 16, 4); + TEST_TYPE_SIZE (PEMRMOVETOEX, 4) + TEST_TYPE_ALIGN (PEMRMOVETOEX, 4) + TEST_TARGET_SIZE (PEMRMOVETOEX, 16) + TEST_TARGET_ALIGN(PEMRMOVETOEX, 4) } static void test_pack_PEMROFFSETCLIPRGN(void) { /* PEMROFFSETCLIPRGN */ - TEST_TYPE(PEMROFFSETCLIPRGN, 4, 4); - TEST_TYPE_POINTER(PEMROFFSETCLIPRGN, 16, 4); + TEST_TYPE_SIZE (PEMROFFSETCLIPRGN, 4) + TEST_TYPE_ALIGN (PEMROFFSETCLIPRGN, 4) + TEST_TARGET_SIZE (PEMROFFSETCLIPRGN, 16) + TEST_TARGET_ALIGN(PEMROFFSETCLIPRGN, 4) } static void test_pack_PEMRPAINTRGN(void) { /* PEMRPAINTRGN */ - TEST_TYPE(PEMRPAINTRGN, 4, 4); - TEST_TYPE_POINTER(PEMRPAINTRGN, 32, 4); + TEST_TYPE_SIZE (PEMRPAINTRGN, 4) + TEST_TYPE_ALIGN (PEMRPAINTRGN, 4) + TEST_TARGET_SIZE (PEMRPAINTRGN, 32) + TEST_TARGET_ALIGN(PEMRPAINTRGN, 4) } static void test_pack_PEMRPIE(void) { /* PEMRPIE */ - TEST_TYPE(PEMRPIE, 4, 4); - TEST_TYPE_POINTER(PEMRPIE, 40, 4); + TEST_TYPE_SIZE (PEMRPIE, 4) + TEST_TYPE_ALIGN (PEMRPIE, 4) + TEST_TARGET_SIZE (PEMRPIE, 40) + TEST_TARGET_ALIGN(PEMRPIE, 4) } static void test_pack_PEMRPIXELFORMAT(void) { /* PEMRPIXELFORMAT */ - TEST_TYPE(PEMRPIXELFORMAT, 4, 4); - TEST_TYPE_POINTER(PEMRPIXELFORMAT, 48, 4); + TEST_TYPE_SIZE (PEMRPIXELFORMAT, 4) + TEST_TYPE_ALIGN (PEMRPIXELFORMAT, 4) + TEST_TARGET_SIZE (PEMRPIXELFORMAT, 48) + TEST_TARGET_ALIGN(PEMRPIXELFORMAT, 4) } static void test_pack_PEMRPLGBLT(void) { /* PEMRPLGBLT */ - TEST_TYPE(PEMRPLGBLT, 4, 4); - TEST_TYPE_POINTER(PEMRPLGBLT, 140, 4); + TEST_TYPE_SIZE (PEMRPLGBLT, 4) + TEST_TYPE_ALIGN (PEMRPLGBLT, 4) + TEST_TARGET_SIZE (PEMRPLGBLT, 140) + TEST_TARGET_ALIGN(PEMRPLGBLT, 4) } static void test_pack_PEMRPOLYBEZIER(void) { /* PEMRPOLYBEZIER */ - TEST_TYPE(PEMRPOLYBEZIER, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYBEZIER, 36, 4); + TEST_TYPE_SIZE (PEMRPOLYBEZIER, 4) + TEST_TYPE_ALIGN (PEMRPOLYBEZIER, 4) + TEST_TARGET_SIZE (PEMRPOLYBEZIER, 36) + TEST_TARGET_ALIGN(PEMRPOLYBEZIER, 4) } static void test_pack_PEMRPOLYBEZIER16(void) { /* PEMRPOLYBEZIER16 */ - TEST_TYPE(PEMRPOLYBEZIER16, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYBEZIER16, 32, 4); + TEST_TYPE_SIZE (PEMRPOLYBEZIER16, 4) + TEST_TYPE_ALIGN (PEMRPOLYBEZIER16, 4) + TEST_TARGET_SIZE (PEMRPOLYBEZIER16, 32) + TEST_TARGET_ALIGN(PEMRPOLYBEZIER16, 4) } static void test_pack_PEMRPOLYBEZIERTO(void) { /* PEMRPOLYBEZIERTO */ - TEST_TYPE(PEMRPOLYBEZIERTO, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYBEZIERTO, 36, 4); + TEST_TYPE_SIZE (PEMRPOLYBEZIERTO, 4) + TEST_TYPE_ALIGN (PEMRPOLYBEZIERTO, 4) + TEST_TARGET_SIZE (PEMRPOLYBEZIERTO, 36) + TEST_TARGET_ALIGN(PEMRPOLYBEZIERTO, 4) } static void test_pack_PEMRPOLYBEZIERTO16(void) { /* PEMRPOLYBEZIERTO16 */ - TEST_TYPE(PEMRPOLYBEZIERTO16, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYBEZIERTO16, 32, 4); + TEST_TYPE_SIZE (PEMRPOLYBEZIERTO16, 4) + TEST_TYPE_ALIGN (PEMRPOLYBEZIERTO16, 4) + TEST_TARGET_SIZE (PEMRPOLYBEZIERTO16, 32) + TEST_TARGET_ALIGN(PEMRPOLYBEZIERTO16, 4) } static void test_pack_PEMRPOLYDRAW(void) { /* PEMRPOLYDRAW */ - TEST_TYPE(PEMRPOLYDRAW, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYDRAW, 40, 4); + TEST_TYPE_SIZE (PEMRPOLYDRAW, 4) + TEST_TYPE_ALIGN (PEMRPOLYDRAW, 4) + TEST_TARGET_SIZE (PEMRPOLYDRAW, 40) + TEST_TARGET_ALIGN(PEMRPOLYDRAW, 4) } static void test_pack_PEMRPOLYDRAW16(void) { /* PEMRPOLYDRAW16 */ - TEST_TYPE(PEMRPOLYDRAW16, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYDRAW16, 36, 4); + TEST_TYPE_SIZE (PEMRPOLYDRAW16, 4) + TEST_TYPE_ALIGN (PEMRPOLYDRAW16, 4) + TEST_TARGET_SIZE (PEMRPOLYDRAW16, 36) + TEST_TARGET_ALIGN(PEMRPOLYDRAW16, 4) } static void test_pack_PEMRPOLYGON(void) { /* PEMRPOLYGON */ - TEST_TYPE(PEMRPOLYGON, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYGON, 36, 4); + TEST_TYPE_SIZE (PEMRPOLYGON, 4) + TEST_TYPE_ALIGN (PEMRPOLYGON, 4) + TEST_TARGET_SIZE (PEMRPOLYGON, 36) + TEST_TARGET_ALIGN(PEMRPOLYGON, 4) } static void test_pack_PEMRPOLYGON16(void) { /* PEMRPOLYGON16 */ - TEST_TYPE(PEMRPOLYGON16, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYGON16, 32, 4); + TEST_TYPE_SIZE (PEMRPOLYGON16, 4) + TEST_TYPE_ALIGN (PEMRPOLYGON16, 4) + TEST_TARGET_SIZE (PEMRPOLYGON16, 32) + TEST_TARGET_ALIGN(PEMRPOLYGON16, 4) } static void test_pack_PEMRPOLYLINE(void) { /* PEMRPOLYLINE */ - TEST_TYPE(PEMRPOLYLINE, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYLINE, 36, 4); + TEST_TYPE_SIZE (PEMRPOLYLINE, 4) + TEST_TYPE_ALIGN (PEMRPOLYLINE, 4) + TEST_TARGET_SIZE (PEMRPOLYLINE, 36) + TEST_TARGET_ALIGN(PEMRPOLYLINE, 4) } static void test_pack_PEMRPOLYLINE16(void) { /* PEMRPOLYLINE16 */ - TEST_TYPE(PEMRPOLYLINE16, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYLINE16, 32, 4); + TEST_TYPE_SIZE (PEMRPOLYLINE16, 4) + TEST_TYPE_ALIGN (PEMRPOLYLINE16, 4) + TEST_TARGET_SIZE (PEMRPOLYLINE16, 32) + TEST_TARGET_ALIGN(PEMRPOLYLINE16, 4) } static void test_pack_PEMRPOLYLINETO(void) { /* PEMRPOLYLINETO */ - TEST_TYPE(PEMRPOLYLINETO, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYLINETO, 36, 4); + TEST_TYPE_SIZE (PEMRPOLYLINETO, 4) + TEST_TYPE_ALIGN (PEMRPOLYLINETO, 4) + TEST_TARGET_SIZE (PEMRPOLYLINETO, 36) + TEST_TARGET_ALIGN(PEMRPOLYLINETO, 4) } static void test_pack_PEMRPOLYLINETO16(void) { /* PEMRPOLYLINETO16 */ - TEST_TYPE(PEMRPOLYLINETO16, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYLINETO16, 32, 4); + TEST_TYPE_SIZE (PEMRPOLYLINETO16, 4) + TEST_TYPE_ALIGN (PEMRPOLYLINETO16, 4) + TEST_TARGET_SIZE (PEMRPOLYLINETO16, 32) + TEST_TARGET_ALIGN(PEMRPOLYLINETO16, 4) } static void test_pack_PEMRPOLYPOLYGON(void) { /* PEMRPOLYPOLYGON */ - TEST_TYPE(PEMRPOLYPOLYGON, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYPOLYGON, 44, 4); + TEST_TYPE_SIZE (PEMRPOLYPOLYGON, 4) + TEST_TYPE_ALIGN (PEMRPOLYPOLYGON, 4) + TEST_TARGET_SIZE (PEMRPOLYPOLYGON, 44) + TEST_TARGET_ALIGN(PEMRPOLYPOLYGON, 4) } static void test_pack_PEMRPOLYPOLYGON16(void) { /* PEMRPOLYPOLYGON16 */ - TEST_TYPE(PEMRPOLYPOLYGON16, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYPOLYGON16, 40, 4); + TEST_TYPE_SIZE (PEMRPOLYPOLYGON16, 4) + TEST_TYPE_ALIGN (PEMRPOLYPOLYGON16, 4) + TEST_TARGET_SIZE (PEMRPOLYPOLYGON16, 40) + TEST_TARGET_ALIGN(PEMRPOLYPOLYGON16, 4) } static void test_pack_PEMRPOLYPOLYLINE(void) { /* PEMRPOLYPOLYLINE */ - TEST_TYPE(PEMRPOLYPOLYLINE, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYPOLYLINE, 44, 4); + TEST_TYPE_SIZE (PEMRPOLYPOLYLINE, 4) + TEST_TYPE_ALIGN (PEMRPOLYPOLYLINE, 4) + TEST_TARGET_SIZE (PEMRPOLYPOLYLINE, 44) + TEST_TARGET_ALIGN(PEMRPOLYPOLYLINE, 4) } static void test_pack_PEMRPOLYPOLYLINE16(void) { /* PEMRPOLYPOLYLINE16 */ - TEST_TYPE(PEMRPOLYPOLYLINE16, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYPOLYLINE16, 40, 4); + TEST_TYPE_SIZE (PEMRPOLYPOLYLINE16, 4) + TEST_TYPE_ALIGN (PEMRPOLYPOLYLINE16, 4) + TEST_TARGET_SIZE (PEMRPOLYPOLYLINE16, 40) + TEST_TARGET_ALIGN(PEMRPOLYPOLYLINE16, 4) } static void test_pack_PEMRPOLYTEXTOUTA(void) { /* PEMRPOLYTEXTOUTA */ - TEST_TYPE(PEMRPOLYTEXTOUTA, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYTEXTOUTA, 80, 4); + TEST_TYPE_SIZE (PEMRPOLYTEXTOUTA, 4) + TEST_TYPE_ALIGN (PEMRPOLYTEXTOUTA, 4) + TEST_TARGET_SIZE (PEMRPOLYTEXTOUTA, 80) + TEST_TARGET_ALIGN(PEMRPOLYTEXTOUTA, 4) } static void test_pack_PEMRPOLYTEXTOUTW(void) { /* PEMRPOLYTEXTOUTW */ - TEST_TYPE(PEMRPOLYTEXTOUTW, 4, 4); - TEST_TYPE_POINTER(PEMRPOLYTEXTOUTW, 80, 4); + TEST_TYPE_SIZE (PEMRPOLYTEXTOUTW, 4) + TEST_TYPE_ALIGN (PEMRPOLYTEXTOUTW, 4) + TEST_TARGET_SIZE (PEMRPOLYTEXTOUTW, 80) + TEST_TARGET_ALIGN(PEMRPOLYTEXTOUTW, 4) } static void test_pack_PEMRREALIZEPALETTE(void) { /* PEMRREALIZEPALETTE */ - TEST_TYPE(PEMRREALIZEPALETTE, 4, 4); - TEST_TYPE_POINTER(PEMRREALIZEPALETTE, 8, 4); + TEST_TYPE_SIZE (PEMRREALIZEPALETTE, 4) + TEST_TYPE_ALIGN (PEMRREALIZEPALETTE, 4) + TEST_TARGET_SIZE (PEMRREALIZEPALETTE, 8) + TEST_TARGET_ALIGN(PEMRREALIZEPALETTE, 4) } static void test_pack_PEMRRECTANGLE(void) { /* PEMRRECTANGLE */ - TEST_TYPE(PEMRRECTANGLE, 4, 4); - TEST_TYPE_POINTER(PEMRRECTANGLE, 24, 4); + TEST_TYPE_SIZE (PEMRRECTANGLE, 4) + TEST_TYPE_ALIGN (PEMRRECTANGLE, 4) + TEST_TARGET_SIZE (PEMRRECTANGLE, 24) + TEST_TARGET_ALIGN(PEMRRECTANGLE, 4) } static void test_pack_PEMRRESIZEPALETTE(void) { /* PEMRRESIZEPALETTE */ - TEST_TYPE(PEMRRESIZEPALETTE, 4, 4); - TEST_TYPE_POINTER(PEMRRESIZEPALETTE, 16, 4); + TEST_TYPE_SIZE (PEMRRESIZEPALETTE, 4) + TEST_TYPE_ALIGN (PEMRRESIZEPALETTE, 4) + TEST_TARGET_SIZE (PEMRRESIZEPALETTE, 16) + TEST_TARGET_ALIGN(PEMRRESIZEPALETTE, 4) } static void test_pack_PEMRRESTOREDC(void) { /* PEMRRESTOREDC */ - TEST_TYPE(PEMRRESTOREDC, 4, 4); - TEST_TYPE_POINTER(PEMRRESTOREDC, 12, 4); + TEST_TYPE_SIZE (PEMRRESTOREDC, 4) + TEST_TYPE_ALIGN (PEMRRESTOREDC, 4) + TEST_TARGET_SIZE (PEMRRESTOREDC, 12) + TEST_TARGET_ALIGN(PEMRRESTOREDC, 4) } static void test_pack_PEMRROUNDRECT(void) { /* PEMRROUNDRECT */ - TEST_TYPE(PEMRROUNDRECT, 4, 4); - TEST_TYPE_POINTER(PEMRROUNDRECT, 32, 4); + TEST_TYPE_SIZE (PEMRROUNDRECT, 4) + TEST_TYPE_ALIGN (PEMRROUNDRECT, 4) + TEST_TARGET_SIZE (PEMRROUNDRECT, 32) + TEST_TARGET_ALIGN(PEMRROUNDRECT, 4) } static void test_pack_PEMRSAVEDC(void) { /* PEMRSAVEDC */ - TEST_TYPE(PEMRSAVEDC, 4, 4); - TEST_TYPE_POINTER(PEMRSAVEDC, 8, 4); + TEST_TYPE_SIZE (PEMRSAVEDC, 4) + TEST_TYPE_ALIGN (PEMRSAVEDC, 4) + TEST_TARGET_SIZE (PEMRSAVEDC, 8) + TEST_TARGET_ALIGN(PEMRSAVEDC, 4) } static void test_pack_PEMRSCALEVIEWPORTEXTEX(void) { /* PEMRSCALEVIEWPORTEXTEX */ - TEST_TYPE(PEMRSCALEVIEWPORTEXTEX, 4, 4); - TEST_TYPE_POINTER(PEMRSCALEVIEWPORTEXTEX, 24, 4); + TEST_TYPE_SIZE (PEMRSCALEVIEWPORTEXTEX, 4) + TEST_TYPE_ALIGN (PEMRSCALEVIEWPORTEXTEX, 4) + TEST_TARGET_SIZE (PEMRSCALEVIEWPORTEXTEX, 24) + TEST_TARGET_ALIGN(PEMRSCALEVIEWPORTEXTEX, 4) } static void test_pack_PEMRSCALEWINDOWEXTEX(void) { /* PEMRSCALEWINDOWEXTEX */ - TEST_TYPE(PEMRSCALEWINDOWEXTEX, 4, 4); - TEST_TYPE_POINTER(PEMRSCALEWINDOWEXTEX, 24, 4); + TEST_TYPE_SIZE (PEMRSCALEWINDOWEXTEX, 4) + TEST_TYPE_ALIGN (PEMRSCALEWINDOWEXTEX, 4) + TEST_TARGET_SIZE (PEMRSCALEWINDOWEXTEX, 24) + TEST_TARGET_ALIGN(PEMRSCALEWINDOWEXTEX, 4) } static void test_pack_PEMRSELECTCLIPPATH(void) { /* PEMRSELECTCLIPPATH */ - TEST_TYPE(PEMRSELECTCLIPPATH, 4, 4); - TEST_TYPE_POINTER(PEMRSELECTCLIPPATH, 12, 4); + TEST_TYPE_SIZE (PEMRSELECTCLIPPATH, 4) + TEST_TYPE_ALIGN (PEMRSELECTCLIPPATH, 4) + TEST_TARGET_SIZE (PEMRSELECTCLIPPATH, 12) + TEST_TARGET_ALIGN(PEMRSELECTCLIPPATH, 4) } static void test_pack_PEMRSELECTCOLORSPACE(void) { /* PEMRSELECTCOLORSPACE */ - TEST_TYPE(PEMRSELECTCOLORSPACE, 4, 4); - TEST_TYPE_POINTER(PEMRSELECTCOLORSPACE, 12, 4); + TEST_TYPE_SIZE (PEMRSELECTCOLORSPACE, 4) + TEST_TYPE_ALIGN (PEMRSELECTCOLORSPACE, 4) + TEST_TARGET_SIZE (PEMRSELECTCOLORSPACE, 12) + TEST_TARGET_ALIGN(PEMRSELECTCOLORSPACE, 4) } static void test_pack_PEMRSELECTOBJECT(void) { /* PEMRSELECTOBJECT */ - TEST_TYPE(PEMRSELECTOBJECT, 4, 4); - TEST_TYPE_POINTER(PEMRSELECTOBJECT, 12, 4); + TEST_TYPE_SIZE (PEMRSELECTOBJECT, 4) + TEST_TYPE_ALIGN (PEMRSELECTOBJECT, 4) + TEST_TARGET_SIZE (PEMRSELECTOBJECT, 12) + TEST_TARGET_ALIGN(PEMRSELECTOBJECT, 4) } static void test_pack_PEMRSELECTPALETTE(void) { /* PEMRSELECTPALETTE */ - TEST_TYPE(PEMRSELECTPALETTE, 4, 4); - TEST_TYPE_POINTER(PEMRSELECTPALETTE, 12, 4); + TEST_TYPE_SIZE (PEMRSELECTPALETTE, 4) + TEST_TYPE_ALIGN (PEMRSELECTPALETTE, 4) + TEST_TARGET_SIZE (PEMRSELECTPALETTE, 12) + TEST_TARGET_ALIGN(PEMRSELECTPALETTE, 4) } static void test_pack_PEMRSETARCDIRECTION(void) { /* PEMRSETARCDIRECTION */ - TEST_TYPE(PEMRSETARCDIRECTION, 4, 4); - TEST_TYPE_POINTER(PEMRSETARCDIRECTION, 12, 4); + TEST_TYPE_SIZE (PEMRSETARCDIRECTION, 4) + TEST_TYPE_ALIGN (PEMRSETARCDIRECTION, 4) + TEST_TARGET_SIZE (PEMRSETARCDIRECTION, 12) + TEST_TARGET_ALIGN(PEMRSETARCDIRECTION, 4) } static void test_pack_PEMRSETBKCOLOR(void) { /* PEMRSETBKCOLOR */ - TEST_TYPE(PEMRSETBKCOLOR, 4, 4); - TEST_TYPE_POINTER(PEMRSETBKCOLOR, 12, 4); + TEST_TYPE_SIZE (PEMRSETBKCOLOR, 4) + TEST_TYPE_ALIGN (PEMRSETBKCOLOR, 4) + TEST_TARGET_SIZE (PEMRSETBKCOLOR, 12) + TEST_TARGET_ALIGN(PEMRSETBKCOLOR, 4) } static void test_pack_PEMRSETBKMODE(void) { /* PEMRSETBKMODE */ - TEST_TYPE(PEMRSETBKMODE, 4, 4); - TEST_TYPE_POINTER(PEMRSETBKMODE, 12, 4); + TEST_TYPE_SIZE (PEMRSETBKMODE, 4) + TEST_TYPE_ALIGN (PEMRSETBKMODE, 4) + TEST_TARGET_SIZE (PEMRSETBKMODE, 12) + TEST_TARGET_ALIGN(PEMRSETBKMODE, 4) } static void test_pack_PEMRSETBRUSHORGEX(void) { /* PEMRSETBRUSHORGEX */ - TEST_TYPE(PEMRSETBRUSHORGEX, 4, 4); - TEST_TYPE_POINTER(PEMRSETBRUSHORGEX, 16, 4); + TEST_TYPE_SIZE (PEMRSETBRUSHORGEX, 4) + TEST_TYPE_ALIGN (PEMRSETBRUSHORGEX, 4) + TEST_TARGET_SIZE (PEMRSETBRUSHORGEX, 16) + TEST_TARGET_ALIGN(PEMRSETBRUSHORGEX, 4) } static void test_pack_PEMRSETCOLORADJUSTMENT(void) { /* PEMRSETCOLORADJUSTMENT */ - TEST_TYPE(PEMRSETCOLORADJUSTMENT, 4, 4); - TEST_TYPE_POINTER(PEMRSETCOLORADJUSTMENT, 32, 4); + TEST_TYPE_SIZE (PEMRSETCOLORADJUSTMENT, 4) + TEST_TYPE_ALIGN (PEMRSETCOLORADJUSTMENT, 4) + TEST_TARGET_SIZE (PEMRSETCOLORADJUSTMENT, 32) + TEST_TARGET_ALIGN(PEMRSETCOLORADJUSTMENT, 4) } static void test_pack_PEMRSETCOLORSPACE(void) { /* PEMRSETCOLORSPACE */ - TEST_TYPE(PEMRSETCOLORSPACE, 4, 4); - TEST_TYPE_POINTER(PEMRSETCOLORSPACE, 12, 4); + TEST_TYPE_SIZE (PEMRSETCOLORSPACE, 4) + TEST_TYPE_ALIGN (PEMRSETCOLORSPACE, 4) + TEST_TARGET_SIZE (PEMRSETCOLORSPACE, 12) + TEST_TARGET_ALIGN(PEMRSETCOLORSPACE, 4) } static void test_pack_PEMRSETDIBITSTODEVICE(void) { /* PEMRSETDIBITSTODEVICE */ - TEST_TYPE(PEMRSETDIBITSTODEVICE, 4, 4); - TEST_TYPE_POINTER(PEMRSETDIBITSTODEVICE, 76, 4); + TEST_TYPE_SIZE (PEMRSETDIBITSTODEVICE, 4) + TEST_TYPE_ALIGN (PEMRSETDIBITSTODEVICE, 4) + TEST_TARGET_SIZE (PEMRSETDIBITSTODEVICE, 76) + TEST_TARGET_ALIGN(PEMRSETDIBITSTODEVICE, 4) } static void test_pack_PEMRSETICMMODE(void) { /* PEMRSETICMMODE */ - TEST_TYPE(PEMRSETICMMODE, 4, 4); - TEST_TYPE_POINTER(PEMRSETICMMODE, 12, 4); + TEST_TYPE_SIZE (PEMRSETICMMODE, 4) + TEST_TYPE_ALIGN (PEMRSETICMMODE, 4) + TEST_TARGET_SIZE (PEMRSETICMMODE, 12) + TEST_TARGET_ALIGN(PEMRSETICMMODE, 4) } static void test_pack_PEMRSETLAYOUT(void) { /* PEMRSETLAYOUT */ - TEST_TYPE(PEMRSETLAYOUT, 4, 4); - TEST_TYPE_POINTER(PEMRSETLAYOUT, 12, 4); + TEST_TYPE_SIZE (PEMRSETLAYOUT, 4) + TEST_TYPE_ALIGN (PEMRSETLAYOUT, 4) + TEST_TARGET_SIZE (PEMRSETLAYOUT, 12) + TEST_TARGET_ALIGN(PEMRSETLAYOUT, 4) } static void test_pack_PEMRSETMAPMODE(void) { /* PEMRSETMAPMODE */ - TEST_TYPE(PEMRSETMAPMODE, 4, 4); - TEST_TYPE_POINTER(PEMRSETMAPMODE, 12, 4); + TEST_TYPE_SIZE (PEMRSETMAPMODE, 4) + TEST_TYPE_ALIGN (PEMRSETMAPMODE, 4) + TEST_TARGET_SIZE (PEMRSETMAPMODE, 12) + TEST_TARGET_ALIGN(PEMRSETMAPMODE, 4) } static void test_pack_PEMRSETMAPPERFLAGS(void) { /* PEMRSETMAPPERFLAGS */ - TEST_TYPE(PEMRSETMAPPERFLAGS, 4, 4); - TEST_TYPE_POINTER(PEMRSETMAPPERFLAGS, 12, 4); + TEST_TYPE_SIZE (PEMRSETMAPPERFLAGS, 4) + TEST_TYPE_ALIGN (PEMRSETMAPPERFLAGS, 4) + TEST_TARGET_SIZE (PEMRSETMAPPERFLAGS, 12) + TEST_TARGET_ALIGN(PEMRSETMAPPERFLAGS, 4) } static void test_pack_PEMRSETMETARGN(void) { /* PEMRSETMETARGN */ - TEST_TYPE(PEMRSETMETARGN, 4, 4); - TEST_TYPE_POINTER(PEMRSETMETARGN, 8, 4); + TEST_TYPE_SIZE (PEMRSETMETARGN, 4) + TEST_TYPE_ALIGN (PEMRSETMETARGN, 4) + TEST_TARGET_SIZE (PEMRSETMETARGN, 8) + TEST_TARGET_ALIGN(PEMRSETMETARGN, 4) } static void test_pack_PEMRSETMITERLIMIT(void) { /* PEMRSETMITERLIMIT */ - TEST_TYPE(PEMRSETMITERLIMIT, 4, 4); - TEST_TYPE_POINTER(PEMRSETMITERLIMIT, 12, 4); + TEST_TYPE_SIZE (PEMRSETMITERLIMIT, 4) + TEST_TYPE_ALIGN (PEMRSETMITERLIMIT, 4) + TEST_TARGET_SIZE (PEMRSETMITERLIMIT, 12) + TEST_TARGET_ALIGN(PEMRSETMITERLIMIT, 4) } static void test_pack_PEMRSETPALETTEENTRIES(void) { /* PEMRSETPALETTEENTRIES */ - TEST_TYPE(PEMRSETPALETTEENTRIES, 4, 4); - TEST_TYPE_POINTER(PEMRSETPALETTEENTRIES, 24, 4); + TEST_TYPE_SIZE (PEMRSETPALETTEENTRIES, 4) + TEST_TYPE_ALIGN (PEMRSETPALETTEENTRIES, 4) + TEST_TARGET_SIZE (PEMRSETPALETTEENTRIES, 24) + TEST_TARGET_ALIGN(PEMRSETPALETTEENTRIES, 4) } static void test_pack_PEMRSETPIXELV(void) { /* PEMRSETPIXELV */ - TEST_TYPE(PEMRSETPIXELV, 4, 4); - TEST_TYPE_POINTER(PEMRSETPIXELV, 20, 4); + TEST_TYPE_SIZE (PEMRSETPIXELV, 4) + TEST_TYPE_ALIGN (PEMRSETPIXELV, 4) + TEST_TARGET_SIZE (PEMRSETPIXELV, 20) + TEST_TARGET_ALIGN(PEMRSETPIXELV, 4) } static void test_pack_PEMRSETPOLYFILLMODE(void) { /* PEMRSETPOLYFILLMODE */ - TEST_TYPE(PEMRSETPOLYFILLMODE, 4, 4); - TEST_TYPE_POINTER(PEMRSETPOLYFILLMODE, 12, 4); + TEST_TYPE_SIZE (PEMRSETPOLYFILLMODE, 4) + TEST_TYPE_ALIGN (PEMRSETPOLYFILLMODE, 4) + TEST_TARGET_SIZE (PEMRSETPOLYFILLMODE, 12) + TEST_TARGET_ALIGN(PEMRSETPOLYFILLMODE, 4) } static void test_pack_PEMRSETROP2(void) { /* PEMRSETROP2 */ - TEST_TYPE(PEMRSETROP2, 4, 4); - TEST_TYPE_POINTER(PEMRSETROP2, 12, 4); + TEST_TYPE_SIZE (PEMRSETROP2, 4) + TEST_TYPE_ALIGN (PEMRSETROP2, 4) + TEST_TARGET_SIZE (PEMRSETROP2, 12) + TEST_TARGET_ALIGN(PEMRSETROP2, 4) } static void test_pack_PEMRSETSTRETCHBLTMODE(void) { /* PEMRSETSTRETCHBLTMODE */ - TEST_TYPE(PEMRSETSTRETCHBLTMODE, 4, 4); - TEST_TYPE_POINTER(PEMRSETSTRETCHBLTMODE, 12, 4); + TEST_TYPE_SIZE (PEMRSETSTRETCHBLTMODE, 4) + TEST_TYPE_ALIGN (PEMRSETSTRETCHBLTMODE, 4) + TEST_TARGET_SIZE (PEMRSETSTRETCHBLTMODE, 12) + TEST_TARGET_ALIGN(PEMRSETSTRETCHBLTMODE, 4) } static void test_pack_PEMRSETTEXTALIGN(void) { /* PEMRSETTEXTALIGN */ - TEST_TYPE(PEMRSETTEXTALIGN, 4, 4); - TEST_TYPE_POINTER(PEMRSETTEXTALIGN, 12, 4); + TEST_TYPE_SIZE (PEMRSETTEXTALIGN, 4) + TEST_TYPE_ALIGN (PEMRSETTEXTALIGN, 4) + TEST_TARGET_SIZE (PEMRSETTEXTALIGN, 12) + TEST_TARGET_ALIGN(PEMRSETTEXTALIGN, 4) } static void test_pack_PEMRSETTEXTCOLOR(void) { /* PEMRSETTEXTCOLOR */ - TEST_TYPE(PEMRSETTEXTCOLOR, 4, 4); - TEST_TYPE_POINTER(PEMRSETTEXTCOLOR, 12, 4); + TEST_TYPE_SIZE (PEMRSETTEXTCOLOR, 4) + TEST_TYPE_ALIGN (PEMRSETTEXTCOLOR, 4) + TEST_TARGET_SIZE (PEMRSETTEXTCOLOR, 12) + TEST_TARGET_ALIGN(PEMRSETTEXTCOLOR, 4) } static void test_pack_PEMRSETVIEWPORTEXTEX(void) { /* PEMRSETVIEWPORTEXTEX */ - TEST_TYPE(PEMRSETVIEWPORTEXTEX, 4, 4); - TEST_TYPE_POINTER(PEMRSETVIEWPORTEXTEX, 16, 4); + TEST_TYPE_SIZE (PEMRSETVIEWPORTEXTEX, 4) + TEST_TYPE_ALIGN (PEMRSETVIEWPORTEXTEX, 4) + TEST_TARGET_SIZE (PEMRSETVIEWPORTEXTEX, 16) + TEST_TARGET_ALIGN(PEMRSETVIEWPORTEXTEX, 4) } static void test_pack_PEMRSETVIEWPORTORGEX(void) { /* PEMRSETVIEWPORTORGEX */ - TEST_TYPE(PEMRSETVIEWPORTORGEX, 4, 4); - TEST_TYPE_POINTER(PEMRSETVIEWPORTORGEX, 16, 4); + TEST_TYPE_SIZE (PEMRSETVIEWPORTORGEX, 4) + TEST_TYPE_ALIGN (PEMRSETVIEWPORTORGEX, 4) + TEST_TARGET_SIZE (PEMRSETVIEWPORTORGEX, 16) + TEST_TARGET_ALIGN(PEMRSETVIEWPORTORGEX, 4) } static void test_pack_PEMRSETWINDOWEXTEX(void) { /* PEMRSETWINDOWEXTEX */ - TEST_TYPE(PEMRSETWINDOWEXTEX, 4, 4); - TEST_TYPE_POINTER(PEMRSETWINDOWEXTEX, 16, 4); + TEST_TYPE_SIZE (PEMRSETWINDOWEXTEX, 4) + TEST_TYPE_ALIGN (PEMRSETWINDOWEXTEX, 4) + TEST_TARGET_SIZE (PEMRSETWINDOWEXTEX, 16) + TEST_TARGET_ALIGN(PEMRSETWINDOWEXTEX, 4) } static void test_pack_PEMRSETWINDOWORGEX(void) { /* PEMRSETWINDOWORGEX */ - TEST_TYPE(PEMRSETWINDOWORGEX, 4, 4); - TEST_TYPE_POINTER(PEMRSETWINDOWORGEX, 16, 4); + TEST_TYPE_SIZE (PEMRSETWINDOWORGEX, 4) + TEST_TYPE_ALIGN (PEMRSETWINDOWORGEX, 4) + TEST_TARGET_SIZE (PEMRSETWINDOWORGEX, 16) + TEST_TARGET_ALIGN(PEMRSETWINDOWORGEX, 4) } static void test_pack_PEMRSETWORLDTRANSFORM(void) { /* PEMRSETWORLDTRANSFORM */ - TEST_TYPE(PEMRSETWORLDTRANSFORM, 4, 4); - TEST_TYPE_POINTER(PEMRSETWORLDTRANSFORM, 32, 4); + TEST_TYPE_SIZE (PEMRSETWORLDTRANSFORM, 4) + TEST_TYPE_ALIGN (PEMRSETWORLDTRANSFORM, 4) + TEST_TARGET_SIZE (PEMRSETWORLDTRANSFORM, 32) + TEST_TARGET_ALIGN(PEMRSETWORLDTRANSFORM, 4) } static void test_pack_PEMRSTRETCHBLT(void) { /* PEMRSTRETCHBLT */ - TEST_TYPE(PEMRSTRETCHBLT, 4, 4); - TEST_TYPE_POINTER(PEMRSTRETCHBLT, 108, 4); + TEST_TYPE_SIZE (PEMRSTRETCHBLT, 4) + TEST_TYPE_ALIGN (PEMRSTRETCHBLT, 4) + TEST_TARGET_SIZE (PEMRSTRETCHBLT, 108) + TEST_TARGET_ALIGN(PEMRSTRETCHBLT, 4) } static void test_pack_PEMRSTRETCHDIBITS(void) { /* PEMRSTRETCHDIBITS */ - TEST_TYPE(PEMRSTRETCHDIBITS, 4, 4); - TEST_TYPE_POINTER(PEMRSTRETCHDIBITS, 80, 4); + TEST_TYPE_SIZE (PEMRSTRETCHDIBITS, 4) + TEST_TYPE_ALIGN (PEMRSTRETCHDIBITS, 4) + TEST_TARGET_SIZE (PEMRSTRETCHDIBITS, 80) + TEST_TARGET_ALIGN(PEMRSTRETCHDIBITS, 4) } static void test_pack_PEMRSTROKEANDFILLPATH(void) { /* PEMRSTROKEANDFILLPATH */ - TEST_TYPE(PEMRSTROKEANDFILLPATH, 4, 4); - TEST_TYPE_POINTER(PEMRSTROKEANDFILLPATH, 24, 4); + TEST_TYPE_SIZE (PEMRSTROKEANDFILLPATH, 4) + TEST_TYPE_ALIGN (PEMRSTROKEANDFILLPATH, 4) + TEST_TARGET_SIZE (PEMRSTROKEANDFILLPATH, 24) + TEST_TARGET_ALIGN(PEMRSTROKEANDFILLPATH, 4) } static void test_pack_PEMRSTROKEPATH(void) { /* PEMRSTROKEPATH */ - TEST_TYPE(PEMRSTROKEPATH, 4, 4); - TEST_TYPE_POINTER(PEMRSTROKEPATH, 24, 4); + TEST_TYPE_SIZE (PEMRSTROKEPATH, 4) + TEST_TYPE_ALIGN (PEMRSTROKEPATH, 4) + TEST_TARGET_SIZE (PEMRSTROKEPATH, 24) + TEST_TARGET_ALIGN(PEMRSTROKEPATH, 4) } static void test_pack_PEMRTEXT(void) { /* PEMRTEXT */ - TEST_TYPE(PEMRTEXT, 4, 4); - TEST_TYPE_POINTER(PEMRTEXT, 40, 4); + TEST_TYPE_SIZE (PEMRTEXT, 4) + TEST_TYPE_ALIGN (PEMRTEXT, 4) + TEST_TARGET_SIZE (PEMRTEXT, 40) + TEST_TARGET_ALIGN(PEMRTEXT, 4) } static void test_pack_PEMRWIDENPATH(void) { /* PEMRWIDENPATH */ - TEST_TYPE(PEMRWIDENPATH, 4, 4); - TEST_TYPE_POINTER(PEMRWIDENPATH, 8, 4); + TEST_TYPE_SIZE (PEMRWIDENPATH, 4) + TEST_TYPE_ALIGN (PEMRWIDENPATH, 4) + TEST_TARGET_SIZE (PEMRWIDENPATH, 8) + TEST_TARGET_ALIGN(PEMRWIDENPATH, 4) } static void test_pack_PENHMETAHEADER(void) { /* PENHMETAHEADER */ - TEST_TYPE(PENHMETAHEADER, 4, 4); - TEST_TYPE_POINTER(PENHMETAHEADER, 108, 4); + TEST_TYPE_SIZE (PENHMETAHEADER, 4) + TEST_TYPE_ALIGN (PENHMETAHEADER, 4) + TEST_TARGET_SIZE (PENHMETAHEADER, 108) + TEST_TARGET_ALIGN(PENHMETAHEADER, 4) } static void test_pack_PEXTLOGFONTA(void) { /* PEXTLOGFONTA */ - TEST_TYPE(PEXTLOGFONTA, 4, 4); - TEST_TYPE_POINTER(PEXTLOGFONTA, 192, 4); + TEST_TYPE_SIZE (PEXTLOGFONTA, 4) + TEST_TYPE_ALIGN (PEXTLOGFONTA, 4) + TEST_TARGET_SIZE (PEXTLOGFONTA, 192) + TEST_TARGET_ALIGN(PEXTLOGFONTA, 4) } static void test_pack_PEXTLOGFONTW(void) { /* PEXTLOGFONTW */ - TEST_TYPE(PEXTLOGFONTW, 4, 4); - TEST_TYPE_POINTER(PEXTLOGFONTW, 320, 4); + TEST_TYPE_SIZE (PEXTLOGFONTW, 4) + TEST_TYPE_ALIGN (PEXTLOGFONTW, 4) + TEST_TARGET_SIZE (PEXTLOGFONTW, 320) + TEST_TARGET_ALIGN(PEXTLOGFONTW, 4) } static void test_pack_PEXTLOGPEN(void) { /* PEXTLOGPEN */ - TEST_TYPE(PEXTLOGPEN, 4, 4); - TEST_TYPE_POINTER(PEXTLOGPEN, 28, 4); + TEST_TYPE_SIZE (PEXTLOGPEN, 4) + TEST_TYPE_ALIGN (PEXTLOGPEN, 4) + TEST_TARGET_SIZE (PEXTLOGPEN, 28) + TEST_TARGET_ALIGN(PEXTLOGPEN, 4) } static void test_pack_PFONTSIGNATURE(void) { /* PFONTSIGNATURE */ - TEST_TYPE(PFONTSIGNATURE, 4, 4); - TEST_TYPE_POINTER(PFONTSIGNATURE, 24, 4); + TEST_TYPE_SIZE (PFONTSIGNATURE, 4) + TEST_TYPE_ALIGN (PFONTSIGNATURE, 4) + TEST_TARGET_SIZE (PFONTSIGNATURE, 24) + TEST_TARGET_ALIGN(PFONTSIGNATURE, 4) } static void test_pack_PGLYPHMETRICSFLOAT(void) { /* PGLYPHMETRICSFLOAT */ - TEST_TYPE(PGLYPHMETRICSFLOAT, 4, 4); - TEST_TYPE_POINTER(PGLYPHMETRICSFLOAT, 24, 4); + TEST_TYPE_SIZE (PGLYPHMETRICSFLOAT, 4) + TEST_TYPE_ALIGN (PGLYPHMETRICSFLOAT, 4) + TEST_TARGET_SIZE (PGLYPHMETRICSFLOAT, 24) + TEST_TARGET_ALIGN(PGLYPHMETRICSFLOAT, 4) } static void test_pack_PGRADIENT_RECT(void) { /* PGRADIENT_RECT */ - TEST_TYPE(PGRADIENT_RECT, 4, 4); - TEST_TYPE_POINTER(PGRADIENT_RECT, 8, 4); + TEST_TYPE_SIZE (PGRADIENT_RECT, 4) + TEST_TYPE_ALIGN (PGRADIENT_RECT, 4) + TEST_TARGET_SIZE (PGRADIENT_RECT, 8) + TEST_TARGET_ALIGN(PGRADIENT_RECT, 4) } static void test_pack_PGRADIENT_TRIANGLE(void) { /* PGRADIENT_TRIANGLE */ - TEST_TYPE(PGRADIENT_TRIANGLE, 4, 4); - TEST_TYPE_POINTER(PGRADIENT_TRIANGLE, 12, 4); + TEST_TYPE_SIZE (PGRADIENT_TRIANGLE, 4) + TEST_TYPE_ALIGN (PGRADIENT_TRIANGLE, 4) + TEST_TARGET_SIZE (PGRADIENT_TRIANGLE, 12) + TEST_TARGET_ALIGN(PGRADIENT_TRIANGLE, 4) } static void test_pack_PHANDLETABLE(void) { /* PHANDLETABLE */ - TEST_TYPE(PHANDLETABLE, 4, 4); - TEST_TYPE_POINTER(PHANDLETABLE, 4, 4); + TEST_TYPE_SIZE (PHANDLETABLE, 4) + TEST_TYPE_ALIGN (PHANDLETABLE, 4) + TEST_TARGET_SIZE (PHANDLETABLE, 4) + TEST_TARGET_ALIGN(PHANDLETABLE, 4) } static void test_pack_PIXELFORMATDESCRIPTOR(void) { /* PIXELFORMATDESCRIPTOR (pack 4) */ - TEST_TYPE(PIXELFORMATDESCRIPTOR, 40, 4); - TEST_FIELD(PIXELFORMATDESCRIPTOR, WORD, nSize, 0, 2, 2); - TEST_FIELD(PIXELFORMATDESCRIPTOR, WORD, nVersion, 2, 2, 2); - TEST_FIELD(PIXELFORMATDESCRIPTOR, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, iPixelType, 8, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cColorBits, 9, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cRedBits, 10, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cRedShift, 11, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cGreenBits, 12, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cGreenShift, 13, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cBlueBits, 14, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cBlueShift, 15, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cAlphaBits, 16, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cAlphaShift, 17, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cAccumBits, 18, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cAccumRedBits, 19, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cAccumGreenBits, 20, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cAccumBlueBits, 21, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cAccumAlphaBits, 22, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cDepthBits, 23, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cStencilBits, 24, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, cAuxBuffers, 25, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, iLayerType, 26, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, BYTE, bReserved, 27, 1, 1); - TEST_FIELD(PIXELFORMATDESCRIPTOR, DWORD, dwLayerMask, 28, 4, 4); - TEST_FIELD(PIXELFORMATDESCRIPTOR, DWORD, dwVisibleMask, 32, 4, 4); - TEST_FIELD(PIXELFORMATDESCRIPTOR, DWORD, dwDamageMask, 36, 4, 4); + 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(PLAYERPLANEDESCRIPTOR, 4, 4); - TEST_TYPE_POINTER(PLAYERPLANEDESCRIPTOR, 32, 4); + TEST_TYPE_SIZE (PLAYERPLANEDESCRIPTOR, 4) + TEST_TYPE_ALIGN (PLAYERPLANEDESCRIPTOR, 4) + TEST_TARGET_SIZE (PLAYERPLANEDESCRIPTOR, 32) + TEST_TARGET_ALIGN(PLAYERPLANEDESCRIPTOR, 4) } static void test_pack_PLOCALESIGNATURE(void) { /* PLOCALESIGNATURE */ - TEST_TYPE(PLOCALESIGNATURE, 4, 4); - TEST_TYPE_POINTER(PLOCALESIGNATURE, 32, 4); + TEST_TYPE_SIZE (PLOCALESIGNATURE, 4) + TEST_TYPE_ALIGN (PLOCALESIGNATURE, 4) + TEST_TARGET_SIZE (PLOCALESIGNATURE, 32) + TEST_TARGET_ALIGN(PLOCALESIGNATURE, 4) } static void test_pack_PLOGBRUSH(void) { /* PLOGBRUSH */ - TEST_TYPE(PLOGBRUSH, 4, 4); - TEST_TYPE_POINTER(PLOGBRUSH, 12, 4); + TEST_TYPE_SIZE (PLOGBRUSH, 4) + TEST_TYPE_ALIGN (PLOGBRUSH, 4) + TEST_TARGET_SIZE (PLOGBRUSH, 12) + TEST_TARGET_ALIGN(PLOGBRUSH, 4) } static void test_pack_PLOGFONTA(void) { /* PLOGFONTA */ - TEST_TYPE(PLOGFONTA, 4, 4); - TEST_TYPE_POINTER(PLOGFONTA, 60, 4); + TEST_TYPE_SIZE (PLOGFONTA, 4) + TEST_TYPE_ALIGN (PLOGFONTA, 4) + TEST_TARGET_SIZE (PLOGFONTA, 60) + TEST_TARGET_ALIGN(PLOGFONTA, 4) } static void test_pack_PLOGFONTW(void) { /* PLOGFONTW */ - TEST_TYPE(PLOGFONTW, 4, 4); - TEST_TYPE_POINTER(PLOGFONTW, 92, 4); + TEST_TYPE_SIZE (PLOGFONTW, 4) + TEST_TYPE_ALIGN (PLOGFONTW, 4) + TEST_TARGET_SIZE (PLOGFONTW, 92) + TEST_TARGET_ALIGN(PLOGFONTW, 4) } static void test_pack_PMETAHEADER(void) { /* PMETAHEADER */ - TEST_TYPE(PMETAHEADER, 4, 4); - TEST_TYPE_POINTER(PMETAHEADER, 18, 2); + TEST_TYPE_SIZE (PMETAHEADER, 4) + TEST_TYPE_ALIGN (PMETAHEADER, 4) + TEST_TARGET_SIZE (PMETAHEADER, 18) + TEST_TARGET_ALIGN(PMETAHEADER, 2) } static void test_pack_PMETARECORD(void) { /* PMETARECORD */ - TEST_TYPE(PMETARECORD, 4, 4); - TEST_TYPE_POINTER(PMETARECORD, 8, 4); + TEST_TYPE_SIZE (PMETARECORD, 4) + TEST_TYPE_ALIGN (PMETARECORD, 4) + TEST_TARGET_SIZE (PMETARECORD, 8) + TEST_TARGET_ALIGN(PMETARECORD, 4) } static void test_pack_PNEWTEXTMETRICA(void) { /* PNEWTEXTMETRICA */ - TEST_TYPE(PNEWTEXTMETRICA, 4, 4); - TEST_TYPE_POINTER(PNEWTEXTMETRICA, 72, 4); + TEST_TYPE_SIZE (PNEWTEXTMETRICA, 4) + TEST_TYPE_ALIGN (PNEWTEXTMETRICA, 4) + TEST_TARGET_SIZE (PNEWTEXTMETRICA, 72) + TEST_TARGET_ALIGN(PNEWTEXTMETRICA, 4) } static void test_pack_PNEWTEXTMETRICW(void) { /* PNEWTEXTMETRICW */ - TEST_TYPE(PNEWTEXTMETRICW, 4, 4); - TEST_TYPE_POINTER(PNEWTEXTMETRICW, 76, 4); + TEST_TYPE_SIZE (PNEWTEXTMETRICW, 4) + TEST_TYPE_ALIGN (PNEWTEXTMETRICW, 4) + TEST_TARGET_SIZE (PNEWTEXTMETRICW, 76) + TEST_TARGET_ALIGN(PNEWTEXTMETRICW, 4) } static void test_pack_POINTFLOAT(void) { /* POINTFLOAT (pack 4) */ - TEST_TYPE(POINTFLOAT, 8, 4); - TEST_FIELD(POINTFLOAT, FLOAT, x, 0, 4, 4); - TEST_FIELD(POINTFLOAT, FLOAT, y, 4, 4, 4); + 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 (pack 4) */ - TEST_TYPE(POINTFX, 8, 2); - TEST_FIELD(POINTFX, FIXED, x, 0, 4, 2); - TEST_FIELD(POINTFX, FIXED, y, 4, 4, 2); + 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 (pack 4) */ - TEST_TYPE(POLYTEXTA, 40, 4); - TEST_FIELD(POLYTEXTA, INT, x, 0, 4, 4); - TEST_FIELD(POLYTEXTA, INT, y, 4, 4, 4); - TEST_FIELD(POLYTEXTA, UINT, n, 8, 4, 4); - TEST_FIELD(POLYTEXTA, LPCSTR, lpstr, 12, 4, 4); - TEST_FIELD(POLYTEXTA, UINT, uiFlags, 16, 4, 4); - TEST_FIELD(POLYTEXTA, RECT, rcl, 20, 16, 4); - TEST_FIELD(POLYTEXTA, INT *, pdx, 36, 4, 4); + TEST_TYPE_SIZE (POLYTEXTA, 40) + TEST_TYPE_ALIGN (POLYTEXTA, 4) + 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, 4) + TEST_FIELD_ALIGN (POLYTEXTA, lpstr, 4) + TEST_FIELD_OFFSET(POLYTEXTA, lpstr, 12) + TEST_FIELD_SIZE (POLYTEXTA, uiFlags, 4) + TEST_FIELD_ALIGN (POLYTEXTA, uiFlags, 4) + TEST_FIELD_OFFSET(POLYTEXTA, uiFlags, 16) + TEST_FIELD_SIZE (POLYTEXTA, rcl, 16) + TEST_FIELD_ALIGN (POLYTEXTA, rcl, 4) + TEST_FIELD_OFFSET(POLYTEXTA, rcl, 20) + TEST_FIELD_SIZE (POLYTEXTA, pdx, 4) + TEST_FIELD_ALIGN (POLYTEXTA, pdx, 4) + TEST_FIELD_OFFSET(POLYTEXTA, pdx, 36) } static void test_pack_POLYTEXTW(void) { /* POLYTEXTW (pack 4) */ - TEST_TYPE(POLYTEXTW, 40, 4); - TEST_FIELD(POLYTEXTW, INT, x, 0, 4, 4); - TEST_FIELD(POLYTEXTW, INT, y, 4, 4, 4); - TEST_FIELD(POLYTEXTW, UINT, n, 8, 4, 4); - TEST_FIELD(POLYTEXTW, LPCWSTR, lpstr, 12, 4, 4); - TEST_FIELD(POLYTEXTW, UINT, uiFlags, 16, 4, 4); - TEST_FIELD(POLYTEXTW, RECT, rcl, 20, 16, 4); - TEST_FIELD(POLYTEXTW, INT *, pdx, 36, 4, 4); + TEST_TYPE_SIZE (POLYTEXTW, 40) + TEST_TYPE_ALIGN (POLYTEXTW, 4) + 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, 4) + TEST_FIELD_ALIGN (POLYTEXTW, lpstr, 4) + TEST_FIELD_OFFSET(POLYTEXTW, lpstr, 12) + TEST_FIELD_SIZE (POLYTEXTW, uiFlags, 4) + TEST_FIELD_ALIGN (POLYTEXTW, uiFlags, 4) + TEST_FIELD_OFFSET(POLYTEXTW, uiFlags, 16) + TEST_FIELD_SIZE (POLYTEXTW, rcl, 16) + TEST_FIELD_ALIGN (POLYTEXTW, rcl, 4) + TEST_FIELD_OFFSET(POLYTEXTW, rcl, 20) + TEST_FIELD_SIZE (POLYTEXTW, pdx, 4) + TEST_FIELD_ALIGN (POLYTEXTW, pdx, 4) + TEST_FIELD_OFFSET(POLYTEXTW, pdx, 36) } static void test_pack_POUTLINETEXTMETRICA(void) { /* POUTLINETEXTMETRICA */ - TEST_TYPE(POUTLINETEXTMETRICA, 4, 4); - TEST_TYPE_POINTER(POUTLINETEXTMETRICA, 212, 4); + TEST_TYPE_SIZE (POUTLINETEXTMETRICA, 4) + TEST_TYPE_ALIGN (POUTLINETEXTMETRICA, 4) + TEST_TARGET_SIZE (POUTLINETEXTMETRICA, 212) + TEST_TARGET_ALIGN(POUTLINETEXTMETRICA, 4) } static void test_pack_POUTLINETEXTMETRICW(void) { /* POUTLINETEXTMETRICW */ - TEST_TYPE(POUTLINETEXTMETRICW, 4, 4); - TEST_TYPE_POINTER(POUTLINETEXTMETRICW, 216, 4); + TEST_TYPE_SIZE (POUTLINETEXTMETRICW, 4) + TEST_TYPE_ALIGN (POUTLINETEXTMETRICW, 4) + TEST_TARGET_SIZE (POUTLINETEXTMETRICW, 216) + TEST_TARGET_ALIGN(POUTLINETEXTMETRICW, 4) } static void test_pack_PPELARRAY(void) { /* PPELARRAY */ - TEST_TYPE(PPELARRAY, 4, 4); - TEST_TYPE_POINTER(PPELARRAY, 20, 4); + TEST_TYPE_SIZE (PPELARRAY, 4) + TEST_TYPE_ALIGN (PPELARRAY, 4) + TEST_TARGET_SIZE (PPELARRAY, 20) + TEST_TARGET_ALIGN(PPELARRAY, 4) } static void test_pack_PPIXELFORMATDESCRIPTOR(void) { /* PPIXELFORMATDESCRIPTOR */ - TEST_TYPE(PPIXELFORMATDESCRIPTOR, 4, 4); - TEST_TYPE_POINTER(PPIXELFORMATDESCRIPTOR, 40, 4); + TEST_TYPE_SIZE (PPIXELFORMATDESCRIPTOR, 4) + TEST_TYPE_ALIGN (PPIXELFORMATDESCRIPTOR, 4) + TEST_TARGET_SIZE (PPIXELFORMATDESCRIPTOR, 40) + TEST_TARGET_ALIGN(PPIXELFORMATDESCRIPTOR, 4) } static void test_pack_PPOINTFLOAT(void) { /* PPOINTFLOAT */ - TEST_TYPE(PPOINTFLOAT, 4, 4); - TEST_TYPE_POINTER(PPOINTFLOAT, 8, 4); + TEST_TYPE_SIZE (PPOINTFLOAT, 4) + TEST_TYPE_ALIGN (PPOINTFLOAT, 4) + TEST_TARGET_SIZE (PPOINTFLOAT, 8) + TEST_TARGET_ALIGN(PPOINTFLOAT, 4) } static void test_pack_PPOLYTEXTA(void) { /* PPOLYTEXTA */ - TEST_TYPE(PPOLYTEXTA, 4, 4); - TEST_TYPE_POINTER(PPOLYTEXTA, 40, 4); + TEST_TYPE_SIZE (PPOLYTEXTA, 4) + TEST_TYPE_ALIGN (PPOLYTEXTA, 4) + TEST_TARGET_SIZE (PPOLYTEXTA, 40) + TEST_TARGET_ALIGN(PPOLYTEXTA, 4) } static void test_pack_PPOLYTEXTW(void) { /* PPOLYTEXTW */ - TEST_TYPE(PPOLYTEXTW, 4, 4); - TEST_TYPE_POINTER(PPOLYTEXTW, 40, 4); + TEST_TYPE_SIZE (PPOLYTEXTW, 4) + TEST_TYPE_ALIGN (PPOLYTEXTW, 4) + TEST_TARGET_SIZE (PPOLYTEXTW, 40) + TEST_TARGET_ALIGN(PPOLYTEXTW, 4) } static void test_pack_PRGNDATA(void) { /* PRGNDATA */ - TEST_TYPE(PRGNDATA, 4, 4); - TEST_TYPE_POINTER(PRGNDATA, 36, 4); + TEST_TYPE_SIZE (PRGNDATA, 4) + TEST_TYPE_ALIGN (PRGNDATA, 4) + TEST_TARGET_SIZE (PRGNDATA, 36) + TEST_TARGET_ALIGN(PRGNDATA, 4) } static void test_pack_PRGNDATAHEADER(void) { /* PRGNDATAHEADER */ - TEST_TYPE(PRGNDATAHEADER, 4, 4); - TEST_TYPE_POINTER(PRGNDATAHEADER, 32, 4); + TEST_TYPE_SIZE (PRGNDATAHEADER, 4) + TEST_TYPE_ALIGN (PRGNDATAHEADER, 4) + TEST_TARGET_SIZE (PRGNDATAHEADER, 32) + TEST_TARGET_ALIGN(PRGNDATAHEADER, 4) } static void test_pack_PTEXTMETRICA(void) { /* PTEXTMETRICA */ - TEST_TYPE(PTEXTMETRICA, 4, 4); - TEST_TYPE_POINTER(PTEXTMETRICA, 56, 4); + TEST_TYPE_SIZE (PTEXTMETRICA, 4) + TEST_TYPE_ALIGN (PTEXTMETRICA, 4) + TEST_TARGET_SIZE (PTEXTMETRICA, 56) + TEST_TARGET_ALIGN(PTEXTMETRICA, 4) } static void test_pack_PTEXTMETRICW(void) { /* PTEXTMETRICW */ - TEST_TYPE(PTEXTMETRICW, 4, 4); - TEST_TYPE_POINTER(PTEXTMETRICW, 60, 4); + TEST_TYPE_SIZE (PTEXTMETRICW, 4) + TEST_TYPE_ALIGN (PTEXTMETRICW, 4) + TEST_TARGET_SIZE (PTEXTMETRICW, 60) + TEST_TARGET_ALIGN(PTEXTMETRICW, 4) } static void test_pack_PTRIVERTEX(void) { /* PTRIVERTEX */ - TEST_TYPE(PTRIVERTEX, 4, 4); - TEST_TYPE_POINTER(PTRIVERTEX, 16, 4); + TEST_TYPE_SIZE (PTRIVERTEX, 4) + TEST_TYPE_ALIGN (PTRIVERTEX, 4) + TEST_TARGET_SIZE (PTRIVERTEX, 16) + TEST_TARGET_ALIGN(PTRIVERTEX, 4) } static void test_pack_PXFORM(void) { /* PXFORM */ - TEST_TYPE(PXFORM, 4, 4); - TEST_TYPE_POINTER(PXFORM, 24, 4); + TEST_TYPE_SIZE (PXFORM, 4) + TEST_TYPE_ALIGN (PXFORM, 4) + TEST_TARGET_SIZE (PXFORM, 24) + TEST_TARGET_ALIGN(PXFORM, 4) } static void test_pack_RASTERIZER_STATUS(void) { /* RASTERIZER_STATUS (pack 4) */ - TEST_TYPE(RASTERIZER_STATUS, 6, 2); - TEST_FIELD(RASTERIZER_STATUS, SHORT, nSize, 0, 2, 2); - TEST_FIELD(RASTERIZER_STATUS, SHORT, wFlags, 2, 2, 2); - TEST_FIELD(RASTERIZER_STATUS, SHORT, nLanguageID, 4, 2, 2); + 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 (pack 4) */ - TEST_TYPE(RGBQUAD, 4, 1); - TEST_FIELD(RGBQUAD, BYTE, rgbBlue, 0, 1, 1); - TEST_FIELD(RGBQUAD, BYTE, rgbGreen, 1, 1, 1); - TEST_FIELD(RGBQUAD, BYTE, rgbRed, 2, 1, 1); - TEST_FIELD(RGBQUAD, BYTE, rgbReserved, 3, 1, 1); + 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 (pack 4) */ - TEST_TYPE(RGBTRIPLE, 3, 1); - TEST_FIELD(RGBTRIPLE, BYTE, rgbtBlue, 0, 1, 1); - TEST_FIELD(RGBTRIPLE, BYTE, rgbtGreen, 1, 1, 1); - TEST_FIELD(RGBTRIPLE, BYTE, rgbtRed, 2, 1, 1); + 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 (pack 4) */ - TEST_TYPE(RGNDATA, 36, 4); - TEST_FIELD(RGNDATA, RGNDATAHEADER, rdh, 0, 32, 4); - TEST_FIELD(RGNDATA, char[1], Buffer, 32, 1, 1); + 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 (pack 4) */ - TEST_TYPE(RGNDATAHEADER, 32, 4); - TEST_FIELD(RGNDATAHEADER, DWORD, dwSize, 0, 4, 4); - TEST_FIELD(RGNDATAHEADER, DWORD, iType, 4, 4, 4); - TEST_FIELD(RGNDATAHEADER, DWORD, nCount, 8, 4, 4); - TEST_FIELD(RGNDATAHEADER, DWORD, nRgnSize, 12, 4, 4); - TEST_FIELD(RGNDATAHEADER, RECT, rcBound, 16, 16, 4); + 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 (pack 4) */ - TEST_TYPE(TEXTMETRICA, 56, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmHeight, 0, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmAscent, 4, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmDescent, 8, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmInternalLeading, 12, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmExternalLeading, 16, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmAveCharWidth, 20, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmMaxCharWidth, 24, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmWeight, 28, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmOverhang, 32, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmDigitizedAspectX, 36, 4, 4); - TEST_FIELD(TEXTMETRICA, LONG, tmDigitizedAspectY, 40, 4, 4); - TEST_FIELD(TEXTMETRICA, BYTE, tmFirstChar, 44, 1, 1); - TEST_FIELD(TEXTMETRICA, BYTE, tmLastChar, 45, 1, 1); - TEST_FIELD(TEXTMETRICA, BYTE, tmDefaultChar, 46, 1, 1); - TEST_FIELD(TEXTMETRICA, BYTE, tmBreakChar, 47, 1, 1); - TEST_FIELD(TEXTMETRICA, BYTE, tmItalic, 48, 1, 1); - TEST_FIELD(TEXTMETRICA, BYTE, tmUnderlined, 49, 1, 1); - TEST_FIELD(TEXTMETRICA, BYTE, tmStruckOut, 50, 1, 1); - TEST_FIELD(TEXTMETRICA, BYTE, tmPitchAndFamily, 51, 1, 1); - TEST_FIELD(TEXTMETRICA, BYTE, tmCharSet, 52, 1, 1); + 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 (pack 4) */ - TEST_TYPE(TEXTMETRICW, 60, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmHeight, 0, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmAscent, 4, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmDescent, 8, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmInternalLeading, 12, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmExternalLeading, 16, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmAveCharWidth, 20, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmMaxCharWidth, 24, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmWeight, 28, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmOverhang, 32, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmDigitizedAspectX, 36, 4, 4); - TEST_FIELD(TEXTMETRICW, LONG, tmDigitizedAspectY, 40, 4, 4); - TEST_FIELD(TEXTMETRICW, WCHAR, tmFirstChar, 44, 2, 2); - TEST_FIELD(TEXTMETRICW, WCHAR, tmLastChar, 46, 2, 2); - TEST_FIELD(TEXTMETRICW, WCHAR, tmDefaultChar, 48, 2, 2); - TEST_FIELD(TEXTMETRICW, WCHAR, tmBreakChar, 50, 2, 2); - TEST_FIELD(TEXTMETRICW, BYTE, tmItalic, 52, 1, 1); - TEST_FIELD(TEXTMETRICW, BYTE, tmUnderlined, 53, 1, 1); - TEST_FIELD(TEXTMETRICW, BYTE, tmStruckOut, 54, 1, 1); - TEST_FIELD(TEXTMETRICW, BYTE, tmPitchAndFamily, 55, 1, 1); - TEST_FIELD(TEXTMETRICW, BYTE, tmCharSet, 56, 1, 1); + 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 (pack 4) */ - TEST_TYPE(TRIVERTEX, 16, 4); - TEST_FIELD(TRIVERTEX, LONG, x, 0, 4, 4); - TEST_FIELD(TRIVERTEX, LONG, y, 4, 4, 4); - TEST_FIELD(TRIVERTEX, COLOR16, Red, 8, 2, 2); - TEST_FIELD(TRIVERTEX, COLOR16, Green, 10, 2, 2); - TEST_FIELD(TRIVERTEX, COLOR16, Blue, 12, 2, 2); - TEST_FIELD(TRIVERTEX, COLOR16, Alpha, 14, 2, 2); + 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 (pack 4) */ - TEST_TYPE(TTPOLYCURVE, 12, 2); - TEST_FIELD(TTPOLYCURVE, WORD, wType, 0, 2, 2); - TEST_FIELD(TTPOLYCURVE, WORD, cpfx, 2, 2, 2); - TEST_FIELD(TTPOLYCURVE, POINTFX[1], apfx, 4, 8, 2); + 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 (pack 4) */ - TEST_TYPE(TTPOLYGONHEADER, 16, 4); - TEST_FIELD(TTPOLYGONHEADER, DWORD, cb, 0, 4, 4); - TEST_FIELD(TTPOLYGONHEADER, DWORD, dwType, 4, 4, 4); - TEST_FIELD(TTPOLYGONHEADER, POINTFX, pfxStart, 8, 8, 2); + 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 (pack 4) */ - TEST_TYPE(XFORM, 24, 4); - TEST_FIELD(XFORM, FLOAT, eM11, 0, 4, 4); - TEST_FIELD(XFORM, FLOAT, eM12, 4, 4, 4); - TEST_FIELD(XFORM, FLOAT, eM21, 8, 4, 4); - TEST_FIELD(XFORM, FLOAT, eM22, 12, 4, 4); - TEST_FIELD(XFORM, FLOAT, eDx, 16, 4, 4); - TEST_FIELD(XFORM, FLOAT, eDy, 20, 4, 4); + 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) } static void test_pack(void) @@ -4366,5 +7049,9 @@ 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/icm.c b/rostests/winetests/gdi32/icm.c index 424082cc8a9..06812aa055b 100644 --- a/rostests/winetests/gdi32/icm.c +++ b/rostests/winetests/gdi32/icm.c @@ -39,7 +39,7 @@ static void test_GetICMProfileA( HDC dc ) ret = GetICMProfileA( NULL, NULL, NULL ); if ( !ret && ( GetLastError() == ERROR_CALL_NOT_IMPLEMENTED ) ) { - skip( "GetICMProfileA is not implemented\n" ); + win_skip( "GetICMProfileA is not implemented\n" ); return; } ok( !ret, "GetICMProfileA succeeded\n" ); @@ -91,7 +91,7 @@ static void test_GetICMProfileW( HDC dc ) ret = GetICMProfileW( NULL, NULL, NULL ); if ( !ret && ( GetLastError() == ERROR_CALL_NOT_IMPLEMENTED ) ) { - skip( "GetICMProfileW is not implemented\n" ); + win_skip( "GetICMProfileW is not implemented\n" ); return; } ok( !ret, "GetICMProfileW succeeded\n" ); @@ -136,7 +136,7 @@ static void test_SetICMMode( HDC dc ) impl = GetICMProfileA( NULL, NULL, NULL ); if ( !impl && ( GetLastError() == ERROR_CALL_NOT_IMPLEMENTED ) ) { - skip( "On NT4 where SetICMMode is not implemented but this is not advertised\n" ); + win_skip( "On NT4 where SetICMMode is not implemented but this is not advertised\n" ); return; } @@ -165,7 +165,7 @@ static void test_SetICMMode( HDC dc ) dc = CreateDCW( displayW, NULL, NULL, NULL ); if ( !dc && ( GetLastError() == ERROR_CALL_NOT_IMPLEMENTED ) ) { - skip( "CreateDCW is not implemented\n" ); + win_skip( "CreateDCW is not implemented\n" ); return; } ok( dc != NULL, "CreateDCW failed (%d)\n", GetLastError() ); diff --git a/rostests/winetests/gdi32/mapping.c b/rostests/winetests/gdi32/mapping.c index 7e85ca9e05a..03428174617 100644 --- a/rostests/winetests/gdi32/mapping.c +++ b/rostests/winetests/gdi32/mapping.c @@ -75,8 +75,9 @@ static void test_world_transform(void) { BOOL is_win9x; HDC hdc; - INT ret, size_cx, size_cy, res_x, res_y; + INT ret, size_cx, size_cy, res_x, res_y, dpi_x, dpi_y; XFORM xform; + SIZE size; SetLastError(0xdeadbeef); GetWorldTransform(0, NULL); @@ -84,11 +85,23 @@ static void test_world_transform(void) hdc = CreateCompatibleDC(0); + xform.eM11 = 1.0f; + xform.eM12 = 0.0f; + xform.eM21 = 0.0f; + xform.eM22 = 1.0f; + xform.eDx = 0.0f; + xform.eDy = 0.0f; + ret = SetWorldTransform(hdc, &xform); + ok(!ret, "SetWorldTransform should fail in GM_COMPATIBLE mode\n"); + size_cx = GetDeviceCaps(hdc, HORZSIZE); size_cy = GetDeviceCaps(hdc, VERTSIZE); res_x = GetDeviceCaps(hdc, HORZRES); res_y = GetDeviceCaps(hdc, VERTRES); - trace("dc size %d x %d, resolution %d x %d\n", size_cx, size_cy, res_x, res_y); + dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); + dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); + trace("dc size %d x %d, resolution %d x %d dpi %d x %d\n", + size_cx, size_cy, res_x, res_y, dpi_x, dpi_y ); expect_viewport_ext(hdc, 1, 1); expect_window_ext(hdc, 1, 1); @@ -101,13 +114,19 @@ static void test_world_transform(void) if (is_win9x) { - expect_viewport_ext(hdc, GetDeviceCaps(hdc, LOGPIXELSX), GetDeviceCaps(hdc, LOGPIXELSY)); + expect_viewport_ext(hdc, dpi_x, dpi_y); expect_window_ext(hdc, 254, -254); } else { expect_viewport_ext(hdc, res_x, -res_y); - expect_window_ext(hdc, size_cx * 10, size_cy * 10); + ok( GetWindowExtEx( hdc, &size ), "GetWindowExtEx failed\n" ); + ok( size.cx == size_cx * 10 || + size.cx == MulDiv( res_x, 254, dpi_x ), /* Vista uses a more precise method */ + "expected cx %d or %d, got %d\n", size_cx * 10, MulDiv( res_x, 254, dpi_x ), size.cx ); + ok( size.cy == size_cy * 10 || + size.cy == MulDiv( res_y, 254, dpi_y ), /* Vista uses a more precise method */ + "expected cy %d or %d, got %d\n", size_cy * 10, MulDiv( res_y, 254, dpi_y ), size.cy ); } expect_world_trasform(hdc, 1.0, 1.0); expect_LPtoDP(hdc, MulDiv(1000 / 10, res_x, size_cx), -MulDiv(1000 / 10, res_y, size_cy)); @@ -134,6 +153,18 @@ static void test_world_transform(void) expect_world_trasform(hdc, 1.0, 1.0); expect_LPtoDP(hdc, 1000, 1000); + /* The transform must conform to (eM11 * eM22 != eM12 * eM21) requirement */ + xform.eM11 = 1.0f; + xform.eM12 = 2.0f; + xform.eM21 = 1.0f; + xform.eM22 = 2.0f; + xform.eDx = 0.0f; + xform.eDy = 0.0f; + ret = SetWorldTransform(hdc, &xform); + ok(!ret || + broken(ret), /* NT4 */ + "SetWorldTransform should fail with an invalid xform\n"); + xform.eM11 = 20.0f; xform.eM12 = 0.0f; xform.eM21 = 0.0f; @@ -154,9 +185,15 @@ static void test_world_transform(void) ok(ret == MM_TEXT, "expected MM_TEXT, got %d\n", ret); expect_viewport_ext(hdc, res_x, -res_y); - expect_window_ext(hdc, size_cx * 10, size_cy * 10); + ok( GetWindowExtEx( hdc, &size ), "GetWindowExtEx failed\n" ); + ok( size.cx == size_cx * 10 || + size.cx == MulDiv( res_x, 254, dpi_x ), /* Vista uses a more precise method */ + "expected cx %d or %d, got %d\n", size_cx * 10, MulDiv( res_x, 254, dpi_x ), size.cx ); + ok( size.cy == size_cy * 10 || + size.cy == MulDiv( res_y, 254, dpi_y ), /* Vista uses a more precise method */ + "expected cy %d or %d, got %d\n", size_cy * 10, MulDiv( res_y, 254, dpi_y ), size.cy ); expect_world_trasform(hdc, 20.0, 20.0); - expect_LPtoDP(hdc, MulDiv(1000 * 2, res_x, size_cx), -MulDiv(1000 * 2, res_y, size_cy)); + expect_LPtoDP(hdc, MulDiv(20000, res_x, size.cx), -MulDiv(20000, res_y, size.cy)); SetLastError(0xdeadbeef); ret = SetMapMode(hdc, MM_TEXT); @@ -167,6 +204,16 @@ static void test_world_transform(void) expect_world_trasform(hdc, 20.0, 20.0); expect_LPtoDP(hdc, 20000, 20000); + ret = SetGraphicsMode(hdc, GM_COMPATIBLE); + ok(ret, "SetGraphicsMode(GM_COMPATIBLE) should not fail if DC has't an identity transform\n"); + ret = GetGraphicsMode(hdc); + ok(ret == GM_COMPATIBLE, "expected GM_COMPATIBLE, got %d\n", ret); + + expect_viewport_ext(hdc, 1, 1); + expect_window_ext(hdc, 1, 1); + expect_world_trasform(hdc, 20.0, 20.0); + expect_LPtoDP(hdc, 20000, 20000); + DeleteDC(hdc); } diff --git a/rostests/winetests/gdi32/metafile.c b/rostests/winetests/gdi32/metafile.c index 85bc5290abe..077977ec0de 100755 --- a/rostests/winetests/gdi32/metafile.c +++ b/rostests/winetests/gdi32/metafile.c @@ -121,8 +121,11 @@ static int CALLBACK eto_emf_enum_proc(HDC hdc, HANDLETABLE *handle_table, const EMREXTTEXTOUTW *emr_ExtTextOutW = (const EMREXTTEXTOUTW *)emr; dx = (const INT *)((const char *)emr + emr_ExtTextOutW->emrtext.offDx); + SetLastError(0xdeadbeef); ret = GetObjectA(GetCurrentObject(hdc, OBJ_FONT), sizeof(device_lf), &device_lf); - ok( ret == sizeof(device_lf), "GetObjectA error %d\n", GetLastError()); + ok( ret == sizeof(device_lf) || + broken(ret == (sizeof(device_lf) - LF_FACESIZE + strlen(device_lf.lfFaceName) + 1)), /* NT4 */ + "GetObjectA error %d\n", GetLastError()); /* compare up to lfOutPrecision, other values are not interesting, * and in fact sometimes arbitrary adapted by Win9x. @@ -327,6 +330,7 @@ static int CALLBACK savedc_emf_enum_proc(HDC hdc, HANDLETABLE *handle_table, SIZE size; static int save_state; static int restore_no; + static int select_no; trace("hdc %p, emr->iType %d, emr->nSize %d, param %p\n", hdc, emr->iType, emr->nSize, (void *)param); @@ -372,6 +376,7 @@ static int CALLBACK savedc_emf_enum_proc(HDC hdc, HANDLETABLE *handle_table, save_state = 0; restore_no = 0; + select_no = 0; check_dc_state(hdc, restore_no, 0, 0, 1, 1, 0, 0, 1, 1); break; } @@ -435,8 +440,16 @@ static int CALLBACK savedc_emf_enum_proc(HDC hdc, HANDLETABLE *handle_table, save_state += restoredc->iRelative; break; } + case EMR_SELECTOBJECT: + { + const EMRSELECTOBJECT *selectobj = (const EMRSELECTOBJECT*)emr; + trace("EMR_SELECTOBJECT: %x\n",selectobj->ihObject); + select_no ++; + break; + } case EMR_EOF: ok(save_state == 0, "EOF save_state %d\n", save_state); + ok(select_no == 3, "Too many/few selects %i\n",select_no); break; } @@ -469,6 +482,9 @@ static void test_SaveDC(void) HENHMETAFILE hMetafile; HWND hwnd; int ret; + POINT pt; + SIZE size; + HFONT hFont,hFont2,hFontOld,hFontCheck; static const RECT rc = { 0, 0, 150, 150 }; /* Win9x doesn't play EMFs on invisible windows */ @@ -495,6 +511,190 @@ static void test_SaveDC(void) /* Force Win9x to update DC state */ SetPixelV(hdcMetafile, 50, 50, 0); + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 0,"Expecting ViewportOrg x of 0, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 120,"Expecting ViewportExt cx of 120, got %i\n",size.cx); + ret = SaveDC(hdcMetafile); + ok(ret == 1, "ret = %d\n", ret); + + SetWindowOrgEx(hdcMetafile, -1, -1, NULL); + SetViewportOrgEx(hdcMetafile, 10, 10, NULL); + SetWindowExtEx(hdcMetafile, 150, 150, NULL ); + SetViewportExtEx(hdcMetafile, 200, 200, NULL ); + + /* Force Win9x to update DC state */ + SetPixelV(hdcMetafile, 50, 50, 0); + + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 10,"Expecting ViewportOrg x of 10, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 200,"Expecting ViewportExt cx of 200, got %i\n",size.cx); + ret = SaveDC(hdcMetafile); + ok(ret == 2, "ret = %d\n", ret); + + SetWindowOrgEx(hdcMetafile, -2, -2, NULL); + SetViewportOrgEx(hdcMetafile, 20, 20, NULL); + SetWindowExtEx(hdcMetafile, 120, 120, NULL ); + SetViewportExtEx(hdcMetafile, 300, 300, NULL ); + SetPolyFillMode( hdcMetafile, ALTERNATE ); + SetBkColor( hdcMetafile, 0 ); + + /* Force Win9x to update DC state */ + SetPixelV(hdcMetafile, 50, 50, 0); + + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 20,"Expecting ViewportOrg x of 20, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 300,"Expecting ViewportExt cx of 300, got %i\n",size.cx); + ret = SaveDC(hdcMetafile); + ok(ret == 3, "ret = %d\n", ret); + + SetWindowOrgEx(hdcMetafile, -3, -3, NULL); + SetViewportOrgEx(hdcMetafile, 30, 30, NULL); + SetWindowExtEx(hdcMetafile, 200, 200, NULL ); + SetViewportExtEx(hdcMetafile, 400, 400, NULL ); + + SetPolyFillMode( hdcMetafile, WINDING ); + SetBkColor( hdcMetafile, 0x123456 ); + ok( GetPolyFillMode( hdcMetafile ) == WINDING, "PolyFillMode not restored\n" ); + ok( GetBkColor( hdcMetafile ) == 0x123456, "Background color not restored\n" ); + + /* Force Win9x to update DC state */ + SetPixelV(hdcMetafile, 50, 50, 0); + + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 30,"Expecting ViewportOrg x of 30, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 400,"Expecting ViewportExt cx of 400, got %i\n",size.cx); + ret = RestoreDC(hdcMetafile, -1); + ok(ret, "ret = %d\n", ret); + + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 20,"Expecting ViewportOrg x of 20, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 300,"Expecting ViewportExt cx of 300, got %i\n",size.cx); + ok( GetPolyFillMode( hdcMetafile ) == ALTERNATE, "PolyFillMode not restored\n" ); + ok( GetBkColor( hdcMetafile ) == 0, "Background color not restored\n" ); + ret = SaveDC(hdcMetafile); + ok(ret == 3, "ret = %d\n", ret); + + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 20,"Expecting ViewportOrg x of 20, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 300,"Expecting ViewportExt cx of 300, got %i\n",size.cx); + ret = RestoreDC(hdcMetafile, 1); + ok(ret, "ret = %d\n", ret); + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 0,"Expecting ViewportOrg x of 0, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 120,"Expecting ViewportExt cx of 120, got %i\n",size.cx); + + SetWindowOrgEx(hdcMetafile, -4, -4, NULL); + SetViewportOrgEx(hdcMetafile, 40, 40, NULL); + SetWindowExtEx(hdcMetafile, 500, 500, NULL ); + SetViewportExtEx(hdcMetafile, 50, 50, NULL ); + + /* Force Win9x to update DC state */ + SetPixelV(hdcMetafile, 50, 50, 0); + + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 40,"Expecting ViewportOrg x of 40, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 50,"Expecting ViewportExt cx of 50, got %i\n",size.cx); + ret = SaveDC(hdcMetafile); + ok(ret == 1, "ret = %d\n", ret); + + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 40,"Expecting ViewportOrg x of 40, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 50,"Expecting ViewportExt cx of 50, got %i\n",size.cx); + ret = SaveDC(hdcMetafile); + ok(ret == 2, "ret = %d\n", ret); + + memset(&orig_lf, 0, sizeof(orig_lf)); + orig_lf.lfCharSet = ANSI_CHARSET; + orig_lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + orig_lf.lfWeight = FW_DONTCARE; + orig_lf.lfHeight = 7; + orig_lf.lfQuality = DEFAULT_QUALITY; + lstrcpyA(orig_lf.lfFaceName, "Arial"); + hFont = CreateFontIndirectA(&orig_lf); + ok(hFont != 0, "CreateFontIndirectA error %d\n", GetLastError()); + + hFontOld = SelectObject(hdcMetafile, hFont); + + hFont2 = CreateFontIndirectA(&orig_lf); + ok(hFont2 != 0, "CreateFontIndirectA error %d\n", GetLastError()); + hFontCheck = SelectObject(hdcMetafile, hFont2); + ok(hFontCheck == hFont, "Font not selected\n"); + + /* Force Win9x to update DC state */ + SetPixelV(hdcMetafile, 50, 50, 0); + + ret = RestoreDC(hdcMetafile, 1); + ok(ret, "ret = %d\n", ret); + ret = GetViewportOrgEx(hdcMetafile, &pt); + ok(pt.x == 40,"Expecting ViewportOrg x of 40, got %i\n",pt.x); + ret = GetViewportExtEx(hdcMetafile, &size); + ok(size.cx == 50,"Expecting ViewportExt cx of 50, got %i\n",size.cx); + + hFontCheck = SelectObject(hdcMetafile, hFontOld); + ok(hFontOld == hFontCheck && hFontCheck != hFont && hFontCheck != hFont2, + "Font not reverted with DC Restore\n"); + + ret = RestoreDC(hdcMetafile, -20); + ok(!ret, "ret = %d\n", ret); + ret = RestoreDC(hdcMetafile, 20); + ok(!ret, "ret = %d\n", ret); + + hMetafile = CloseEnhMetaFile(hdcMetafile); + ok(hMetafile != 0, "CloseEnhMetaFile error %d\n", GetLastError()); + + ret = EnumEnhMetaFile(hdcDisplay, hMetafile, savedc_emf_enum_proc, 0, &rc); + ok( ret == 1, "EnumEnhMetaFile rets %d\n", ret); + + ret = DeleteObject(hFont); + ok( ret, "DeleteObject error %d\n", GetLastError()); + ret = DeleteObject(hFont2); + ok( ret, "DeleteObject error %d\n", GetLastError()); + ret = DeleteEnhMetaFile(hMetafile); + ok( ret, "DeleteEnhMetaFile error %d\n", GetLastError()); + ret = ReleaseDC(hwnd, hdcDisplay); + ok( ret, "ReleaseDC error %d\n", GetLastError()); + DestroyWindow(hwnd); +} + +static void test_mf_SaveDC(void) +{ + HDC hdcMetafile; + HMETAFILE hMetafile; + int ret; + POINT pt; + SIZE size; + HFONT hFont,hFont2,hFontOld,hFontCheck; + + hdcMetafile = CreateMetaFileA(NULL); + ok(hdcMetafile != 0, "CreateMetaFileA error %d\n", GetLastError()); + + ret = SetMapMode(hdcMetafile, MM_ANISOTROPIC); + ok (ret, "SetMapMode should not fail\n"); + + /* Need to write something to the emf, otherwise Windows won't play it back */ + LineTo(hdcMetafile, 150, 150); + + SetWindowOrgEx(hdcMetafile, 0, 0, NULL); + SetViewportOrgEx(hdcMetafile, 0, 0, NULL); + SetWindowExtEx(hdcMetafile, 110, 110, NULL ); + SetViewportExtEx(hdcMetafile, 120, 120, NULL ); + + /* Force Win9x to update DC state */ + SetPixelV(hdcMetafile, 50, 50, 0); + + ret = GetViewportOrgEx(hdcMetafile, &pt); + todo_wine ok (!ret, "GetViewportOrgEx should fail\n"); + ret = GetViewportExtEx(hdcMetafile, &size); + todo_wine ok (!ret, "GetViewportExtEx should fail\n"); ret = SaveDC(hdcMetafile); ok(ret == 1, "ret = %d\n", ret); @@ -507,7 +707,7 @@ static void test_SaveDC(void) SetPixelV(hdcMetafile, 50, 50, 0); ret = SaveDC(hdcMetafile); - ok(ret == 2, "ret = %d\n", ret); + ok(ret == 1, "ret = %d\n", ret); SetWindowOrgEx(hdcMetafile, -2, -2, NULL); SetViewportOrgEx(hdcMetafile, 20, 20, NULL); @@ -516,15 +716,22 @@ static void test_SaveDC(void) /* Force Win9x to update DC state */ SetPixelV(hdcMetafile, 50, 50, 0); + SetPolyFillMode( hdcMetafile, ALTERNATE ); + SetBkColor( hdcMetafile, 0 ); ret = SaveDC(hdcMetafile); - ok(ret == 3, "ret = %d\n", ret); + ok(ret == 1, "ret = %d\n", ret); SetWindowOrgEx(hdcMetafile, -3, -3, NULL); SetViewportOrgEx(hdcMetafile, 30, 30, NULL); SetWindowExtEx(hdcMetafile, 200, 200, NULL ); SetViewportExtEx(hdcMetafile, 400, 400, NULL ); + SetPolyFillMode( hdcMetafile, WINDING ); + SetBkColor( hdcMetafile, 0x123456 ); + todo_wine ok( !GetPolyFillMode( hdcMetafile ), "GetPolyFillMode succeeded\n" ); + todo_wine ok( GetBkColor( hdcMetafile ) == CLR_INVALID, "GetBkColor succeeded\n" ); + /* Force Win9x to update DC state */ SetPixelV(hdcMetafile, 50, 50, 0); @@ -532,7 +739,7 @@ static void test_SaveDC(void) ok(ret, "ret = %d\n", ret); ret = SaveDC(hdcMetafile); - ok(ret == 3, "ret = %d\n", ret); + ok(ret == 1, "ret = %d\n", ret); ret = RestoreDC(hdcMetafile, 1); ok(ret, "ret = %d\n", ret); @@ -549,21 +756,54 @@ static void test_SaveDC(void) ok(ret == 1, "ret = %d\n", ret); ret = SaveDC(hdcMetafile); - ok(ret == 2, "ret = %d\n", ret); + ok(ret == 1, "ret = %d\n", ret); - hMetafile = CloseEnhMetaFile(hdcMetafile); + memset(&orig_lf, 0, sizeof(orig_lf)); + orig_lf.lfCharSet = ANSI_CHARSET; + orig_lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + orig_lf.lfWeight = FW_DONTCARE; + orig_lf.lfHeight = 7; + orig_lf.lfQuality = DEFAULT_QUALITY; + lstrcpyA(orig_lf.lfFaceName, "Arial"); + hFont = CreateFontIndirectA(&orig_lf); + ok(hFont != 0, "CreateFontIndirectA error %d\n", GetLastError()); + + hFontOld = SelectObject(hdcMetafile, hFont); + + hFont2 = CreateFontIndirectA(&orig_lf); + ok(hFont2 != 0, "CreateFontIndirectA error %d\n", GetLastError()); + hFontCheck = SelectObject(hdcMetafile, hFont2); + ok(hFontCheck == hFont, "Font not selected\n"); + + /* Force Win9x to update DC state */ + SetPixelV(hdcMetafile, 50, 50, 0); + + ret = RestoreDC(hdcMetafile, 1); + ok(ret, "ret = %d\n", ret); + + hFontCheck = SelectObject(hdcMetafile, hFontOld); + ok(hFontOld != hFontCheck && hFontCheck == hFont2, "Font incorrectly reverted with DC Restore\n"); + + /* restore level is ignored */ + ret = RestoreDC(hdcMetafile, -20); + ok(ret, "ret = %d\n", ret); + ret = RestoreDC(hdcMetafile, 20); + ok(ret, "ret = %d\n", ret); + ret = RestoreDC(hdcMetafile, 0); + ok(ret, "ret = %d\n", ret); + + hMetafile = CloseMetaFile(hdcMetafile); ok(hMetafile != 0, "CloseEnhMetaFile error %d\n", GetLastError()); - ret = EnumEnhMetaFile(hdcDisplay, hMetafile, savedc_emf_enum_proc, 0, &rc); - ok( ret == 1, "EnumEnhMetaFile rets %d\n", ret); - - ret = DeleteEnhMetaFile(hMetafile); - ok( ret, "DeleteEnhMetaFile error %d\n", GetLastError()); - ret = ReleaseDC(hwnd, hdcDisplay); - ok( ret, "ReleaseDC error %d\n", GetLastError()); - DestroyWindow(hwnd); + ret = DeleteMetaFile(hMetafile); + ok( ret, "DeleteMetaFile error %d\n", GetLastError()); + ret = DeleteObject(hFont); + ok( ret, "DeleteObject error %d\n", GetLastError()); + ret = DeleteObject(hFont2); + ok( ret, "DeleteObject error %d\n", GetLastError()); } + /* Win-format metafile (mfdrv) tests */ /* These tests compare the generated metafiles byte-by-byte */ /* with the nominal results. */ @@ -992,33 +1232,15 @@ static void dump_EMREXTTEXTOUT(const EMREXTTEXTOUTW *eto) } static BOOL match_emf_record(const ENHMETARECORD *emr1, const ENHMETARECORD *emr2, - const char *desc, BOOL ignore_scaling, BOOL todo) + const char *desc, BOOL ignore_scaling) { int diff; - if (emr1->iType != emr2->iType && todo) - { - todo_wine - { - ok(emr1->iType == emr2->iType, "%s: emr->iType %u != %u\n", - desc, emr1->iType, emr2->iType); - } - } - else - ok(emr1->iType == emr2->iType, "%s: emr->iType %u != %u\n", - desc, emr1->iType, emr2->iType); + ok(emr1->iType == emr2->iType, "%s: emr->iType %u != %u\n", + desc, emr1->iType, emr2->iType); - if (emr1->nSize != emr2->nSize && todo) - { - todo_wine - { - ok(emr1->nSize == emr2->nSize, "%s: emr->nSize %u != %u\n", - desc, emr1->nSize, emr2->nSize); - } - } - else - ok(emr1->nSize == emr2->nSize, "%s: emr->nSize %u != %u\n", - desc, emr1->nSize, emr2->nSize); + ok(emr1->nSize == emr2->nSize, "%s: emr->nSize %u != %u\n", + desc, emr1->nSize, emr2->nSize); /* iType and nSize mismatches are fatal */ if (emr1->iType != emr2->iType || emr1->nSize != emr2->nSize) return FALSE; @@ -1057,13 +1279,8 @@ static BOOL match_emf_record(const ENHMETARECORD *emr1, const ENHMETARECORD *emr } else diff = memcmp(emr1, emr2, emr1->nSize); - if (diff && todo) - { - todo_wine - ok(diff == 0, "%s: contents of record %u don't match\n", desc, emr1->iType); - } - else - ok(diff == 0, "%s: contents of record %u don't match\n", desc, emr1->iType); + + ok(diff == 0, "%s: contents of record %u don't match\n", desc, emr1->iType); if (diff) { @@ -1071,7 +1288,7 @@ static BOOL match_emf_record(const ENHMETARECORD *emr1, const ENHMETARECORD *emr dump_emf_record(emr2, "actual bits"); } - return diff == 0 || todo; /* report all non-fatal record mismatches */ + return diff == 0; /* report all non-fatal record mismatches */ } /* Compare the EMF produced by a test function with the @@ -1082,7 +1299,7 @@ static BOOL match_emf_record(const ENHMETARECORD *emr1, const ENHMETARECORD *emr */ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits, UINT bsize, const char *desc, - BOOL ignore_scaling, BOOL todo) + BOOL ignore_scaling) { unsigned char buf[MF_BUFSIZE]; UINT mfsize, offset; @@ -1093,12 +1310,6 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits, if (mfsize < MF_BUFSIZE) { - if (mfsize != bsize && todo) - { - todo_wine - ok(mfsize == bsize, "%s: mfsize=%d, bsize=%d\n", desc, mfsize, bsize); - } - else ok(mfsize == bsize, "%s: mfsize=%d, bsize=%d\n", desc, mfsize, bsize); } else @@ -1116,20 +1327,8 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits, ok(emh1->iType == emh2->iType, "expected EMR_HEADER, got %u\n", emh2->iType); ok(emh1->nSize == emh2->nSize, "expected nSize %u, got %u\n", emh1->nSize, emh2->nSize); ok(emh1->dSignature == emh2->dSignature, "expected dSignature %u, got %u\n", emh1->dSignature, emh2->dSignature); - if (todo && emh1->nBytes != emh2->nBytes) - { - todo_wine - ok(emh1->nBytes == emh2->nBytes, "expected nBytes %u, got %u\n", emh1->nBytes, emh2->nBytes); - } - else - ok(emh1->nBytes == emh2->nBytes, "expected nBytes %u, got %u\n", emh1->nBytes, emh2->nBytes); - if (todo && emh1->nRecords != emh2->nRecords) - { - todo_wine - ok(emh1->nRecords == emh2->nRecords, "expected nBytes %u, got %u\n", emh1->nRecords, emh2->nRecords); - } - else - ok(emh1->nRecords == emh2->nRecords, "expected nBytes %u, got %u\n", emh1->nRecords, emh2->nRecords); + ok(emh1->nBytes == emh2->nBytes, "expected nBytes %u, got %u\n", emh1->nBytes, emh2->nBytes); + ok(emh1->nRecords == emh2->nRecords, "expected nBytes %u, got %u\n", emh1->nRecords, emh2->nRecords); offset = emh1->nSize; while (offset < emh1->nBytes) @@ -1140,7 +1339,7 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits, trace("EMF record %u, size %u/record %u, size %u\n", emr1->iType, emr1->nSize, emr2->iType, emr2->nSize); - if (!match_emf_record(emr1, emr2, desc, ignore_scaling, todo)) return -1; + if (!match_emf_record(emr1, emr2, desc, ignore_scaling)) return -1; offset += emr1->nSize; } @@ -1261,7 +1460,9 @@ static void test_SetMetaFileBits(void) SetLastError(0xdeadbeef); hmf = SetMetaFileBitsEx(0, MF_GRAPHICS_BITS); ok(!hmf, "SetMetaFileBitsEx should fail\n"); - ok(GetLastError() == ERROR_INVALID_DATA, "wrong error %d\n", GetLastError()); + ok(GetLastError() == ERROR_INVALID_DATA || + broken(GetLastError() == ERROR_INVALID_PARAMETER), /* Win9x */ + "wrong error %d\n", GetLastError()); /* Now with not even size */ SetLastError(0xdeadbeef); @@ -1280,7 +1481,9 @@ static void test_SetMetaFileBits(void) SetLastError(0xdeadbeef); hmf = SetMetaFileBitsEx(sizeof(MF_GRAPHICS_BITS), buf); ok(!hmf, "SetMetaFileBitsEx should fail\n"); - ok(GetLastError() == ERROR_INVALID_DATA, "wrong error %d\n", GetLastError()); + ok(GetLastError() == ERROR_INVALID_DATA || + broken(GetLastError() == ERROR_INVALID_PARAMETER), /* Win9x */ + "wrong error %d\n", GetLastError()); /* Now with corrupted mtSize field */ memcpy(buf, MF_GRAPHICS_BITS, sizeof(MF_GRAPHICS_BITS)); @@ -1480,7 +1683,7 @@ static void test_emf_ExtTextOut_on_path(void) * are there, but their contents don't match for different reasons. */ if (compare_emf_bits(hMetafile, EMF_TEXTOUT_ON_PATH_BITS, sizeof(EMF_TEXTOUT_ON_PATH_BITS), - "emf_TextOut_on_path", FALSE, FALSE) != 0) + "emf_TextOut_on_path", FALSE) != 0) { dump_emf_bits(hMetafile, "emf_TextOut_on_path"); dump_emf_records(hMetafile, "emf_TextOut_on_path"); @@ -1676,7 +1879,7 @@ static void test_emf_clipping(void) ok(hemf != 0, "CloseEnhMetaFile error %d\n", GetLastError()); if (compare_emf_bits(hemf, EMF_CLIPPING, sizeof(EMF_CLIPPING), - "emf_clipping", FALSE, FALSE) != 0) + "emf_clipping", FALSE) != 0) { dump_emf_bits(hemf, "emf_clipping"); dump_emf_records(hemf, "emf_clipping"); @@ -1785,7 +1988,7 @@ static void test_mf_conversions(void) hemf = create_converted_emf(&mfp); if (compare_emf_bits(hemf, EMF_LINETO_MM_ANISOTROPIC_BITS, sizeof(EMF_LINETO_MM_ANISOTROPIC_BITS), - "emf_LineTo MM_ANISOTROPIC", TRUE, FALSE) != 0) + "emf_LineTo MM_ANISOTROPIC", TRUE) != 0) { dump_emf_bits(hemf, "emf_LineTo MM_ANISOTROPIC"); dump_emf_records(hemf, "emf_LineTo MM_ANISOTROPIC"); @@ -1810,7 +2013,7 @@ static void test_mf_conversions(void) hemf = create_converted_emf(&mfp); if (compare_emf_bits(hemf, EMF_LINETO_MM_TEXT_BITS, sizeof(EMF_LINETO_MM_TEXT_BITS), - "emf_LineTo MM_TEXT", TRUE, FALSE) != 0) + "emf_LineTo MM_TEXT", TRUE) != 0) { dump_emf_bits(hemf, "emf_LineTo MM_TEXT"); dump_emf_records(hemf, "emf_LineTo MM_TEXT"); @@ -1830,7 +2033,7 @@ static void test_mf_conversions(void) hemf = create_converted_emf(NULL); if (compare_emf_bits(hemf, EMF_LINETO_BITS, sizeof(EMF_LINETO_BITS), - "emf_LineTo NULL", TRUE, FALSE) != 0) + "emf_LineTo NULL", TRUE) != 0) { dump_emf_bits(hemf, "emf_LineTo NULL"); dump_emf_records(hemf, "emf_LineTo NULL"); @@ -2146,7 +2349,6 @@ static void test_SetEnhMetaFileBits(void) ok(!hemf || broken(hemf != NULL), /* Win9x, WinMe */ "SetEnhMetaFileBits should fail\n"); - todo_wine ok(GetLastError() == 0xdeadbeef, "Expected deadbeef, got %u\n", GetLastError()); DeleteEnhMetaFile(hemf); @@ -2157,7 +2359,6 @@ static void test_SetEnhMetaFileBits(void) ok(!hemf || broken(hemf != NULL), /* Win9x, WinMe */ "SetEnhMetaFileBits should fail\n"); - todo_wine ok(GetLastError() == 0xdeadbeef, "Expected deadbeef, got %u\n", GetLastError()); DeleteEnhMetaFile(hemf); } @@ -2171,6 +2372,7 @@ START_TEST(metafile) test_SaveDC(); /* For win-format metafiles (mfdrv) */ + test_mf_SaveDC(); test_mf_Blank(); test_mf_Graphics(); test_mf_PatternBrush(); diff --git a/rostests/winetests/gdi32/path.c b/rostests/winetests/gdi32/path.c index 58e84677fcf..4a8ea6d4743 100644 --- a/rostests/winetests/gdi32/path.c +++ b/rostests/winetests/gdi32/path.c @@ -238,7 +238,7 @@ static void test_arcto(void) GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { /* ArcTo is only available on Win2k and later */ - skip("ArcTo is not available\n"); + win_skip("ArcTo is not available\n"); goto done; } SetArcDirection(hdc, AD_COUNTERCLOCKWISE); @@ -282,7 +282,7 @@ static void test_anglearc(void) GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { /* AngleArc is only available on Win2k and later */ - skip("AngleArc is not available\n"); + win_skip("AngleArc is not available\n"); goto done; } AngleArc(hdc, 300, 300, 80, 150.0, -180.0); @@ -355,7 +355,7 @@ static void test_polydraw(void) GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { /* PolyDraw is only available on Win2k and later */ - skip("PolyDraw is not available\n"); + win_skip("PolyDraw is not available\n"); goto done; } expect(TRUE, retb); diff --git a/rostests/winetests/gdi32/pen.c b/rostests/winetests/gdi32/pen.c index 64304fac1a2..460288d9cd3 100644 --- a/rostests/winetests/gdi32/pen.c +++ b/rostests/winetests/gdi32/pen.c @@ -61,6 +61,7 @@ static void test_logpen(void) LOGPEN lp; EXTLOGPEN elp; LOGBRUSH lb; + DWORD_PTR unset_hatch; DWORD obj_type, user_style[2] = { 0xabc, 0xdef }; struct { @@ -90,9 +91,19 @@ static void test_logpen(void) size = GetObject(hpen, sizeof(lp), &lp); ok(size == sizeof(lp), "GetObject returned %d, error %d\n", size, GetLastError()); + if (pen[i].style == PS_USERSTYLE || pen[i].style == PS_ALTERNATE) + { + if (lp.lopnStyle == pen[i].style) + { + win_skip("Skipping PS_USERSTYLE and PS_ALTERNATE tests on Win9x\n"); + continue; + } + } ok(lp.lopnStyle == pen[i].ret_style, "expected %u, got %u\n", pen[i].ret_style, lp.lopnStyle); ok(lp.lopnWidth.x == pen[i].ret_width, "expected %u, got %d\n", pen[i].ret_width, lp.lopnWidth.x); - ok(lp.lopnWidth.y == 0, "expected 0, got %d\n", lp.lopnWidth.y); + ok(lp.lopnWidth.y == 0 || + broken(lp.lopnWidth.y == 0xb), /* Win9x */ + "expected 0, got %d\n", lp.lopnWidth.y); ok(lp.lopnColor == pen[i].ret_color, "expected %08x, got %08x\n", pen[i].ret_color, lp.lopnColor); DeleteObject(hpen); @@ -113,12 +124,14 @@ static void test_logpen(void) memset(&lp, 0xb0, sizeof(lp)); SetLastError(0xdeadbeef); size = GetObject(hpen, sizeof(lp.lopnStyle), &lp); - ok(!size, "GetObject should fail: size %d, error %d\n", size, GetLastError()); + ok(!size || + broken(size == sizeof(lp.lopnStyle)), /* Win9x */ + "GetObject should fail: size %d, error %d\n", size, GetLastError()); /* see how larger buffer sizes are handled */ memset(&lp, 0xb0, sizeof(lp)); SetLastError(0xdeadbeef); - size = GetObject(hpen, sizeof(lp) * 2, &lp); + size = GetObject(hpen, sizeof(lp) * 4, &lp); ok(size == sizeof(lp), "GetObject returned %d, error %d\n", size, GetLastError()); /* see how larger buffer sizes are handled */ @@ -225,12 +238,17 @@ static void test_logpen(void) break; case PS_USERSTYLE: - ok(size == sizeof(EXTLOGPEN) - sizeof(elp.elpStyleEntry) + sizeof(user_style), + ok(size == sizeof(EXTLOGPEN) - sizeof(elp.elpStyleEntry) + sizeof(user_style) || + broken(size == 0 && GetLastError() == ERROR_INVALID_PARAMETER), /* Win9x */ "GetObject returned %d, error %d\n", size, GetLastError()); break; default: - ok(size == sizeof(EXTLOGPEN) - sizeof(elp.elpStyleEntry), + ok(size == sizeof(EXTLOGPEN) - sizeof(elp.elpStyleEntry) || + broken(size == sizeof(LOGPEN)) || /* Win9x */ + broken(pen[i].style == PS_ALTERNATE && + size == 0 && + GetLastError() == ERROR_INVALID_PARAMETER), /* Win9x */ "GetObject returned %d, error %d\n", size, GetLastError()); break; } @@ -239,7 +257,9 @@ static void test_logpen(void) memset(&elp, 0xb0, sizeof(elp)); SetLastError(0xdeadbeef); size = GetObject(hpen, sizeof(elp.elpPenStyle), &elp); - ok(!size, "GetObject should fail: size %d, error %d\n", size, GetLastError()); + ok(!size || + broken(size == sizeof(elp.elpPenStyle)), /* Win9x */ + "GetObject should fail: size %d, error %d\n", size, GetLastError()); /* see how larger buffer sizes are handled */ memset(&ext_pen, 0xb0, sizeof(ext_pen)); @@ -258,11 +278,12 @@ static void test_logpen(void) /* for PS_NULL it also works this way */ memset(&elp, 0xb0, sizeof(elp)); + memset(&unset_hatch, 0xb0, sizeof(unset_hatch)); SetLastError(0xdeadbeef); size = GetObject(hpen, sizeof(elp), &elp); ok(size == sizeof(EXTLOGPEN), "GetObject returned %d, error %d\n", size, GetLastError()); - ok(ext_pen.elp.elpHatch == 0xb0b0b0b0, "expected 0xb0b0b0b0, got %p\n", (void *)ext_pen.elp.elpHatch); + ok(ext_pen.elp.elpHatch == unset_hatch, "expected 0xb0b0b0b0, got %p\n", (void *)ext_pen.elp.elpHatch); ok(ext_pen.elp.elpNumEntries == 0xb0b0b0b0, "expected 0xb0b0b0b0, got %x\n", ext_pen.elp.elpNumEntries); break; @@ -276,7 +297,11 @@ static void test_logpen(void) break; default: - ok(size == sizeof(EXTLOGPEN) - sizeof(elp.elpStyleEntry), + ok(size == sizeof(EXTLOGPEN) - sizeof(elp.elpStyleEntry) || + broken(size == sizeof(LOGPEN)) || /* Win9x */ + broken(pen[i].style == PS_ALTERNATE && + size == 0 && + GetLastError() == ERROR_INVALID_PARAMETER), /* Win9x */ "GetObject returned %d, error %d\n", size, GetLastError()); ok(ext_pen.elp.elpHatch == HS_CROSS, "expected HS_CROSS, got %p\n", (void *)ext_pen.elp.elpHatch); ok(ext_pen.elp.elpNumEntries == 0, "expected 0, got %x\n", ext_pen.elp.elpNumEntries); @@ -504,6 +529,11 @@ static void test_ps_userstyle(void) pen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 50, &lb, 3, NULL); ok(pen == 0, "ExtCreatePen should fail\n"); + if (pen == 0 && GetLastError() == 0xdeadbeef) + { + win_skip("Looks like 9x, skipping PS_USERSTYLE tests\n"); + return; + } expect(ERROR_INVALID_PARAMETER, GetLastError()); DeleteObject(pen); SetLastError(0xdeadbeef); @@ -542,7 +572,7 @@ static void test_ps_userstyle(void) ok(pen != 0, "ExtCreatePen should not fail\n"); size = GetObject(pen, sizeof(ext_pen), &ext_pen); - expect(88, size); + expect(FIELD_OFFSET(EXTLOGPEN,elpStyleEntry[16]), size); for(i = 0; i < 16; i++) expect(style[i], ext_pen.elp.elpStyleEntry[i]); diff --git a/rostests/winetests/gdiplus/brush.c b/rostests/winetests/gdiplus/brush.c index d2cbd3c77e3..b6fbe3044ef 100644 --- a/rostests/winetests/gdiplus/brush.c +++ b/rostests/winetests/gdiplus/brush.c @@ -328,6 +328,34 @@ static void test_gradientgetrect(void) expectf(10.0, rectf.Width); todo_wine expectf(10.0, rectf.Height); status = GdipDeleteBrush((GpBrush*)brush); + /* slope = -1 */ + pt1.X = pt1.Y = 0.0; + pt2.X = 20.0; + pt2.Y = -20.0; + status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); + expect(Ok, status); + memset(&rectf, 0, sizeof(GpRectF)); + status = GdipGetLineRect(brush, &rectf); + expect(Ok, status); + expectf(0.0, rectf.X); + expectf(-20.0, rectf.Y); + expectf(20.0, rectf.Width); + expectf(20.0, rectf.Height); + status = GdipDeleteBrush((GpBrush*)brush); + /* slope = 1/100 */ + pt1.X = pt1.Y = 0.0; + pt2.X = 100.0; + pt2.Y = 1.0; + status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); + expect(Ok, status); + memset(&rectf, 0, sizeof(GpRectF)); + status = GdipGetLineRect(brush, &rectf); + expect(Ok, status); + expectf(0.0, rectf.X); + expectf(0.0, rectf.Y); + expectf(100.0, rectf.Width); + expectf(1.0, rectf.Height); + status = GdipDeleteBrush((GpBrush*)brush); /* from rect with LinearGradientModeHorizontal */ rectf.X = rectf.Y = 10.0; rectf.Width = rectf.Height = 100.0; @@ -342,6 +370,127 @@ static void test_gradientgetrect(void) expectf(100.0, rectf.Width); expectf(100.0, rectf.Height); status = GdipDeleteBrush((GpBrush*)brush); + /* passing negative Width/Height to LinearGradientModeHorizontal */ + rectf.X = rectf.Y = 10.0; + rectf.Width = rectf.Height = -100.0; + status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeHorizontal, + WrapModeTile, &brush); + expect(Ok, status); + memset(&rectf, 0, sizeof(GpRectF)); + status = GdipGetLineRect(brush, &rectf); + expect(Ok, status); + expectf(10.0, rectf.X); + expectf(10.0, rectf.Y); + expectf(-100.0, rectf.Width); + expectf(-100.0, rectf.Height); + status = GdipDeleteBrush((GpBrush*)brush); +} + +static void test_lineblend(void) +{ + GpLineGradient *brush; + GpStatus status; + GpPointF pt1, pt2; + INT count=10; + int i; + const REAL factors[5] = {0.0f, 0.1f, 0.5f, 0.9f, 1.0f}; + const REAL positions[5] = {0.0f, 0.2f, 0.5f, 0.8f, 1.0f}; + REAL res_factors[6] = {0.3f, 0.0f, 0.0f, 0.0f, 0.0f}; + REAL res_positions[6] = {0.3f, 0.0f, 0.0f, 0.0f, 0.0f}; + + pt1.X = pt1.Y = 1.0; + pt2.X = pt2.Y = 100.0; + status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); + expect(Ok, status); + + status = GdipGetLineBlendCount(NULL, &count); + expect(InvalidParameter, status); + + status = GdipGetLineBlendCount(brush, NULL); + expect(InvalidParameter, status); + + status = GdipGetLineBlendCount(brush, &count); + expect(Ok, status); + expect(1, count); + + status = GdipGetLineBlend(NULL, res_factors, res_positions, 1); + expect(InvalidParameter, status); + + status = GdipGetLineBlend(brush, NULL, res_positions, 1); + expect(InvalidParameter, status); + + status = GdipGetLineBlend(brush, res_factors, NULL, 1); + expect(InvalidParameter, status); + + status = GdipGetLineBlend(brush, res_factors, res_positions, 0); + expect(InvalidParameter, status); + + status = GdipGetLineBlend(brush, res_factors, res_positions, -1); + expect(InvalidParameter, status); + + status = GdipGetLineBlend(brush, res_factors, res_positions, 1); + expect(Ok, status); + + status = GdipGetLineBlend(brush, res_factors, res_positions, 2); + expect(Ok, status); + + status = GdipSetLineBlend(NULL, factors, positions, 5); + expect(InvalidParameter, status); + + status = GdipSetLineBlend(brush, NULL, positions, 5); + expect(InvalidParameter, status); + + status = GdipSetLineBlend(brush, factors, NULL, 5); + expect(InvalidParameter, status); + + status = GdipSetLineBlend(brush, factors, positions, 0); + expect(InvalidParameter, status); + + status = GdipSetLineBlend(brush, factors, positions, -1); + expect(InvalidParameter, status); + + /* leave off the 0.0 position */ + status = GdipSetLineBlend(brush, &factors[1], &positions[1], 4); + expect(InvalidParameter, status); + + /* leave off the 1.0 position */ + status = GdipSetLineBlend(brush, factors, positions, 4); + expect(InvalidParameter, status); + + status = GdipSetLineBlend(brush, factors, positions, 5); + expect(Ok, status); + + status = GdipGetLineBlendCount(brush, &count); + expect(Ok, status); + expect(5, count); + + status = GdipGetLineBlend(brush, res_factors, res_positions, 4); + expect(InsufficientBuffer, status); + + status = GdipGetLineBlend(brush, res_factors, res_positions, 5); + expect(Ok, status); + + for (i=0; i<5; i++) + { + expectf(factors[i], res_factors[i]); + expectf(positions[i], res_positions[i]); + } + + status = GdipGetLineBlend(brush, res_factors, res_positions, 6); + expect(Ok, status); + + status = GdipSetLineBlend(brush, factors, positions, 1); + expect(Ok, status); + + status = GdipGetLineBlendCount(brush, &count); + expect(Ok, status); + expect(1, count); + + status = GdipGetLineBlend(brush, res_factors, res_positions, 1); + expect(Ok, status); + + status = GdipDeleteBrush((GpBrush*)brush); + expect(Ok, status); } START_TEST(brush) @@ -365,6 +514,7 @@ START_TEST(brush) test_transform(); test_texturewrap(); test_gradientgetrect(); + test_lineblend(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/font.c b/rostests/winetests/gdiplus/font.c index 125535df45a..0da5b2f7bc3 100644 --- a/rostests/winetests/gdiplus/font.c +++ b/rostests/winetests/gdiplus/font.c @@ -97,7 +97,7 @@ static void test_createfont(void) static void test_logfont(void) { - LOGFONTW lfw, lfw2; + LOGFONTA lfa, lfa2; GpFont *font; GpStatus stat; GpGraphics *graphics; @@ -105,70 +105,69 @@ static void test_logfont(void) INT style; GdipCreateFromHDC(hdc, &graphics); - memset(&lfw, 0, sizeof(LOGFONTW)); - memset(&lfw2, 0xff, sizeof(LOGFONTW)); + memset(&lfa, 0, sizeof(LOGFONTA)); + memset(&lfa2, 0xff, sizeof(LOGFONTA)); /* empty FaceName */ - lfw.lfFaceName[0] = 0; - stat = GdipCreateFontFromLogfontW(hdc, &lfw, &font); - + lfa.lfFaceName[0] = 0; + stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font); expect(NotTrueTypeFont, stat); - memcpy(&lfw.lfFaceName, arial, 6 * sizeof(WCHAR)); + lstrcpyA(lfa.lfFaceName, "Arial"); - stat = GdipCreateFontFromLogfontW(hdc, &lfw, &font); + stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font); if (stat == FileNotFound) { skip("Arial not installed.\n"); return; } expect(Ok, stat); - stat = GdipGetLogFontW(font, graphics, &lfw2); + stat = GdipGetLogFontA(font, graphics, &lfa2); expect(Ok, stat); - ok(lfw2.lfHeight < 0, "Expected negative height\n"); - expect(0, lfw2.lfWidth); - expect(0, lfw2.lfEscapement); - expect(0, lfw2.lfOrientation); - ok((lfw2.lfWeight >= 100) && (lfw2.lfWeight <= 900), "Expected weight to be set\n"); - expect(0, lfw2.lfItalic); - expect(0, lfw2.lfUnderline); - expect(0, lfw2.lfStrikeOut); - expect(GetTextCharset(hdc), lfw2.lfCharSet); - expect(0, lfw2.lfOutPrecision); - expect(0, lfw2.lfClipPrecision); - expect(0, lfw2.lfQuality); - expect(0, lfw2.lfPitchAndFamily); + ok(lfa2.lfHeight < 0, "Expected negative height\n"); + expect(0, lfa2.lfWidth); + expect(0, lfa2.lfEscapement); + expect(0, lfa2.lfOrientation); + ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n"); + expect(0, lfa2.lfItalic); + expect(0, lfa2.lfUnderline); + expect(0, lfa2.lfStrikeOut); + expect(GetTextCharset(hdc), lfa2.lfCharSet); + expect(0, lfa2.lfOutPrecision); + expect(0, lfa2.lfClipPrecision); + expect(0, lfa2.lfQuality); + expect(0, lfa2.lfPitchAndFamily); GdipDeleteFont(font); - memset(&lfw, 0, sizeof(LOGFONTW)); - lfw.lfHeight = 25; - lfw.lfWidth = 25; - lfw.lfEscapement = lfw.lfOrientation = 50; - lfw.lfItalic = lfw.lfUnderline = lfw.lfStrikeOut = TRUE; + memset(&lfa, 0, sizeof(LOGFONTA)); + lfa.lfHeight = 25; + lfa.lfWidth = 25; + lfa.lfEscapement = lfa.lfOrientation = 50; + lfa.lfItalic = lfa.lfUnderline = lfa.lfStrikeOut = TRUE; - memset(&lfw2, 0xff, sizeof(LOGFONTW)); - memcpy(&lfw.lfFaceName, arial, 6 * sizeof(WCHAR)); + memset(&lfa2, 0xff, sizeof(LOGFONTA)); + lstrcpyA(lfa.lfFaceName, "Arial"); - stat = GdipCreateFontFromLogfontW(hdc, &lfw, &font); + stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font); expect(Ok, stat); - stat = GdipGetLogFontW(font, graphics, &lfw2); + stat = GdipGetLogFontA(font, graphics, &lfa2); expect(Ok, stat); - ok(lfw2.lfHeight < 0, "Expected negative height\n"); - expect(0, lfw2.lfWidth); - expect(0, lfw2.lfEscapement); - expect(0, lfw2.lfOrientation); - ok((lfw2.lfWeight >= 100) && (lfw2.lfWeight <= 900), "Expected weight to be set\n"); - expect(TRUE, lfw2.lfItalic); - expect(TRUE, lfw2.lfUnderline); - expect(TRUE, lfw2.lfStrikeOut); - expect(GetTextCharset(hdc), lfw2.lfCharSet); - expect(0, lfw2.lfOutPrecision); - expect(0, lfw2.lfClipPrecision); - expect(0, lfw2.lfQuality); - expect(0, lfw2.lfPitchAndFamily); + ok(lfa2.lfHeight < 0, "Expected negative height\n"); + expect(0, lfa2.lfWidth); + expect(0, lfa2.lfEscapement); + expect(0, lfa2.lfOrientation); + ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n"); + expect(TRUE, lfa2.lfItalic); + expect(TRUE, lfa2.lfUnderline); + expect(TRUE, lfa2.lfStrikeOut); + expect(GetTextCharset(hdc), lfa2.lfCharSet); + expect(0, lfa2.lfOutPrecision); + expect(0, lfa2.lfClipPrecision); + expect(0, lfa2.lfQuality); + expect(0, lfa2.lfPitchAndFamily); stat = GdipGetFontStyle(font, &style); expect(Ok, stat); @@ -341,6 +340,19 @@ monospace: expect (Ok, stat); } +static void test_installedfonts (void) +{ + GpStatus stat; + GpFontCollection* collection=NULL; + + stat = GdipNewInstalledFontCollection(NULL); + expect (InvalidParameter, stat); + + stat = GdipNewInstalledFontCollection(&collection); + expect (Ok, stat); + ok (collection != NULL, "got NULL font collection\n"); +} + START_TEST(font) { struct GdiplusStartupInput gdiplusStartupInput; @@ -358,6 +370,7 @@ START_TEST(font) test_fontfamily(); test_fontfamily_properties(); test_getgenerics(); + test_installedfonts(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/graphics.c b/rostests/winetests/gdiplus/graphics.c index 8091a9adff3..71991511072 100644 --- a/rostests/winetests/gdiplus/graphics.c +++ b/rostests/winetests/gdiplus/graphics.c @@ -935,6 +935,57 @@ static void test_textcontrast(void) ReleaseDC(0, hdc); } +static void test_GdipDrawString(void) +{ + GpStatus status; + GpGraphics *graphics = NULL; + GpFont *fnt = NULL; + RectF rect; + GpStringFormat *format; + GpBrush *brush; + LOGFONTA logfont; + HDC hdc = GetDC(0); + static const WCHAR string[] = {'T','e','s','t',0}; + + memset(&logfont,0,sizeof(logfont)); + strcpy(logfont.lfFaceName,"Arial"); + logfont.lfHeight = 12; + logfont.lfCharSet = DEFAULT_CHARSET; + + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + + status = GdipCreateFontFromLogfontA(hdc, &logfont, &fnt); + if (status == FileNotFound) + { + skip("Arial not installed.\n"); + return; + } + expect(Ok, status); + + status = GdipCreateSolidFill((ARGB)0xdeadbeef, (GpSolidFill**)&brush); + expect(Ok, status); + + status = GdipCreateStringFormat(0,0,&format); + expect(Ok, status); + + rect.X = 0; + rect.Y = 0; + rect.Width = 0; + rect.Height = 12; + + status = GdipDrawString(graphics, string, 4, fnt, &rect, format, brush); + expect(Ok, status); + + GdipDeleteGraphics(graphics); + GdipDeleteBrush(brush); + GdipDeleteFont(fnt); + GdipDeleteStringFormat(format); + + ReleaseDC(0, hdc); +} + + START_TEST(graphics) { struct GdiplusStartupInput gdiplusStartupInput; @@ -954,6 +1005,7 @@ START_TEST(graphics) test_GdipDrawArcI(); test_GdipDrawLineI(); test_GdipDrawLinesI(); + test_GdipDrawString(); test_Get_Release_DC(); test_transformpoints(); test_get_set_clip(); diff --git a/rostests/winetests/gdiplus/image.c b/rostests/winetests/gdiplus/image.c index 12fab7cb659..4443f88822a 100644 --- a/rostests/winetests/gdiplus/image.c +++ b/rostests/winetests/gdiplus/image.c @@ -229,6 +229,7 @@ static void test_SavingImages(void) const REAL WIDTH = 10.0, HEIGHT = 20.0; REAL w, h; ImageCodecInfo *codecs; + static const CHAR filenameA[] = "a.bmp"; static const WCHAR filename[] = { 'a','.','b','m','p',0 }; codecs = NULL; @@ -280,7 +281,7 @@ static void test_SavingImages(void) GdipFree(codecs); if (bm) GdipDisposeImage((GpImage*)bm); - ok(DeleteFileW(filename), "Delete failed.\n"); + ok(DeleteFileA(filenameA), "Delete failed.\n"); } static void test_encoders(void) @@ -292,7 +293,7 @@ static void test_encoders(void) int i; int bmp_found; - static const WCHAR bmp_format[] = {'B', 'M', 'P', 0}; + static const CHAR bmp_format[] = "BMP"; stat = GdipGetImageEncodersSize(&n, &s); expect(stat, Ok); @@ -319,8 +320,13 @@ static void test_encoders(void) bmp_found = FALSE; for (i = 0; i < n; i++) { - if (CompareStringW(LOCALE_SYSTEM_DEFAULT, 0, - codecs[i].FormatDescription, -1, + CHAR desc[32]; + + WideCharToMultiByte(CP_ACP, 0, codecs[i].FormatDescription, -1, + desc, 32, 0, 0); + + if (CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, + desc, -1, bmp_format, -1) == CSTR_EQUAL) { bmp_found = TRUE; break; @@ -474,7 +480,7 @@ static void test_GdipCreateBitmapFromHBITMAP(void) expectf(HEIGHT1, height); if (stat == Ok) GdipDisposeImage((GpImage*)gpbm); - GlobalFree(hbm); + DeleteObject(hbm); hbm = CreateBitmap(WIDTH2, HEIGHT2, 1, 1, &buff); stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm); @@ -487,7 +493,7 @@ static void test_GdipCreateBitmapFromHBITMAP(void) expectf(HEIGHT2, height); if (stat == Ok) GdipDisposeImage((GpImage*)gpbm); - GlobalFree(hbm); + DeleteObject(hbm); hdc = CreateCompatibleDC(0); ok(hdc != NULL, "CreateCompatibleDC failed\n"); @@ -524,8 +530,8 @@ static void test_GdipCreateBitmapFromHBITMAP(void) if (stat == Ok) GdipDisposeImage((GpImage*)gpbm); - GlobalFree(hpal); - GlobalFree(hbm); + DeleteObject(hpal); + DeleteObject(hbm); } static void test_GdipGetImageFlags(void) @@ -623,7 +629,9 @@ static void test_fromhicon(void) DeleteObject(hbmColor); stat = GdipCreateBitmapFromHICON(hIcon, &bitmap); - expect(Ok, stat); + ok(stat == Ok || + broken(stat == InvalidParameter), /* Win98 */ + "Expected Ok, got %.8x\n", stat); if(stat == Ok){ /* check attributes */ stat = GdipGetImageHeight((GpImage*)bitmap, &dim); diff --git a/rostests/winetests/gdiplus/region.c b/rostests/winetests/gdiplus/region.c index 689811cedc4..d48554c48b6 100644 --- a/rostests/winetests/gdiplus/region.c +++ b/rostests/winetests/gdiplus/region.c @@ -793,12 +793,14 @@ static void test_fromhrgn(void) status = GdipGetRegionDataSize(region, &needed); todo_wine{ expect(Ok, status); - expect(216, needed); + ok(needed == 216 || + needed == 196, /* win98 */ + "Got %.8x\n", needed); } status = GdipGetRegionData(region, (BYTE*)buf, sizeof(buf), &needed); todo_wine expect(Ok, status); - if(status == Ok) + if(status == Ok && needed == 216) /* Don't try to test win98 layout */ { todo_wine{ expect(Ok, status); diff --git a/rostests/winetests/imm32/imm32.c b/rostests/winetests/imm32/imm32.c index 591feb337fd..7e7f752d466 100644 --- a/rostests/winetests/imm32/imm32.c +++ b/rostests/winetests/imm32/imm32.c @@ -135,6 +135,7 @@ static HWND hwnd; static int init(void) { WNDCLASSEX wc; + HIMC imc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; @@ -158,6 +159,14 @@ static int init(void) { if (!hwnd) return 0; + imc = ImmGetContext(hwnd); + if (!imc) + { + win_skip("IME support not implemented\n"); + return 0; + } + ImmReleaseContext(hwnd, imc); + ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd); @@ -173,7 +182,7 @@ static void cleanup(void) { UnregisterClass(wndcls, GetModuleHandle(0)); } -static int test_ImmNotifyIME(void) { +static void test_ImmNotifyIME(void) { static const char string[] = "wine"; char resstr[16] = ""; HIMC imc; @@ -216,12 +225,88 @@ static int test_ImmNotifyIME(void) { msg_spy_flush_msgs(); ImmReleaseContext(hwnd, imc); +} - return 0; +static void test_ImmGetCompositionString(void) +{ + HIMC imc; + static const WCHAR string[] = {'w','i','n','e',0x65e5,0x672c,0x8a9e}; + char cstring[20]; + WCHAR wstring[20]; + DWORD len; + DWORD alen,wlen; + + imc = ImmGetContext(hwnd); + ImmSetCompositionStringW(imc, SCS_SETSTR, string, sizeof(string), NULL,0); + alen = ImmGetCompositionStringA(imc, GCS_COMPSTR, cstring, 20); + wlen = ImmGetCompositionStringW(imc, GCS_COMPSTR, wstring, 20); + /* windows machines without any IME installed just return 0 above */ + if( alen && wlen) + { + len = ImmGetCompositionStringW(imc, GCS_COMPATTR, NULL, 0); + ok(len*sizeof(WCHAR)==wlen,"GCS_COMPATTR(W) not returning correct count\n"); + len = ImmGetCompositionStringA(imc, GCS_COMPATTR, NULL, 0); + ok(len==alen,"GCS_COMPATTR(A) not returning correct count\n"); + } + ImmReleaseContext(hwnd, imc); +} + +static void test_ImmSetCompositionString(void) +{ + HIMC imc; + BOOL ret; + + SetLastError(0xdeadbeef); + imc = ImmGetContext(hwnd); + ok(imc != 0, "ImmGetContext() failed. Last error: %u\n", GetLastError()); + if (!imc) + return; + + ret = ImmSetCompositionStringW(imc, SCS_SETSTR, NULL, 0, NULL, 0); + todo_wine + ok(!ret, "ImmSetCompositionStringW() succeeded.\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"); + + ImmReleaseContext(hwnd, imc); +} + +static void test_ImmIME(void) +{ + HIMC imc; + + imc = ImmGetContext(hwnd); + if (imc) + { + BOOL rc; + rc = ImmConfigureIMEA(imc, NULL, IME_CONFIG_REGISTERWORD, NULL); + ok (rc == 0, "ImmConfigureIMEA did not fail\n"); + rc = ImmConfigureIMEW(imc, NULL, IME_CONFIG_REGISTERWORD, NULL); + ok (rc == 0, "ImmConfigureIMEW did not fail\n"); + } + ImmReleaseContext(hwnd,imc); } START_TEST(imm32) { if (init()) + { test_ImmNotifyIME(); + test_ImmGetCompositionString(); + test_ImmSetCompositionString(); + test_ImmIME(); + } cleanup(); } diff --git a/rostests/winetests/inetmib1/main.c b/rostests/winetests/inetmib1/main.c index 13613fd9d42..6c83d58e7fd 100644 --- a/rostests/winetests/inetmib1/main.c +++ b/rostests/winetests/inetmib1/main.c @@ -35,7 +35,7 @@ static void testInit(void) pInit = (void *)GetProcAddress(inetmib1, "SnmpExtensionInit"); if (!pInit) { - skip("no SnmpExtensionInit\n"); + win_skip("no SnmpExtensionInit\n"); return; } /* Crash @@ -72,7 +72,7 @@ static void testQuery(void) pQuery = (void *)GetProcAddress(inetmib1, "SnmpExtensionQuery"); if (!pQuery) { - skip("couldn't find SnmpExtensionQuery\n"); + win_skip("couldn't find SnmpExtensionQuery\n"); return; } /* Crash @@ -473,4 +473,5 @@ START_TEST(main) inetmib1 = LoadLibraryA("inetmib1"); testInit(); testQuery(); + FreeLibrary(inetmib1); } diff --git a/rostests/winetests/iphlpapi/iphlpapi.c b/rostests/winetests/iphlpapi/iphlpapi.c index 23f85ece3f0..cd2e45200a3 100644 --- a/rostests/winetests/iphlpapi/iphlpapi.c +++ b/rostests/winetests/iphlpapi/iphlpapi.c @@ -35,6 +35,7 @@ */ #include +#include "winsock2.h" #include "windef.h" #include "winbase.h" #include "iphlpapi.h" @@ -43,6 +44,16 @@ #include #include +#undef htonl +#undef htons +#undef ntohl +#undef ntohs + +#define htonl(l) ((u_long)(l)) +#define htons(s) ((u_short)(s)) +#define ntohl(l) ((u_long)(l)) +#define ntohs(s) ((u_short)(s)) + static HMODULE hLibrary = NULL; typedef DWORD (WINAPI *GetNumberOfInterfacesFunc)(PDWORD); @@ -62,6 +73,7 @@ typedef DWORD (WINAPI *GetUdpStatisticsFunc)(PMIB_UDPSTATS); typedef DWORD (WINAPI *GetTcpTableFunc)(PMIB_TCPTABLE,PDWORD,BOOL); typedef DWORD (WINAPI *GetUdpTableFunc)(PMIB_UDPTABLE,PDWORD,BOOL); typedef DWORD (WINAPI *GetPerAdapterInfoFunc)(ULONG,PIP_PER_ADAPTER_INFO,PULONG); +typedef DWORD (WINAPI *GetAdaptersAddressesFunc)(ULONG,ULONG,PVOID,PIP_ADAPTER_ADDRESSES,PULONG); static GetNumberOfInterfacesFunc gGetNumberOfInterfaces = NULL; static GetIpAddrTableFunc gGetIpAddrTable = NULL; @@ -80,6 +92,7 @@ static GetUdpStatisticsFunc gGetUdpStatistics = NULL; static GetTcpTableFunc gGetTcpTable = NULL; static GetUdpTableFunc gGetUdpTable = NULL; static GetPerAdapterInfoFunc gGetPerAdapterInfo = NULL; +static GetAdaptersAddressesFunc gGetAdaptersAddresses = NULL; static void loadIPHlpApi(void) { @@ -118,6 +131,7 @@ static void loadIPHlpApi(void) gGetUdpTable = (GetUdpTableFunc)GetProcAddress( hLibrary, "GetUdpTable"); gGetPerAdapterInfo = (GetPerAdapterInfoFunc)GetProcAddress(hLibrary, "GetPerAdapterInfo"); + gGetAdaptersAddresses = (GetAdaptersAddressesFunc)GetProcAddress(hLibrary, "GetAdaptersAddresses"); } } @@ -145,6 +159,16 @@ static void freeIPHlpApi(void) } } +/* replacement for inet_ntoa */ +static const char *ntoa( DWORD ip ) +{ + static char buffer[40]; + + ip = htonl(ip); + sprintf( buffer, "%u.%u.%u.%u", (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff ); + return buffer; +} + /* still-to-be-tested 98-only functions: GetUniDirectionalAdapterInfo @@ -263,6 +287,30 @@ static void testGetIfTable(void) ok(apiReturn == NO_ERROR, "GetIfTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n\n", apiReturn); + + if (apiReturn == NO_ERROR && winetest_debug > 1) + { + DWORD i, j; + char name[MAX_INTERFACE_NAME_LEN]; + + trace( "interface table: %u entries\n", buf->dwNumEntries ); + for (i = 0; i < buf->dwNumEntries; i++) + { + MIB_IFROW *row = &buf->table[i]; + WideCharToMultiByte( CP_ACP, 0, row->wszName, -1, name, MAX_INTERFACE_NAME_LEN, NULL, NULL ); + trace( "%u: '%s' type %u mtu %u speed %u phys", + row->dwIndex, name, row->dwType, row->dwMtu, row->dwSpeed ); + for (j = 0; j < row->dwPhysAddrLen; j++) + printf( " %02x", row->bPhysAddr[j] ); + printf( "\n" ); + trace( " in: bytes %u upkts %u nupkts %u disc %u err %u unk %u\n", + row->dwInOctets, row->dwInUcastPkts, row->dwInNUcastPkts, + row->dwInDiscards, row->dwInErrors, row->dwInUnknownProtos ); + trace( " out: bytes %u upkts %u nupkts %u disc %u err %u\n", + row->dwOutOctets, row->dwOutUcastPkts, row->dwOutNUcastPkts, + row->dwOutDiscards, row->dwOutErrors ); + } + } HeapFree(GetProcessHeap(), 0, buf); } } @@ -293,6 +341,22 @@ static void testGetIpForwardTable(void) ok(apiReturn == NO_ERROR, "GetIpForwardTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n", apiReturn); + + if (apiReturn == NO_ERROR && winetest_debug > 1) + { + DWORD i; + + trace( "IP forward table: %u entries\n", buf->dwNumEntries ); + for (i = 0; i < buf->dwNumEntries; i++) + { + char buffer[40]; + sprintf( buffer, "dest %s", ntoa( buf->table[i].dwForwardDest )); + sprintf( buffer + strlen(buffer), " mask %s", ntoa( buf->table[i].dwForwardMask )); + trace( "%u: %s gw %s if %u type %u\n", i, buffer, + ntoa( buf->table[i].dwForwardNextHop ), + buf->table[i].dwForwardIfIndex, buf->table[i].dwForwardType ); + } + } HeapFree(GetProcessHeap(), 0, buf); } } @@ -326,6 +390,21 @@ static void testGetIpNetTable(void) apiReturn == ERROR_NO_DATA, /* empty ARP table's okay */ "GetIpNetTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n", apiReturn); + + if (apiReturn == NO_ERROR && winetest_debug > 1) + { + DWORD i, j; + + trace( "IP net table: %u entries\n", buf->dwNumEntries ); + for (i = 0; i < buf->dwNumEntries; i++) + { + trace( "%u: idx %u type %u addr %s phys", + i, buf->table[i].dwIndex, buf->table[i].dwType, ntoa( buf->table[i].dwAddr )); + for (j = 0; j < buf->table[i].dwPhysAddrLen; j++) + printf( " %02x", buf->table[i].bPhysAddr[j] ); + printf( "\n" ); + } + } HeapFree(GetProcessHeap(), 0, buf); } } @@ -355,6 +434,23 @@ static void testGetIcmpStatistics(void) } ok(apiReturn == NO_ERROR, "GetIcmpStatistics returned %d, expected NO_ERROR\n", apiReturn); + if (apiReturn == NO_ERROR && winetest_debug > 1) + { + trace( "ICMP stats: %8s %8s\n", "in", "out" ); + trace( " dwMsgs: %8u %8u\n", stats.stats.icmpInStats.dwMsgs, stats.stats.icmpOutStats.dwMsgs ); + trace( " dwErrors: %8u %8u\n", stats.stats.icmpInStats.dwErrors, stats.stats.icmpOutStats.dwErrors ); + trace( " dwDestUnreachs: %8u %8u\n", stats.stats.icmpInStats.dwDestUnreachs, stats.stats.icmpOutStats.dwDestUnreachs ); + trace( " dwTimeExcds: %8u %8u\n", stats.stats.icmpInStats.dwTimeExcds, stats.stats.icmpOutStats.dwTimeExcds ); + trace( " dwParmProbs: %8u %8u\n", stats.stats.icmpInStats.dwParmProbs, stats.stats.icmpOutStats.dwParmProbs ); + trace( " dwSrcQuenchs: %8u %8u\n", stats.stats.icmpInStats.dwSrcQuenchs, stats.stats.icmpOutStats.dwSrcQuenchs ); + trace( " dwRedirects: %8u %8u\n", stats.stats.icmpInStats.dwRedirects, stats.stats.icmpOutStats.dwRedirects ); + trace( " dwEchos: %8u %8u\n", stats.stats.icmpInStats.dwEchos, stats.stats.icmpOutStats.dwEchos ); + trace( " dwEchoReps: %8u %8u\n", stats.stats.icmpInStats.dwEchoReps, stats.stats.icmpOutStats.dwEchoReps ); + trace( " dwTimestamps: %8u %8u\n", stats.stats.icmpInStats.dwTimestamps, stats.stats.icmpOutStats.dwTimestamps ); + trace( " dwTimestampReps: %8u %8u\n", stats.stats.icmpInStats.dwTimestampReps, stats.stats.icmpOutStats.dwTimestampReps ); + trace( " dwAddrMasks: %8u %8u\n", stats.stats.icmpInStats.dwAddrMasks, stats.stats.icmpOutStats.dwAddrMasks ); + trace( " dwAddrMaskReps: %8u %8u\n", stats.stats.icmpInStats.dwAddrMaskReps, stats.stats.icmpOutStats.dwAddrMaskReps ); + } } } @@ -375,6 +471,33 @@ static void testGetIpStatistics(void) apiReturn = gGetIpStatistics(&stats); ok(apiReturn == NO_ERROR, "GetIpStatistics returned %d, expected NO_ERROR\n", apiReturn); + if (apiReturn == NO_ERROR && winetest_debug > 1) + { + trace( "IP stats:\n" ); + trace( " dwForwarding: %u\n", stats.dwForwarding ); + trace( " dwDefaultTTL: %u\n", stats.dwDefaultTTL ); + trace( " dwInReceives: %u\n", stats.dwInReceives ); + trace( " dwInHdrErrors: %u\n", stats.dwInHdrErrors ); + trace( " dwInAddrErrors: %u\n", stats.dwInAddrErrors ); + trace( " dwForwDatagrams: %u\n", stats.dwForwDatagrams ); + trace( " dwInUnknownProtos: %u\n", stats.dwInUnknownProtos ); + trace( " dwInDiscards: %u\n", stats.dwInDiscards ); + trace( " dwInDelivers: %u\n", stats.dwInDelivers ); + trace( " dwOutRequests: %u\n", stats.dwOutRequests ); + trace( " dwRoutingDiscards: %u\n", stats.dwRoutingDiscards ); + trace( " dwOutDiscards: %u\n", stats.dwOutDiscards ); + trace( " dwOutNoRoutes: %u\n", stats.dwOutNoRoutes ); + trace( " dwReasmTimeout: %u\n", stats.dwReasmTimeout ); + trace( " dwReasmReqds: %u\n", stats.dwReasmReqds ); + trace( " dwReasmOks: %u\n", stats.dwReasmOks ); + trace( " dwReasmFails: %u\n", stats.dwReasmFails ); + trace( " dwFragOks: %u\n", stats.dwFragOks ); + trace( " dwFragFails: %u\n", stats.dwFragFails ); + trace( " dwFragCreates: %u\n", stats.dwFragCreates ); + trace( " dwNumIf: %u\n", stats.dwNumIf ); + trace( " dwNumAddr: %u\n", stats.dwNumAddr ); + trace( " dwNumRoutes: %u\n", stats.dwNumRoutes ); + } } } @@ -395,6 +518,25 @@ static void testGetTcpStatistics(void) apiReturn = gGetTcpStatistics(&stats); ok(apiReturn == NO_ERROR, "GetTcpStatistics returned %d, expected NO_ERROR\n", apiReturn); + if (apiReturn == NO_ERROR && winetest_debug > 1) + { + trace( "TCP stats:\n" ); + trace( " dwRtoAlgorithm: %u\n", stats.dwRtoAlgorithm ); + trace( " dwRtoMin: %u\n", stats.dwRtoMin ); + trace( " dwRtoMax: %u\n", stats.dwRtoMax ); + trace( " dwMaxConn: %u\n", stats.dwMaxConn ); + trace( " dwActiveOpens: %u\n", stats.dwActiveOpens ); + trace( " dwPassiveOpens: %u\n", stats.dwPassiveOpens ); + trace( " dwAttemptFails: %u\n", stats.dwAttemptFails ); + trace( " dwEstabResets: %u\n", stats.dwEstabResets ); + trace( " dwCurrEstab: %u\n", stats.dwCurrEstab ); + trace( " dwInSegs: %u\n", stats.dwInSegs ); + trace( " dwOutSegs: %u\n", stats.dwOutSegs ); + trace( " dwRetransSegs: %u\n", stats.dwRetransSegs ); + trace( " dwInErrs: %u\n", stats.dwInErrs ); + trace( " dwOutRsts: %u\n", stats.dwOutRsts ); + trace( " dwNumConns: %u\n", stats.dwNumConns ); + } } } @@ -415,6 +557,15 @@ static void testGetUdpStatistics(void) apiReturn = gGetUdpStatistics(&stats); ok(apiReturn == NO_ERROR, "GetUdpStatistics returned %d, expected NO_ERROR\n", apiReturn); + if (apiReturn == NO_ERROR && winetest_debug > 1) + { + trace( "UDP stats:\n" ); + trace( " dwInDatagrams: %u\n", stats.dwInDatagrams ); + trace( " dwNoPorts: %u\n", stats.dwNoPorts ); + trace( " dwInErrors: %u\n", stats.dwInErrors ); + trace( " dwOutDatagrams: %u\n", stats.dwOutDatagrams ); + trace( " dwNumAddrs: %u\n", stats.dwNumAddrs ); + } } } @@ -424,15 +575,11 @@ static void testGetTcpTable(void) DWORD apiReturn; ULONG dwSize = 0; - apiReturn = gGetTcpTable(NULL, NULL, FALSE); + apiReturn = gGetTcpTable(NULL, &dwSize, FALSE); if (apiReturn == ERROR_NOT_SUPPORTED) { skip("GetTcpTable is not supported\n"); return; } - ok(apiReturn == ERROR_INVALID_PARAMETER, - "GetTcpTable(NULL, NULL, FALSE) returned %d, expected ERROR_INVALID_PARAMETER\n", - apiReturn); - apiReturn = gGetTcpTable(NULL, &dwSize, FALSE); ok(apiReturn == ERROR_INSUFFICIENT_BUFFER || broken(apiReturn == ERROR_NO_DATA), /* win95 */ "GetTcpTable(NULL, &dwSize, FALSE) returned %d, expected ERROR_INSUFFICIENT_BUFFER\n", @@ -444,6 +591,21 @@ static void testGetTcpTable(void) ok(apiReturn == NO_ERROR, "GetTcpTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n", apiReturn); + + if (apiReturn == NO_ERROR && winetest_debug > 1) + { + DWORD i; + trace( "TCP table: %u entries\n", buf->dwNumEntries ); + for (i = 0; i < buf->dwNumEntries; i++) + { + char buffer[40]; + sprintf( buffer, "local %s:%u", + ntoa(buf->table[i].dwLocalAddr), ntohs(buf->table[i].dwLocalPort) ); + trace( "%u: %s remote %s:%u state %u\n", + i, buffer, ntoa( buf->table[i].dwRemoteAddr ), + ntohs(buf->table[i].dwRemotePort), buf->table[i].dwState ); + } + } HeapFree(GetProcessHeap(), 0, buf); } } @@ -455,25 +617,30 @@ static void testGetUdpTable(void) DWORD apiReturn; ULONG dwSize = 0; - apiReturn = gGetUdpTable(NULL, NULL, FALSE); + apiReturn = gGetUdpTable(NULL, &dwSize, FALSE); if (apiReturn == ERROR_NOT_SUPPORTED) { skip("GetUdpTable is not supported\n"); return; } - ok(apiReturn == ERROR_INVALID_PARAMETER, - "GetUdpTable(NULL, NULL, FALSE) returned %d, expected ERROR_INVALID_PARAMETER\n", - apiReturn); - apiReturn = gGetUdpTable(NULL, &dwSize, FALSE); ok(apiReturn == ERROR_INSUFFICIENT_BUFFER, "GetUdpTable(NULL, &dwSize, FALSE) returned %d, expected ERROR_INSUFFICIENT_BUFFER\n", apiReturn); - if (apiReturn != ERROR_INSUFFICIENT_BUFFER) { + if (apiReturn == ERROR_INSUFFICIENT_BUFFER) { PMIB_UDPTABLE buf = HeapAlloc(GetProcessHeap(), 0, dwSize); apiReturn = gGetUdpTable(buf, &dwSize, FALSE); ok(apiReturn == NO_ERROR, "GetUdpTable(buf, &dwSize, FALSE) returned %d, expected NO_ERROR\n", apiReturn); + + if (apiReturn == NO_ERROR && winetest_debug > 1) + { + DWORD i; + trace( "UDP table: %u entries\n", buf->dwNumEntries ); + for (i = 0; i < buf->dwNumEntries; i++) + trace( "%u: %s:%u\n", + i, ntoa( buf->table[i].dwLocalAddr ), ntohs(buf->table[i].dwLocalPort) ); + } HeapFree(GetProcessHeap(), 0, buf); } } @@ -657,6 +824,71 @@ static void testWin2KFunctions(void) testGetPerAdapterInfo(); } +static void test_GetAdaptersAddresses(void) +{ + ULONG ret, size; + IP_ADAPTER_ADDRESSES *aa; + IP_ADAPTER_UNICAST_ADDRESS *ua; + + if (!gGetAdaptersAddresses) + { + win_skip("GetAdaptersAddresses not present\n"); + return; + } + + ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, NULL); + ok(ret == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", ret); + + ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &size); + ok(ret == ERROR_BUFFER_OVERFLOW, "expected ERROR_BUFFER_OVERFLOW, got %u\n", ret); + if (ret != ERROR_BUFFER_OVERFLOW) return; + + aa = HeapAlloc(GetProcessHeap(), 0, size); + ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, aa, &size); + ok(!ret, "expected ERROR_SUCCESS got %u\n", ret); + + while (!ret && winetest_debug > 1 && aa) + { + trace("Length: %u\n", aa->Length); + trace("IfIndex: %u\n", aa->IfIndex); + trace("Next: %p\n", aa->Next); + trace("AdapterName: %s\n", aa->AdapterName); + trace("FirstUnicastAddress: %p\n", aa->FirstUnicastAddress); + ua = aa->FirstUnicastAddress; + while (ua) + { + trace("\tLength: %u\n", ua->Length); + trace("\tFlags: 0x%08x\n", ua->Flags); + trace("\tNext: %p\n", ua->Next); + trace("\tAddress.lpSockaddr: %p\n", ua->Address.lpSockaddr); + trace("\tAddress.iSockaddrLength: %d\n", ua->Address.iSockaddrLength); + trace("\tPrefixOrigin: %u\n", ua->PrefixOrigin); + trace("\tSuffixOrigin: %u\n", ua->SuffixOrigin); + trace("\tDadState: %u\n", ua->DadState); + trace("\tValidLifetime: 0x%08x\n", ua->ValidLifetime); + trace("\tPreferredLifetime: 0x%08x\n", ua->PreferredLifetime); + trace("\tLeaseLifetime: 0x%08x\n", ua->LeaseLifetime); + trace("\n"); + ua = ua->Next; + } + trace("FirstAnycastAddress: %p\n", aa->FirstAnycastAddress); + trace("FirstMulticastAddress: %p\n", aa->FirstMulticastAddress); + trace("FirstDnsServerAddress: %p\n", aa->FirstDnsServerAddress); + trace("DnsSuffix: %p\n", aa->DnsSuffix); + trace("Description: %p\n", aa->Description); + trace("FriendlyName: %p\n", aa->FriendlyName); + trace("PhysicalAddress: %02x\n", aa->PhysicalAddress[0]); + trace("PhysicalAddressLength: %u\n", aa->PhysicalAddressLength); + trace("Flags: 0x%08x\n", aa->Flags); + trace("Mtu: %u\n", aa->Mtu); + trace("IfType: %u\n", aa->IfType); + trace("OperStatus: %u\n", aa->OperStatus); + trace("\n"); + aa = aa->Next; + } + HeapFree(GetProcessHeap(), 0, aa); +} + START_TEST(iphlpapi) { @@ -666,6 +898,7 @@ START_TEST(iphlpapi) testWinNT4Functions(); testWin98Functions(); testWin2KFunctions(); + test_GetAdaptersAddresses(); freeIPHlpApi(); } } diff --git a/rostests/winetests/jscript/api.js b/rostests/winetests/jscript/api.js index f3700987a33..30f201738e7 100644 --- a/rostests/winetests/jscript/api.js +++ b/rostests/winetests/jscript/api.js @@ -579,6 +579,36 @@ ok(tmp === Infinity, "Math.abs(-Infinite) = " + tmp); tmp = Math.abs(-3, 2); ok(tmp === 3, "Math.abs(-3, 2) = " + tmp); +tmp = Math.cos(0); +ok(tmp === 1, "Math.cos(0) = " + tmp); + +tmp = Math.cos(Math.PI/2); +ok(Math.floor(tmp*100) === 0, "Math.cos(Math.PI/2) = " + tmp); + +tmp = Math.cos(-Math.PI/2); +ok(Math.floor(tmp*100) === 0, "Math.cos(-Math.PI/2) = " + tmp); + +tmp = Math.cos(Math.PI/3, 2); +ok(Math.floor(tmp*100) === 50, "Math.cos(Math.PI/3, 2) = " + tmp); + +tmp = Math.cos(true); +ok(Math.floor(tmp*100) === 54, "Math.cos(true) = " + tmp); + +tmp = Math.cos(false); +ok(tmp === 1, "Math.cos(false) = " + tmp); + +tmp = Math.cos(); +ok(isNaN(tmp), "Math.cos() is not NaN"); + +tmp = Math.cos(NaN); +ok(isNaN(tmp), "Math.cos(NaN) is not NaN"); + +tmp = Math.cos(Infinity); +ok(isNaN(tmp), "Math.cos(Infinity) is not NaN"); + +tmp = Math.cos(-Infinity); +ok(isNaN(tmp), "Math.cos(-Infinity) is not NaN"); + tmp = Math.pow(2, 2); ok(tmp === 4, "Math.pow(2, 2) = " + tmp); @@ -640,4 +670,9 @@ ok(Math.floor(Math.LOG10E*100) === 43, "Math.LOG10E = " + Math.LOG10E); Math.LOG10E = "test"; ok(Math.floor(Math.LOG10E*100) === 43, "modified Math.LOG10E = " + Math.LOG10E); +ok(typeof(Math.LN2) === "number", "typeof(Math.LN2) = " + typeof(Math.LN2)); +ok(Math.floor(Math.LN2*100) === 69, "Math.LN2 = " + Math.LN2); +Math.LN2 = "test"; +ok(Math.floor(Math.LN2*100) === 69, "modified Math.LN2 = " + Math.LN2); + reportSuccess(); diff --git a/rostests/winetests/jscript/run.c b/rostests/winetests/jscript/run.c index 39577cd8b49..a1fe3b6daeb 100644 --- a/rostests/winetests/jscript/run.c +++ b/rostests/winetests/jscript/run.c @@ -600,6 +600,47 @@ static void parse_script(BSTR script_str) IUnknown_Release(parser); } +static HRESULT parse_htmlscript(BSTR script_str) +{ + IActiveScriptParse *parser; + IActiveScript *engine; + HRESULT hres; + BSTR tmp = a2bstr(""); + + engine = create_script(); + if(!engine) + return E_FAIL; + + hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser); + ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); + if (FAILED(hres)) + { + IActiveScript_Release(engine); + return E_FAIL; + } + + hres = IActiveScriptParse64_InitNew(parser); + ok(hres == S_OK, "InitNew failed: %08x\n", hres); + + hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite); + ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); + + hres = IActiveScript_AddNamedItem(engine, testW, + SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS); + ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres); + + hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); + + hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, tmp, 0, 0, 0, NULL, NULL); + + IActiveScript_Release(engine); + IUnknown_Release(parser); + SysFreeString(tmp); + + return hres; +} + static void parse_script_a(const char *src) { BSTR tmp = a2bstr(src); @@ -607,6 +648,16 @@ static void parse_script_a(const char *src) SysFreeString(tmp); } +static HRESULT parse_htmlscript_a(const char *src) +{ + HRESULT hres; + BSTR tmp = a2bstr(src); + hres = parse_htmlscript(tmp); + SysFreeString(tmp); + + return hres; +} + static BSTR get_script_from_file(const char *filename) { DWORD size, len; @@ -741,6 +792,8 @@ static void test_isvisible(BOOL global_members) static void run_tests(void) { + HRESULT hres; + strict_dispid_check = TRUE; parse_script_a(""); @@ -776,6 +829,19 @@ static void run_tests(void) test_isvisible(FALSE); test_isvisible(TRUE); + + hres = parse_htmlscript_a(""); + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); + hres = parse_htmlscript_a("\n"); + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); + hres = parse_htmlscript_a("\n"); + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); + hres = parse_htmlscript_a("var a=1;\nif(a-->0) a=5;\n"); + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); + hres = parse_htmlscript_a("var a=1;\nif(a\n-->0) a=5;\n"); + ok(hres != S_OK, "ParseScriptText have not failed\n"); } START_TEST(run) diff --git a/rostests/winetests/kernel32/actctx.c b/rostests/winetests/kernel32/actctx.c index 1215ef587a0..d8f48de7472 100644 --- a/rostests/winetests/kernel32/actctx.c +++ b/rostests/winetests/kernel32/actctx.c @@ -43,6 +43,14 @@ static const char* strw(LPCWSTR x) return buffer; } +#ifdef __i386__ +#define ARCH "x86" +#elif defined __x86_64__ +#define ARCH "amd64" +#else +#define ARCH "none" +#endif + static const char manifest1[] = "" "" @@ -54,7 +62,7 @@ static const char manifest2[] = "" "" "" -"" +"" "" "" "" @@ -76,7 +84,7 @@ static const char manifest4[] = "" "" "" + "version=\"6.0.1.0\" processorArchitecture=\"" ARCH "\" publicKeyToken=\"6595b64144ccf1df\">" "" "" "" @@ -84,19 +92,19 @@ static const char manifest4[] = static const char testdep_manifest1[] = "" -"" +"" ""; static const char testdep_manifest2[] = "" -"" +"" "" "" ""; static const char testdep_manifest3[] = " " -"" +"" "" "" "wndClass" @@ -138,7 +146,7 @@ static const char wrong_manifest6[] = static const char wrong_manifest7[] = "" -"" +"" "" ""; @@ -150,7 +158,7 @@ static const char wrong_manifest8[] = static const char wrong_depmanifest1[] = "" -"" +"" ""; static const WCHAR testlib_dll[] = @@ -386,21 +394,21 @@ static const info_in_assembly manifest4_info = { static const info_in_assembly depmanifest1_info = { 0x10, depmanifest_path, - "testdep,processorArchitecture=\"x86\"," + "testdep,processorArchitecture=\"" ARCH "\"," "type=\"win32\",version=\"6.5.4.3\"", TRUE }; static const info_in_assembly depmanifest2_info = { 0x10, depmanifest_path, - "testdep,processorArchitecture=\"x86\"," + "testdep,processorArchitecture=\"" ARCH "\"," "type=\"win32\",version=\"6.5.4.3\"", TRUE }; static const info_in_assembly depmanifest3_info = { 0x10, depmanifest_path, - "testdep,processorArchitecture=\"x86\",type=\"win32\",version=\"6.5.4.3\"", + "testdep,processorArchitecture=\"" ARCH "\",type=\"win32\",version=\"6.5.4.3\"", TRUE }; @@ -1202,7 +1210,7 @@ START_TEST(actctx) if (!init_funcs()) { - skip("Needed functions are not available\n"); + win_skip("Needed functions are not available\n"); return; } init_paths(); diff --git a/rostests/winetests/kernel32/atom.c b/rostests/winetests/kernel32/atom.c index 9601fd616c9..c7398500ab9 100755 --- a/rostests/winetests/kernel32/atom.c +++ b/rostests/winetests/kernel32/atom.c @@ -77,7 +77,7 @@ static BOOL unicode_OS; static void test_add_atom(void) { ATOM atom, w_atom; - int i; + INT_PTR i; SetLastError( 0xdeadbeef ); atom = GlobalAddAtomA( "foobar" ); @@ -129,20 +129,20 @@ static void test_add_atom(void) { SetLastError( 0xdeadbeef ); ok( GlobalAddAtomA((LPCSTR)i) == i && GetLastError() == 0xdeadbeef, - "failed to add atom %x\n", i ); + "failed to add atom %lx\n", i ); if (unicode_OS) { SetLastError( 0xdeadbeef ); ok( GlobalAddAtomW((LPCWSTR)i) == i && GetLastError() == 0xdeadbeef, - "failed to add atom %x\n", i ); + "failed to add atom %lx\n", i ); } } for (i = 0xc000; i <= 0xffff; i++) { - ok( !GlobalAddAtomA((LPCSTR)i), "succeeded adding %x\n", i ); + ok( !GlobalAddAtomA((LPCSTR)i), "succeeded adding %lx\n", i ); if (unicode_OS) - ok( !GlobalAddAtomW((LPCWSTR)i), "succeeded adding %x\n", i ); + ok( !GlobalAddAtomW((LPCWSTR)i), "succeeded adding %lx\n", i ); } } @@ -201,6 +201,7 @@ static void test_get_atom_name(void) sprintf( res, "#%d", i ); memset( res + strlen(res) + 1, 'a', 10 ); ok( !memcmp( res, buf, 10 ), "bad buffer contents %s\n", buf ); + if (len <= 1 || len >= 7) break; /* don't bother testing all of them */ } else ok( !len, "bad length %d\n", len ); @@ -283,6 +284,7 @@ static void test_get_atom_name(void) print_integral( res, i ); memset( res + lstrlenW(res) + 1, 'a', 10 * sizeof(WCHAR)); ok( !memcmp( res, outW, 10 * sizeof(WCHAR) ), "bad buffer contents for %d\n", i ); + if (len <= 1 || len >= 7) break; /* don't bother testing all of them */ } else ok( !len, "bad length %d\n", len ); @@ -349,7 +351,7 @@ static void test_error_handling(void) static void test_local_add_atom(void) { ATOM atom, w_atom; - int i; + INT_PTR i; SetLastError( 0xdeadbeef ); atom = AddAtomA( "foobar" ); @@ -401,20 +403,20 @@ static void test_local_add_atom(void) { SetLastError( 0xdeadbeef ); ok( AddAtomA((LPCSTR)i) == i && GetLastError() == 0xdeadbeef, - "failed to add atom %x\n", i ); + "failed to add atom %lx\n", i ); if (unicode_OS) { SetLastError( 0xdeadbeef ); ok( AddAtomW((LPCWSTR)i) == i && GetLastError() == 0xdeadbeef, - "failed to add atom %x\n", i ); + "failed to add atom %lx\n", i ); } } for (i = 0xc000; i <= 0xffff; i++) { - ok( !AddAtomA((LPCSTR)i), "succeeded adding %x\n", i ); + ok( !AddAtomA((LPCSTR)i), "succeeded adding %lx\n", i ); if (unicode_OS) - ok( !AddAtomW((LPCWSTR)i), "succeeded adding %x\n", i ); + ok( !AddAtomW((LPCWSTR)i), "succeeded adding %lx\n", i ); } } diff --git a/rostests/winetests/kernel32/change.c b/rostests/winetests/kernel32/change.c index cb500ef4076..50d899a424f 100755 --- a/rostests/winetests/kernel32/change.c +++ b/rostests/winetests/kernel32/change.c @@ -38,7 +38,7 @@ static DWORD CALLBACK NotificationThread(LPVOID arg) { - HANDLE change = (HANDLE) arg; + HANDLE change = arg; BOOL notified = FALSE; BOOL ret = FALSE; DWORD status; @@ -65,8 +65,7 @@ static HANDLE StartNotificationThread(LPCSTR path, BOOL subtree, DWORD flags) change = FindFirstChangeNotificationA(path, subtree, flags); ok(change != INVALID_HANDLE_VALUE, "FindFirstChangeNotification error: %d\n", GetLastError()); - thread = CreateThread(NULL, 0, NotificationThread, (LPVOID)change, - 0, &threadId); + thread = CreateThread(NULL, 0, NotificationThread, change, 0, &threadId); ok(thread != NULL, "CreateThread error: %d\n", GetLastError()); return thread; @@ -264,7 +263,7 @@ static void test_ffcn(void) r = GetTempPathW( MAX_PATH, path ); if (!r && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("GetTempPathW is not implemented\n"); + win_skip("GetTempPathW is not implemented\n"); return; } ok( r != 0, "temp path failed\n"); @@ -356,8 +355,8 @@ static void test_ffcnMultipleThreads(void) * directory object with an empty wine user APC queue for this thread (bug #7286) */ /* Create our notification thread */ - handles[1] = CreateThread(NULL, 0, NotificationThread, (LPVOID)handles[0], - 0, &threadId); + handles[1] = CreateThread(NULL, 0, NotificationThread, handles[0], 0, + &threadId); ok(handles[1] != NULL, "CreateThread error: %d\n", GetLastError()); status = WaitForMultipleObjects(2, handles, FALSE, 5000); @@ -387,7 +386,7 @@ static void test_readdirectorychanges(void) if (!pReadDirectoryChangesW) { - skip("ReadDirectoryChangesW is not available\n"); + win_skip("ReadDirectoryChangesW is not available\n"); return; } @@ -395,7 +394,7 @@ static void test_readdirectorychanges(void) r = GetTempPathW( MAX_PATH, path ); if (!r && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("GetTempPathW is not implemented\n"); + win_skip("GetTempPathW is not implemented\n"); return; } ok( r != 0, "temp path failed\n"); @@ -615,14 +614,14 @@ static void test_readdirectorychanges_null(void) if (!pReadDirectoryChangesW) { - skip("ReadDirectoryChangesW is not available\n"); + win_skip("ReadDirectoryChangesW is not available\n"); return; } SetLastError(0xdeadbeef); r = GetTempPathW( MAX_PATH, path ); if (!r && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("GetTempPathW is not implemented\n"); + win_skip("GetTempPathW is not implemented\n"); return; } ok( r != 0, "temp path failed\n"); @@ -717,7 +716,7 @@ static void test_readdirectorychanges_filedir(void) r = GetTempPathW( MAX_PATH, path ); if (!r && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("GetTempPathW is not implemented\n"); + win_skip("GetTempPathW is not implemented\n"); return; } ok( r != 0, "temp path failed\n"); @@ -848,8 +847,8 @@ static void test_ffcn_directory_overlap(void) ret = FindCloseChangeNotification(parent_watch); ok(ret, "FindCloseChangeNotification error: %d\n", GetLastError()); - child_thread = CreateThread(NULL, 0, NotificationThread, - (LPVOID)child_watch, 0, &threadId); + child_thread = CreateThread(NULL, 0, NotificationThread, child_watch, 0, + &threadId); ok(child_thread != NULL, "CreateThread error: %d\n", GetLastError()); /* Create a file in child */ diff --git a/rostests/winetests/kernel32/codepage.c b/rostests/winetests/kernel32/codepage.c index 8dc6af949ed..906124156b7 100755 --- a/rostests/winetests/kernel32/codepage.c +++ b/rostests/winetests/kernel32/codepage.c @@ -205,7 +205,7 @@ static void test_overlapped_buffers(void) int ret; SetLastError(0xdeadbeef); - memcpy((WCHAR *)(buf + 1), strW, sizeof(strW)); + memcpy(buf + 1, strW, sizeof(strW)); ret = WideCharToMultiByte(CP_ACP, 0, (WCHAR *)(buf + 1), -1, buf, sizeof(buf), NULL, NULL); ok(ret == sizeof(strA), "unexpected ret %d\n", ret); ok(!memcmp(buf, strA, sizeof(strA)), "conversion failed: %s\n", buf); diff --git a/rostests/winetests/kernel32/comm.c b/rostests/winetests/kernel32/comm.c index 3c73eb54355..99fe505d294 100755 --- a/rostests/winetests/kernel32/comm.c +++ b/rostests/winetests/kernel32/comm.c @@ -1161,15 +1161,14 @@ static void test_WaitRx(HANDLE hcom) */ static DWORD CALLBACK toggle_ctlLine(LPVOID arg) { - DWORD *args = (DWORD *) arg; + DWORD_PTR *args = arg; DWORD timeout = args[0]; DWORD ctl = args[1]; HANDLE hcom = (HANDLE) args[2]; HANDLE hComPortEvent = (HANDLE) args[3]; DWORD success, err; - trace("toggle_ctlLine timeout %d clt 0x%08x handle 0x%08x\n", - args[0], args[1], args[2]); + trace("toggle_ctlLine timeout %d ctl 0x%08x handle %p\n", timeout, ctl, hcom ); Sleep(timeout); ok(EscapeCommFunction(hcom, ctl),"EscapeCommFunction 0x%08x failed\n", ctl); trace("toggle_ctline done\n"); @@ -1190,8 +1189,8 @@ static void test_WaitCts(HANDLE hcom) OVERLAPPED overlapped; HANDLE hComPortEvent; HANDLE alarmThread; - DWORD args[4], defaultStat = 0; - DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0; + DWORD_PTR args[4]; + DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0, defaultStat = 0; ok(GetCommState(hcom, &dcb), "GetCommState failed\n"); dcb.fRtsControl=RTS_CONTROL_ENABLE; @@ -1208,15 +1207,15 @@ static void test_WaitCts(HANDLE hcom) args[1] = CLRRTS; else args[1] = SETRTS; - args[2]=(DWORD) hcom; + args[2]=(DWORD_PTR)hcom; - trace("test_WaitCts timeout %d clt 0x%08x handle 0x%08x\n",args[0], args[1], args[2]); + trace("test_WaitCts timeout %ld clt 0x%08lx handle %p\n",args[0], args[1], hcom); ok(SetCommMask(hcom, EV_CTS), "SetCommMask failed\n"); hComPortEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); ok(hComPortEvent != 0, "CreateEvent failed\n"); - args[3] = (DWORD) hComPortEvent; - alarmThread = CreateThread(NULL, 0, toggle_ctlLine, (void *) &args, 0, &alarmThreadId); + args[3] = (DWORD_PTR)hComPortEvent; + alarmThread = CreateThread(NULL, 0, toggle_ctlLine, args, 0, &alarmThreadId); /* Wait a minimum to let the thread start up */ Sleep(10); trace("Thread created\n"); @@ -1265,7 +1264,7 @@ static void test_WaitCts(HANDLE hcom) */ static DWORD CALLBACK reset_CommMask(LPVOID arg) { - DWORD *args = (DWORD *) arg; + DWORD_PTR *args = arg; DWORD timeout = args[0]; HANDLE hcom = (HANDLE) args[1]; @@ -1287,7 +1286,7 @@ static void test_AbortWaitCts(HANDLE hcom) OVERLAPPED overlapped; HANDLE hComPortEvent; HANDLE alarmThread; - DWORD args[2]; + DWORD_PTR args[2]; DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0; ok(GetCommState(hcom, &dcb), "GetCommState failed\n"); @@ -1297,14 +1296,14 @@ static void test_AbortWaitCts(HANDLE hcom) return; } args[0]= TIMEOUT >>1; - args[1]=(DWORD) hcom; + args[1]= (DWORD_PTR)hcom; - trace("test_AbortWaitCts timeout %d handle 0x%08x\n",args[0], args[1]); + trace("test_AbortWaitCts timeout %ld handle %p\n",args[0], hcom); ok(SetCommMask(hcom, EV_CTS), "SetCommMask failed\n"); hComPortEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); ok(hComPortEvent != 0, "CreateEvent failed\n"); - alarmThread = CreateThread(NULL, 0, reset_CommMask, (void *) &args, 0, &alarmThreadId); + alarmThread = CreateThread(NULL, 0, reset_CommMask, args, 0, &alarmThreadId); /* Wait a minimum to let the thread start up */ Sleep(10); trace("Thread created\n"); @@ -1348,8 +1347,8 @@ static void test_WaitDsr(HANDLE hcom) OVERLAPPED overlapped; HANDLE hComPortEvent; HANDLE alarmThread; - DWORD args[3], defaultStat = 0; - DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0; + DWORD_PTR args[3]; + DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0, defaultStat = 0; ok(GetCommState(hcom, &dcb), "GetCommState failed\n"); if (dcb.fDtrControl == DTR_CONTROL_DISABLE) @@ -1363,14 +1362,14 @@ static void test_WaitDsr(HANDLE hcom) args[1] = CLRDTR; else args[1] = SETDTR; - args[2]=(DWORD) hcom; + args[2]= (DWORD_PTR)hcom; - trace("test_WaitDsr timeout %d clt 0x%08x handle 0x%08x\n",args[0], args[1], args[2]); + trace("test_WaitDsr timeout %ld clt 0x%08lx handle %p\n",args[0], args[1], hcom); ok(SetCommMask(hcom, EV_DSR), "SetCommMask failed\n"); hComPortEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); ok(hComPortEvent != 0, "CreateEvent failed\n"); - alarmThread = CreateThread(NULL, 0, toggle_ctlLine, (void *) &args, 0, &alarmThreadId); + alarmThread = CreateThread(NULL, 0, toggle_ctlLine, args, 0, &alarmThreadId); ok(alarmThread !=0 , "CreateThread Failed\n"); ZeroMemory( &overlapped, sizeof(overlapped)); @@ -1421,8 +1420,8 @@ static void test_WaitRing(HANDLE hcom) OVERLAPPED overlapped; HANDLE hComPortEvent; HANDLE alarmThread; - DWORD args[3], defaultStat; - DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0; + DWORD_PTR args[3]; + DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0, defaultStat; BOOL ret; ok(GetCommState(hcom, &dcb), "GetCommState failed\n"); @@ -1441,14 +1440,14 @@ static void test_WaitRing(HANDLE hcom) args[1] = CLRDTR; else args[1] = SETDTR; - args[2]=(DWORD) hcom; + args[2]=(DWORD_PTR) hcom; - trace("test_WaitRing timeout %d clt 0x%08x handle 0x%08x\n",args[0], args[1], args[2]); + trace("test_WaitRing timeout %ld clt 0x%08lx handle %p\n",args[0], args[1], hcom); ok(SetCommMask(hcom, EV_RING), "SetCommMask failed\n"); hComPortEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); ok(hComPortEvent != 0, "CreateEvent failed\n"); - alarmThread = CreateThread(NULL, 0, toggle_ctlLine, (void *) &args, 0, &alarmThreadId); + alarmThread = CreateThread(NULL, 0, toggle_ctlLine, args, 0, &alarmThreadId); ok(alarmThread !=0 , "CreateThread Failed\n"); ZeroMemory( &overlapped, sizeof(overlapped)); @@ -1498,8 +1497,8 @@ static void test_WaitDcd(HANDLE hcom) OVERLAPPED overlapped; HANDLE hComPortEvent; HANDLE alarmThread; - DWORD args[3], defaultStat = 0; - DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0; + DWORD_PTR args[3]; + DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0, defaultStat = 0; ok(GetCommState(hcom, &dcb), "GetCommState failed\n"); if (dcb.fDtrControl == DTR_CONTROL_DISABLE) @@ -1513,14 +1512,14 @@ static void test_WaitDcd(HANDLE hcom) args[1] = CLRDTR; else args[1] = SETDTR; - args[2]=(DWORD) hcom; + args[2]= (DWORD_PTR)hcom; - trace("test_WaitDcd timeout %d clt 0x%08x handle 0x%08x\n",args[0], args[1], args[2]); + trace("test_WaitDcd timeout %ld clt 0x%08lx handle %p\n",args[0], args[1], hcom); ok(SetCommMask(hcom, EV_RLSD), "SetCommMask failed\n"); hComPortEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); ok(hComPortEvent != 0, "CreateEvent failed\n"); - alarmThread = CreateThread(NULL, 0, toggle_ctlLine, (void *) &args, 0, &alarmThreadId); + alarmThread = CreateThread(NULL, 0, toggle_ctlLine, args, 0, &alarmThreadId); ok(alarmThread !=0 , "CreateThread Failed\n"); ZeroMemory( &overlapped, sizeof(overlapped)); @@ -1566,7 +1565,7 @@ static void test_WaitDcd(HANDLE hcom) */ static DWORD CALLBACK set_CommBreak(LPVOID arg) { - DWORD *args = (DWORD *) arg; + DWORD_PTR *args = arg; DWORD timeout = args[0]; HANDLE hcom = (HANDLE) args[1]; @@ -1587,7 +1586,7 @@ static void test_WaitBreak(HANDLE hcom) OVERLAPPED overlapped; HANDLE hComPortEvent; HANDLE alarmThread; - DWORD args[2]; + DWORD_PTR args[2]; DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0; ok(SetCommMask(hcom, EV_BREAK), "SetCommMask failed\n"); @@ -1596,8 +1595,8 @@ static void test_WaitBreak(HANDLE hcom) trace("test_WaitBreak\n"); args[0]= TIMEOUT >>1; - args[1]=(DWORD) hcom; - alarmThread = CreateThread(NULL, 0, set_CommBreak, (void *) &args, 0, &alarmThreadId); + args[1]= (DWORD_PTR)hcom; + alarmThread = CreateThread(NULL, 0, set_CommBreak, args, 0, &alarmThreadId); /* Wait a minimum to let the thread start up */ Sleep(10); trace("Thread created\n"); diff --git a/rostests/winetests/kernel32/console.c b/rostests/winetests/kernel32/console.c index 6eed56bd07f..a54ff5cdda4 100755 --- a/rostests/winetests/kernel32/console.c +++ b/rostests/winetests/kernel32/console.c @@ -162,7 +162,7 @@ static void testCursorInfo(HANDLE hCon) if (info.dwSize == 12) { - skip("NULL CONSOLE_CURSOR_INFO will crash on win9x\n"); + win_skip("NULL CONSOLE_CURSOR_INFO will crash on win9x\n"); return; } @@ -173,7 +173,46 @@ static void testCursorInfo(HANDLE hCon) ERROR_INVALID_ACCESS, GetLastError()); } -static void testWriteSimple(HANDLE hCon, COORD sbSize) +static void testEmptyWrite(HANDLE hCon) +{ + COORD c; + DWORD len; + const char* mytest = ""; + + c.X = c.Y = 0; + ok(SetConsoleCursorPosition(hCon, c) != 0, "Cursor in upper-left\n"); + + len = -1; + ok(WriteConsole(hCon, NULL, 0, &len, NULL) != 0 && len == 0, "WriteConsole\n"); + okCURSOR(hCon, c); + + /* Passing a NULL lpBuffer with sufficiently large non-zero length succeeds + * on native Windows and result in memory-like contents being written to + * the console. Calling WriteConsoleW like this will crash on Wine. */ + if (0) + { + len = -1; + ok(!WriteConsole(hCon, NULL, 16, &len, NULL) && len == -1, "WriteConsole\n"); + okCURSOR(hCon, c); + + /* Cursor advances for this call. */ + len = -1; + ok(WriteConsole(hCon, NULL, 128, &len, NULL) != 0 && len == 128, "WriteConsole\n"); + } + + len = -1; + ok(WriteConsole(hCon, mytest, 0, &len, NULL) != 0 && len == 0, "WriteConsole\n"); + okCURSOR(hCon, c); + + /* WriteConsole does not halt on a null terminator and is happy to write + * memory contents beyond the actual size of the buffer. */ + len = -1; + ok(WriteConsole(hCon, mytest, 16, &len, NULL) != 0 && len == 16, "WriteConsole\n"); + c.X += 16; + okCURSOR(hCon, c); +} + +static void testWriteSimple(HANDLE hCon) { COORD c; DWORD len; @@ -407,7 +446,9 @@ static void testWrite(HANDLE hCon, COORD sbSize) /* FIXME: should in fact insure that the sb is at least 10 character wide */ ok(SetConsoleTextAttribute(hCon, TEST_ATTRIB), "Setting default text color\n"); resetContent(hCon, sbSize, FALSE); - testWriteSimple(hCon, sbSize); + testEmptyWrite(hCon); + resetContent(hCon, sbSize, FALSE); + testWriteSimple(hCon); resetContent(hCon, sbSize, FALSE); testWriteNotWrappedNotProcessed(hCon, sbSize); resetContent(hCon, sbSize, FALSE); @@ -665,7 +706,7 @@ static void testScreenBuffer(HANDLE hConOut) ret = SetConsoleOutputCP(866); if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("SetConsoleOutputCP is not implemented\n"); + win_skip("SetConsoleOutputCP is not implemented\n"); return; } ok(ret, "Cannot set output codepage to 866\n"); @@ -901,7 +942,8 @@ START_TEST(console) ok(hConIn != INVALID_HANDLE_VALUE, "Opening ConIn\n"); ok(hConOut != INVALID_HANDLE_VALUE, "Opening ConOut\n"); - ok(ret = GetConsoleScreenBufferInfo(hConOut, &sbi), "Getting sb info\n"); + ret = GetConsoleScreenBufferInfo(hConOut, &sbi); + ok(ret, "Getting sb info\n"); if (!ret) return; /* Non interactive tests */ @@ -921,7 +963,7 @@ START_TEST(console) if (!pGetConsoleInputExeNameA || !pSetConsoleInputExeNameA) { - skip("GetConsoleInputExeNameA and/or SetConsoleInputExeNameA is not available\n"); + win_skip("GetConsoleInputExeNameA and/or SetConsoleInputExeNameA is not available\n"); return; } else diff --git a/rostests/winetests/kernel32/debugger.c b/rostests/winetests/kernel32/debugger.c index 1a5072c25d6..363dd216c24 100644 --- a/rostests/winetests/kernel32/debugger.c +++ b/rostests/winetests/kernel32/debugger.c @@ -47,6 +47,40 @@ static void get_file_name(char* buf) GetTempFileNameA(path, "wt", 0, buf); } +typedef struct tag_reg_save_value +{ + const char *name; + DWORD type; + BYTE *data; + DWORD size; +} reg_save_value; + +static DWORD save_value(HKEY hkey, const char *value, reg_save_value *saved) +{ + DWORD ret; + saved->name=value; + saved->data=0; + saved->size=0; + ret=RegQueryValueExA(hkey, value, NULL, &saved->type, NULL, &saved->size); + if (ret == ERROR_SUCCESS) + { + saved->data=HeapAlloc(GetProcessHeap(), 0, saved->size); + RegQueryValueExA(hkey, value, NULL, &saved->type, saved->data, &saved->size); + } + return ret; +} + +static void restore_value(HKEY hkey, reg_save_value *saved) +{ + if (saved->data) + { + RegSetValueExA(hkey, saved->name, 0, saved->type, saved->data, saved->size); + HeapFree(GetProcessHeap(), 0, saved->data); + } + else + RegDeleteValueA(hkey, saved->name); +} + static void get_events(const char* name, HANDLE *start_event, HANDLE *done_event) { const char* basename; @@ -133,7 +167,7 @@ static void doDebugger(int argc, char** argv) { const char* logfile; debugger_blackbox_t blackbox; - HANDLE start_event, done_event, debug_event; + HANDLE start_event = 0, done_event = 0, debug_event; blackbox.argc=argc; logfile=(argc >= 4 ? argv[3] : NULL); @@ -149,7 +183,7 @@ static void doDebugger(int argc, char** argv) else blackbox.attach_rc=TRUE; - debug_event=(argc >= 6 ? (HANDLE)atol(argv[5]) : NULL); + debug_event=(argc >= 6 ? (HANDLE)(INT_PTR)atol(argv[5]) : NULL); blackbox.debug_err=0; if (debug_event && strstr(myARGV[2], "event")) { @@ -313,14 +347,13 @@ static void crash_and_winedbg(HKEY hkey, const char* argv0) static void test_ExitCode(void) { static const char* AeDebug="Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug"; + static const char* WineDbg="Software\\Wine\\WineDbg"; char test_exe[MAX_PATH]; DWORD ret; HKEY hkey; DWORD disposition; - LPBYTE auto_val=NULL; - DWORD auto_size, auto_type; - LPBYTE debugger_val=NULL; - DWORD debugger_size, debugger_type; + reg_save_value auto_value; + reg_save_value debugger_value; GetModuleFileNameA(GetModuleHandle(NULL), test_exe, sizeof(test_exe)); if (GetFileAttributes(test_exe) == INVALID_FILE_ATTRIBUTES) @@ -334,22 +367,9 @@ static void test_ExitCode(void) ret=RegCreateKeyExA(HKEY_LOCAL_MACHINE, AeDebug, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &disposition); if (ret == ERROR_SUCCESS) { - auto_size=0; - ret=RegQueryValueExA(hkey, "auto", NULL, &auto_type, NULL, &auto_size); - if (ret == ERROR_SUCCESS) - { - auto_val=HeapAlloc(GetProcessHeap(), 0, auto_size); - RegQueryValueExA(hkey, "auto", NULL, &auto_type, auto_val, &auto_size); - } - - debugger_size=0; - ret=RegQueryValueExA(hkey, "debugger", NULL, &debugger_type, NULL, &debugger_size); - if (ret == ERROR_SUCCESS) - { - debugger_val=HeapAlloc(GetProcessHeap(), 0, debugger_size); - RegQueryValueExA(hkey, "debugger", NULL, &debugger_type, debugger_val, &debugger_size); - trace("HKLM\\%s\\debugger is set to '%s'\n", AeDebug, debugger_val); - } + save_value(hkey, "auto", &auto_value); + save_value(hkey, "debugger", &debugger_value); + trace("HKLM\\%s\\debugger is set to '%s'\n", AeDebug, debugger_value.data); } else if (ret == ERROR_ACCESS_DENIED) { @@ -362,11 +382,32 @@ static void test_ExitCode(void) return; } - if (debugger_val && debugger_type == REG_SZ && - strstr((char*)debugger_val, "winedbg --auto")) - crash_and_winedbg(hkey, test_exe); + if (debugger_value.data && debugger_value.type == REG_SZ && + strstr((char*)debugger_value.data, "winedbg --auto")) + { + HKEY hkeyWinedbg; + ret=RegCreateKeyA(HKEY_CURRENT_USER, WineDbg, &hkeyWinedbg); + if (ret == ERROR_SUCCESS) + { + static DWORD zero; + reg_save_value crash_dlg_value; + save_value(hkeyWinedbg, "ShowCrashDialog", &crash_dlg_value); + RegSetValueExA(hkeyWinedbg, "ShowCrashDialog", 0, REG_DWORD, (BYTE *)&zero, sizeof(DWORD)); + crash_and_winedbg(hkey, test_exe); + restore_value(hkeyWinedbg, &crash_dlg_value); + RegCloseKey(hkeyWinedbg); + } + else + ok(0, "Couldn't access WineDbg Key - error %u\n", ret); + } - crash_and_debug(hkey, test_exe, "dbg,none"); + if (winetest_interactive) + /* Since the debugging process never sets the debug event, it isn't recognized + as a valid debugger and, after the debugger exits, Windows will show a dialog box + asking the user what to do */ + crash_and_debug(hkey, test_exe, "dbg,none"); + else + skip("\"none\" debugger test needs user interaction\n"); crash_and_debug(hkey, test_exe, "dbg,event,order"); crash_and_debug(hkey, test_exe, "dbg,attach,event,code2"); if (pDebugSetProcessKillOnExit) @@ -381,20 +422,8 @@ static void test_ExitCode(void) } else { - if (auto_val) - { - RegSetValueExA(hkey, "auto", 0, auto_type, auto_val, auto_size); - HeapFree(GetProcessHeap(), 0, auto_val); - } - else - RegDeleteValueA(hkey, "auto"); - if (debugger_val) - { - RegSetValueExA(hkey, "debugger", 0, debugger_type, debugger_val, debugger_size); - HeapFree(GetProcessHeap(), 0, debugger_val); - } - else - RegDeleteValueA(hkey, "debugger"); + restore_value(hkey, &auto_value); + restore_value(hkey, &debugger_value); RegCloseKey(hkey); } } diff --git a/rostests/winetests/kernel32/directory.c b/rostests/winetests/kernel32/directory.c index 47e77013a1d..a0ccd9f924d 100755 --- a/rostests/winetests/kernel32/directory.c +++ b/rostests/winetests/kernel32/directory.c @@ -339,27 +339,32 @@ static void test_CreateDirectoryW(void) ret = CreateDirectoryW(NULL, NULL); if (!ret && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return; - ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, "should not create NULL path\n"); + ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, + "should not create NULL path ret %u err %u\n", ret, GetLastError()); ret = CreateDirectoryW(empty_strW, NULL); - ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, "should not create empty path\n"); + ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, + "should not create empty path ret %u err %u\n", ret, GetLastError()); ret = GetSystemDirectoryW(tmpdir, MAX_PATH); ok(ret < MAX_PATH, "System directory should fit into MAX_PATH\n"); ret = SetCurrentDirectoryW(tmpdir); - ok(ret == TRUE, "could not chdir to the System directory\n"); + ok(ret == TRUE, "could not chdir to the System directory ret %u err %u\n", ret, GetLastError()); ret = CreateDirectoryW(dotW, NULL); - ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, + "should not create existing path ret %u err %u\n", ret, GetLastError()); ret = CreateDirectoryW(dotdotW, NULL); - ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, + "should not create existing path ret %u err %u\n", ret, GetLastError()); GetTempPathW(MAX_PATH, tmpdir); tmpdir[3] = 0; /* truncate the path */ ret = CreateDirectoryW(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_ACCESS_DENIED, "should deny access to the drive root\n"); + ok(ret == FALSE && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == ERROR_ALREADY_EXISTS), + "should deny access to the drive root ret %u err %u\n", ret, GetLastError()); GetTempPathW(MAX_PATH, tmpdir); lstrcatW(tmpdir, tmp_dir_name); @@ -367,7 +372,8 @@ static void test_CreateDirectoryW(void) ok(ret == TRUE, "CreateDirectoryW should always succeed\n"); ret = CreateDirectoryW(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, "should not create existing path\n"); + ok(ret == FALSE && GetLastError() == ERROR_ALREADY_EXISTS, + "should not create existing path ret %u err %u\n", ret, GetLastError()); ret = RemoveDirectoryW(tmpdir); ok(ret == TRUE, "RemoveDirectoryW should always succeed\n"); @@ -391,8 +397,9 @@ static void test_CreateDirectoryW(void) lstrcatW(tmpdir, slashW); lstrcatW(tmpdir, tmp_dir_name); ret = CreateDirectoryW(tmpdir, NULL); - ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, - "CreateDirectoryW with multiple nonexistent directories in path should fail\n"); + ok(ret == FALSE && GetLastError() == ERROR_PATH_NOT_FOUND, + "CreateDirectoryW with multiple nonexistent directories in path should fail ret %u err %u\n", + ret, GetLastError()); ret = RemoveDirectoryW(tmpdir); } diff --git a/rostests/winetests/kernel32/drive.c b/rostests/winetests/kernel32/drive.c index a94cbdfea6e..98bc12667e7 100755 --- a/rostests/winetests/kernel32/drive.c +++ b/rostests/winetests/kernel32/drive.c @@ -118,7 +118,12 @@ static void test_GetDiskFreeSpaceA(void) else { ok(ret || - (!ret && (GetLastError() == ERROR_NOT_READY || GetLastError() == ERROR_INVALID_DRIVE)), + GetLastError() == ERROR_NOT_READY || + GetLastError() == ERROR_INVALID_FUNCTION || + GetLastError() == ERROR_INVALID_DRIVE || + GetLastError() == ERROR_PATH_NOT_FOUND || + GetLastError() == ERROR_REQUEST_ABORTED || + GetLastError() == ERROR_UNRECOGNIZED_VOLUME, "GetDiskFreeSpaceA(%s): ret=%d GetLastError=%d\n", drive, ret, GetLastError()); if( GetVersion() & 0x80000000) @@ -132,7 +137,12 @@ static void test_GetDiskFreeSpaceA(void) tot.QuadPart = sectors_per_cluster; tot.QuadPart = (tot.QuadPart * bytes_per_sector) * total_clusters; ret = pGetDiskFreeSpaceExA( drive, &d, &totEx, NULL); - ok( ret || (!ret && ERROR_NOT_READY == GetLastError()), + ok( ret || + GetLastError() == ERROR_NOT_READY || + GetLastError() == ERROR_INVALID_FUNCTION || + GetLastError() == ERROR_PATH_NOT_FOUND || + GetLastError() == ERROR_REQUEST_ABORTED || + GetLastError() == ERROR_UNRECOGNIZED_VOLUME, "GetDiskFreeSpaceExA( %s ) failed. GetLastError=%d\n", drive, GetLastError()); ok( bytes_per_sector == 0 || /* empty cd rom drive */ totEx.QuadPart <= tot.QuadPart, @@ -188,7 +198,12 @@ static void test_GetDiskFreeSpaceW(void) "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%d\n", drive[0], ret, GetLastError()); else - ok(ret || GetLastError() == ERROR_NOT_READY, + ok( ret || + GetLastError() == ERROR_NOT_READY || + GetLastError() == ERROR_INVALID_FUNCTION || + GetLastError() == ERROR_PATH_NOT_FOUND || + GetLastError() == ERROR_REQUEST_ABORTED || + GetLastError() == ERROR_UNRECOGNIZED_VOLUME, "GetDiskFreeSpaceW(%c): ret=%d GetLastError=%d\n", drive[0], ret, GetLastError()); } diff --git a/rostests/winetests/kernel32/environ.c b/rostests/winetests/kernel32/environ.c index 70549e30240..b3526675b20 100755 --- a/rostests/winetests/kernel32/environ.c +++ b/rostests/winetests/kernel32/environ.c @@ -148,7 +148,7 @@ static void test_GetSetEnvironmentVariableW(void) if (ret == FALSE && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) { /* Must be Win9x which doesn't support the Unicode functions */ - skip("SetEnvironmentVariableW is not implemented\n"); + win_skip("SetEnvironmentVariableW is not implemented\n"); return; } ok(ret == TRUE, @@ -245,13 +245,14 @@ static void test_ExpandEnvironmentStringsA(void) SetEnvironmentVariableA("EnvVar", value); ret_size = ExpandEnvironmentStringsA(NULL, buf1, sizeof(buf1)); - ok(ret_size == 1 || ret_size == 0 /* Win9x */, + ok(ret_size == 1 || ret_size == 0 /* Win9x */ || ret_size == 2 /* NT4 */, "ExpandEnvironmentStrings returned %d\n", ret_size); /* Try to get the required buffer size 'the natural way' */ strcpy(buf, "%EnvVar%"); ret_size = ExpandEnvironmentStringsA(buf, NULL, 0); ok(ret_size == strlen(value)+1 || /* win98 */ + ret_size == (strlen(value)+1)*2 || /* NT4 */ ret_size == strlen(value)+2 || /* win2k, XP, win2k3 */ ret_size == 0 /* Win95 */, "ExpandEnvironmentStrings returned %d instead of %d, %d or %d\n", @@ -260,21 +261,24 @@ static void test_ExpandEnvironmentStringsA(void) /* Again, side-stepping the Win95 bug */ ret_size = ExpandEnvironmentStringsA(buf, buf1, 0); /* v5.1.2600.2945 (XP SP2) returns len + 2 here! */ - ok(ret_size == strlen(value)+1 || ret_size == strlen(value)+2, + ok(ret_size == strlen(value)+1 || ret_size == strlen(value)+2 || + ret_size == (strlen(value)+1)*2 /* NT4 */, "ExpandEnvironmentStrings returned %d instead of %d\n", ret_size, lstrlenA(value)+1); /* Try with a buffer that's too small */ ret_size = ExpandEnvironmentStringsA(buf, buf1, 12); /* v5.1.2600.2945 (XP SP2) returns len + 2 here! */ - ok(ret_size == strlen(value)+1 || ret_size == strlen(value)+2, + ok(ret_size == strlen(value)+1 || ret_size == strlen(value)+2 || + ret_size == (strlen(value)+1)*2 /* NT4 */, "ExpandEnvironmentStrings returned %d instead of %d\n", ret_size, lstrlenA(value)+1); /* Try with a buffer of just the right size */ /* v5.1.2600.2945 (XP SP2) needs and returns len + 2 here! */ ret_size = ExpandEnvironmentStringsA(buf, buf1, ret_size); - ok(ret_size == strlen(value)+1 || ret_size == strlen(value)+2, + ok(ret_size == strlen(value)+1 || ret_size == strlen(value)+2 || + ret_size == (strlen(value)+1)*2 /* NT4 */, "ExpandEnvironmentStrings returned %d instead of %d\n", ret_size, lstrlenA(value)+1); ok(!strcmp(buf1, value), "ExpandEnvironmentStrings returned [%s]\n", buf1); @@ -282,7 +286,9 @@ static void test_ExpandEnvironmentStringsA(void) /* Try with an unset environment variable */ strcpy(buf, not_an_env_var); ret_size = ExpandEnvironmentStringsA(buf, buf1, sizeof(buf1)); - ok(ret_size == strlen(not_an_env_var)+1, "ExpandEnvironmentStrings returned %d instead of %d\n", ret_size, lstrlenA(value)+1); + ok(ret_size == strlen(not_an_env_var)+1 || + ret_size == (strlen(not_an_env_var)+1)*2 /* NT4 */, + "ExpandEnvironmentStrings returned %d instead of %d\n", ret_size, lstrlenA(not_an_env_var)+1); ok(!strcmp(buf1, not_an_env_var), "ExpandEnvironmentStrings returned [%s]\n", buf1); /* test a large destination size */ @@ -303,7 +309,9 @@ static void test_ExpandEnvironmentStringsA(void) strcpy(buf, "Indirect-%IndirectVar%-Indirect"); strcpy(buf2, "Indirect-Foo%EnvVar%Bar-Indirect"); ret_size = ExpandEnvironmentStringsA(buf, buf1, sizeof(buf1)); - ok(ret_size == strlen(buf2)+1, "ExpandEnvironmentStrings returned %d instead of %d\n", ret_size, lstrlen(buf2)+1); + ok(ret_size == strlen(buf2)+1 || + ret_size == (strlen(buf2)+1)*2 /* NT4 */, + "ExpandEnvironmentStrings returned %d instead of %d\n", ret_size, lstrlen(buf2)+1); ok(!strcmp(buf1, buf2), "ExpandEnvironmentStrings returned [%s]\n", buf1); SetEnvironmentVariableA("IndirectVar", NULL); @@ -351,7 +359,7 @@ static void test_GetComputerName(void) ret = GetComputerNameW((LPWSTR)0xdeadbeef, &size); error = GetLastError(); if (error == ERROR_CALL_NOT_IMPLEMENTED) - skip("GetComputerNameW is not implemented\n"); + win_skip("GetComputerNameW is not implemented\n"); else { todo_wine @@ -376,7 +384,7 @@ static void test_GetComputerNameExA(void) if (!pGetComputerNameExA) { - skip("GetComputerNameExA function not implemented\n"); + win_skip("GetComputerNameExA function not implemented\n"); return; } @@ -450,7 +458,7 @@ static void test_GetComputerNameExW(void) if (!pGetComputerNameExW) { - skip("GetComputerNameExW function not implemented\n"); + win_skip("GetComputerNameExW function not implemented\n"); return; } diff --git a/rostests/winetests/kernel32/file.c b/rostests/winetests/kernel32/file.c index 2239558f677..89b284d74cf 100755 --- a/rostests/winetests/kernel32/file.c +++ b/rostests/winetests/kernel32/file.c @@ -20,6 +20,9 @@ * */ +/* ReplaceFile requires Windows 2000 or newer */ +#define _WIN32_WINNT 0x0500 + #include #include #include @@ -32,6 +35,7 @@ static HANDLE (WINAPI *pFindFirstFileExA)(LPCSTR,FINDEX_INFO_LEVELS,LPVOID,FINDEX_SEARCH_OPS,LPVOID,DWORD); static BOOL (WINAPI *pReplaceFileA)(LPCSTR, LPCSTR, LPCSTR, DWORD, LPVOID, LPVOID); static BOOL (WINAPI *pReplaceFileW)(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPVOID, LPVOID); +static UINT (WINAPI *pGetSystemWindowsDirectoryA)(LPSTR, UINT); /* keep filename and filenameW the same */ static const char filename[] = "testfile.xxx"; @@ -55,6 +59,7 @@ static void InitFunctionPointers(void) pFindFirstFileExA=(void*)GetProcAddress(hkernel32, "FindFirstFileExA"); pReplaceFileA=(void*)GetProcAddress(hkernel32, "ReplaceFileA"); pReplaceFileW=(void*)GetProcAddress(hkernel32, "ReplaceFileW"); + pGetSystemWindowsDirectoryA=(void*)GetProcAddress(hkernel32, "GetSystemWindowsDirectoryA"); } static void test__hread( void ) @@ -351,20 +356,20 @@ static void test__llseek( void ) for (i = 0; i < 400; i++) { - ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" ); + ok( _hwrite( filehandle, sillytext, strlen( sillytext ) ) != -1, "_hwrite complains\n" ); } - ok( HFILE_ERROR != _llseek( filehandle, 400 * strlen( sillytext ), FILE_CURRENT ), "should be able to seek\n" ); - ok( HFILE_ERROR != _llseek( filehandle, 27 + 35 * strlen( sillytext ), FILE_BEGIN ), "should be able to seek\n" ); + ok( _llseek( filehandle, 400 * strlen( sillytext ), FILE_CURRENT ) != -1, "should be able to seek\n" ); + ok( _llseek( filehandle, 27 + 35 * strlen( sillytext ), FILE_BEGIN ) != -1, "should be able to seek\n" ); bytes_read = _hread( filehandle, buffer, 1); ok( 1 == bytes_read, "file read size error\n" ); ok( buffer[0] == sillytext[27], "_llseek error, it got lost seeking\n" ); - ok( HFILE_ERROR != _llseek( filehandle, -400 * strlen( sillytext ), FILE_END ), "should be able to seek\n" ); + ok( _llseek( filehandle, -400 * (LONG)strlen( sillytext ), FILE_END ) != -1, "should be able to seek\n" ); bytes_read = _hread( filehandle, buffer, 1); ok( 1 == bytes_read, "file read size error\n" ); ok( buffer[0] == sillytext[0], "_llseek error, it got lost seeking\n" ); - ok( HFILE_ERROR != _llseek( filehandle, 1000000, FILE_END ), "should be able to seek past file; poor, poor Windows programmers\n" ); + ok( _llseek( filehandle, 1000000, FILE_END ) != -1, "should be able to seek past file; poor, poor Windows programmers\n" ); ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" ); ret = DeleteFileA( filename ); @@ -559,6 +564,9 @@ static void test_CopyFileA(void) ret = GetTempFileNameA(temp_path, prefix, 0, source); ok(ret != 0, "GetTempFileNameA error %d\n", GetLastError()); + ret = MoveFileA(source, source); + todo_wine ok(ret, "MoveFileA: failed, error %d\n", 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"); @@ -1318,6 +1326,7 @@ static void test_FindFirstFileA(void) int err; char buffer[5] = "C:\\"; char buffer2[100]; + char nonexistent[MAX_PATH]; /* try FindFirstFileA on "C:\" */ buffer[0] = get_windows_drive(); @@ -1355,8 +1364,10 @@ static void test_FindFirstFileA(void) /* try FindFirstFileA on "C:\foo\" */ SetLastError( 0xdeadbeaf ); - strcpy(buffer2, buffer); - strcat(buffer2, "foo\\"); + GetTempFileNameA( buffer, "foo", 0, nonexistent ); + DeleteFileA( nonexistent ); + strcpy(buffer2, nonexistent); + strcat(buffer2, "\\"); handle = FindFirstFileA(buffer2, &data); err = GetLastError(); ok ( handle == INVALID_HANDLE_VALUE, "FindFirstFile on %s should Fail\n", buffer2 ); @@ -1366,8 +1377,8 @@ static void test_FindFirstFileA(void) /* try FindFirstFileA on "C:\foo\bar.txt" */ SetLastError( 0xdeadbeaf ); - strcpy(buffer2, buffer); - strcat(buffer2, "foo\\bar.txt"); + strcpy(buffer2, nonexistent); + strcat(buffer2, "\\bar.txt"); handle = FindFirstFileA(buffer2, &data); err = GetLastError(); ok ( handle == INVALID_HANDLE_VALUE, "FindFirstFile on %s should Fail\n", buffer2 ); @@ -1375,8 +1386,8 @@ static void test_FindFirstFileA(void) /* try FindFirstFileA on "C:\foo\*.*" */ SetLastError( 0xdeadbeaf ); - strcpy(buffer2, buffer); - strcat(buffer2, "foo\\*.*"); + strcpy(buffer2, nonexistent); + strcat(buffer2, "\\*.*"); handle = FindFirstFileA(buffer2, &data); err = GetLastError(); ok ( handle == INVALID_HANDLE_VALUE, "FindFirstFile on %s should Fail\n", buffer2 ); @@ -1384,7 +1395,8 @@ static void test_FindFirstFileA(void) /* try FindFirstFileA on "foo\bar.txt" */ SetLastError( 0xdeadbeaf ); - strcpy(buffer2, "foo\\bar.txt"); + strcpy(buffer2, nonexistent + 3); + strcat(buffer2, "\\bar.txt"); handle = FindFirstFileA(buffer2, &data); err = GetLastError(); ok ( handle == INVALID_HANDLE_VALUE, "FindFirstFile on %s should Fail\n", buffer2 ); @@ -1494,7 +1506,7 @@ static void test_FindFirstFileExA(void) if (!pFindFirstFileExA) { - skip("FindFirstFileExA() is missing\n"); + win_skip("FindFirstFileExA() is missing\n"); return; } @@ -1507,7 +1519,7 @@ static void test_FindFirstFileExA(void) handle = pFindFirstFileExA("test-dir\\*", FindExInfoStandard, &search_results, FindExSearchLimitToDirectories, NULL, 0); if (handle == INVALID_HANDLE_VALUE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("FindFirstFileExA is not implemented\n"); + win_skip("FindFirstFileExA is not implemented\n"); goto cleanup; } ok(handle != INVALID_HANDLE_VALUE, "FindFirstFile failed (err=%u)\n", GetLastError()); @@ -1668,10 +1680,11 @@ static void test_async_file_errors(void) static void test_read_write(void) { - DWORD bytes, ret; + DWORD bytes, ret, old_prot; HANDLE hFile; char temp_path[MAX_PATH]; char filename[MAX_PATH]; + char *mem; static const char prefix[] = "pfx"; ret = GetTempPathA(MAX_PATH, temp_path); @@ -1721,6 +1734,95 @@ static void test_read_write(void) "ret = %d, error %d\n", ret, GetLastError()); ok(!bytes, "bytes = %d\n", bytes); + /* test passing protected memory as buffer */ + + mem = VirtualAlloc( NULL, 0x4000, MEM_COMMIT, PAGE_READWRITE ); + ok( mem != NULL, "failed to allocate virtual mem error %u\n", GetLastError() ); + + ret = WriteFile( hFile, mem, 0x4000, &bytes, NULL ); + ok( ret, "WriteFile failed error %u\n", GetLastError() ); + ok( bytes == 0x4000, "only wrote %x bytes\n", bytes ); + + ret = VirtualProtect( mem + 0x2000, 0x2000, PAGE_NOACCESS, &old_prot ); + ok( ret, "VirtualProtect failed error %u\n", GetLastError() ); + + ret = WriteFile( hFile, mem, 0x4000, &bytes, NULL ); + ok( !ret, "WriteFile succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_USER_BUFFER || + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "wrong error %u\n", GetLastError() ); + ok( bytes == 0, "wrote %x bytes\n", bytes ); + + ret = WriteFile( (HANDLE)0xdead, mem, 0x4000, &bytes, NULL ); + ok( !ret, "WriteFile succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_HANDLE || /* handle is checked before buffer on NT */ + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "wrong error %u\n", GetLastError() ); + ok( bytes == 0, "wrote %x bytes\n", bytes ); + + ret = VirtualProtect( mem, 0x2000, PAGE_NOACCESS, &old_prot ); + ok( ret, "VirtualProtect failed error %u\n", GetLastError() ); + + ret = WriteFile( hFile, mem, 0x4000, &bytes, NULL ); + ok( !ret, "WriteFile succeeded\n" ); + ok( GetLastError() == ERROR_INVALID_USER_BUFFER || + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "wrong error %u\n", GetLastError() ); + ok( bytes == 0, "wrote %x bytes\n", bytes ); + + SetFilePointer( hFile, 0, NULL, FILE_BEGIN ); + + ret = ReadFile( hFile, mem, 0x4000, &bytes, NULL ); + ok( !ret, "ReadFile succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS || + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "wrong error %u\n", GetLastError() ); + ok( bytes == 0, "read %x bytes\n", bytes ); + + ret = VirtualProtect( mem, 0x2000, PAGE_READONLY, &old_prot ); + ok( ret, "VirtualProtect failed error %u\n", GetLastError() ); + + ret = ReadFile( hFile, mem, 0x4000, &bytes, NULL ); + ok( !ret, "ReadFile succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS || + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "wrong error %u\n", GetLastError() ); + ok( bytes == 0, "read %x bytes\n", bytes ); + + ret = VirtualProtect( mem, 0x2000, PAGE_READWRITE, &old_prot ); + ok( ret, "VirtualProtect failed error %u\n", GetLastError() ); + + ret = ReadFile( hFile, mem, 0x4000, &bytes, NULL ); + ok( !ret, "ReadFile succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS || + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "wrong error %u\n", GetLastError() ); + ok( bytes == 0, "read %x bytes\n", bytes ); + + SetFilePointer( hFile, 0x1234, NULL, FILE_BEGIN ); + SetEndOfFile( hFile ); + SetFilePointer( hFile, 0, NULL, FILE_BEGIN ); + + ret = ReadFile( hFile, mem, 0x4000, &bytes, NULL ); + ok( !ret, "ReadFile succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS || + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "wrong error %u\n", GetLastError() ); + ok( bytes == 0, "read %x bytes\n", bytes ); + + ret = ReadFile( hFile, mem, 0x2000, &bytes, NULL ); + ok( ret, "ReadFile failed error %u\n", GetLastError() ); + ok( bytes == 0x1234, "read %x bytes\n", bytes ); + + ret = ReadFile( hFile, NULL, 1, &bytes, NULL ); + ok( !ret, "ReadFile succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS || + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "wrong error %u\n", GetLastError() ); + ok( bytes == 0, "read %x bytes\n", bytes ); + + VirtualFree( mem, 0, MEM_FREE ); + ret = CloseHandle(hFile); ok( ret, "CloseHandle: error %d\n", GetLastError()); ret = DeleteFileA(filename); @@ -1749,7 +1851,10 @@ static void test_OpenFile(void) UINT length; /* Check for existing file */ - length = GetWindowsDirectoryA(buff, MAX_PATH); + if (!pGetSystemWindowsDirectoryA) + length = GetWindowsDirectoryA(buff, MAX_PATH); + else + length = pGetSystemWindowsDirectoryA(buff, MAX_PATH); if (length + sizeof(file) < MAX_PATH) { @@ -1837,8 +1942,8 @@ static void test_OpenFile(void) ok( ofs.cBytes == sizeof(OFSTRUCT), "OpenFile set ofs.cBytes to %d\n", ofs.cBytes ); ok( ofs.nErrCode == ERROR_SUCCESS || broken(ofs.nErrCode != ERROR_SUCCESS) /* win9x */, "OpenFile set ofs.nErrCode to %d\n", ofs.nErrCode ); - ret = CloseHandle((HANDLE)hFile); - ok( ret == TRUE, "CloseHandle() returns %d\n", ret ); + ret = _lclose(hFile); + ok( !ret, "_lclose() returns %d\n", ret ); retval = GetFileAttributesA(filename); ok( retval != INVALID_FILE_ATTRIBUTES, "GetFileAttributesA: error %d\n", GetLastError() ); @@ -1855,8 +1960,8 @@ static void test_OpenFile(void) "OpenFile set ofs.nErrCode to %d\n", ofs.nErrCode ); ok( lstrcmpiA(ofs.szPathName, buff) == 0, "OpenFile returned '%s', but was expected to return '%s'\n", ofs.szPathName, buff ); - ret = CloseHandle((HANDLE)hFile); - ok( ret == TRUE, "CloseHandle() returns %d\n", ret ); + ret = _lclose(hFile); + ok( !ret, "_lclose() returns %d\n", ret ); memset(&ofs, 0xA5, sizeof(ofs)); SetLastError(0xfaceabee); @@ -1870,8 +1975,8 @@ static void test_OpenFile(void) "OpenFile set ofs.nErrCode to %d\n", ofs.nErrCode ); ok( lstrcmpiA(ofs.szPathName, buff) == 0, "OpenFile returned '%s', but was expected to return '%s'\n", ofs.szPathName, buff ); - ret = CloseHandle((HANDLE)hFile); - ok( ret == TRUE, "CloseHandle() returns %d\n", ret ); + ret = _lclose(hFile); + ok( !ret, "_lclose() returns %d\n", ret ); memset(&ofs, 0xA5, sizeof(ofs)); SetLastError(0xfaceabee); @@ -1885,8 +1990,8 @@ static void test_OpenFile(void) "OpenFile set ofs.nErrCode to %d\n", ofs.nErrCode ); ok( lstrcmpiA(ofs.szPathName, buff) == 0, "OpenFile returned '%s', but was expected to return '%s'\n", ofs.szPathName, buff ); - ret = CloseHandle((HANDLE)hFile); - ok( ret == TRUE, "CloseHandle() returns %d\n", ret ); + ret = _lclose(hFile); + ok( !ret, "_lclose() returns %d\n", ret ); memset(&ofs, 0xA5, sizeof(ofs)); SetLastError(0xfaceabee); @@ -1924,6 +2029,12 @@ static void test_overlapped(void) DWORD r, result; /* GetOverlappedResult crashes if the 2nd or 3rd param are NULL */ + if (0) /* tested: WinXP */ + { + GetOverlappedResult(0, NULL, &result, FALSE); + GetOverlappedResult(0, &ov, NULL, FALSE); + GetOverlappedResult(0, NULL, NULL, FALSE); + } memset( &ov, 0, sizeof ov ); result = 1; @@ -2024,11 +2135,11 @@ static void test_ReplaceFileA(void) static const char prefix[] = "pfx"; char temp_path[MAX_PATH]; DWORD ret; - BOOL retok; + BOOL retok, removeBackup = FALSE; if (!pReplaceFileA) { - skip("ReplaceFileA() is missing\n"); + win_skip("ReplaceFileA() is missing\n"); return; } @@ -2109,27 +2220,32 @@ static void test_ReplaceFileA(void) /* make sure that the "replaced" file has the size of the replacement file */ hReplacedFile = CreateFileA(replaced, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); ok(hReplacedFile != INVALID_HANDLE_VALUE, - "failed to open replaced file\n"); - ret = GetFileSize(hReplacedFile, NULL); - ok(ret == sizeof(replacementData), - "replaced file has wrong size %d\n", ret); - /* make sure that the replacement file no-longer exists */ - hReplacementFile = CreateFileA(replacement, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); - ok(hReplacementFile == INVALID_HANDLE_VALUE, - "unexpected error, replacement file should not exist %d\n", GetLastError()); - /* make sure that the backup has the old "replaced" filetime */ - ret = GetFileTime(hBackupFile, NULL, NULL, &ftBackup); - ok( ret, "GetFileTime error (backup %d\n", GetLastError()); - ok(check_file_time(&ftBackup, &ftReplaced, 20000000), "backup file has wrong filetime\n"); - CloseHandle(hBackupFile); - /* make sure that the "replaced" has the old replacement filetime */ - ret = GetFileTime(hReplacedFile, NULL, NULL, &ftReplaced); - ok( ret, "GetFileTime error (backup %d\n", GetLastError()); - ok(check_file_time(&ftReplaced, &ftReplacement, 20000000), - "replaced file has wrong filetime %x%08x / %x%08x\n", - ftReplaced.dwHighDateTime, ftReplaced.dwLowDateTime, - ftReplacement.dwHighDateTime, ftReplacement.dwLowDateTime ); - CloseHandle(hReplacedFile); + "failed to open replaced file: %d\n", GetLastError()); + if (hReplacedFile != INVALID_HANDLE_VALUE) + { + ret = GetFileSize(hReplacedFile, NULL); + ok(ret == sizeof(replacementData), + "replaced file has wrong size %d\n", ret); + /* make sure that the replacement file no-longer exists */ + hReplacementFile = CreateFileA(replacement, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); + ok(hReplacementFile == INVALID_HANDLE_VALUE, + "unexpected error, replacement file should not exist %d\n", GetLastError()); + /* make sure that the backup has the old "replaced" filetime */ + ret = GetFileTime(hBackupFile, NULL, NULL, &ftBackup); + ok( ret, "GetFileTime error (backup %d\n", GetLastError()); + ok(check_file_time(&ftBackup, &ftReplaced, 20000000), "backup file has wrong filetime\n"); + CloseHandle(hBackupFile); + /* make sure that the "replaced" has the old replacement filetime */ + ret = GetFileTime(hReplacedFile, NULL, NULL, &ftReplaced); + ok( ret, "GetFileTime error (backup %d\n", GetLastError()); + ok(check_file_time(&ftReplaced, &ftReplacement, 20000000), + "replaced file has wrong filetime %x%08x / %x%08x\n", + ftReplaced.dwHighDateTime, ftReplaced.dwLowDateTime, + ftReplacement.dwHighDateTime, ftReplacement.dwLowDateTime ); + CloseHandle(hReplacedFile); + } + else + skip("couldn't open replacement file, skipping tests\n"); /* re-create replacement file for pass w/o backup (blank) */ ret = GetTempFileNameA(temp_path, prefix, 0, replacement); @@ -2139,7 +2255,8 @@ static void test_ReplaceFileA(void) */ SetLastError(0xdeadbeef); ret = pReplaceFileA(replaced, replacement, NULL, 0, 0, 0); - ok(ret, "ReplaceFileA: unexpected error %d\n", GetLastError()); + ok(ret || GetLastError() == ERROR_ACCESS_DENIED, + "ReplaceFileA: unexpected error %d\n", GetLastError()); /* re-create replacement file for pass w/ backup (backup-file not existing) */ ret = GetTempFileNameA(temp_path, prefix, 0, replacement); @@ -2151,13 +2268,17 @@ static void test_ReplaceFileA(void) */ SetLastError(0xdeadbeef); ret = pReplaceFileA(replaced, replacement, backup, 0, 0, 0); - ok(ret, "ReplaceFileA: unexpected error %d\n", GetLastError()); + ok(ret || GetLastError() == ERROR_ACCESS_DENIED, + "ReplaceFileA: unexpected error %d\n", GetLastError()); + if (ret) + removeBackup = TRUE; /* re-create replacement file for pass w/ no permissions to "replaced" */ ret = GetTempFileNameA(temp_path, prefix, 0, replacement); ok(ret != 0, "GetTempFileNameA error (replacement) %d\n", GetLastError()); ret = SetFileAttributesA(replaced, FILE_ATTRIBUTE_READONLY); - ok(ret, "SetFileAttributesA: error setting to read only %d\n", GetLastError()); + ok(ret || GetLastError() == ERROR_ACCESS_DENIED, + "SetFileAttributesA: error setting to read only %d\n", GetLastError()); /* perform replacement w/ backup (no permission to "replaced") * TODO: flags are not implemented */ @@ -2171,25 +2292,29 @@ static void test_ReplaceFileA(void) "unexpected error, replacement file should still exist %d\n", GetLastError()); CloseHandle(hReplacementFile); ret = SetFileAttributesA(replaced, FILE_ATTRIBUTE_NORMAL); - ok(ret, "SetFileAttributesA: error setting to normal %d\n", GetLastError()); + ok(ret || GetLastError() == ERROR_ACCESS_DENIED, + "SetFileAttributesA: error setting to normal %d\n", GetLastError()); /* replacement file still exists, make pass w/o "replaced" */ ret = DeleteFileA(replaced); - ok(ret, "DeleteFileA: error (replaced) %d\n", GetLastError()); + ok(ret || GetLastError() == ERROR_ACCESS_DENIED, + "DeleteFileA: error (replaced) %d\n", GetLastError()); /* perform replacement w/ backup (no pre-existing backup or "replaced") * TODO: flags are not implemented */ SetLastError(0xdeadbeef); ret = pReplaceFileA(replaced, replacement, backup, 0, 0, 0); - ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, - "ReplaceFileA: unexpected error %d\n", GetLastError()); + ok(!ret && (GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_ACCESS_DENIED), + "ReplaceFileA: unexpected error %d\n", GetLastError()); /* perform replacement w/o existing "replacement" file * TODO: flags are not implemented */ SetLastError(0xdeadbeef); ret = pReplaceFileA(replaced, replacement, NULL, 0, 0, 0); - ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, + ok(!ret && (GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_ACCESS_DENIED), "ReplaceFileA: unexpected error %d\n", GetLastError()); /* @@ -2199,10 +2324,13 @@ static void test_ReplaceFileA(void) */ /* delete temporary files, replacement and replaced are already deleted */ - ret = DeleteFileA(backup); - ok(ret || - broken(GetLastError() == ERROR_ACCESS_DENIED), /* win2k */ - "DeleteFileA: error (backup) %d\n", GetLastError()); + if (removeBackup) + { + ret = DeleteFileA(backup); + ok(ret || + broken(GetLastError() == ERROR_ACCESS_DENIED), /* win2k */ + "DeleteFileA: error (backup) %d\n", GetLastError()); + } } /* @@ -2215,10 +2343,11 @@ static void test_ReplaceFileW(void) static const WCHAR prefix[] = {'p','f','x',0}; WCHAR temp_path[MAX_PATH]; DWORD ret; + BOOL removeBackup = FALSE; if (!pReplaceFileW) { - skip("ReplaceFileW() is missing\n"); + win_skip("ReplaceFileW() is missing\n"); return; } @@ -2243,25 +2372,31 @@ static void test_ReplaceFileW(void) ret = GetTempFileNameW(temp_path, prefix, 0, replacement); ok(ret != 0, "GetTempFileNameW error (replacement) %d\n", GetLastError()); ret = pReplaceFileW(replaced, replacement, NULL, 0, 0, 0); - ok(ret, "ReplaceFileW: error %d\n", GetLastError()); + ok(ret || GetLastError() == ERROR_ACCESS_DENIED, + "ReplaceFileW: error %d\n", GetLastError()); ret = GetTempFileNameW(temp_path, prefix, 0, replacement); ok(ret != 0, "GetTempFileNameW error (replacement) %d\n", GetLastError()); ret = DeleteFileW(backup); ok(ret, "DeleteFileW: error (backup) %d\n", GetLastError()); ret = pReplaceFileW(replaced, replacement, backup, 0, 0, 0); - ok(ret, "ReplaceFileW: error %d\n", GetLastError()); + ok(ret || GetLastError() == ERROR_ACCESS_DENIED, + "ReplaceFileW: error %d\n", GetLastError()); ret = GetTempFileNameW(temp_path, prefix, 0, replacement); ok(ret != 0, "GetTempFileNameW error (replacement) %d\n", GetLastError()); ret = SetFileAttributesW(replaced, FILE_ATTRIBUTE_READONLY); - ok(ret, "SetFileAttributesW: error setting to read only %d\n", GetLastError()); + ok(ret || GetLastError() == ERROR_ACCESS_DENIED, + "SetFileAttributesW: error setting to read only %d\n", GetLastError()); ret = pReplaceFileW(replaced, replacement, backup, 0, 0, 0); ok(ret != ERROR_UNABLE_TO_REMOVE_REPLACED, "ReplaceFileW: unexpected error %d\n", GetLastError()); ret = SetFileAttributesW(replaced, FILE_ATTRIBUTE_NORMAL); - ok(ret, "SetFileAttributesW: error setting to normal %d\n", GetLastError()); + ok(ret || GetLastError() == ERROR_ACCESS_DENIED, + "SetFileAttributesW: error setting to normal %d\n", GetLastError()); + if (ret) + removeBackup = TRUE; ret = DeleteFileW(replaced); ok(ret, "DeleteFileW: error (replaced) %d\n", GetLastError()); @@ -2269,13 +2404,17 @@ static void test_ReplaceFileW(void) ok(!ret, "ReplaceFileW: error %d\n", GetLastError()); ret = pReplaceFileW(replaced, replacement, NULL, 0, 0, 0); - ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, + ok(!ret && (GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_ACCESS_DENIED), "ReplaceFileW: unexpected error %d\n", GetLastError()); - ret = DeleteFileW(backup); - ok(ret || - broken(GetLastError() == ERROR_ACCESS_DENIED), /* win2k */ - "DeleteFileW: error (backup) %d\n", GetLastError()); + if (removeBackup) + { + ret = DeleteFileW(backup); + ok(ret || + broken(GetLastError() == ERROR_ACCESS_DENIED), /* win2k */ + "DeleteFileW: error (backup) %d\n", GetLastError()); + } } START_TEST(file) diff --git a/rostests/winetests/kernel32/format_msg.c b/rostests/winetests/kernel32/format_msg.c index 74d51090074..cbb8b5aec38 100755 --- a/rostests/winetests/kernel32/format_msg.c +++ b/rostests/winetests/kernel32/format_msg.c @@ -237,7 +237,7 @@ static void test_message_null_buffer(void) error = GetLastError(); if (!ret && error == ERROR_CALL_NOT_IMPLEMENTED) { - skip("FormatMessageW is not implemented\n"); + win_skip("FormatMessageW is not implemented\n"); return; } diff --git a/rostests/winetests/kernel32/heap.c b/rostests/winetests/kernel32/heap.c index c196c23e3cd..39517ccb0ec 100755 --- a/rostests/winetests/kernel32/heap.c +++ b/rostests/winetests/kernel32/heap.c @@ -34,7 +34,30 @@ static SIZE_T resize_9x(SIZE_T size) return max(dwSizeAligned, 12); /* at least 12 bytes */ } -START_TEST(heap) +static void test_sized_HeapAlloc(int nbytes) +{ + int success; + char *buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nbytes); + ok(buf != NULL, "allocate failed\n"); + ok(buf[0] == 0, "buffer not zeroed\n"); + success = HeapFree(GetProcessHeap(), 0, buf); + ok(success, "free failed\n"); +} + +static void test_sized_HeapReAlloc(int nbytes1, int nbytes2) +{ + int success; + char *buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nbytes1); + ok(buf != NULL, "allocate failed\n"); + ok(buf[0] == 0, "buffer not zeroed\n"); + buf = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buf, nbytes2); + ok(buf != NULL, "reallocate failed\n"); + ok(buf[nbytes2-1] == 0, "buffer not zeroed\n"); + success = HeapFree(GetProcessHeap(), 0, buf); + ok(success, "free failed\n"); +} + +static void test_heap(void) { LPVOID mem; LPVOID msecond; @@ -64,13 +87,13 @@ START_TEST(heap) /* test some border cases of HeapAlloc and HeapReAlloc */ mem = HeapAlloc(GetProcessHeap(), 0, 0); ok(mem != NULL, "memory not allocated for size 0\n"); - msecond = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, mem, ~0UL - 7); - ok(msecond == NULL, "HeapReAlloc(0xfffffff8) should have failed\n"); - msecond = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, mem, ~0UL); - ok(msecond == NULL, "HeapReAlloc(0xffffffff) should have failed\n"); + msecond = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, mem, ~(SIZE_T)0 - 7); + ok(msecond == NULL, "HeapReAlloc(~0 - 7) should have failed\n"); + msecond = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, mem, ~(SIZE_T)0); + ok(msecond == NULL, "HeapReAlloc(~0) should have failed\n"); HeapFree(GetProcessHeap(), 0, mem); - mem = HeapAlloc(GetProcessHeap(), 0, ~0UL); - ok(mem == NULL, "memory allocated for size ~0UL\n"); + mem = HeapAlloc(GetProcessHeap(), 0, ~(SIZE_T)0); + ok(mem == NULL, "memory allocated for size ~0\n"); /* large blocks must be 16-byte aligned */ mem = HeapAlloc(GetProcessHeap(), 0, 512 * 1024); @@ -190,13 +213,16 @@ START_TEST(heap) ok(mem == NULL, "Expected NULL, got %p\n", mem); /* invalid free */ - SetLastError(MAGIC_DEAD); - mem = GlobalFree(gbl); - ok(mem == gbl || broken(mem == NULL) /* nt4 */, "Expected gbl, got %p\n", mem); - if (mem == gbl) - ok(GetLastError() == ERROR_INVALID_HANDLE || - GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ - "Expected ERROR_INVALID_HANDLE or ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + if (sizeof(void *) != 8) /* crashes on 64-bit Vista */ + { + SetLastError(MAGIC_DEAD); + mem = GlobalFree(gbl); + ok(mem == gbl || broken(mem == NULL) /* nt4 */, "Expected gbl, got %p\n", mem); + if (mem == gbl) + ok(GetLastError() == ERROR_INVALID_HANDLE || + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "Expected ERROR_INVALID_HANDLE or ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + } gbl = GlobalAlloc(GMEM_DDESHARE, 100); @@ -211,12 +237,15 @@ START_TEST(heap) "Expected 1 or 0, got %d\n", res); /* GlobalSize on an invalid handle */ - SetLastError(MAGIC_DEAD); - size = GlobalSize((HGLOBAL)0xc042); - ok(size == 0, "Expected 0, got %ld\n", size); - ok(GetLastError() == ERROR_INVALID_HANDLE || - GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ - "Expected ERROR_INVALID_HANDLE or ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + if (sizeof(void *) != 8) /* crashes on 64-bit Vista */ + { + SetLastError(MAGIC_DEAD); + size = GlobalSize((HGLOBAL)0xc042); + ok(size == 0, "Expected 0, got %ld\n", size); + ok(GetLastError() == ERROR_INVALID_HANDLE || + GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ + "Expected ERROR_INVALID_HANDLE or ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + } /* ####################################### */ /* Local*() functions */ @@ -332,3 +361,16 @@ START_TEST(heap) GlobalFree(gbl); } + +START_TEST(heap) +{ + test_heap(); + + /* Test both short and very long blocks */ + test_sized_HeapAlloc(1); + test_sized_HeapAlloc(1 << 20); + test_sized_HeapReAlloc(1, 100); + test_sized_HeapReAlloc(1, (1 << 20)); + test_sized_HeapReAlloc((1 << 20), (2 << 20)); + test_sized_HeapReAlloc((1 << 20), 1); +} diff --git a/rostests/winetests/kernel32/loader.c b/rostests/winetests/kernel32/loader.c index 5187d882a45..9361ed58c12 100644 --- a/rostests/winetests/kernel32/loader.c +++ b/rostests/winetests/kernel32/loader.c @@ -52,6 +52,8 @@ static IMAGE_NT_HEADERS nt_header = IMAGE_FILE_MACHINE_I386, /* Machine */ #elif defined __x86_64__ IMAGE_FILE_MACHINE_AMD64, /* Machine */ +#elif defined __powerpc__ + IMAGE_FILE_MACHINE_POWERPC, /* Machine */ #else # error You must specify the machine type #endif @@ -70,7 +72,9 @@ static IMAGE_NT_HEADERS nt_header = 0, /* SizeOfUninitializedData */ 0, /* AddressOfEntryPoint */ 0x10, /* BaseOfCode, also serves as e_lfanew in the truncated MZ header */ +#ifndef _WIN64 0, /* BaseOfData */ +#endif 0x10000000, /* ImageBase */ 0, /* SectionAlignment */ 0, /* FileAlignment */ @@ -398,7 +402,7 @@ static void test_Loader(void) "%d: VirtualQuery error %d\n", i, GetLastError()); if (nt_header.OptionalHeader.SectionAlignment < si.dwPageSize) { - ok(info.BaseAddress == (char *)hlib, "%d: got %p != expected %p\n", i, info.BaseAddress, (char *)hlib); + ok(info.BaseAddress == hlib, "%d: got %p != expected %p\n", i, info.BaseAddress, hlib); ok(info.RegionSize == ALIGN_SIZE(nt_header.OptionalHeader.SizeOfImage, si.dwPageSize), "%d: got %lx != expected %x\n", i, info.RegionSize, ALIGN_SIZE(nt_header.OptionalHeader.SizeOfImage, si.dwPageSize)); ok(info.Protect == PAGE_EXECUTE_WRITECOPY, "%d: %x != PAGE_EXECUTE_WRITECOPY\n", i, info.Protect); diff --git a/rostests/winetests/kernel32/locale.c b/rostests/winetests/kernel32/locale.c index 4dce7335e0b..e88e182a37c 100755 --- a/rostests/winetests/kernel32/locale.c +++ b/rostests/winetests/kernel32/locale.c @@ -1110,6 +1110,12 @@ static void test_CompareStringA(void) ret = CompareStringA(lcid, 0, "\2", 2, "\1", 2); todo_wine ok(ret != 2, "\\2 vs \\1 expected unequal\n"); + + 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 = lstrcmpi("#", "."); + todo_wine ok(ret == -1, "\"#\" vs \".\" expected -1, got %d\n", ret); } static void test_LCMapStringA(void) @@ -1221,9 +1227,11 @@ static void test_LCMapStringA(void) ret = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, upper_case, -1, buf, sizeof(buf)); ok(ret, "LCMapStringA must succeed\n"); + ok(buf[ret-1] == 0, "LCMapStringA not null-terminated\n"); ret2 = LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_SORTKEY, upper_case, lstrlenA(upper_case), buf2, sizeof(buf2)); - ok(ret, "LCMapStringA must succeed\n"); + ok(ret2, "LCMapStringA must succeed\n"); + ok(buf2[ret2-1] == 0, "LCMapStringA not null-terminated\n" ); ok(ret == ret2, "lengths of sort keys must be equal\n"); ok(!lstrcmpA(buf, buf2), "sort keys must be equal\n"); @@ -1901,7 +1909,7 @@ static void test_FoldStringW(void) if (!pFoldStringW) { - skip("FoldStringW is not available\n"); + win_skip("FoldStringW is not available\n"); return; /* FoldString is present in NT v3.1+, but not 95/98/Me */ } @@ -1913,7 +1921,7 @@ static void test_FoldStringW(void) ret = pFoldStringW(badFlags[i], src, 256, dst, 256); if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) { - skip("FoldStringW is not implemented\n"); + win_skip("FoldStringW is not implemented\n"); return; } ok(!ret && GetLastError() == ERROR_INVALID_FLAGS, @@ -2291,7 +2299,7 @@ static void test_EnumUILanguageA(void) { BOOL ret; if (!pEnumUILanguagesA) { - skip("EnumUILanguagesA is not available on Win9x or NT4\n"); + win_skip("EnumUILanguagesA is not available on Win9x or NT4\n"); return; } diff --git a/rostests/winetests/kernel32/path.c b/rostests/winetests/kernel32/path.c index e8e6c1e1ce1..20ee4535b85 100755 --- a/rostests/winetests/kernel32/path.c +++ b/rostests/winetests/kernel32/path.c @@ -328,7 +328,7 @@ static void test_InitPathA(CHAR *newdir, CHAR *curDrive, CHAR *otherDrive) "GetTempPathA returned a path that did not end in '\\'\n"); lstrcpyA(tmpstr,"aaaaaaaa"); len1=GetTempPathA(len,tmpstr); - ok(len1==len+1, + ok(len1==len+1 || broken(len1 == len), /* WinME */ "GetTempPathA should return string length %d instead of %d\n",len+1,len1); /* Test GetTmpFileNameA @@ -384,14 +384,16 @@ static void test_InitPathA(CHAR *newdir, CHAR *curDrive, CHAR *otherDrive) ok(CreateDirectoryA(tmpstr,NULL),"CreateDirectoryA failed\n"); sprintf(tmpstr,"%s\\%s",newdir,LONGDIR); ok(CreateDirectoryA(tmpstr,NULL),"CreateDirectoryA failed\n"); - bRes = CreateDirectoryA("c:",NULL); - ok(!bRes && (GetLastError() == ERROR_ACCESS_DENIED || - GetLastError() == ERROR_ALREADY_EXISTS), - "CreateDirectoryA(\"c:\" should have failed (%d)\n", GetLastError()); - bRes = CreateDirectoryA("c:\\",NULL); + sprintf(tmpstr,"%c:", *curDrive); + bRes = CreateDirectoryA(tmpstr,NULL); ok(!bRes && (GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == ERROR_ALREADY_EXISTS), - "CreateDirectoryA(\"c:\\\" should have failed (%d)\n", GetLastError()); + "CreateDirectoryA(\"%s\" should have failed (%d)\n", tmpstr, GetLastError()); + sprintf(tmpstr,"%c:\\", *curDrive); + bRes = CreateDirectoryA(tmpstr,NULL); + ok(!bRes && (GetLastError() == ERROR_ACCESS_DENIED || + GetLastError() == ERROR_ALREADY_EXISTS), + "CreateDirectoryA(\"%s\" should have failed (%d)\n", tmpstr, GetLastError()); sprintf(tmpstr,"%s\\%s\\%s",newdir,SHORTDIR,SHORTFILE); hndl=CreateFileA(tmpstr,GENERIC_WRITE,0,NULL, CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); @@ -468,10 +470,10 @@ static void test_CurrentDirectoryA(CHAR *origdir, CHAR *newdir) /* change to root without a trailing backslash. The function call succeeds but the directory is not changed. */ - strcpy(tmpstr,"C:"); + sprintf(tmpstr, "%c:", newdir[0]); test_setdir(newdir,tmpstr,newdir,1,"check 10"); /* works however with a trailing backslash */ - strcpy(tmpstr,"C:\\"); + sprintf(tmpstr, "%c:\\", newdir[0]); test_setdir(newdir,tmpstr,NULL,1,"check 11"); } @@ -901,15 +903,18 @@ static void test_GetTempPath(void) char windir[MAX_PATH]; char buf[MAX_PATH]; - GetEnvironmentVariableA("TMP", save_TMP, sizeof(save_TMP)); + if (!GetEnvironmentVariableA("TMP", save_TMP, sizeof(save_TMP))) save_TMP[0] = 0; /* test default configuration */ trace("TMP=%s\n", save_TMP); - strcpy(buf,save_TMP); - if (buf[strlen(buf)-1]!='\\') - strcat(buf,"\\"); - test_GetTempPathA(buf); - test_GetTempPathW(buf); + if (save_TMP[0]) + { + strcpy(buf,save_TMP); + if (buf[strlen(buf)-1]!='\\') + strcat(buf,"\\"); + test_GetTempPathA(buf); + test_GetTempPathW(buf); + } /* TMP=C:\WINDOWS */ GetWindowsDirectoryA(windir, sizeof(windir)); @@ -956,7 +961,7 @@ static void test_GetLongPathNameW(void) length = pGetLongPathNameW(NULL,NULL,0); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("GetLongPathNameW is not implemented\n"); + win_skip("GetLongPathNameW is not implemented\n"); return; } ok(0==length,"GetLongPathNameW returned %d but expected 0\n",length); @@ -985,7 +990,7 @@ static void test_GetShortPathNameW(void) GetTempPathW( MAX_PATH, path ); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("GetTempPathW is not implemented\n"); + win_skip("GetTempPathW is not implemented\n"); return; } @@ -1216,8 +1221,11 @@ static void test_drive_letter_case(void) ret = GetTempPath(sizeof(buf), buf); ok(ret, "GetTempPath error %u\n", GetLastError()); ok(ret < sizeof(buf), "buffer should be %u bytes\n", ret); - ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]); - ok(buf[strlen(buf)-1] == '\\', "Temporary path (%s) doesn't end in a slash\n", buf); + if (buf[0]) + { + ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]); + ok(buf[strlen(buf)-1] == '\\', "Temporary path (%s) doesn't end in a slash\n", buf); + } memset(buf, 0, sizeof(buf)); SetLastError(0xdeadbeef); diff --git a/rostests/winetests/kernel32/pipe.c b/rostests/winetests/kernel32/pipe.c index a4b6853317a..a1080faad3d 100755 --- a/rostests/winetests/kernel32/pipe.c +++ b/rostests/winetests/kernel32/pipe.c @@ -62,13 +62,6 @@ static void test_CreateNamedPipe(int pipemode) /* nInBufSize */ 1024, /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, /* lpSecurityAttrib */ NULL); - - if (hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - /* Is this the right way to notify user of skipped tests? */ - ok(hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED, - "CreateNamedPipe not supported on this platform, skipping tests.\n"); - return; - } ok(hnp == INVALID_HANDLE_VALUE && GetLastError() == ERROR_INVALID_NAME, "CreateNamedPipe should fail if name doesn't start with \\\\.\\pipe\n"); @@ -389,7 +382,7 @@ static void test_CreateNamedPipe_instances_must_match(void) /** implementation of alarm() */ static DWORD CALLBACK alarmThreadMain(LPVOID arg) { - DWORD timeout = (DWORD) arg; + DWORD_PTR timeout = (DWORD_PTR) arg; trace("alarmThreadMain\n"); if (WaitForSingleObject( alarm_event, timeout ) == WAIT_TIMEOUT) { @@ -548,7 +541,7 @@ static DWORD CALLBACK serverThreadMain3(LPVOID arg) OVERLAPPED oOverlap; int letWFSOEwait = (i & 2); int letGORwait = (i & 1); - DWORD err; + DWORD err; memset(&oOverlap, 0, sizeof(oOverlap)); oOverlap.hEvent = hEvent; @@ -557,51 +550,74 @@ static DWORD CALLBACK serverThreadMain3(LPVOID arg) 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"); + ok(!success && (err == ERROR_IO_PENDING || err == ERROR_PIPE_CONNECTED), "overlapped ConnectNamedPipe\n"); trace("overlapped ConnectNamedPipe returned.\n"); - if (!success && (err == ERROR_IO_PENDING) && letWFSOEwait) - ok(WaitForSingleObjectEx(hEvent, INFINITE, TRUE) == 0, "wait ConnectNamedPipe\n"); - 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, "GetOverlappedResult ConnectNamedPipe\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"); /* Echo bytes once */ memset(buf, 0, sizeof(buf)); trace("Server reading...\n"); - success = ReadFile(hnp, buf, sizeof(buf), NULL, &oOverlap); + success = ReadFile(hnp, buf, sizeof(buf), &readden, &oOverlap); trace("Server ReadFile returned...\n"); err = GetLastError(); ok(success || err == ERROR_IO_PENDING, "overlapped ReadFile\n"); trace("overlapped ReadFile returned.\n"); - if (!success && (err == ERROR_IO_PENDING) && letWFSOEwait) - ok(WaitForSingleObjectEx(hEvent, INFINITE, TRUE) == 0, "wait ReadFile\n"); - success = GetOverlappedResult(hnp, &oOverlap, &readden, letGORwait); - if (!letGORwait && !letWFSOEwait && !success) { - ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n"); - success = GetOverlappedResult(hnp, &oOverlap, &readden, TRUE); - } + 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 ReadFile returned %x\n", ret); + } + success = GetOverlappedResult(hnp, &oOverlap, &readden, letGORwait); + if (!letGORwait && !letWFSOEwait && !success) { + ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n"); + success = GetOverlappedResult(hnp, &oOverlap, &readden, TRUE); + } + } trace("Server done reading.\n"); ok(success, "overlapped ReadFile\n"); trace("Server writing...\n"); - success = WriteFile(hnp, buf, readden, NULL, &oOverlap); + success = WriteFile(hnp, buf, readden, &written, &oOverlap); trace("Server WriteFile returned...\n"); err = GetLastError(); ok(success || err == ERROR_IO_PENDING, "overlapped WriteFile\n"); trace("overlapped WriteFile returned.\n"); - if (!success && (err == ERROR_IO_PENDING) && letWFSOEwait) - ok(WaitForSingleObjectEx(hEvent, INFINITE, TRUE) == 0, "wait WriteFile\n"); - success = GetOverlappedResult(hnp, &oOverlap, &written, letGORwait); - if (!letGORwait && !letWFSOEwait && !success) { - ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n"); - success = GetOverlappedResult(hnp, &oOverlap, &written, TRUE); - } + 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 WriteFile returned %x\n", ret); + } + success = GetOverlappedResult(hnp, &oOverlap, &written, letGORwait); + if (!letGORwait && !letWFSOEwait && !success) { + ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n"); + success = GetOverlappedResult(hnp, &oOverlap, &written, TRUE); + } + } trace("Server done writing.\n"); ok(success, "overlapped WriteFile\n"); ok(written == readden, "write file len\n"); @@ -613,6 +629,113 @@ static DWORD CALLBACK serverThreadMain3(LPVOID arg) return 0; } +/** Trivial byte echo server - uses i/o completion ports */ +static DWORD CALLBACK serverThreadMain4(LPVOID arg) +{ + int i; + HANDLE hcompletion; + + trace("serverThreadMain4\n"); + /* Set up a simple echo server */ + hnp = CreateNamedPipe(PIPENAME "serverThreadMain4", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed\n"); + + hcompletion = CreateIoCompletionPort(hnp, NULL, 12345, 1); + ok(hcompletion != NULL, "CreateIoCompletionPort failed, error=%i\n", GetLastError()); + + for (i = 0; i < NB_SERVER_LOOPS; i++) { + char buf[512]; + DWORD written; + DWORD readden; + DWORD dummy; + DWORD success; + OVERLAPPED oConnect; + OVERLAPPED oRead; + OVERLAPPED oWrite; + OVERLAPPED *oResult; + DWORD err; + ULONG_PTR compkey; + + memset(&oConnect, 0, sizeof(oConnect)); + memset(&oRead, 0, sizeof(oRead)); + memset(&oWrite, 0, sizeof(oWrite)); + + /* Wait for client to connect */ + trace("Server calling overlapped ConnectNamedPipe...\n"); + success = ConnectNamedPipe(hnp, &oConnect); + err = GetLastError(); + ok(!success && (err == ERROR_IO_PENDING || err == ERROR_PIPE_CONNECTED), + "overlapped ConnectNamedPipe got %u err %u\n", success, err ); + if (!success && err == ERROR_IO_PENDING) { + trace("ConnectNamedPipe GetQueuedCompletionStatus\n"); + success = GetQueuedCompletionStatus(hcompletion, &dummy, &compkey, &oResult, 0); + if (!success) + { + ok( GetLastError() == WAIT_TIMEOUT, + "ConnectNamedPipe GetQueuedCompletionStatus wrong error %u\n", GetLastError()); + success = GetQueuedCompletionStatus(hcompletion, &dummy, &compkey, &oResult, 10000); + } + ok(success, "ConnectNamedPipe GetQueuedCompletionStatus failed, errno=%i\n", GetLastError()); + if (success) + { + ok(compkey == 12345, "got completion key %i instead of 12345\n", (int)compkey); + ok(oResult == &oConnect, "got overlapped pointer %p instead of %p\n", oResult, &oConnect); + } + } + trace("overlapped ConnectNamedPipe operation complete.\n"); + + /* Echo bytes once */ + memset(buf, 0, sizeof(buf)); + + trace("Server reading...\n"); + success = ReadFile(hnp, buf, sizeof(buf), &readden, &oRead); + trace("Server ReadFile returned...\n"); + err = GetLastError(); + ok(success || err == ERROR_IO_PENDING, "overlapped ReadFile, err=%i\n", err); + success = GetQueuedCompletionStatus(hcompletion, &readden, &compkey, + &oResult, 10000); + ok(success, "ReadFile GetQueuedCompletionStatus failed, errno=%i\n", GetLastError()); + if (success) + { + ok(compkey == 12345, "got completion key %i instead of 12345\n", (int)compkey); + ok(oResult == &oRead, "got overlapped pointer %p instead of %p\n", oResult, &oRead); + } + trace("Server done reading.\n"); + + trace("Server writing...\n"); + success = WriteFile(hnp, buf, readden, &written, &oWrite); + trace("Server WriteFile returned...\n"); + err = GetLastError(); + ok(success || err == ERROR_IO_PENDING, "overlapped WriteFile failed, err=%u\n", err); + success = GetQueuedCompletionStatus(hcompletion, &written, &compkey, + &oResult, 10000); + ok(success, "WriteFile GetQueuedCompletionStatus failed, errno=%i\n", GetLastError()); + if (success) + { + ok(compkey == 12345, "got completion key %i instead of 12345\n", (int)compkey); + ok(oResult == &oWrite, "got overlapped pointer %p instead of %p\n", oResult, &oWrite); + ok(written == readden, "write file len\n"); + } + trace("Server done writing.\n"); + + /* finish this connection, wait for next one */ + ok(FlushFileBuffers(hnp), "FlushFileBuffers\n"); + success = DisconnectNamedPipe(hnp); + ok(success, "DisconnectNamedPipe failed, err %u\n", GetLastError()); + } + + ok(CloseHandle(hnp), "CloseHandle named pipe failed, err=%i\n", GetLastError()); + ok(CloseHandle(hcompletion), "CloseHandle completion failed, err=%i\n", GetLastError()); + + return 0; +} + static void exercizeServer(const char *pipename, HANDLE serverThread) { int i; @@ -690,13 +813,15 @@ static void test_NamedPipe_2(void) ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); exercizeServer(PIPENAME "serverThreadMain2", serverThread); - if( 0 ) /* overlapped pipe server doesn't work yet - it randomly fails */ - { /* Try server #3 */ serverThread = CreateThread(NULL, 0, serverThreadMain3, 0, 0, &serverThreadId); ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); exercizeServer(PIPENAME "serverThreadMain3", serverThread); - } + + /* Try server #4 */ + serverThread = CreateThread(NULL, 0, serverThreadMain4, 0, 0, &serverThreadId); + ok(serverThread != INVALID_HANDLE_VALUE, "CreateThread\n"); + exercizeServer(PIPENAME "serverThreadMain4", serverThread); ok(SetEvent( alarm_event ), "SetEvent\n"); CloseHandle( alarm_event ); @@ -821,7 +946,7 @@ struct named_pipe_client_params static DWORD CALLBACK named_pipe_client_func(LPVOID p) { - struct named_pipe_client_params *params = (struct named_pipe_client_params *)p; + struct named_pipe_client_params *params = p; HANDLE pipe; BOOL ret; const char message[] = "Test"; @@ -1266,7 +1391,7 @@ static DWORD CALLBACK overlapped_server(LPVOID arg) OVERLAPPED ol; HANDLE pipe; int ret, err; - struct overlapped_server_args *a = (struct overlapped_server_args*)arg; + struct overlapped_server_args *a = arg; DWORD num; char buf[100]; @@ -1323,6 +1448,117 @@ static void test_overlapped(void) CloseHandle(thread); } +static void test_NamedPipeHandleState(void) +{ + HANDLE server, client; + BOOL ret; + DWORD state, instances, maxCollectionCount, collectDataTimeout; + char userName[MAX_PATH]; + + server = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, + /* dwOpenMode */ PIPE_TYPE_BYTE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(server != INVALID_HANDLE_VALUE, "cf failed\n"); + ret = GetNamedPipeHandleState(server, NULL, NULL, NULL, NULL, NULL, 0); + todo_wine + ok(ret, "GetNamedPipeHandleState failed: %d\n", GetLastError()); + ret = GetNamedPipeHandleState(server, &state, &instances, NULL, NULL, NULL, + 0); + todo_wine + ok(ret, "GetNamedPipeHandleState failed: %d\n", GetLastError()); + if (ret) + { + ok(state == 0, "unexpected state %08x\n", state); + ok(instances == 1, "expected 1 instances, got %d\n", instances); + } + /* Some parameters have no meaning, and therefore can't be retrieved, + * on a local pipe. + */ + SetLastError(0xdeadbeef); + ret = GetNamedPipeHandleState(server, &state, &instances, + &maxCollectionCount, &collectDataTimeout, userName, + sizeof(userName) / sizeof(userName[0])); + todo_wine + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, + "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + /* A byte-mode pipe server can't be changed to message mode. */ + state = PIPE_READMODE_MESSAGE; + SetLastError(0xdeadbeef); + ret = SetNamedPipeHandleState(server, &state, NULL, NULL); + todo_wine + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, + "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + + client = CreateFileA(PIPENAME, GENERIC_READ|GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, 0, NULL); + ok(client != INVALID_HANDLE_VALUE, "cf failed\n"); + + state = PIPE_READMODE_BYTE; + ret = SetNamedPipeHandleState(client, &state, NULL, NULL); + todo_wine + ok(ret, "SetNamedPipeHandleState failed: %d\n", GetLastError()); + /* A byte-mode pipe client can't be changed to message mode, either. */ + state = PIPE_READMODE_MESSAGE; + SetLastError(0xdeadbeef); + ret = SetNamedPipeHandleState(server, &state, NULL, NULL); + todo_wine + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, + "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + + CloseHandle(client); + CloseHandle(server); + + server = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, + /* dwOpenMode */ PIPE_TYPE_MESSAGE | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(server != INVALID_HANDLE_VALUE, "cf failed\n"); + ret = GetNamedPipeHandleState(server, NULL, NULL, NULL, NULL, NULL, 0); + todo_wine + ok(ret, "GetNamedPipeHandleState failed: %d\n", GetLastError()); + ret = GetNamedPipeHandleState(server, &state, &instances, NULL, NULL, NULL, + 0); + todo_wine + ok(ret, "GetNamedPipeHandleState failed: %d\n", GetLastError()); + if (ret) + { + ok(state == 0, "unexpected state %08x\n", state); + ok(instances == 1, "expected 1 instances, got %d\n", instances); + } + /* In contrast to byte-mode pipes, a message-mode pipe server can be + * changed to byte mode. + */ + state = PIPE_READMODE_BYTE; + ret = SetNamedPipeHandleState(server, &state, NULL, NULL); + todo_wine + ok(ret, "SetNamedPipeHandleState failed: %d\n", GetLastError()); + + client = CreateFileA(PIPENAME, GENERIC_READ|GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, 0, NULL); + ok(client != INVALID_HANDLE_VALUE, "cf failed\n"); + + state = PIPE_READMODE_MESSAGE; + ret = SetNamedPipeHandleState(client, &state, NULL, NULL); + todo_wine + ok(ret, "SetNamedPipeHandleState failed: %d\n", GetLastError()); + /* A message-mode pipe client can also be changed to byte mode. + */ + state = PIPE_READMODE_BYTE; + ret = SetNamedPipeHandleState(client, &state, NULL, NULL); + todo_wine + ok(ret, "SetNamedPipeHandleState failed: %d\n", GetLastError()); + + CloseHandle(client); + CloseHandle(server); +} + START_TEST(pipe) { HMODULE hmod; @@ -1339,4 +1575,5 @@ START_TEST(pipe) test_CreatePipe(); test_impersonation(); test_overlapped(); + test_NamedPipeHandleState(); } diff --git a/rostests/winetests/kernel32/process.c b/rostests/winetests/kernel32/process.c index 0568b527e03..2b07450b9ee 100755 --- a/rostests/winetests/kernel32/process.c +++ b/rostests/winetests/kernel32/process.c @@ -35,9 +35,42 @@ #include "wine/test.h" +#define PROCESS_NAME_NATIVE 1 + +#define expect_eq_d(expected, actual) \ + do { \ + int value = (actual); \ + ok((expected) == value, "Expected " #actual " to be %d (" #expected ") is %d\n", \ + (expected), value); \ + } while (0) +#define expect_eq_ws_i(expected, actual) \ + do { \ + LPCWSTR value = (actual); \ + ok(lstrcmpiW((expected), value) == 0, "Expected " #actual " to be L\"%s\" (" #expected ") is L\"%s\"\n", \ + wine_dbgstr_w(expected), wine_dbgstr_w(value)); \ + } while (0) + +/* A simpler version of wine_dbgstr_w. Note that the returned buffer will be + * invalid after 16 calls to this funciton. */ +static const char *wine_dbgstr_w(LPCWSTR wstr) +{ + static char *buffers[16]; + static int curr_buffer = 0; + + int size; + + curr_buffer = (curr_buffer + 1) % 16; + HeapFree(GetProcessHeap(), 0, buffers[curr_buffer]); + size = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL); + buffers[curr_buffer] = HeapAlloc(GetProcessHeap(), 0, size); + size = WideCharToMultiByte(CP_ACP, 0, wstr, -1, buffers[curr_buffer], size, NULL, NULL); + return buffers[curr_buffer]; +} + static HINSTANCE hkernel32; static LPVOID (WINAPI *pVirtualAllocEx)(HANDLE, LPVOID, SIZE_T, DWORD, DWORD); static BOOL (WINAPI *pVirtualFreeEx)(HANDLE, LPVOID, SIZE_T, DWORD); +static BOOL (WINAPI *pQueryFullProcessImageNameW)(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD lpdwSize); /* ############################### */ static char base[MAX_PATH]; @@ -175,6 +208,7 @@ static int init(void) hkernel32 = GetModuleHandleA("kernel32"); pVirtualAllocEx = (void *) GetProcAddress(hkernel32, "VirtualAllocEx"); pVirtualFreeEx = (void *) GetProcAddress(hkernel32, "VirtualFreeEx"); + pQueryFullProcessImageNameW = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameW"); return 1; } @@ -241,7 +275,7 @@ static void doChild(const char* file, const char* option) siA.dwX, siA.dwY, siA.dwXSize, siA.dwYSize, siA.dwXCountChars, siA.dwYCountChars, siA.dwFillAttribute, siA.dwFlags, siA.wShowWindow, - (DWORD)siA.hStdInput, (DWORD)siA.hStdOutput, (DWORD)siA.hStdError); + (DWORD_PTR)siA.hStdInput, (DWORD_PTR)siA.hStdOutput, (DWORD_PTR)siA.hStdError); /* since GetStartupInfoW is only implemented in win2k, * zero out before calling so we can notice the difference @@ -258,7 +292,7 @@ static void doChild(const char* file, const char* option) siW.dwX, siW.dwY, siW.dwXSize, siW.dwYSize, siW.dwXCountChars, siW.dwYCountChars, siW.dwFillAttribute, siW.dwFlags, siW.wShowWindow, - (DWORD)siW.hStdInput, (DWORD)siW.hStdOutput, (DWORD)siW.hStdError); + (DWORD_PTR)siW.hStdInput, (DWORD_PTR)siW.hStdOutput, (DWORD_PTR)siW.hStdError); /* Arguments */ childPrintf(hFile, "[Arguments]\nargcA=%d\n", myARGC); @@ -492,7 +526,7 @@ static void ok_child_stringWA( int line, const char *sect, const char *key, #define okChildInt(sect, key, expect) \ do { \ UINT result = GetPrivateProfileIntA((sect), (key), !(expect), resfile); \ - ok(result == expect, "%s:%s expected %d, but got %d\n", (sect), (key), (int)(expect), result); \ + ok(result == expect, "%s:%s expected %u, but got %u\n", (sect), (key), (UINT)(expect), result); \ } while (0) static void test_Startup(void) @@ -1292,9 +1326,9 @@ static void test_Console(void) okChildInt("StartupInfoA", "wShowWindow", startup.wShowWindow); /* check child correctly inherited the console */ - okChildInt("StartupInfoA", "hStdInput", (DWORD)startup.hStdInput); - okChildInt("StartupInfoA", "hStdOutput", (DWORD)startup.hStdOutput); - okChildInt("StartupInfoA", "hStdError", (DWORD)startup.hStdError); + okChildInt("StartupInfoA", "hStdInput", (DWORD_PTR)startup.hStdInput); + okChildInt("StartupInfoA", "hStdOutput", (DWORD_PTR)startup.hStdOutput); + okChildInt("StartupInfoA", "hStdError", (DWORD_PTR)startup.hStdError); okChildInt("Console", "SizeX", (DWORD)sbi.dwSize.X); okChildInt("Console", "SizeY", (DWORD)sbi.dwSize.Y); okChildInt("Console", "CursorX", (DWORD)sbi.dwCursorPosition.X); @@ -1409,7 +1443,7 @@ static void test_OpenProcess(void) /* not exported in all windows versions */ if ((!pVirtualAllocEx) || (!pVirtualFreeEx)) { - skip("VirtualAllocEx not found\n"); + win_skip("VirtualAllocEx not found\n"); return; } @@ -1423,7 +1457,7 @@ static void test_OpenProcess(void) if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { /* Win9x */ CloseHandle(hproc); - skip("VirtualAllocEx not implemented\n"); + win_skip("VirtualAllocEx not implemented\n"); return; } ok(GetLastError() == ERROR_ACCESS_DENIED, "wrong error %d\n", GetLastError()); @@ -1520,6 +1554,76 @@ static void test_GetProcessVersion(void) CloseHandle(pi.hThread); } +static void test_ProcessName(void) +{ + HANDLE hSelf; + WCHAR module_name[1024]; + WCHAR deviceW[] = {'\\','D', 'e','v','i','c','e',0}; + WCHAR buf[1024]; + DWORD size; + + if (!pQueryFullProcessImageNameW) + { + win_skip("QueryFullProcessImageNameW unavailable (added in Windows Vista)\n"); + return; + } + + ok(GetModuleFileNameW(NULL, module_name, 1024), "GetModuleFileNameW(NULL, ...) failed\n"); + + /* GetCurrentProcess pseudo-handle */ + size = sizeof(buf) / sizeof(buf[0]); + expect_eq_d(TRUE, pQueryFullProcessImageNameW(GetCurrentProcess(), 0, buf, &size)); + expect_eq_d(lstrlenW(buf), size); + expect_eq_ws_i(buf, module_name); + + hSelf = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, GetCurrentProcessId()); + /* Real handle */ + size = sizeof(buf) / sizeof(buf[0]); + expect_eq_d(TRUE, pQueryFullProcessImageNameW(hSelf, 0, buf, &size)); + expect_eq_d(lstrlenW(buf), size); + expect_eq_ws_i(buf, module_name); + + /* Buffer too small */ + size = lstrlenW(module_name)/2; + lstrcpyW(buf, deviceW); + SetLastError(0xdeadbeef); + expect_eq_d(FALSE, pQueryFullProcessImageNameW(hSelf, 0, buf, &size)); + expect_eq_d(lstrlenW(module_name)/2, size); /* size not changed(!) */ + expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError()); + expect_eq_ws_i(deviceW, buf); /* buffer not changed */ + + /* Too small - not space for NUL terminator */ + size = lstrlenW(module_name); + SetLastError(0xdeadbeef); + expect_eq_d(FALSE, pQueryFullProcessImageNameW(hSelf, 0, buf, &size)); + expect_eq_d(lstrlenW(module_name), size); /* size not changed(!) */ + expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError()); + + /* NULL buffer */ + size = 0; + expect_eq_d(FALSE, pQueryFullProcessImageNameW(hSelf, 0, NULL, &size)); + expect_eq_d(0, size); + expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError()); + + /* native path */ + size = sizeof(buf) / sizeof(buf[0]); + expect_eq_d(TRUE, pQueryFullProcessImageNameW(hSelf, PROCESS_NAME_NATIVE, buf, &size)); + expect_eq_d(lstrlenW(buf), size); + ok(buf[0] == '\\', "NT path should begin with '\\'\n"); + todo_wine ok(memcmp(buf, deviceW, sizeof(WCHAR)*lstrlenW(deviceW)) == 0, "NT path should begin with \\Device\n"); + + /* Buffer too small */ + size = lstrlenW(module_name)/2; + SetLastError(0xdeadbeef); + lstrcpyW(buf, module_name); + expect_eq_d(FALSE, pQueryFullProcessImageNameW(hSelf, 0, buf, &size)); + expect_eq_d(lstrlenW(module_name)/2, size); /* size not changed(!) */ + expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError()); + expect_eq_ws_i(module_name, buf); /* buffer not changed */ + + CloseHandle(hSelf); +} + static void test_Handles(void) { HANDLE handle = GetCurrentProcess(); @@ -1573,6 +1677,7 @@ START_TEST(process) test_ExitCode(); test_OpenProcess(); test_GetProcessVersion(); + test_ProcessName(); test_Handles(); /* things that can be tested: * lookup: check the way program to be executed is searched diff --git a/rostests/winetests/kernel32/profile.c b/rostests/winetests/kernel32/profile.c index 87c0a738670..fbf5d2400b1 100755 --- a/rostests/winetests/kernel32/profile.c +++ b/rostests/winetests/kernel32/profile.c @@ -186,7 +186,15 @@ static void test_profile_sections(void) broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */ "expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); - /* And a real one */ + /* Existing empty section with no keys */ + SetLastError(0xdeadbeef); + ret=GetPrivateProfileSectionA("section2", buf, sizeof(buf), testfile4); + ok( ret == 0, "expected return size 0, got %d\n", ret ); + ok( GetLastError() == ERROR_SUCCESS || + broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */ + "expected ERROR_SUCCESS, got %d\n", GetLastError()); + + /* Existing section with keys and values*/ SetLastError(0xdeadbeef); ret=GetPrivateProfileSectionA("section1", buf, sizeof(buf), testfile4); for( p = buf + strlen(buf) + 1; *p;p += strlen(p)+1) @@ -798,17 +806,28 @@ static void test_GetPrivateProfileString(const char *content, const char *descri ok(ret == 4, "Expected 4, got %d\n", ret); ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf); + /* Existing section with no keys in an existing file */ + memset(buf, 0xc,sizeof(buf)); + SetLastError(0xdeadbeef); + ret=GetPrivateProfileStringA("section2", "DoesntExist", "", + buf, MAX_PATH, filename); + ok( ret == 0, "expected return size 0, got %d\n", ret ); + ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); + todo_wine + ok( GetLastError() == 0xdeadbeef , "expected 0xdeadbeef, got %d\n", + GetLastError()); + + DeleteFileA(path); DeleteFileA(filename); } static DWORD timeout = 0; -static BOOL check_file_data(LPCSTR path, LPCSTR data) +static BOOL check_binary_file_data(LPCSTR path, const VOID *data, DWORD size) { HANDLE file; CHAR buf[MAX_PATH]; - DWORD size; BOOL ret; /* Sleep() is needed on Win9x and WinME */ @@ -819,17 +838,23 @@ static BOOL check_file_data(LPCSTR path, LPCSTR data) if (file == INVALID_HANDLE_VALUE) return FALSE; - size = GetFileSize(file, NULL); - buf[size] = '\0'; + if(size != GetFileSize(file, NULL) ) + { + CloseHandle(file); + return FALSE; + } + ret = ReadFile(file, buf, size, &size, NULL); CloseHandle(file); if (!ret) return FALSE; - if (!*data && size != 0) - return FALSE; + return !memcmp(buf, data, size); +} - return !lstrcmpA(buf, data); +static BOOL check_file_data(LPCSTR path, LPCSTR data) +{ + return check_binary_file_data(path, data, lstrlenA(data)); } static void test_WritePrivateProfileString(void) @@ -1019,7 +1044,23 @@ static void test_WritePrivateProfileString(void) ret = WritePrivateProfileStringA("App3", "key5", NULL, path); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); ok(check_file_data(path, data), "File doesn't match\n"); + DeleteFileA(path); + /* NULLs in file before first section. Should be preserved in output */ + data = "Data \0 before \0 first \0 section" /* 31 bytes */ + "\r\n[section1]\r\n" /* 14 bytes */ + "key1=string1\r\n"; /* 14 bytes */ + GetTempFileNameA(temp, "wine", 0, path); + create_test_file(path, data, 31); + ret = WritePrivateProfileStringA("section1", "key1", "string1", path); + ok(ret == TRUE, "Expected TRUE, got %d\n", ret); + todo_wine + ok( check_binary_file_data(path, data, 59) || + broken( check_binary_file_data(path, /* Windows 9x */ + "Data \0 before \0 first \0 section" /* 31 bytes */ + "\r\n\r\n[section1]\r\n" /* 14 bytes */ + "key1=string1" /* 14 bytes */ + , 59)), "File doesn't match\n"); DeleteFileA(path); } diff --git a/rostests/winetests/kernel32/resource.c b/rostests/winetests/kernel32/resource.c index cde27a8d535..622f7814c8f 100644 --- a/rostests/winetests/kernel32/resource.c +++ b/rostests/winetests/kernel32/resource.c @@ -310,7 +310,7 @@ START_TEST(resource) if (GLE == ERROR_CALL_NOT_IMPLEMENTED) { - skip("Resource calls are not implemented\n"); + win_skip("Resource calls are not implemented\n"); return; } diff --git a/rostests/winetests/kernel32/sync.c b/rostests/winetests/kernel32/sync.c index 32d37e868b8..ea36fc60847 100755 --- a/rostests/winetests/kernel32/sync.c +++ b/rostests/winetests/kernel32/sync.c @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define _WIN32_WINNT 0x500 #include #include #include @@ -53,7 +54,7 @@ static void test_signalandwait(void) r = pSignalObjectAndWait(NULL, NULL, 0, 0); if (r == ERROR_INVALID_FUNCTION) { - skip("SignalObjectAndWait is not implemented\n"); + win_skip("SignalObjectAndWait is not implemented\n"); return; /* Win98/ME */ } ok( r == WAIT_FAILED, "should fail\n"); @@ -196,7 +197,7 @@ static void test_slist(void) int value; } item1, item2, item3, *pitem; - SLIST_HEADER slist_header, test_header; + SLIST_HEADER slist_header; PSLIST_ENTRY entry; USHORT size; @@ -219,15 +220,12 @@ static void test_slist(void) pInterlockedPopEntrySList == NULL || pInterlockedPushEntrySList == NULL) { - skip("some required slist entrypoints were not found, skipping tests\n"); + win_skip("some required slist entrypoints were not found, skipping tests\n"); return; } - memset(&test_header, 0, sizeof(test_header)); memset(&slist_header, 0xFF, sizeof(slist_header)); pInitializeSListHead(&slist_header); - ok(memcmp(&test_header, &slist_header, sizeof(SLIST_HEADER)) == 0, - "InitializeSListHead didn't zero-fill list header\n"); size = pQueryDepthSList(&slist_header); ok(size == 0, "initially created slist has size %d, expected 0\n", size); @@ -395,7 +393,7 @@ static void test_waitable_timer(void) if (!pCreateWaitableTimerA || !pOpenWaitableTimerA) { - skip("{Create,Open}WaitableTimerA() is not available\n"); + win_skip("{Create,Open}WaitableTimerA() is not available\n"); return; } @@ -457,7 +455,7 @@ static void test_iocp_callback(void) p_BindIoCompletionCallback = (void*)GetProcAddress(hmod, "BindIoCompletionCallback"); if(!p_BindIoCompletionCallback) { - skip("BindIoCompletionCallback not found in this DLL\n"); + win_skip("BindIoCompletionCallback not found in this DLL\n"); return; } @@ -492,7 +490,7 @@ static void test_iocp_callback(void) ok(retb == TRUE, "BindIoCompletionCallback failed\n"); memset(&overlapped, 0, sizeof(overlapped)); - retb = WriteFile(hFile, (const void *) buffer, 4, &bytesWritten, &overlapped); + retb = WriteFile(hFile, buffer, 4, &bytesWritten, &overlapped); ok(retb == TRUE || GetLastError() == ERROR_IO_PENDING, "WriteFile failed, lastError = %d\n", GetLastError()); ret = WaitForSingleObject(sem, 5000); @@ -536,7 +534,7 @@ static void test_iocp_callback(void) static void CALLBACK timer_queue_cb1(PVOID p, BOOLEAN timedOut) { - int *pn = (int *) p; + int *pn = p; ok(timedOut, "Timer callbacks should always time out\n"); ++*pn; } @@ -596,7 +594,7 @@ static void CALLBACK timer_queue_cb4(PVOID p, BOOLEAN timedOut) static void CALLBACK timer_queue_cb5(PVOID p, BOOLEAN timedOut) { - DWORD delay = (DWORD) p; + DWORD_PTR delay = (DWORD_PTR) p; ok(timedOut, "Timer callbacks should always time out\n"); if (delay) Sleep(delay); @@ -647,7 +645,7 @@ static void test_timer_queue(void) if (!pChangeTimerQueueTimer || !pCreateTimerQueue || !pCreateTimerQueueTimer || !pDeleteTimerQueueEx || !pDeleteTimerQueueTimer) { - skip("TimerQueue API not present\n"); + win_skip("TimerQueue API not present\n"); return; } diff --git a/rostests/winetests/kernel32/thread.c b/rostests/winetests/kernel32/thread.c index 0030422b5fe..c1d65c1dd93 100755 --- a/rostests/winetests/kernel32/thread.c +++ b/rostests/winetests/kernel32/thread.c @@ -18,6 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* Define _WIN32_WINNT to get SetThreadIdealProcessor on Windows */ +#define _WIN32_WINNT 0x0500 + #include #include #include @@ -180,11 +183,11 @@ INT obeying_ars = 0; /* -1 == no, 0 == dunno yet, 1 == yes */ */ static DWORD WINAPI threadFunc1(LPVOID p) { - t1Struct *tstruct = (t1Struct *)p; + t1Struct *tstruct = p; int i; /* write our thread # into shared memory */ tstruct->threadmem[tstruct->threadnum]=GetCurrentThreadId(); - ok(TlsSetValue(tlsIndex,(LPVOID)(tstruct->threadnum+1))!=0, + ok(TlsSetValue(tlsIndex,(LPVOID)(INT_PTR)(tstruct->threadnum+1))!=0, "TlsSetValue failed\n"); /* The threads synchronize before terminating. This is done by Signaling an event, and waiting for all events to occur @@ -202,7 +205,7 @@ static DWORD WINAPI threadFunc1(LPVOID p) ok( lstrlenA( (char *)0xdeadbeef ) == 0, "lstrlenA: unexpected success\n" ); /* Check that no one changed our tls memory */ - ok((int)TlsGetValue(tlsIndex)-1==tstruct->threadnum, + ok((INT_PTR)TlsGetValue(tlsIndex)-1==tstruct->threadnum, "TlsGetValue failed\n"); return NUM_THREADS+tstruct->threadnum; } @@ -222,7 +225,7 @@ static DWORD WINAPI threadFunc3(LPVOID p) static DWORD WINAPI threadFunc4(LPVOID p) { - HANDLE event = (HANDLE)p; + HANDLE event = p; if(event != NULL) { SetEvent(event); } @@ -233,7 +236,7 @@ static DWORD WINAPI threadFunc4(LPVOID p) #if CHECK_STACK static DWORD WINAPI threadFunc5(LPVOID p) { - DWORD *exitCode = (DWORD *)p; + DWORD *exitCode = p; SYSTEM_INFO sysInfo; sysInfo.dwPageSize=0; GetSystemInfo(&sysInfo); @@ -252,13 +255,13 @@ static DWORD WINAPI threadFunc5(LPVOID p) static DWORD WINAPI threadFunc_SetEvent(LPVOID p) { - SetEvent((HANDLE) p); + SetEvent(p); return 0; } static DWORD WINAPI threadFunc_CloseHandle(LPVOID p) { - CloseHandle((HANDLE) p); + CloseHandle(p); return 0; } @@ -305,7 +308,7 @@ static VOID test_CreateRemoteThread(void) hRemoteEvent, CREATE_SUSPENDED, &tid); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("CreateRemoteThread is not implemented\n"); + win_skip("CreateRemoteThread is not implemented\n"); goto cleanup; } ok(hThread != NULL, "CreateRemoteThread failed, err=%u\n", GetLastError()); @@ -547,8 +550,7 @@ static VOID test_TerminateThread(void) HANDLE thread,access_thread,event; DWORD threadId,exitCode; event=CreateEventA(NULL,TRUE,FALSE,NULL); - thread = CreateThread(NULL,0,threadFunc4, - (LPVOID)event, 0,&threadId); + thread = CreateThread(NULL,0,threadFunc4,event,0,&threadId); ok(thread!=NULL,"Create Thread failed\n"); /* TerminateThread has a race condition in Wine. If the thread is terminated before it starts, it leaves a process behind. Therefore, we wait for the @@ -926,7 +928,7 @@ static DWORD CALLBACK work_function(void *p) static void test_QueueUserWorkItem(void) { - int i; + INT_PTR i; DWORD wait_result; DWORD before, after; @@ -975,7 +977,7 @@ static void test_RegisterWaitForSingleObject(void) if (!pRegisterWaitForSingleObject || !pUnregisterWait) { - skip("RegisterWaitForSingleObject or UnregisterWait not implemented\n"); + win_skip("RegisterWaitForSingleObject or UnregisterWait not implemented\n"); return; } @@ -1043,7 +1045,7 @@ static DWORD WINAPI TLS_InheritanceProc(LPVOID p) inheritance with TLS_InheritanceProc. */ static DWORD WINAPI TLS_ThreadProc(LPVOID p) { - LONG id = (LONG) p; + LONG_PTR id = (LONG_PTR) p; LPVOID val; BOOL ret; @@ -1163,7 +1165,7 @@ static DWORD WINAPI TLS_ThreadProc(LPVOID p) static void test_TLS(void) { HANDLE threads[2]; - LONG i; + LONG_PTR i; DWORD ret; BOOL suc; diff --git a/rostests/winetests/kernel32/time.c b/rostests/winetests/kernel32/time.c index 21a8232b917..0b3959a56e5 100755 --- a/rostests/winetests/kernel32/time.c +++ b/rostests/winetests/kernel32/time.c @@ -294,7 +294,7 @@ static void test_GetTimeZoneInformation(void) if (!pSystemTimeToTzSpecificLocalTime) { - skip("SystemTimeToTzSpecificLocalTime not present\n"); + win_skip("SystemTimeToTzSpecificLocalTime not available\n"); return; } @@ -305,7 +305,7 @@ static void test_GetTimeZoneInformation(void) res = pSystemTimeToTzSpecificLocalTime(&tzinfo, &utc, ¤t); if (!res && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("SystemTimeToTzSpecificLocalTime is not implemented\n"); + win_skip("SystemTimeToTzSpecificLocalTime is not implemented\n"); return; } @@ -425,7 +425,7 @@ static void test_TzSpecificLocalTimeToSystemTime(void) if (!pTzSpecificLocalTimeToSystemTime || !pSystemTimeToTzSpecificLocalTime) { - skip("TzSpecificLocalTimeToSystemTime or SystemTimeToTzSpecificLocalTime not present\n"); + win_skip("TzSpecificLocalTimeToSystemTime or SystemTimeToTzSpecificLocalTime not available\n"); return; } diff --git a/rostests/winetests/kernel32/timer.c b/rostests/winetests/kernel32/timer.c index 40b2277dd92..3c3fde76f11 100755 --- a/rostests/winetests/kernel32/timer.c +++ b/rostests/winetests/kernel32/timer.c @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define _WIN32_WINNT 0x0501 + #include "wine/test.h" #include "winbase.h" @@ -37,14 +39,14 @@ static void test_timer(void) pCreateWaitableTimerA = (fnCreateWaitableTimerA) GetProcAddress( hker, "CreateWaitableTimerA"); if( !pCreateWaitableTimerA ) { - skip("CreateWaitableTimerA is not available\n"); + win_skip("CreateWaitableTimerA is not available\n"); return; } pSetWaitableTimer = (fnSetWaitableTimer) GetProcAddress( hker, "SetWaitableTimer"); if( !pSetWaitableTimer ) { - skip("SetWaitableTimer is not available\n"); + win_skip("SetWaitableTimer is not available\n"); return; } diff --git a/rostests/winetests/kernel32/toolhelp.c b/rostests/winetests/kernel32/toolhelp.c index 804d266294c..dfe4ad8d0d5 100644 --- a/rostests/winetests/kernel32/toolhelp.c +++ b/rostests/winetests/kernel32/toolhelp.c @@ -44,7 +44,7 @@ static BOOL (WINAPI *pThread32Next)(HANDLE, LPTHREADENTRY32); static DWORD WINAPI sub_thread(void* pmt) { - DWORD w = WaitForSingleObject((HANDLE)pmt, WAIT_TIME); + DWORD w = WaitForSingleObject(pmt, WAIT_TIME); return w; } @@ -73,8 +73,8 @@ static int init(void) case 2: /* the test program */ return 0; case 4: /* the sub-process */ - ev1 = (HANDLE)atoi(argv[2]); - ev2 = (HANDLE)atoi(argv[3]); + ev1 = (HANDLE)(INT_PTR)atoi(argv[2]); + ev2 = (HANDLE)(INT_PTR)atoi(argv[3]); ev3 = CreateEvent(NULL, FALSE, FALSE, NULL); if (ev3 == NULL) ExitProcess(WAIT_ABANDONED); @@ -204,14 +204,14 @@ static void test_thread(DWORD curr_pid, DWORD sub_pcs_pid) static const char* curr_expected_modules[] = { - "kernel32.dll", "kernel32_test.exe" + "kernel32.dll", /* FIXME: could test for ntdll on NT and Wine */ }; static const char* sub_expected_modules[] = { - "kernel32.dll", "kernel32_test.exe", + "kernel32.dll", "shell32.dll" /* FIXME: could test for ntdll on NT and Wine */ }; @@ -283,6 +283,7 @@ START_TEST(toolhelp) { DWORD pid = GetCurrentProcessId(); int r; + char *p, module[MAX_PATH]; char buffer[MAX_PATH]; SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION info; @@ -304,7 +305,7 @@ START_TEST(toolhelp) !pProcess32First || !pProcess32Next || !pThread32First || !pThread32Next) { - skip("Needed functions are not available, most likely running on Windows NT\n"); + win_skip("Needed functions are not available, most likely running on Windows NT\n"); return; } @@ -324,12 +325,18 @@ START_TEST(toolhelp) startup.dwFlags = STARTF_USESHOWWINDOW; startup.wShowWindow = SW_SHOWNORMAL; - sprintf(buffer, "%s tests/toolhelp.c %u %u", selfname, (DWORD)ev1, (DWORD)ev2); + sprintf(buffer, "%s tests/toolhelp.c %lu %lu", selfname, (DWORD_PTR)ev1, (DWORD_PTR)ev2); ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to be initialized */ w = WaitForSingleObject(ev1, WAIT_TIME); ok(w == WAIT_OBJECT_0, "Failed to wait on sub-process startup\n"); + GetModuleFileNameA( 0, module, sizeof(module) ); + if (!(p = strrchr( module, '\\' ))) p = module; + else p++; + curr_expected_modules[0] = p; + sub_expected_modules[0] = p; + test_process(pid, info.dwProcessId); test_thread(pid, info.dwProcessId); test_module(pid, curr_expected_modules, NUM_OF(curr_expected_modules)); diff --git a/rostests/winetests/kernel32/version.c b/rostests/winetests/kernel32/version.c index d051b5d875b..5805e32f6e2 100644 --- a/rostests/winetests/kernel32/version.c +++ b/rostests/winetests/kernel32/version.c @@ -107,7 +107,7 @@ static void test_VerifyVersionInfo(void) if(!pVerifyVersionInfoA || !pVerSetConditionMask) { - skip("Needed functions not available\n"); + win_skip("Needed functions not available\n"); return; } diff --git a/rostests/winetests/kernel32/virtual.c b/rostests/winetests/kernel32/virtual.c index 5bd0c016642..5bea0099ebd 100755 --- a/rostests/winetests/kernel32/virtual.c +++ b/rostests/winetests/kernel32/virtual.c @@ -22,7 +22,7 @@ #include #include "windef.h" -#include "psdk/winbase.h" +#include "winbase.h" #include "winerror.h" #include "wine/test.h" @@ -57,7 +57,7 @@ static void test_VirtualAllocEx(void) { const unsigned int alloc_size = 1<<15; char *src, *dst; - unsigned long bytes_written = 0, bytes_read = 0, i; + SIZE_T bytes_written = 0, bytes_read = 0, i; void *addr1, *addr2; BOOL b; DWORD old_prot; @@ -66,7 +66,7 @@ static void test_VirtualAllocEx(void) /* not exported in all windows-versions */ if ((!pVirtualAllocEx) || (!pVirtualFreeEx)) { - skip("VirtualAllocEx not found\n"); + win_skip("Virtual{Alloc,Free}Ex not available\n"); return; } @@ -78,14 +78,14 @@ static void test_VirtualAllocEx(void) PAGE_EXECUTE_READWRITE); if (!addr1 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { /* Win9x */ - skip("VirtualAllocEx not implemented\n"); + win_skip("VirtualAllocEx not implemented\n"); TerminateProcess(hProcess, 0); CloseHandle(hProcess); return; } - src = HeapAlloc( GetProcessHeap(), 0, alloc_size ); - dst = HeapAlloc( GetProcessHeap(), 0, alloc_size ); + src = VirtualAlloc( NULL, alloc_size, MEM_COMMIT, PAGE_READWRITE ); + dst = VirtualAlloc( NULL, alloc_size, MEM_COMMIT, PAGE_READWRITE ); for (i = 0; i < alloc_size; i++) src[i] = i & 0xff; @@ -96,11 +96,40 @@ static void test_VirtualAllocEx(void) b = ReadProcessMemory(hProcess, addr1, dst, alloc_size, &bytes_read); ok(b && (bytes_read == alloc_size), "%lu bytes read\n", bytes_read); ok(!memcmp(src, dst, alloc_size), "Data from remote process differs\n"); + + /* test invalid source buffers */ + + b = VirtualProtect( src + 0x2000, 0x2000, PAGE_NOACCESS, &old_prot ); + ok( b, "VirtualProtect failed error %u\n", GetLastError() ); + b = WriteProcessMemory(hProcess, addr1, src, alloc_size, &bytes_written); + ok( !b, "WriteProcessMemory succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS || + GetLastError() == ERROR_PARTIAL_COPY, /* vista */ + "wrong error %u\n", GetLastError() ); + ok( bytes_written == 0, "%lu bytes written\n", bytes_written ); + b = ReadProcessMemory(hProcess, addr1, src, alloc_size, &bytes_read); + ok( !b, "ReadProcessMemory succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS, "wrong error %u\n", GetLastError() ); + ok( bytes_read == 0, "%lu bytes written\n", bytes_read ); + + b = VirtualProtect( src, 0x2000, PAGE_NOACCESS, &old_prot ); + ok( b, "VirtualProtect failed error %u\n", GetLastError() ); + b = WriteProcessMemory(hProcess, addr1, src, alloc_size, &bytes_written); + ok( !b, "WriteProcessMemory succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS || + GetLastError() == ERROR_PARTIAL_COPY, /* vista */ + "wrong error %u\n", GetLastError() ); + ok( bytes_written == 0, "%lu bytes written\n", bytes_written ); + b = ReadProcessMemory(hProcess, addr1, src, alloc_size, &bytes_read); + ok( !b, "ReadProcessMemory succeeded\n" ); + ok( GetLastError() == ERROR_NOACCESS, "wrong error %u\n", GetLastError() ); + ok( bytes_read == 0, "%lu bytes written\n", bytes_read ); + b = pVirtualFreeEx(hProcess, addr1, 0, MEM_RELEASE); ok(b != 0, "VirtualFreeEx, error %u\n", GetLastError()); - HeapFree( GetProcessHeap(), 0, src ); - HeapFree( GetProcessHeap(), 0, dst ); + VirtualFree( src, 0, MEM_FREE ); + VirtualFree( dst, 0, MEM_FREE ); /* * The following tests parallel those in test_VirtualAlloc() @@ -674,7 +703,7 @@ static void test_NtMapViewOfSection(void) pNtUnmapViewOfSection = (void *)GetProcAddress( GetModuleHandle("ntdll.dll"), "NtUnmapViewOfSection" ); if (!pNtMapViewOfSection || !pNtUnmapViewOfSection) { - skip( "NtMapViewOfSection not found\n" ); + win_skip( "NtMapViewOfSection not available\n" ); return; } diff --git a/rostests/winetests/kernel32/volume.c b/rostests/winetests/kernel32/volume.c index 97e3559c000..19fc6f08f7d 100644 --- a/rostests/winetests/kernel32/volume.c +++ b/rostests/winetests/kernel32/volume.c @@ -20,6 +20,7 @@ #include "wine/test.h" #include "winbase.h" +#include static HINSTANCE hdll; static BOOL (WINAPI * pGetVolumeNameForVolumeMountPointA)(LPCSTR, LPSTR, DWORD); @@ -29,29 +30,51 @@ static BOOL (WINAPI *pFindNextVolumeA)(HANDLE,LPSTR,DWORD); static BOOL (WINAPI *pFindVolumeClose)(HANDLE); static UINT (WINAPI *pGetLogicalDriveStringsA)(UINT,LPSTR); static UINT (WINAPI *pGetLogicalDriveStringsW)(UINT,LPWSTR); +static BOOL (WINAPI *pGetVolumeInformationA)(LPCSTR, LPSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPSTR, DWORD); /* ############################### */ static void test_query_dos_deviceA(void) { char drivestr[] = "a:"; - char *p, buffer[2000]; - DWORD ret; + char *p, *buffer, buffer2[2000]; + DWORD ret, ret2, buflen=32768; BOOL found = FALSE; if (!pFindFirstVolumeA) { - skip("On win9x, HARDDISK and RAMDISK not present\n"); + win_skip("On win9x, HARDDISK and RAMDISK not present\n"); return; } + buffer = HeapAlloc( GetProcessHeap(), 0, buflen ); + ret = QueryDosDeviceA( NULL, buffer, buflen ); + ok(ret && GetLastError() != ERROR_INSUFFICIENT_BUFFER, + "QueryDosDevice buffer too small\n"); + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { + HeapFree( GetProcessHeap(), 0, buffer ); + return; + } + ok(ret, "QueryDosDeviceA failed to return list, last error %u\n", GetLastError()); + if (ret) { + p = buffer; + for (;;) { + if (!strlen(p)) break; + ret2 = QueryDosDeviceA( p, buffer2, sizeof(buffer2) ); + ok(ret2, "QueryDosDeviceA failed to return current mapping for %s, last error %u\n", p, GetLastError()); + p += strlen(p) + 1; + if (ret <= (p-buffer)) break; + } + } + for (;drivestr[0] <= 'z'; drivestr[0]++) { - ret = QueryDosDeviceA( drivestr, buffer, sizeof(buffer)); + ret = QueryDosDeviceA( drivestr, buffer, buflen); if(ret) { for (p = buffer; *p; p++) *p = toupper(*p); if (strstr(buffer, "HARDDISK") || strstr(buffer, "RAMDISK")) found = TRUE; } } ok(found, "expected at least one devicename to contain HARDDISK or RAMDISK\n"); + HeapFree( GetProcessHeap(), 0, buffer ); } static void test_FindFirstVolume(void) @@ -216,6 +239,130 @@ static void test_GetLogicalDriveStringsW(void) HeapFree(GetProcessHeap(), 0, buf); } +static void test_GetVolumeInformationA(void) +{ + BOOL ret; + UINT result; + char Root_Dir0[]="C:"; + char Root_Dir1[]="C:\\"; + char Root_Dir2[]="\\\\?\\C:\\"; + char volume[MAX_PATH+1]; + DWORD vol_name_size=MAX_PATH+1, vol_serial_num=-1, max_comp_len=0, fs_flags=0, fs_name_len=MAX_PATH+1; + char vol_name_buf[MAX_PATH+1], fs_name_buf[MAX_PATH+1]; + char windowsdir[MAX_PATH+10]; + + if (!pGetVolumeInformationA) { + win_skip("GetVolumeInformationA not found\n"); + return; + } + if (!pGetVolumeNameForVolumeMountPointA) { + win_skip("GetVolumeNameForVolumeMountPointA not found\n"); + return; + } + + /* get windows drive letter and update strings for testing */ + result = GetWindowsDirectory(windowsdir, sizeof(windowsdir)); + ok(result < sizeof(windowsdir), "windowsdir is abnormally long!\n"); + ok(result != 0, "GetWindowsDirectory: error %d\n", GetLastError()); + Root_Dir0[0] = windowsdir[0]; + Root_Dir1[0] = windowsdir[0]; + Root_Dir2[4] = windowsdir[0]; + + /* get the unique volume name for the windows drive */ + ret = pGetVolumeNameForVolumeMountPointA(Root_Dir1, volume, MAX_PATH); + ok(ret == TRUE, "GetVolumeNameForVolumeMountPointA failed\n"); + + /* **** now start the tests **** */ + /* check for error on no trailing \ */ + ret = pGetVolumeInformationA(Root_Dir0, vol_name_buf, vol_name_size, NULL, + NULL, NULL, fs_name_buf, fs_name_len); + ok(!ret && GetLastError() == ERROR_INVALID_NAME, + "GetVolumeInformationA w/o '\\' did not fail, last error %u\n", GetLastError()); + + /* try null root directory to return "root of the current directory" */ + ret = pGetVolumeInformationA(NULL, vol_name_buf, vol_name_size, NULL, + NULL, NULL, fs_name_buf, fs_name_len); + ok(ret, "GetVolumeInformationA failed on null root dir, last error %u\n", GetLastError()); + + /* Try normal drive letter with trailing \ */ + ret = pGetVolumeInformationA(Root_Dir1, vol_name_buf, vol_name_size, + &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); + ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", Root_Dir1, GetLastError()); + + /* try again with dirve letter and the "disable parsing" prefix */ + ret = pGetVolumeInformationA(Root_Dir2, vol_name_buf, vol_name_size, + &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); + todo_wine ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", Root_Dir2, GetLastError()); + + /* try again with unique voluem name */ + ret = pGetVolumeInformationA(volume, vol_name_buf, vol_name_size, + &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); + todo_wine ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", volume, GetLastError()); + + /* try again with device name space */ + Root_Dir2[2] = '.'; + ret = pGetVolumeInformationA(Root_Dir2, vol_name_buf, vol_name_size, + &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); + todo_wine ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", Root_Dir2, GetLastError()); + + /* try again with a directory off the root - should generate error */ + if (windowsdir[strlen(windowsdir)-1] != '\\') strcat(windowsdir, "\\"); + ret = pGetVolumeInformationA(windowsdir, vol_name_buf, vol_name_size, + &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); + todo_wine ok(!ret && GetLastError()==ERROR_DIR_NOT_ROOT, + "GetVolumeInformationA failed, root=%s, last error=%u\n", windowsdir, GetLastError()); +} + +/* Test to check that unique volume name from windows dir mount point */ +/* matches at least one of the unique volume names returned from the */ +/* FindFirstVolumeA/FindNextVolumeA list. */ +static void test_enum_vols(void) +{ + DWORD ret; + HANDLE hFind = INVALID_HANDLE_VALUE; + char Volume_1[MAX_PATH] = {0}; + char Volume_2[MAX_PATH] = {0}; + char path[] = "c:\\"; + BOOL found = FALSE; + char windowsdir[MAX_PATH]; + + if (!pGetVolumeNameForVolumeMountPointA) { + win_skip("GetVolumeNameForVolumeMountPointA not found\n"); + return; + } + + /*get windows drive letter and update strings for testing */ + ret = GetWindowsDirectory( windowsdir, sizeof(windowsdir) ); + ok(ret < sizeof(windowsdir), "windowsdir is abnormally long!\n"); + ok(ret != 0, "GetWindowsDirecory: error %d\n", GetLastError()); + path[0] = windowsdir[0]; + + /* get the unique volume name for the windows drive */ + ret = pGetVolumeNameForVolumeMountPointA( path, Volume_1, MAX_PATH ); + ok(ret == TRUE, "GetVolumeNameForVolumeMountPointA failed\n"); +todo_wine + ok(strlen(Volume_1) == 49, "GetVolumeNameForVolumeMountPointA returned wrong length name %s\n", Volume_1); + + /* get first unique volume name of list */ + hFind = pFindFirstVolumeA( Volume_2, MAX_PATH ); + ok(hFind != INVALID_HANDLE_VALUE, "FindFirstVolume failed, err=%u\n", + GetLastError()); + + do + { + /* validate correct length of unique volume name */ + ok(strlen(Volume_2) == 49, "Find[First/Next]Volume returned wrong length name %s\n", Volume_1); + if (memcmp(Volume_1, Volume_2, 49) == 0) + { + found = TRUE; + break; + } + } while (pFindNextVolumeA( hFind, Volume_2, MAX_PATH )); +todo_wine + ok(found, "volume name %s not found by Find[First/Next]Volume\n", Volume_1); + pFindVolumeClose( hFind ); +} + START_TEST(volume) { hdll = GetModuleHandleA("kernel32.dll"); @@ -226,6 +373,7 @@ START_TEST(volume) pFindVolumeClose = (void *) GetProcAddress(hdll, "FindVolumeClose"); pGetLogicalDriveStringsA = (void *) GetProcAddress(hdll, "GetLogicalDriveStringsA"); pGetLogicalDriveStringsW = (void *) GetProcAddress(hdll, "GetLogicalDriveStringsW"); + pGetVolumeInformationA = (void *) GetProcAddress(hdll, "GetVolumeInformationA"); test_query_dos_deviceA(); test_FindFirstVolume(); @@ -233,4 +381,6 @@ START_TEST(volume) test_GetVolumeNameForVolumeMountPointW(); test_GetLogicalDriveStringsA(); test_GetLogicalDriveStringsW(); + test_GetVolumeInformationA(); + test_enum_vols(); } diff --git a/rostests/winetests/mlang/mlang.c b/rostests/winetests/mlang/mlang.c index ae5060a7cdc..0f51df0a4d6 100644 --- a/rostests/winetests/mlang/mlang.c +++ b/rostests/winetests/mlang/mlang.c @@ -211,7 +211,7 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) ok(lenA == expected_len, "expected lenA %u, got %u\n", expected_len, lenA); } -static inline void cpinfo_cmp(MIMECPINFO *cpinfo1, MIMECPINFO *cpinfo2) +static void cpinfo_cmp(MIMECPINFO *cpinfo1, MIMECPINFO *cpinfo2) { ok(cpinfo1->dwFlags == cpinfo2->dwFlags, "dwFlags mismatch: %08x != %08x\n", cpinfo1->dwFlags, cpinfo2->dwFlags); ok(cpinfo1->uiCodePage == cpinfo2->uiCodePage, "uiCodePage mismatch: %u != %u\n", cpinfo1->uiCodePage, cpinfo2->uiCodePage); @@ -538,7 +538,7 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) IEnumCodePage_Release(iEnumCP); } -static inline void scriptinfo_cmp(SCRIPTINFO *sinfo1, SCRIPTINFO *sinfo2) +static void scriptinfo_cmp(SCRIPTINFO *sinfo1, SCRIPTINFO *sinfo2) { ok(sinfo1->ScriptId == sinfo2->ScriptId, "ScriptId mismatch: %d != %d\n", sinfo1->ScriptId, sinfo2->ScriptId); ok(sinfo1->uiCodePage == sinfo2->uiCodePage, "uiCodePage mismatch: %u != %u\n", sinfo1->uiCodePage, sinfo2->uiCodePage); @@ -649,6 +649,8 @@ static void IMLangFontLink_Test(IMLangFontLink* iMLFL) DWORD dwCodePages, dwManyCodePages; DWORD dwCmpCodePages; UINT CodePage; + static const WCHAR str[3] = { 'd', 0x0436, 0xff90 }; + LONG processed; HRESULT ret; dwCodePages = ~0u; @@ -693,21 +695,89 @@ static void IMLangFontLink_Test(IMLangFontLink* iMLFL) dwCmpCodePages = FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC | FS_GREEK | FS_TURKISH | FS_HEBREW | FS_ARABIC | FS_BALTIC | FS_VIETNAMESE | FS_THAI | FS_JISJAPAN | FS_CHINESESIMP | FS_WANSUNG | FS_CHINESETRAD; - ok(IMLangFontLink_GetCharCodePages(iMLFL, 'd', &dwCodePages) == S_OK, - "IMLangFontLink_GetCharCodePages failed\n"); - ok(dwCodePages == dwCmpCodePages, "Incorrect CodePages returned (%i)\n", dwCodePages); + ret = IMLangFontLink_GetCharCodePages(iMLFL, 'd', &dwCodePages); + ok(ret == S_OK, "IMLangFontLink_GetCharCodePages error %x\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + + dwCodePages = 0; + processed = 0; + ret = IMLangFontLink_GetStrCodePages(iMLFL, &str[0], 1, 0, &dwCodePages, &processed); + ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %x\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + ok(processed == 1, "expected 1, got %d\n", processed); /* Cyrillic */ dwCmpCodePages = FS_CYRILLIC | FS_JISJAPAN | FS_CHINESESIMP | FS_WANSUNG; - ok(IMLangFontLink_GetCharCodePages(iMLFL, 0x0436, &dwCodePages) == S_OK, - "IMLangFontLink_GetCharCodePages failed\n"); - ok(dwCodePages == dwCmpCodePages, "Incorrect CodePages returned (%i)\n", dwCodePages); + ret = IMLangFontLink_GetCharCodePages(iMLFL, 0x0436, &dwCodePages); + ok(ret == S_OK, "IMLangFontLink_GetCharCodePages error %x\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + + dwCodePages = 0; + processed = 0; + ret = IMLangFontLink_GetStrCodePages(iMLFL, &str[1], 1, 0, &dwCodePages, &processed); + ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %x\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + ok(processed == 1, "expected 1, got %d\n", processed); /* Japanese */ dwCmpCodePages = FS_JISJAPAN; - ok(IMLangFontLink_GetCharCodePages(iMLFL, 0xff90, &dwCodePages) == S_OK, - "IMLangFontLink_GetCharCodePages failed\n"); - ok(dwCodePages == dwCmpCodePages, "Incorrect CodePages returned (%i)\n", dwCodePages); + ret = IMLangFontLink_GetCharCodePages(iMLFL, 0xff90, &dwCodePages); + ok(ret == S_OK, "IMLangFontLink_GetCharCodePages error %x\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + + dwCodePages = 0; + processed = 0; + ret = IMLangFontLink_GetStrCodePages(iMLFL, &str[2], 1, 0, &dwCodePages, &processed); + ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %x\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + ok(processed == 1, "expected 1, got %d\n", processed); + + dwCmpCodePages = FS_CYRILLIC | FS_JISJAPAN | FS_CHINESESIMP | FS_WANSUNG; + dwCodePages = 0; + processed = 0; + ret = IMLangFontLink_GetStrCodePages(iMLFL, str, 2, 0, &dwCodePages, &processed); + ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %x\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + ok(processed == 2, "expected 2, got %d\n", processed); + + dwCmpCodePages = FS_JISJAPAN; + dwCodePages = 0; + processed = 0; + ret = IMLangFontLink_GetStrCodePages(iMLFL, str, 3, 0, &dwCodePages, &processed); + ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %x\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + ok(processed == 3, "expected 3, got %d\n", processed); + + dwCodePages = 0xffff; + processed = -1; + ret = IMLangFontLink_GetStrCodePages(iMLFL, &str[2], 1, 0, &dwCodePages, &processed); + ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %x\n", ret); + ok(dwCodePages == dwCmpCodePages, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + ok(processed == 1, "expected 0, got %d\n", processed); + + ret = IMLangFontLink_GetStrCodePages(iMLFL, &str[2], 1, 0, NULL, NULL); + ok(ret == S_OK, "IMLangFontLink_GetStrCodePages error %x\n", ret); + + dwCodePages = 0xffff; + processed = -1; + ret = IMLangFontLink_GetStrCodePages(iMLFL, str, -1, 0, &dwCodePages, &processed); + ok(ret == E_INVALIDARG, "IMLangFontLink_GetStrCodePages should fail: %x\n", ret); + ok(dwCodePages == 0, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + ok(processed == 0, "expected 0, got %d\n", processed); + + dwCodePages = 0xffff; + processed = -1; + ret = IMLangFontLink_GetStrCodePages(iMLFL, NULL, 1, 0, &dwCodePages, &processed); + ok(ret == E_INVALIDARG, "IMLangFontLink_GetStrCodePages should fail: %x\n", ret); + ok(dwCodePages == 0, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + ok(processed == 0, "expected 0, got %d\n", processed); + + dwCodePages = 0xffff; + processed = -1; + ret = IMLangFontLink_GetStrCodePages(iMLFL, str, 0, 0, &dwCodePages, &processed); + ok(ret == E_INVALIDARG, "IMLangFontLink_GetStrCodePages should fail: %x\n", ret); + ok(dwCodePages == 0, "expected %x, got %x\n", dwCmpCodePages, dwCodePages); + ok(processed == 0, "expected 0, got %d\n", processed); } /* copied from libs/wine/string.c */ @@ -1395,7 +1465,7 @@ static void test_GetScriptFontInfo(IMLangFontLink2 *font_link) hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_FIXED_FONT, &nfonts, sfi); ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); ok(nfonts == 1, "got %u, expected 1\n", nfonts); - ok(sfi[0].scripts, "unexpected result\n"); + ok(sfi[0].scripts != 0, "unexpected result\n"); ok(sfi[0].wszFont[0], "unexpected result\n"); nfonts = 1; @@ -1403,7 +1473,7 @@ static void test_GetScriptFontInfo(IMLangFontLink2 *font_link) hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_PROPORTIONAL_FONT, &nfonts, sfi); ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); ok(nfonts == 1, "got %u, expected 1\n", nfonts); - ok(sfi[0].scripts, "unexpected result\n"); + ok(sfi[0].scripts != 0, "unexpected result\n"); ok(sfi[0].wszFont[0], "unexpected result\n"); } diff --git a/rostests/winetests/mscms/profile.c b/rostests/winetests/mscms/profile.c index e33280ab857..100c15c4f1f 100644 --- a/rostests/winetests/mscms/profile.c +++ b/rostests/winetests/mscms/profile.c @@ -581,9 +581,14 @@ static void check_registry(BOOL *has_space_rgb) trace("RegEnumValueA() failed (%d), cannot enumerate profiles\n", res); break; } - ok( dwType == REG_SZ, "RegEnumValueA() returned unexpected value type (%d)\n", dwType ); - if (dwType != REG_SZ) break; - trace(" found '%s' value containing '%s' (%d chars)\n", szName, szData, lstrlenA(szData)); + ok( dwType == REG_SZ || dwType == REG_DWORD, "RegEnumValueA() returned unexpected value type (%d)\n", dwType ); + + if (dwType == REG_SZ) + trace(" found string value '%s' containing '%s' (%d chars)\n", szName, szData, lstrlenA(szData)); + else if (dwType == REG_DWORD) + trace(" found DWORD value '%s' containing '%x'\n", szName, *(DWORD *)szData); + else + break; } RegCloseKey( hkIcmKey ); diff --git a/rostests/winetests/msctf/inputprocessor.c b/rostests/winetests/msctf/inputprocessor.c index b7e2695b38d..7ba9140573a 100644 --- a/rostests/winetests/msctf/inputprocessor.c +++ b/rostests/winetests/msctf/inputprocessor.c @@ -23,15 +23,42 @@ #define COBJMACROS #include "wine/test.h" #include "winuser.h" +#include "initguid.h" #include "shlwapi.h" #include "shlguid.h" #include "comcat.h" -#include "initguid.h" #include "msctf.h" +#include "olectl.h" static ITfInputProcessorProfiles* g_ipp; static LANGID gLangid; -static ITfCategoryMgr * g_cm; +static ITfCategoryMgr * g_cm = NULL; +static ITfThreadMgr* g_tm = NULL; +static ITfDocumentMgr *g_dm = NULL; +static TfClientId cid = 0; +static TfClientId tid = 0; + +#define SINK_UNEXPECTED 0 +#define SINK_EXPECTED 1 +#define SINK_FIRED 2 + +static BOOL test_ShouldActivate = FALSE; +static BOOL test_ShouldDeactivate = FALSE; + +static DWORD tmSinkCookie; +static DWORD tmSinkRefCount; +static ITfDocumentMgr *test_CurrentFocus = NULL; +static ITfDocumentMgr *test_PrevFocus = NULL; +static INT test_OnSetFocus = SINK_UNEXPECTED; +static INT test_OnInitDocumentMgr = SINK_UNEXPECTED; +static INT test_OnPushContext = SINK_UNEXPECTED; +static INT test_OnPopContext = SINK_UNEXPECTED; +static INT test_KEV_OnSetFocus = SINK_UNEXPECTED; + +HRESULT RegisterTextService(REFCLSID rclsid); +HRESULT UnregisterTextService(); +HRESULT ThreadMgrEventSink_Constructor(IUnknown **ppOut); +HRESULT TextStoreACP_Constructor(IUnknown **ppOut); DEFINE_GUID(CLSID_FakeService, 0xEDE1A7AD,0x66DE,0x47E0,0xB6,0x20,0x3E,0x92,0xF8,0x24,0x6B,0xF3); DEFINE_GUID(CLSID_TF_InputProcessorProfiles, 0x33c53a50,0xf456,0x4884,0xb0,0x49,0x85,0xfd,0x64,0x3e,0xcf,0xed); @@ -41,6 +68,8 @@ DEFINE_GUID(GUID_TFCAT_TIP_SPEECH, 0xB5A73CD1,0x8355,0x426B,0xA1,0x61,0x25 DEFINE_GUID(GUID_TFCAT_TIP_HANDWRITING, 0x246ecb87,0xc2f2,0x4abe,0x90,0x5b,0xc8,0xb3,0x8a,0xdd,0x2c,0x43); DEFINE_GUID (GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, 0x046B8C80,0x1647,0x40F7,0x9B,0x21,0xB9,0x3B,0x81,0xAA,0xBC,0x1B); DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); +DEFINE_GUID(CLSID_TF_ThreadMgr, 0x529a9e6b,0x6587,0x4f23,0xab,0x9e,0x9c,0x7d,0x68,0x3e,0x3c,0x50); +DEFINE_GUID(CLSID_PreservedKey, 0xA0ED8E55,0xCD3B,0x4274,0xB2,0x95,0xF6,0xC9,0xBA,0x2B,0x84,0x72); static HRESULT initialize(void) @@ -52,6 +81,9 @@ static HRESULT initialize(void) if (SUCCEEDED(hr)) hr = CoCreateInstance (&CLSID_TF_CategoryMgr, NULL, CLSCTX_INPROC_SERVER, &IID_ITfCategoryMgr, (void**)&g_cm); + if (SUCCEEDED(hr)) + hr = CoCreateInstance (&CLSID_TF_ThreadMgr, NULL, + CLSCTX_INPROC_SERVER, &IID_ITfThreadMgr, (void**)&g_tm); return hr; } @@ -61,6 +93,8 @@ static void cleanup(void) ITfInputProcessorProfiles_Release(g_ipp); if (g_cm) ITfCategoryMgr_Release(g_cm); + if (g_tm) + ITfThreadMgr_Release(g_tm); CoUninitialize(); } @@ -71,6 +105,12 @@ static void test_Register(void) static const WCHAR szDesc[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',0}; static const WCHAR szFile[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',' ','F','i','l','e',0}; + hr = ITfInputProcessorProfiles_GetCurrentLanguage(g_ipp,&gLangid); + ok(SUCCEEDED(hr),"Unable to get current language id\n"); + trace("Current Language %x\n",gLangid); + + hr = RegisterTextService(&CLSID_FakeService); + ok(SUCCEEDED(hr),"Unable to register COM for TextService\n"); hr = ITfInputProcessorProfiles_Register(g_ipp, &CLSID_FakeService); ok(SUCCEEDED(hr),"Unable to register text service(%x)\n",hr); hr = ITfInputProcessorProfiles_AddLanguageProfile(g_ipp, &CLSID_FakeService, gLangid, &CLSID_FakeService, szDesc, sizeof(szDesc)/sizeof(WCHAR), szFile, sizeof(szFile)/sizeof(WCHAR), 1); @@ -82,6 +122,7 @@ static void test_Unregister(void) HRESULT hr; hr = ITfInputProcessorProfiles_Unregister(g_ipp, &CLSID_FakeService); ok(SUCCEEDED(hr),"Unable to unregister text service(%x)\n",hr); + UnregisterTextService(); } static void test_EnumInputProcessorInfo(void) @@ -115,7 +156,7 @@ static void test_EnumLanguageProfiles(void) { found = TRUE; ok(profile.langid == gLangid, "LangId Incorrect\n"); - todo_wine ok(IsEqualGUID(&profile.catid,&GUID_TFCAT_TIP_KEYBOARD), "CatId Incorrect\n"); + ok(IsEqualGUID(&profile.catid,&GUID_TFCAT_TIP_KEYBOARD), "CatId Incorrect\n"); ok(IsEqualGUID(&profile.guidProfile,&CLSID_FakeService), "guidProfile Incorrect\n"); } } @@ -128,24 +169,549 @@ static void test_RegisterCategory(void) HRESULT hr; hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); + hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); } static void test_UnregisterCategory(void) { HRESULT hr; hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); - todo_wine ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); + ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); + hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); +} + +static void test_FindClosestCategory(void) +{ + GUID output; + HRESULT hr; + const GUID *list[3] = {&GUID_TFCAT_TIP_SPEECH, &GUID_TFCAT_TIP_KEYBOARD, &GUID_TFCAT_TIP_HANDWRITING}; + + hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, NULL, 0); + ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); + ok(IsEqualGUID(&output,&GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER),"Wrong GUID\n"); + + hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); + ok(IsEqualGUID(&output,&GUID_NULL),"Wrong GUID\n"); + + hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 3); + ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); + ok(IsEqualGUID(&output,&GUID_TFCAT_TIP_KEYBOARD),"Wrong GUID\n"); +} + +static void test_Enable(void) +{ + HRESULT hr; + BOOL enabled = FALSE; + + hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, TRUE); + ok(SUCCEEDED(hr),"Failed to enable text service\n"); + hr = ITfInputProcessorProfiles_IsEnabledLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, &enabled); + ok(SUCCEEDED(hr),"Failed to get enabled state\n"); + ok(enabled == TRUE,"enabled state incorrect\n"); +} + +static void test_Disable(void) +{ + HRESULT hr; + + trace("Disabling\n"); + hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, FALSE); + ok(SUCCEEDED(hr),"Failed to disable text service\n"); +} + +static void test_ThreadMgrAdviseSinks(void) +{ + ITfSource *source = NULL; + HRESULT hr; + IUnknown *sink; + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); + ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); + if (!source) + return; + + ThreadMgrEventSink_Constructor(&sink); + + tmSinkRefCount = 1; + tmSinkCookie = 0; + hr = ITfSource_AdviseSink(source,&IID_ITfThreadMgrEventSink, sink, &tmSinkCookie); + ok(SUCCEEDED(hr),"Failed to Advise Sink\n"); + ok(tmSinkCookie!=0,"Failed to get sink cookie\n"); + + /* Advising the sink adds a ref, Relesing here lets the object be deleted + when unadvised */ + tmSinkRefCount = 2; + IUnknown_Release(sink); + ITfSource_Release(source); +} + +static void test_ThreadMgrUnadviseSinks(void) +{ + ITfSource *source = NULL; + HRESULT hr; + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); + ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); + if (!source) + return; + + tmSinkRefCount = 1; + hr = ITfSource_UnadviseSink(source, tmSinkCookie); + ok(SUCCEEDED(hr),"Failed to unadvise Sink\n"); + ITfSource_Release(source); +} + +/********************************************************************** + * ITfKeyEventSink + **********************************************************************/ +typedef struct tagKeyEventSink +{ + const ITfKeyEventSinkVtbl *KeyEventSinkVtbl; + LONG refCount; +} KeyEventSink; + +static void KeyEventSink_Destructor(KeyEventSink *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID iid, LPVOID *ppvOut) +{ + KeyEventSink *This = (KeyEventSink *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfKeyEventSink)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI KeyEventSink_AddRef(ITfKeyEventSink *iface) +{ + KeyEventSink *This = (KeyEventSink *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI KeyEventSink_Release(ITfKeyEventSink *iface) +{ + KeyEventSink *This = (KeyEventSink *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + KeyEventSink_Destructor(This); + return ret; +} + +static HRESULT WINAPI KeyEventSink_OnSetFocus(ITfKeyEventSink *iface, + BOOL fForeground) +{ + ok(test_KEV_OnSetFocus == SINK_EXPECTED,"Unexpected KeyEventSink_OnSetFocus\n"); + test_KEV_OnSetFocus = SINK_FIRED; + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnTestKeyDown(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnTestKeyUp(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnKeyDown(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnKeyUp(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnPreservedKey(ITfKeyEventSink *iface, + ITfContext *pic, REFGUID rguid, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static const ITfKeyEventSinkVtbl KeyEventSink_KeyEventSinkVtbl = +{ + KeyEventSink_QueryInterface, + KeyEventSink_AddRef, + KeyEventSink_Release, + + KeyEventSink_OnSetFocus, + KeyEventSink_OnTestKeyDown, + KeyEventSink_OnTestKeyUp, + KeyEventSink_OnKeyDown, + KeyEventSink_OnKeyUp, + KeyEventSink_OnPreservedKey +}; + +HRESULT KeyEventSink_Constructor(ITfKeyEventSink **ppOut) +{ + KeyEventSink *This; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(KeyEventSink)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->KeyEventSinkVtbl = &KeyEventSink_KeyEventSinkVtbl; + This->refCount = 1; + + *ppOut = (ITfKeyEventSink*)This; + return S_OK; +} + + +static void test_KeystrokeMgr(void) +{ + ITfKeystrokeMgr *keymgr= NULL; + HRESULT hr; + TF_PRESERVEDKEY tfpk; + BOOL preserved; + ITfKeyEventSink *sink; + + KeyEventSink_Constructor(&sink); + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfKeystrokeMgr, (LPVOID*)&keymgr); + ok(SUCCEEDED(hr),"Failed to get IID_ITfKeystrokeMgr for ThreadMgr\n"); + + tfpk.uVKey = 'A'; + tfpk.uModifiers = TF_MOD_SHIFT; + + test_KEV_OnSetFocus = SINK_EXPECTED; + hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,tid,sink,TRUE); + todo_wine ok(SUCCEEDED(hr),"ITfKeystrokeMgr_AdviseKeyEventSink failed\n"); + todo_wine ok(test_KEV_OnSetFocus == SINK_FIRED, "KeyEventSink_OnSetFocus not fired as expected\n"); + + hr =ITfKeystrokeMgr_PreserveKey(keymgr, 0, &CLSID_PreservedKey, &tfpk, NULL, 0); + ok(hr==E_INVALIDARG,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); + + hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_PreserveKey failed\n"); + + hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); + ok(hr == TF_E_ALREADY_EXISTS,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); + + preserved = FALSE; + hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); + ok(hr == S_OK, "ITfKeystrokeMgr_IsPreservedKey failed\n"); + if (hr == S_OK) ok(preserved == TRUE,"misreporting preserved key\n"); + + hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnpreserveKey failed\n"); + + hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); + ok(hr == S_FALSE, "ITfKeystrokeMgr_IsPreservedKey failed\n"); + if (hr == S_FALSE) ok(preserved == FALSE,"misreporting preserved key\n"); + + hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); + ok(hr==CONNECT_E_NOCONNECTION,"ITfKeystrokeMgr_UnpreserveKey inproperly succeeded\n"); + + hr = ITfKeystrokeMgr_UnadviseKeyEventSink(keymgr,tid); + todo_wine ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnadviseKeyEventSink failed\n"); + + ITfKeystrokeMgr_Release(keymgr); + ITfKeyEventSink_Release(sink); +} + +static void test_Activate(void) +{ + HRESULT hr; + + hr = ITfInputProcessorProfiles_ActivateLanguageProfile(g_ipp,&CLSID_FakeService,gLangid,&CLSID_FakeService); + ok(SUCCEEDED(hr),"Failed to Activate text service\n"); +} + +static inline int check_context_refcount(ITfContext *iface) +{ + IUnknown_AddRef(iface); + return IUnknown_Release(iface); +} + +static void test_startSession(void) +{ + HRESULT hr; + DWORD cnt; + DWORD editCookie; + ITfDocumentMgr *dmtest; + ITfContext *cxt,*cxt2,*cxt3,*cxtTest; + ITextStoreACP *ts; + TfClientId cid2 = 0; + + hr = ITfThreadMgr_Deactivate(g_tm); + ok(hr == E_UNEXPECTED,"Deactivate should have failed with E_UNEXPECTED\n"); + + test_ShouldActivate = TRUE; + hr = ITfThreadMgr_Activate(g_tm,&cid); + ok(SUCCEEDED(hr),"Failed to Activate\n"); + ok(cid != tid,"TextService id mistakenly matches Client id\n"); + + test_ShouldActivate = FALSE; + hr = ITfThreadMgr_Activate(g_tm,&cid2); + ok(SUCCEEDED(hr),"Failed to Activate\n"); + ok (cid == cid2, "Second activate client ID does not match\n"); + + hr = ITfThreadMgr_Deactivate(g_tm); + ok(SUCCEEDED(hr),"Failed to Deactivate\n"); + + hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&g_dm); + ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); + + hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); + ok(SUCCEEDED(hr),"GetFocus Failed\n"); + ok(dmtest == NULL,"Initial focus not null\n"); + + test_CurrentFocus = g_dm; + test_PrevFocus = NULL; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_SetFocus(g_tm,g_dm); + ok(SUCCEEDED(hr),"SetFocus Failed\n"); + ok(test_OnSetFocus == SINK_FIRED, "OnSetFocus sink not called\n"); + test_OnSetFocus = SINK_UNEXPECTED; + + hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); + ok(SUCCEEDED(hr),"GetFocus Failed\n"); + ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); + + cnt = ITfDocumentMgr_Release(g_dm); + ok(cnt == 2,"DocumentMgr refcount not expected (2 vs %i)\n",cnt); + + hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); + ok(SUCCEEDED(hr),"GetFocus Failed\n"); + ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); + + TextStoreACP_Constructor((IUnknown**)&ts); + + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, (IUnknown*)ts, &cxt, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt2, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt3, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + + cnt = check_context_refcount(cxt); + test_OnPushContext = SINK_EXPECTED; + test_OnInitDocumentMgr = SINK_EXPECTED; + hr = ITfDocumentMgr_Push(g_dm, cxt); + ok(SUCCEEDED(hr),"Push Failed\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ok(test_OnPushContext == SINK_FIRED, "OnPushContext sink not fired\n"); + ok(test_OnInitDocumentMgr == SINK_FIRED, "OnInitDocumentMgr sink not fired\n"); + + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt, "Wrong context on top\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + cnt = ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on Base\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + check_context_refcount(cxt2); + test_OnPushContext = SINK_EXPECTED; + hr = ITfDocumentMgr_Push(g_dm, cxt2); + ok(SUCCEEDED(hr),"Push Failed\n"); + ok(test_OnPushContext == SINK_FIRED, "OnPushContext sink not fired\n"); + + cnt = check_context_refcount(cxt2); + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt2, "Wrong context on top\n"); + ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt); + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on Base\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt3); + hr = ITfDocumentMgr_Push(g_dm, cxt3); + ok(!SUCCEEDED(hr),"Push Succeeded\n"); + ok(check_context_refcount(cxt3) == cnt, "Ref changed\n"); + + cnt = check_context_refcount(cxt2); + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt2, "Wrong context on top\n"); + ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt); + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on Base\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt2); + test_OnPopContext = SINK_EXPECTED; + hr = ITfDocumentMgr_Pop(g_dm, 0); + ok(SUCCEEDED(hr),"Pop Failed\n"); + ok(check_context_refcount(cxt2) < cnt, "Ref count did not decrease\n"); + ok(test_OnPopContext == SINK_FIRED, "OnPopContext sink not fired\n"); + + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt, "Wrong context on top\n"); + ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on base\n"); + ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_Pop(g_dm, 0); + ok(!SUCCEEDED(hr),"Pop Succeeded\n"); + + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt, "Wrong context on top\n"); + ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on base\n"); + ITfContext_Release(cxtTest); + + ITfContext_Release(cxt); + ITfContext_Release(cxt2); + ITfContext_Release(cxt3); +} + +static void test_endSession(void) +{ + HRESULT hr; + test_ShouldDeactivate = TRUE; + test_CurrentFocus = NULL; + test_PrevFocus = g_dm; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_Deactivate(g_tm); + ok(SUCCEEDED(hr),"Failed to Deactivate\n"); + ok(test_OnSetFocus == SINK_FIRED, "OnSetFocus sink not called\n"); + test_OnSetFocus = SINK_UNEXPECTED; +} + +static void test_TfGuidAtom(void) +{ + GUID gtest,g1; + HRESULT hr; + TfGuidAtom atom1,atom2; + BOOL equal; + + CoCreateGuid(>est); + + /* msdn reports this should return E_INVALIDARG. However my test show it crashing (winxp)*/ + /* + hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,NULL); + ok(hr==E_INVALIDARG,"ITfCategoryMgr_RegisterGUID should have failed\n"); + */ + hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); + hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom2); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); + ok(atom1 == atom2,"atoms do not match\n"); + hr = ITfCategoryMgr_GetGUID(g_cm,atom2,NULL); + ok(hr==E_INVALIDARG,"ITfCategoryMgr_GetGUID should have failed\n"); + hr = ITfCategoryMgr_GetGUID(g_cm,atom2,&g1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); + ok(IsEqualGUID(&g1,>est),"guids do not match\n"); + hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,NULL); + ok(hr==E_INVALIDARG,"ITfCategoryMgr_IsEqualTfGuidAtom should have failed\n"); + hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,&equal); + ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); + ok(equal == TRUE,"Equal value invalid\n"); + + /* show that cid and tid TfClientIds are also TfGuidAtoms */ + hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,tid,&CLSID_FakeService,&equal); + ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); + ok(equal == TRUE,"Equal value invalid\n"); + hr = ITfCategoryMgr_GetGUID(g_cm,cid,&g1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); + ok(!IsEqualGUID(&g1,&GUID_NULL),"guid should not be NULL\n"); +} + +static void test_ClientId(void) +{ + ITfClientId *pcid; + TfClientId id1,id2; + HRESULT hr; + GUID g2; + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfClientId, (LPVOID*)&pcid); + ok(SUCCEEDED(hr),"Unable to aquire ITfClientId interface\n"); + + CoCreateGuid(&g2); + + hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id1); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id2); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + ok(id1==id2,"Id's for GUID_NULL do not match\n"); + hr = ITfClientId_GetClientId(pcid,&CLSID_FakeService,&id2); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + ok(id2!=id1,"Id matches GUID_NULL\n"); + ok(id2==tid,"Id for CLSID_FakeService not matching tid\n"); + ok(id2!=cid,"Id for CLSID_FakeService matching cid\n"); + hr = ITfClientId_GetClientId(pcid,&g2,&id2); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + ok(id2!=id1,"Id matches GUID_NULL\n"); + ok(id2!=tid,"Id for random guid matching tid\n"); + ok(id2!=cid,"Id for random guid matching cid\n"); + ITfClientId_Release(pcid); } START_TEST(inputprocessor) { if (SUCCEEDED(initialize())) { - gLangid = GetUserDefaultLCID(); test_Register(); test_RegisterCategory(); test_EnumInputProcessorInfo(); + test_Enable(); + test_ThreadMgrAdviseSinks(); + test_Activate(); + test_startSession(); + test_TfGuidAtom(); + test_ClientId(); + test_KeystrokeMgr(); + test_endSession(); test_EnumLanguageProfiles(); + test_FindClosestCategory(); + test_Disable(); + test_ThreadMgrUnadviseSinks(); test_UnregisterCategory(); test_Unregister(); } @@ -153,3 +719,593 @@ START_TEST(inputprocessor) skip("Unable to create InputProcessor\n"); cleanup(); } + +/********************************************************************** + * ITextStoreACP + **********************************************************************/ +typedef struct tagTextStoreACP +{ + const ITextStoreACPVtbl *TextStoreACPVtbl; + LONG refCount; +} TextStoreACP; + +static void TextStoreACP_Destructor(TextStoreACP *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI TextStoreACP_QueryInterface(ITextStoreACP *iface, REFIID iid, LPVOID *ppvOut) +{ + TextStoreACP *This = (TextStoreACP *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITextStoreACP)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI TextStoreACP_AddRef(ITextStoreACP *iface) +{ + TextStoreACP *This = (TextStoreACP *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI TextStoreACP_Release(ITextStoreACP *iface) +{ + TextStoreACP *This = (TextStoreACP *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + TextStoreACP_Destructor(This); + return ret; +} + +static HRESULT WINAPI TextStoreACP_AdviseSink(ITextStoreACP *iface, + REFIID riid, IUnknown *punk, DWORD dwMask) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI TextStoreACP_UnadviseSink(ITextStoreACP *iface, + IUnknown *punk) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_RequestLock(ITextStoreACP *iface, + DWORD dwLockFlags, HRESULT *phrSession) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetStatus(ITextStoreACP *iface, + TS_STATUS *pdcs) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_QueryInsert(ITextStoreACP *iface, + LONG acpTestStart, LONG acpTestEnd, ULONG cch, LONG *pacpResultStart, + LONG *pacpResultEnd) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetSelection(ITextStoreACP *iface, + ULONG ulIndex, ULONG ulCount, TS_SELECTION_ACP *pSelection, ULONG *pcFetched) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_SetSelection(ITextStoreACP *iface, + ULONG ulCount, const TS_SELECTION_ACP *pSelection) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetText(ITextStoreACP *iface, + LONG acpStart, LONG acpEnd, WCHAR *pchPlain, ULONG cchPlainReq, + ULONG *pcchPlainRet, TS_RUNINFO *prgRunInfo, ULONG cRunInfoReq, + ULONG *pcRunInfoRet, LONG *pacpNext) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_SetText(ITextStoreACP *iface, + DWORD dwFlags, LONG acpStart, LONG acpEnd, const WCHAR *pchText, + ULONG cch, TS_TEXTCHANGE *pChange) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetFormattedText(ITextStoreACP *iface, + LONG acpStart, LONG acpEnd, IDataObject **ppDataObject) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetEmbedded(ITextStoreACP *iface, + LONG acpPos, REFGUID rguidService, REFIID riid, IUnknown **ppunk) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_QueryInsertEmbedded(ITextStoreACP *iface, + const GUID *pguidService, const FORMATETC *pFormatEtc, BOOL *pfInsertable) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_InsertEmbedded(ITextStoreACP *iface, + DWORD dwFlags, LONG acpStart, LONG acpEnd, IDataObject *pDataObject, + TS_TEXTCHANGE *pChange) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_InsertTextAtSelection(ITextStoreACP *iface, + DWORD dwFlags, const WCHAR *pchText, ULONG cch, LONG *pacpStart, + LONG *pacpEnd, TS_TEXTCHANGE *pChange) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_InsertEmbeddedAtSelection(ITextStoreACP *iface, + DWORD dwFlags, IDataObject *pDataObject, LONG *pacpStart, LONG *pacpEnd, + TS_TEXTCHANGE *pChange) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_RequestSupportedAttrs(ITextStoreACP *iface, + DWORD dwFlags, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_RequestAttrsAtPosition(ITextStoreACP *iface, + LONG acpPos, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs, + DWORD dwFlags) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_RequestAttrsTransitioningAtPosition(ITextStoreACP *iface, + LONG acpPos, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs, + DWORD dwFlags) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_FindNextAttrTransition(ITextStoreACP *iface, + LONG acpStart, LONG acpHalt, ULONG cFilterAttrs, const TS_ATTRID *paFilterAttrs, + DWORD dwFlags, LONG *pacpNext, BOOL *pfFound, LONG *plFoundOffset) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_RetrieveRequestedAttrs(ITextStoreACP *iface, + ULONG ulCount, TS_ATTRVAL *paAttrVals, ULONG *pcFetched) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetEndACP(ITextStoreACP *iface, + LONG *pacp) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetActiveView(ITextStoreACP *iface, + TsViewCookie *pvcView) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetACPFromPoint(ITextStoreACP *iface, + TsViewCookie vcView, const POINT *ptScreen, DWORD dwFlags, + LONG *pacp) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetTextExt(ITextStoreACP *iface, + TsViewCookie vcView, LONG acpStart, LONG acpEnd, RECT *prc, + BOOL *pfClipped) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetScreenExt(ITextStoreACP *iface, + TsViewCookie vcView, RECT *prc) +{ + trace("\n"); + return S_OK; +} +static HRESULT WINAPI TextStoreACP_GetWnd(ITextStoreACP *iface, + TsViewCookie vcView, HWND *phwnd) +{ + trace("\n"); + return S_OK; +} + +static const ITextStoreACPVtbl TextStoreACP_TextStoreACPVtbl = +{ + TextStoreACP_QueryInterface, + TextStoreACP_AddRef, + TextStoreACP_Release, + + TextStoreACP_AdviseSink, + TextStoreACP_UnadviseSink, + TextStoreACP_RequestLock, + TextStoreACP_GetStatus, + TextStoreACP_QueryInsert, + TextStoreACP_GetSelection, + TextStoreACP_SetSelection, + TextStoreACP_GetText, + TextStoreACP_SetText, + TextStoreACP_GetFormattedText, + TextStoreACP_GetEmbedded, + TextStoreACP_QueryInsertEmbedded, + TextStoreACP_InsertEmbedded, + TextStoreACP_InsertTextAtSelection, + TextStoreACP_InsertEmbeddedAtSelection, + TextStoreACP_RequestSupportedAttrs, + TextStoreACP_RequestAttrsAtPosition, + TextStoreACP_RequestAttrsTransitioningAtPosition, + TextStoreACP_FindNextAttrTransition, + TextStoreACP_RetrieveRequestedAttrs, + TextStoreACP_GetEndACP, + TextStoreACP_GetActiveView, + TextStoreACP_GetACPFromPoint, + TextStoreACP_GetTextExt, + TextStoreACP_GetScreenExt, + TextStoreACP_GetWnd +}; + +HRESULT TextStoreACP_Constructor(IUnknown **ppOut) +{ + TextStoreACP *This; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(TextStoreACP)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->TextStoreACPVtbl = &TextStoreACP_TextStoreACPVtbl; + This->refCount = 1; + + *ppOut = (IUnknown *)This; + return S_OK; +} + +/********************************************************************** + * ITfThreadMgrEventSink + **********************************************************************/ +typedef struct tagThreadMgrEventSink +{ + const ITfThreadMgrEventSinkVtbl *ThreadMgrEventSinkVtbl; + LONG refCount; +} ThreadMgrEventSink; + +static void ThreadMgrEventSink_Destructor(ThreadMgrEventSink *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI ThreadMgrEventSink_QueryInterface(ITfThreadMgrEventSink *iface, REFIID iid, LPVOID *ppvOut) +{ + ThreadMgrEventSink *This = (ThreadMgrEventSink *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfThreadMgrEventSink)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI ThreadMgrEventSink_AddRef(ITfThreadMgrEventSink *iface) +{ + ThreadMgrEventSink *This = (ThreadMgrEventSink *)iface; + ok (tmSinkRefCount == This->refCount,"ThreadMgrEventSink refcount off %i vs %i\n",This->refCount,tmSinkRefCount); + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI ThreadMgrEventSink_Release(ITfThreadMgrEventSink *iface) +{ + ThreadMgrEventSink *This = (ThreadMgrEventSink *)iface; + ULONG ret; + + ok (tmSinkRefCount == This->refCount,"ThreadMgrEventSink refcount off %i vs %i\n",This->refCount,tmSinkRefCount); + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + ThreadMgrEventSink_Destructor(This); + return ret; +} + +static HRESULT WINAPI ThreadMgrEventSink_OnInitDocumentMgr(ITfThreadMgrEventSink *iface, +ITfDocumentMgr *pdim) +{ + ok(test_OnInitDocumentMgr == SINK_EXPECTED, "Unexpected OnInitDocumentMgr sink\n"); + test_OnInitDocumentMgr = SINK_FIRED; + return S_OK; +} + +static HRESULT WINAPI ThreadMgrEventSink_OnUninitDocumentMgr(ITfThreadMgrEventSink *iface, +ITfDocumentMgr *pdim) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI ThreadMgrEventSink_OnSetFocus(ITfThreadMgrEventSink *iface, +ITfDocumentMgr *pdimFocus, ITfDocumentMgr *pdimPrevFocus) +{ + ok(test_OnSetFocus == SINK_EXPECTED, "Unexpected OnSetFocus sink\n"); + ok(pdimFocus == test_CurrentFocus,"Sink reports wrong focus\n"); + ok(pdimPrevFocus == test_PrevFocus,"Sink reports wrong previous focus\n"); + test_OnSetFocus = SINK_FIRED; + return S_OK; +} + +static HRESULT WINAPI ThreadMgrEventSink_OnPushContext(ITfThreadMgrEventSink *iface, +ITfContext *pic) +{ + ok(test_OnPushContext == SINK_EXPECTED, "Unexpected OnPushContext sink\n"); + test_OnPushContext = SINK_FIRED; + return S_OK; +} + +static HRESULT WINAPI ThreadMgrEventSink_OnPopContext(ITfThreadMgrEventSink *iface, +ITfContext *pic) +{ + ok(test_OnPopContext == SINK_EXPECTED, "Unexpected OnPopContext sink\n"); + test_OnPopContext = SINK_FIRED; + return S_OK; +} + +static const ITfThreadMgrEventSinkVtbl ThreadMgrEventSink_ThreadMgrEventSinkVtbl = +{ + ThreadMgrEventSink_QueryInterface, + ThreadMgrEventSink_AddRef, + ThreadMgrEventSink_Release, + + ThreadMgrEventSink_OnInitDocumentMgr, + ThreadMgrEventSink_OnUninitDocumentMgr, + ThreadMgrEventSink_OnSetFocus, + ThreadMgrEventSink_OnPushContext, + ThreadMgrEventSink_OnPopContext +}; + +HRESULT ThreadMgrEventSink_Constructor(IUnknown **ppOut) +{ + ThreadMgrEventSink *This; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ThreadMgrEventSink)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->ThreadMgrEventSinkVtbl = &ThreadMgrEventSink_ThreadMgrEventSinkVtbl; + This->refCount = 1; + + *ppOut = (IUnknown *)This; + return S_OK; +} + + +/******************************************************************************************** + * Stub text service for testing + ********************************************************************************************/ + +static LONG TS_refCount; +static IClassFactory *cf; +static DWORD regid; + +typedef HRESULT (*LPFNCONSTRUCTOR)(IUnknown *pUnkOuter, IUnknown **ppvOut); + +typedef struct tagClassFactory +{ + const IClassFactoryVtbl *vtbl; + LONG ref; + LPFNCONSTRUCTOR ctor; +} ClassFactory; + +typedef struct tagTextService +{ + const ITfTextInputProcessorVtbl *TextInputProcessorVtbl; + LONG refCount; +} TextService; + +static void ClassFactory_Destructor(ClassFactory *This) +{ + HeapFree(GetProcessHeap(),0,This); + TS_refCount--; +} + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *ppvOut) +{ + *ppvOut = NULL; + if (IsEqualIID(riid, &IID_IClassFactory) || IsEqualIID(riid, &IID_IUnknown)) + { + IClassFactory_AddRef(iface); + *ppvOut = iface; + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + ClassFactory *This = (ClassFactory *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + ClassFactory *This = (ClassFactory *)iface; + ULONG ret = InterlockedDecrement(&This->ref); + + if (ret == 0) + ClassFactory_Destructor(This); + return ret; +} + +static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID iid, LPVOID *ppvOut) +{ + ClassFactory *This = (ClassFactory *)iface; + HRESULT ret; + IUnknown *obj; + + ret = This->ctor(punkOuter, &obj); + if (FAILED(ret)) + return ret; + ret = IUnknown_QueryInterface(obj, iid, ppvOut); + IUnknown_Release(obj); + return ret; +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) +{ + if(fLock) + InterlockedIncrement(&TS_refCount); + else + InterlockedDecrement(&TS_refCount); + + return S_OK; +} + +static const IClassFactoryVtbl ClassFactoryVtbl = { + /* IUnknown */ + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + + /* IClassFactory*/ + ClassFactory_CreateInstance, + ClassFactory_LockServer +}; + +static HRESULT ClassFactory_Constructor(LPFNCONSTRUCTOR ctor, LPVOID *ppvOut) +{ + ClassFactory *This = HeapAlloc(GetProcessHeap(),0,sizeof(ClassFactory)); + This->vtbl = &ClassFactoryVtbl; + This->ref = 1; + This->ctor = ctor; + *ppvOut = (LPVOID)This; + TS_refCount++; + return S_OK; +} + +static void TextService_Destructor(TextService *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI TextService_QueryInterface(ITfTextInputProcessor *iface, REFIID iid, LPVOID *ppvOut) +{ + TextService *This = (TextService *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfTextInputProcessor)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI TextService_AddRef(ITfTextInputProcessor *iface) +{ + TextService *This = (TextService *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI TextService_Release(ITfTextInputProcessor *iface) +{ + TextService *This = (TextService *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + TextService_Destructor(This); + return ret; +} + +static HRESULT WINAPI TextService_Activate(ITfTextInputProcessor *iface, + ITfThreadMgr *ptim, TfClientId id) +{ + trace("TextService_Activate\n"); + ok(test_ShouldActivate,"Activation came unexpectedly\n"); + tid = id; + return S_OK; +} + +static HRESULT WINAPI TextService_Deactivate(ITfTextInputProcessor *iface) +{ + trace("TextService_Deactivate\n"); + ok(test_ShouldDeactivate,"Deactivation came unexpectedly\n"); + return S_OK; +} + +static const ITfTextInputProcessorVtbl TextService_TextInputProcessorVtbl= +{ + TextService_QueryInterface, + TextService_AddRef, + TextService_Release, + + TextService_Activate, + TextService_Deactivate +}; + +HRESULT TextService_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +{ + TextService *This; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(TextService)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->TextInputProcessorVtbl= &TextService_TextInputProcessorVtbl; + This->refCount = 1; + + *ppOut = (IUnknown *)This; + return S_OK; +} + +HRESULT RegisterTextService(REFCLSID rclsid) +{ + ClassFactory_Constructor( TextService_Constructor ,(LPVOID*)&cf); + return CoRegisterClassObject(rclsid, (IUnknown*) cf, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®id); +} + +HRESULT UnregisterTextService() +{ + return CoRevokeClassObject(regid); +} diff --git a/rostests/winetests/mshtml/dom.c b/rostests/winetests/mshtml/dom.c index b4889999cbe..249968d4250 100644 --- a/rostests/winetests/mshtml/dom.c +++ b/rostests/winetests/mshtml/dom.c @@ -66,8 +66,6 @@ static WCHAR wordW[] = {'w','o','r','d',0}; static const WCHAR text_javascriptW[] = {'t','e','x','t','/','j','a','v','a','s','c','r','i','p','t',0}; -static const WCHAR idW[] = {'i','d',0}; - typedef enum { ET_NONE, ET_HTML, @@ -486,7 +484,7 @@ static IHTMLElement *_get_elem_iface(unsigned line, IUnknown *unk) HRESULT hres; hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement, (void**)&elem); - ok_(__FILE__,line) (hres == S_OK, "Coule not get IHTMLElement: %08x\n", hres); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement: %08x\n", hres); return elem; } @@ -497,7 +495,7 @@ static IHTMLElement2 *_get_elem2_iface(unsigned line, IUnknown *unk) HRESULT hres; hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement2, (void**)&elem); - ok_(__FILE__,line) (hres == S_OK, "Coule not get IHTMLElement2: %08x\n", hres); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement2: %08x\n", hres); return elem; } @@ -508,7 +506,7 @@ static IHTMLElement3 *_get_elem3_iface(unsigned line, IUnknown *unk) HRESULT hres; hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement3, (void**)&elem); - ok_(__FILE__,line) (hres == S_OK, "Coule not get IHTMLElement3: %08x\n", hres); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElement3: %08x\n", hres); return elem; } @@ -519,7 +517,7 @@ static IHTMLDOMNode *_get_node_iface(unsigned line, IUnknown *unk) HRESULT hres; hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMNode, (void**)&node); - ok_(__FILE__,line) (hres == S_OK, "Coule not get IHTMLDOMNode: %08x\n", hres); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLDOMNode: %08x\n", hres); return node; } @@ -575,10 +573,10 @@ static void _test_elem_type(unsigned line, IUnknown *unk, elem_type_t type) } #define get_node_type(n) _get_node_type(__LINE__,n) -static long _get_node_type(unsigned line, IUnknown *unk) +static LONG _get_node_type(unsigned line, IUnknown *unk) { IHTMLDOMNode *node = _get_node_iface(line, unk); - long type = -1; + LONG type = -1; HRESULT hres; hres = IHTMLDOMNode_get_nodeType(node, &type); @@ -611,7 +609,7 @@ static IHTMLDOMChildrenCollection *_get_child_nodes(unsigned line, IUnknown *unk } #define get_child_item(c,i) _get_child_item(__LINE__,c,i) -static IHTMLDOMNode *_get_child_item(unsigned line, IHTMLDOMChildrenCollection *col, long idx) +static IHTMLDOMNode *_get_child_item(unsigned line, IHTMLDOMChildrenCollection *col, LONG idx) { IHTMLDOMNode *node = NULL; IDispatch *disp; @@ -627,7 +625,7 @@ static IHTMLDOMNode *_get_child_item(unsigned line, IHTMLDOMChildrenCollection * } #define test_elem_attr(e,n,v) _test_elem_attr(__LINE__,e,n,v) -static void _test_elem_attr(unsigned line, IHTMLElement *elem, LPCWSTR name, LPCWSTR exval) +static void _test_elem_attr(unsigned line, IHTMLElement *elem, const char *name, const char *exval) { VARIANT value; BSTR tmp; @@ -635,14 +633,14 @@ static void _test_elem_attr(unsigned line, IHTMLElement *elem, LPCWSTR name, LPC VariantInit(&value); - tmp = SysAllocString(name); + tmp = a2bstr(name); hres = IHTMLElement_getAttribute(elem, tmp, 0, &value); SysFreeString(tmp); ok_(__FILE__,line) (hres == S_OK, "getAttribute failed: %08x\n", hres); if(exval) { ok_(__FILE__,line) (V_VT(&value) == VT_BSTR, "vt=%d\n", V_VT(&value)); - ok_(__FILE__,line) (!lstrcmpW(exval, V_BSTR(&value)), "unexpected value %s\n", dbgstr_w(V_BSTR(&value))); + ok_(__FILE__,line) (!strcmp_wa(V_BSTR(&value), exval), "unexpected value %s\n", dbgstr_w(V_BSTR(&value))); }else { ok_(__FILE__,line) (V_VT(&value) == VT_NULL, "vt=%d\n", V_VT(&value)); } @@ -654,7 +652,7 @@ static void _test_elem_attr(unsigned line, IHTMLElement *elem, LPCWSTR name, LPC static void _test_elem_offset(unsigned line, IUnknown *unk) { IHTMLElement *elem = _get_elem_iface(line, unk); - long l; + LONG l; HRESULT hres; hres = IHTMLElement_get_offsetTop(elem, &l); @@ -793,29 +791,29 @@ static IHTMLOptionElement *_create_option_elem(unsigned line, IHTMLDocument2 *do } #define test_select_length(s,l) _test_select_length(__LINE__,s,l) -static void _test_select_length(unsigned line, IHTMLSelectElement *select, long length) +static void _test_select_length(unsigned line, IHTMLSelectElement *select, LONG length) { - long len = 0xdeadbeef; + LONG len = 0xdeadbeef; HRESULT hres; hres = IHTMLSelectElement_get_length(select, &len); ok_(__FILE__,line) (hres == S_OK, "get_length failed: %08x\n", hres); - ok_(__FILE__,line) (len == length, "len=%ld, expected %ld\n", len, length); + ok_(__FILE__,line) (len == length, "len=%d, expected %d\n", len, length); } #define test_select_selidx(s,i) _test_select_selidx(__LINE__,s,i) -static void _test_select_selidx(unsigned line, IHTMLSelectElement *select, long index) +static void _test_select_selidx(unsigned line, IHTMLSelectElement *select, LONG index) { - long idx = 0xdeadbeef; + LONG idx = 0xdeadbeef; HRESULT hres; hres = IHTMLSelectElement_get_selectedIndex(select, &idx); ok_(__FILE__,line) (hres == S_OK, "get_selectedIndex failed: %08x\n", hres); - ok_(__FILE__,line) (idx == index, "idx=%ld, expected %ld\n", idx, index); + ok_(__FILE__,line) (idx == index, "idx=%d, expected %d\n", idx, index); } #define test_select_put_selidx(s,i) _test_select_put_selidx(__LINE__,s,i) -static void _test_select_put_selidx(unsigned line, IHTMLSelectElement *select, long index) +static void _test_select_put_selidx(unsigned line, IHTMLSelectElement *select, LONG index) { HRESULT hres; @@ -905,38 +903,38 @@ static void _test_range_expand(unsigned line, IHTMLTxtRange *range, LPWSTR unit, } #define test_range_move(r,u,c,e) _test_range_move(__LINE__,r,u,c,e) -static void _test_range_move(unsigned line, IHTMLTxtRange *range, LPWSTR unit, long cnt, long excnt) +static void _test_range_move(unsigned line, IHTMLTxtRange *range, LPWSTR unit, LONG cnt, LONG excnt) { - long c = 0xdeadbeef; + LONG c = 0xdeadbeef; HRESULT hres; hres = IHTMLTxtRange_move(range, unit, cnt, &c); ok_(__FILE__,line) (hres == S_OK, "move failed: %08x\n", hres); - ok_(__FILE__,line) (c == excnt, "count=%ld, expected %ld\n", c, excnt); + ok_(__FILE__,line) (c == excnt, "count=%d, expected %d\n", c, excnt); _test_range_text(line, range, NULL); } #define test_range_movestart(r,u,c,e) _test_range_movestart(__LINE__,r,u,c,e) static void _test_range_movestart(unsigned line, IHTMLTxtRange *range, - LPWSTR unit, long cnt, long excnt) + LPWSTR unit, LONG cnt, LONG excnt) { - long c = 0xdeadbeef; + LONG c = 0xdeadbeef; HRESULT hres; hres = IHTMLTxtRange_moveStart(range, unit, cnt, &c); ok_(__FILE__,line) (hres == S_OK, "move failed: %08x\n", hres); - ok_(__FILE__,line) (c == excnt, "count=%ld, expected %ld\n", c, excnt); + ok_(__FILE__,line) (c == excnt, "count=%d, expected %d\n", c, excnt); } #define test_range_moveend(r,u,c,e) _test_range_moveend(__LINE__,r,u,c,e) -static void _test_range_moveend(unsigned line, IHTMLTxtRange *range, LPWSTR unit, long cnt, long excnt) +static void _test_range_moveend(unsigned line, IHTMLTxtRange *range, LPWSTR unit, LONG cnt, LONG excnt) { - long c = 0xdeadbeef; + LONG c = 0xdeadbeef; HRESULT hres; hres = IHTMLTxtRange_moveEnd(range, unit, cnt, &c); ok_(__FILE__,line) (hres == S_OK, "move failed: %08x\n", hres); - ok_(__FILE__,line) (c == excnt, "count=%ld, expected %ld\n", c, excnt); + ok_(__FILE__,line) (c == excnt, "count=%d, expected %d\n", c, excnt); } #define test_range_put_text(r,t) _test_range_put_text(__LINE__,r,t) @@ -1001,10 +999,10 @@ static void _test_range_parent(unsigned line, IHTMLTxtRange *range, elem_type_t #define test_elem_collection(c,t,l) _test_elem_collection(__LINE__,c,t,l) static void _test_elem_collection(unsigned line, IUnknown *unk, - const elem_type_t *elem_types, long exlen) + const elem_type_t *elem_types, LONG exlen) { IHTMLElementCollection *col; - long len; + LONG len; DWORD i; VARIANT name, index; IDispatch *disp; @@ -1017,7 +1015,7 @@ static void _test_elem_collection(unsigned line, IUnknown *unk, hres = IHTMLElementCollection_get_length(col, &len); ok_(__FILE__,line) (hres == S_OK, "get_length failed: %08x\n", hres); - ok_(__FILE__,line) (len == exlen, "len=%ld, expected %ld\n", len, exlen); + ok_(__FILE__,line) (len == exlen, "len=%d, expected %d\n", len, exlen); if(len > exlen) len = exlen; @@ -1054,7 +1052,7 @@ static void _test_elem_collection(unsigned line, IUnknown *unk, } #define test_elem_getelembytag(u,t,l) _test_elem_getelembytag(__LINE__,u,t,l) -static void _test_elem_getelembytag(unsigned line, IUnknown *unk, elem_type_t type, long exlen) +static void _test_elem_getelembytag(unsigned line, IUnknown *unk, elem_type_t type, LONG exlen) { IHTMLElement2 *elem = _get_elem2_iface(line, unk); IHTMLElementCollection *col = NULL; @@ -1112,18 +1110,18 @@ static void _test_elem_set_innertext(unsigned line, IHTMLElement *elem, const ch col = _get_child_nodes(line, (IUnknown*)elem); ok(col != NULL, "col == NULL\n"); if(col) { - long length = 0, type; + LONG length = 0, type; IHTMLDOMNode *node; hres = IHTMLDOMChildrenCollection_get_length(col, &length); ok(hres == S_OK, "get_length failed: %08x\n", hres); - ok(length == 1, "length = %ld\n", length); + ok(length == 1, "length = %d\n", length); node = _get_child_item(line, col, 0); ok(node != NULL, "node == NULL\n"); if(node) { type = _get_node_type(line, (IUnknown*)node); - ok(type == 3, "type=%ld\n", type); + ok(type == 3, "type=%d\n", type); IHTMLDOMNode_Release(node); } @@ -1132,6 +1130,39 @@ static void _test_elem_set_innertext(unsigned line, IHTMLElement *elem, const ch } +#define test_elem_innerhtml(e,t) _test_elem_innerhtml(__LINE__,e,t) +static void _test_elem_innerhtml(unsigned line, IUnknown *unk, const char *inner_html) +{ + IHTMLElement *elem = _get_elem_iface(line, unk); + BSTR html; + HRESULT hres; + + hres = IHTMLElement_get_innerHTML(elem, &html); + ok_(__FILE__,line)(hres == S_OK, "get_innerHTML failed: %08x\n", hres); + if(inner_html) + ok_(__FILE__,line)(!strcmp_wa(html, inner_html), "unexpected innerHTML: %s\n", dbgstr_w(html)); + else + ok_(__FILE__,line)(!html, "innerHTML = %s\n", dbgstr_w(html)); + + IHTMLElement_Release(elem); + SysFreeString(html); +} + +#define test_elem_set_innerhtml(e,t) _test_elem_set_innerhtml(__LINE__,e,t) +static void _test_elem_set_innerhtml(unsigned line, IUnknown *unk, const char *inner_html) +{ + IHTMLElement *elem = _get_elem_iface(line, unk); + BSTR html; + HRESULT hres; + + html = a2bstr(inner_html); + hres = IHTMLElement_put_innerHTML(elem, html); + ok_(__FILE__,line)(hres == S_OK, "put_innerHTML failed: %08x\n", hres); + + IHTMLElement_Release(elem); + SysFreeString(html); +} + #define get_first_child(n) _get_first_child(__LINE__,n) static IHTMLDOMNode *_get_first_child(unsigned line, IUnknown *unk) { @@ -1241,11 +1272,11 @@ static void _test_select_set_disabled(unsigned line, IHTMLSelectElement *select, } #define elem_get_scroll_height(u) _elem_get_scroll_height(__LINE__,u) -static long _elem_get_scroll_height(unsigned line, IUnknown *unk) +static LONG _elem_get_scroll_height(unsigned line, IUnknown *unk) { IHTMLElement2 *elem = _get_elem2_iface(line, unk); IHTMLTextContainer *txtcont; - long l = -1, l2 = -1; + LONG l = -1, l2 = -1; HRESULT hres; hres = IHTMLElement2_get_scrollHeight(elem, &l); @@ -1257,18 +1288,18 @@ static long _elem_get_scroll_height(unsigned line, IUnknown *unk) hres = IHTMLTextContainer_get_scrollHeight(txtcont, &l2); IHTMLTextContainer_Release(txtcont); - ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollHeight failed: %ld\n", l2); - ok_(__FILE__,line) (l == l2, "unexpected height %ld, expected %ld\n", l2, l); + ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollHeight failed: %d\n", l2); + ok_(__FILE__,line) (l == l2, "unexpected height %d, expected %d\n", l2, l); return l; } #define elem_get_scroll_width(u) _elem_get_scroll_width(__LINE__,u) -static long _elem_get_scroll_width(unsigned line, IUnknown *unk) +static LONG _elem_get_scroll_width(unsigned line, IUnknown *unk) { IHTMLElement2 *elem = _get_elem2_iface(line, unk); IHTMLTextContainer *txtcont; - long l = -1, l2 = -1; + LONG l = -1, l2 = -1; HRESULT hres; hres = IHTMLElement2_get_scrollWidth(elem, &l); @@ -1280,18 +1311,18 @@ static long _elem_get_scroll_width(unsigned line, IUnknown *unk) hres = IHTMLTextContainer_get_scrollWidth(txtcont, &l2); IHTMLTextContainer_Release(txtcont); - ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollWidth failed: %ld\n", l2); - ok_(__FILE__,line) (l == l2, "unexpected width %ld, expected %ld\n", l2, l); + ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollWidth failed: %d\n", l2); + ok_(__FILE__,line) (l == l2, "unexpected width %d, expected %d\n", l2, l); return l; } #define elem_get_scroll_top(u) _elem_get_scroll_top(__LINE__,u) -static long _elem_get_scroll_top(unsigned line, IUnknown *unk) +static LONG _elem_get_scroll_top(unsigned line, IUnknown *unk) { IHTMLElement2 *elem = _get_elem2_iface(line, unk); IHTMLTextContainer *txtcont; - long l = -1, l2 = -1; + LONG l = -1, l2 = -1; HRESULT hres; hres = IHTMLElement2_get_scrollTop(elem, &l); @@ -1303,8 +1334,8 @@ static long _elem_get_scroll_top(unsigned line, IUnknown *unk) hres = IHTMLTextContainer_get_scrollTop(txtcont, &l2); IHTMLTextContainer_Release(txtcont); - ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollTop failed: %ld\n", l2); - ok_(__FILE__,line) (l == l2, "unexpected top %ld, expected %ld\n", l2, l); + ok_(__FILE__,line) (hres == S_OK, "IHTMLTextContainer::get_scrollTop failed: %d\n", l2); + ok_(__FILE__,line) (l == l2, "unexpected top %d, expected %d\n", l2, l); return l; } @@ -1314,7 +1345,7 @@ static void _elem_get_scroll_left(unsigned line, IUnknown *unk) { IHTMLElement2 *elem = _get_elem2_iface(line, unk); IHTMLTextContainer *txtcont; - long l = -1, l2 = -1; + LONG l = -1, l2 = -1; HRESULT hres; hres = IHTMLElement2_get_scrollLeft(elem, NULL); @@ -1329,8 +1360,8 @@ static void _elem_get_scroll_left(unsigned line, IUnknown *unk) hres = IHTMLTextContainer_get_scrollLeft(txtcont, &l2); IHTMLTextContainer_Release(txtcont); - ok(hres == S_OK, "IHTMLTextContainer::get_scrollLeft failed: %ld\n", l2); - ok(l == l2, "unexpected left %ld, expected %ld\n", l2, l); + ok(hres == S_OK, "IHTMLTextContainer::get_scrollLeft failed: %d\n", l2); + ok(l == l2, "unexpected left %d, expected %d\n", l2, l); } #define test_img_src(i,s) _test_img_src(__LINE__,i,s) @@ -1670,7 +1701,7 @@ static void _test_node_put_value_str(unsigned line, IUnknown *unk, const char *v static void _test_elem_client_size(unsigned line, IUnknown *unk) { IHTMLElement2 *elem = _get_elem2_iface(line, unk); - long l; + LONG l; HRESULT hres; hres = IHTMLElement2_get_clientWidth(elem, &l); @@ -1894,8 +1925,36 @@ static void _test_border_styles(unsigned line, IHTMLStyle *pStyle, BSTR Name) } } -static void test_elem_col_item(IHTMLElementCollection *col, LPCWSTR n, - const elem_type_t *elem_types, long len) +#define test_style_csstext(s,t) _test_style_csstext(__LINE__,s,t) +static void _test_style_csstext(unsigned line, IHTMLStyle *style, const char *extext) +{ + BSTR text = (void*)0xdeadbeef; + HRESULT hres; + + hres = IHTMLStyle_get_cssText(style, &text); + ok_(__FILE__,line)(hres == S_OK, "get_cssText failed: %08x\n", hres); + if(extext) + ok_(__FILE__,line)(!strcmp_wa(text, extext), "cssText = %s\n", dbgstr_w(text)); + else + ok_(__FILE__,line)(!text, "cssText = %s\n", dbgstr_w(text)); + + SysFreeString(text); +} + +#define test_style_set_csstext(s,t) _test_style_set_csstext(__LINE__,s,t) +static void _test_style_set_csstext(unsigned line, IHTMLStyle *style, const char *text) +{ + BSTR tmp; + HRESULT hres; + + tmp = a2bstr(text); + hres = IHTMLStyle_put_cssText(style, tmp); + ok_(__FILE__,line)(hres == S_OK, "put_cssText failed: %08x\n", hres); + SysFreeString(tmp); +} + +static void test_elem_col_item(IHTMLElementCollection *col, const char *n, + const elem_type_t *elem_types, LONG len) { IDispatch *disp; VARIANT name, index; @@ -1904,7 +1963,7 @@ static void test_elem_col_item(IHTMLElementCollection *col, LPCWSTR n, V_VT(&index) = VT_EMPTY; V_VT(&name) = VT_BSTR; - V_BSTR(&name) = SysAllocString(n); + V_BSTR(&name) = a2bstr(n); hres = IHTMLElementCollection_item(col, name, index, &disp); ok(hres == S_OK, "item failed: %08x\n", hres); @@ -1947,7 +2006,7 @@ cleanup: SysFreeString(V_BSTR(&name)); } -static IHTMLElement *get_elem_by_id(IHTMLDocument2 *doc, LPCWSTR id, BOOL expect_success) +static IHTMLElement *get_elem_by_id(IHTMLDocument2 *doc, const char *id, BOOL expect_success) { IHTMLElementCollection *col; IHTMLElement *elem; @@ -1963,7 +2022,7 @@ static IHTMLElement *get_elem_by_id(IHTMLDocument2 *doc, LPCWSTR id, BOOL expect V_VT(&index) = VT_EMPTY; V_VT(&name) = VT_BSTR; - V_BSTR(&name) = SysAllocString(id); + V_BSTR(&name) = a2bstr(id); hres = IHTMLElementCollection_item(col, name, index, &disp); IHTMLElementCollection_Release(col); @@ -1984,7 +2043,7 @@ static IHTMLElement *get_elem_by_id(IHTMLDocument2 *doc, LPCWSTR id, BOOL expect return elem; } -static IHTMLElement *get_doc_elem_by_id(IHTMLDocument2 *doc, LPCWSTR id) +static IHTMLElement *get_doc_elem_by_id(IHTMLDocument2 *doc, const char *id) { IHTMLDocument3 *doc3; IHTMLElement *elem; @@ -1994,10 +2053,10 @@ static IHTMLElement *get_doc_elem_by_id(IHTMLDocument2 *doc, LPCWSTR id) hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3); ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres); - tmp = SysAllocString(id); + tmp = a2bstr(id); hres = IHTMLDocument3_getElementById(doc3, tmp, &elem); SysFreeString(tmp); - ok(hres == S_OK, "getElementById(%s) failed: %08x\n", dbgstr_w(id), hres); + ok(hres == S_OK, "getElementById(%s) failed: %08x\n", id, hres); IHTMLDocument3_Release(doc3); @@ -2440,6 +2499,19 @@ static void test_current_style(IHTMLCurrentStyle *current_style) ok(!strcmp_wa(str, "default"), "get_cursor returned %s\n", dbgstr_w(str)); SysFreeString(str); + hres = IHTMLCurrentStyle_get_backgroundRepeat(current_style, &str); + ok(hres == S_OK, "get_backgroundRepeat failed: %08x\n", hres); + ok(!strcmp_wa(str, "repeat"), "get_backgroundRepeat returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_borderColor(current_style, &str); + ok(hres == S_OK, "get_borderColor failed: %08x\n", hres); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_borderStyle(current_style, &str); + ok(hres == S_OK, "get_borderStyle failed: %08x\n", hres); + SysFreeString(str); + hres = IHTMLCurrentStyle_get_fontWeight(current_style, &v); ok(hres == S_OK, "get_fontWeight failed: %08x\n", hres); ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v)); @@ -2492,6 +2564,11 @@ static void test_current_style(IHTMLCurrentStyle *current_style) ok(hres == S_OK, "get_marginRight failed: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); VariantClear(&v); + + hres = IHTMLCurrentStyle_get_marginLeft(current_style, &v); + ok(hres == S_OK, "get_marginLeft failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + VariantClear(&v); } static void test_style2(IHTMLStyle2 *style2) @@ -2506,7 +2583,7 @@ static void test_style2(IHTMLStyle2 *style2) str = a2bstr("absolute"); hres = IHTMLStyle2_put_position(style2, str); - ok(hres == S_OK, "get_position failed: %08x\n", hres); + ok(hres == S_OK, "put_position failed: %08x\n", hres); SysFreeString(str); str = NULL; @@ -2557,6 +2634,8 @@ static void test_default_style(IHTMLStyle *style) test_disp((IUnknown*)style, &DIID_DispHTMLStyle); test_ifaces((IUnknown*)style, style_iids); + test_style_csstext(style, NULL); + hres = IHTMLStyle_get_position(style, &str); ok(hres == S_OK, "get_position failed: %08x\n", hres); ok(!str, "str=%s\n", dbgstr_w(str)); @@ -2658,6 +2737,7 @@ static void test_default_style(IHTMLStyle *style) hres = IHTMLStyle_put_fontWeight(style, sDefault); ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres); + SysFreeString(sDefault); /* font Variant */ hres = IHTMLStyle_get_fontVariant(style, NULL); @@ -2713,7 +2793,7 @@ static void test_default_style(IHTMLStyle *style) ok(b == VARIANT_FALSE, "textDecorationUnderline = %x\n", b); hres = IHTMLStyle_put_textDecorationUnderline(style, VARIANT_TRUE); - ok(hres == S_OK, "get_textDecorationUnderline failed: %08x\n", hres); + ok(hres == S_OK, "put_textDecorationUnderline failed: %08x\n", hres); ok(b == VARIANT_FALSE, "textDecorationUnderline = %x\n", b); hres = IHTMLStyle_get_textDecorationUnderline(style, &b); @@ -2721,7 +2801,7 @@ static void test_default_style(IHTMLStyle *style) ok(b == VARIANT_TRUE, "textDecorationUnderline = %x\n", b); hres = IHTMLStyle_put_textDecorationUnderline(style, VARIANT_FALSE); - ok(hres == S_OK, "get_textDecorationUnderline failed: %08x\n", hres); + ok(hres == S_OK, "put_textDecorationUnderline failed: %08x\n", hres); b = 0xfefe; hres = IHTMLStyle_get_textDecorationLineThrough(style, &b); @@ -2729,7 +2809,7 @@ static void test_default_style(IHTMLStyle *style) ok(b == VARIANT_FALSE, "textDecorationLineThrough = %x\n", b); hres = IHTMLStyle_put_textDecorationLineThrough(style, VARIANT_TRUE); - ok(hres == S_OK, "get_textDecorationLineThrough failed: %08x\n", hres); + ok(hres == S_OK, "put_textDecorationLineThrough failed: %08x\n", hres); ok(b == VARIANT_FALSE, "textDecorationLineThrough = %x\n", b); hres = IHTMLStyle_get_textDecorationLineThrough(style, &b); @@ -2737,7 +2817,97 @@ static void test_default_style(IHTMLStyle *style) ok(b == VARIANT_TRUE, "textDecorationLineThrough = %x\n", b); hres = IHTMLStyle_put_textDecorationLineThrough(style, VARIANT_FALSE); - ok(hres == S_OK, "get_textDecorationLineThrough failed: %08x\n", hres); + ok(hres == S_OK, "put_textDecorationLineThrough failed: %08x\n", hres); + + b = 0xfefe; + hres = IHTMLStyle_get_textDecorationNone(style, &b); + ok(hres == S_OK, "get_textDecorationNone failed: %08x\n", hres); + ok(b == VARIANT_FALSE, "textDecorationNone = %x\n", b); + + hres = IHTMLStyle_put_textDecorationNone(style, VARIANT_TRUE); + ok(hres == S_OK, "put_textDecorationNone failed: %08x\n", hres); + ok(b == VARIANT_FALSE, "textDecorationNone = %x\n", b); + + hres = IHTMLStyle_get_textDecorationNone(style, &b); + ok(hres == S_OK, "get_textDecorationNone failed: %08x\n", hres); + ok(b == VARIANT_TRUE, "textDecorationNone = %x\n", b); + + hres = IHTMLStyle_put_textDecorationNone(style, VARIANT_FALSE); + ok(hres == S_OK, "put_textDecorationNone failed: %08x\n", hres); + + b = 0xfefe; + hres = IHTMLStyle_get_textDecorationOverline(style, &b); + ok(hres == S_OK, "get_textDecorationOverline failed: %08x\n", hres); + ok(b == VARIANT_FALSE, "textDecorationOverline = %x\n", b); + + hres = IHTMLStyle_put_textDecorationOverline(style, VARIANT_TRUE); + ok(hres == S_OK, "put_textDecorationOverline failed: %08x\n", hres); + ok(b == VARIANT_FALSE, "textDecorationOverline = %x\n", b); + + hres = IHTMLStyle_get_textDecorationOverline(style, &b); + ok(hres == S_OK, "get_textDecorationOverline failed: %08x\n", hres); + ok(b == VARIANT_TRUE, "textDecorationOverline = %x\n", b); + + hres = IHTMLStyle_put_textDecorationOverline(style, VARIANT_FALSE); + ok(hres == S_OK, "put_textDecorationOverline failed: %08x\n", hres); + + b = 0xfefe; + hres = IHTMLStyle_get_textDecorationBlink(style, &b); + ok(hres == S_OK, "get_textDecorationBlink failed: %08x\n", hres); + ok(b == VARIANT_FALSE, "textDecorationBlink = %x\n", b); + + hres = IHTMLStyle_put_textDecorationBlink(style, VARIANT_TRUE); + ok(hres == S_OK, "put_textDecorationBlink failed: %08x\n", hres); + ok(b == VARIANT_FALSE, "textDecorationBlink = %x\n", b); + + hres = IHTMLStyle_get_textDecorationBlink(style, &b); + ok(hres == S_OK, "get_textDecorationBlink failed: %08x\n", hres); + ok(b == VARIANT_TRUE, "textDecorationBlink = %x\n", b); + + hres = IHTMLStyle_put_textDecorationBlink(style, VARIANT_FALSE); + ok(hres == S_OK, "textDecorationBlink failed: %08x\n", hres); + + hres = IHTMLStyle_get_textDecoration(style, &sDefault); + ok(hres == S_OK, "get_textDecoration failed: %08x\n", hres); + + str = a2bstr("invalid"); + hres = IHTMLStyle_put_textDecoration(style, str); + ok(hres == E_INVALIDARG, "put_textDecoration failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("none"); + hres = IHTMLStyle_put_textDecoration(style, str); + ok(hres == S_OK, "put_textDecoration failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("underline"); + hres = IHTMLStyle_put_textDecoration(style, str); + ok(hres == S_OK, "put_textDecoration failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("overline"); + hres = IHTMLStyle_put_textDecoration(style, str); + ok(hres == S_OK, "put_textDecoration failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("line-through"); + hres = IHTMLStyle_put_textDecoration(style, str); + ok(hres == S_OK, "put_textDecoration failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("blink"); + hres = IHTMLStyle_put_textDecoration(style, str); + ok(hres == S_OK, "put_textDecoration failed: %08x\n", hres); + SysFreeString(str); + + hres = IHTMLStyle_get_textDecoration(style, &str); + ok(hres == S_OK, "get_textDecoration failed: %08x\n", hres); + ok(!strcmp_wa(str, "blink"), "str != blink\n"); + SysFreeString(str); + + hres = IHTMLStyle_put_textDecoration(style, sDefault); + ok(hres == S_OK, "put_textDecoration failed: %08x\n", hres); + SysFreeString(sDefault); hres = IHTMLStyle_get_posWidth(style, NULL); ok(hres == E_POINTER, "get_posWidth failed: %08x\n", hres); @@ -2753,7 +2923,7 @@ static void test_default_style(IHTMLStyle *style) ok(!V_BSTR(&v), "V_BSTR(v)=%p\n", V_BSTR(&v)); hres = IHTMLStyle_put_posWidth(style, 2.2); - ok(hres == S_OK, "get_posWidth failed: %08x\n", hres); + ok(hres == S_OK, "put_posWidth failed: %08x\n", hres); hres = IHTMLStyle_get_posWidth(style, &f); ok(hres == S_OK, "get_posWidth failed: %08x\n", hres); @@ -2780,7 +2950,7 @@ static void test_default_style(IHTMLStyle *style) str = a2bstr("1"); hres = IHTMLStyle_put_margin(style, str); - ok(hres == S_OK, "get_margin failed: %08x\n", hres); + ok(hres == S_OK, "put_margin failed: %08x\n", hres); SysFreeString(str); hres = IHTMLStyle_get_margin(style, &str); @@ -2788,7 +2958,7 @@ static void test_default_style(IHTMLStyle *style) ok(strcmp_wa(str, "1"), "margin = %s\n", dbgstr_w(str)); hres = IHTMLStyle_put_margin(style, NULL); - ok(hres == S_OK, "get_margin failed: %08x\n", hres); + ok(hres == S_OK, "put_margin failed: %08x\n", hres); str = NULL; hres = IHTMLStyle_get_border(style, &str); @@ -2798,7 +2968,7 @@ static void test_default_style(IHTMLStyle *style) str = a2bstr("1px"); hres = IHTMLStyle_put_border(style, str); - ok(hres == S_OK, "get_border failed: %08x\n", hres); + ok(hres == S_OK, "put_border failed: %08x\n", hres); SysFreeString(str); V_VT(&v) = VT_EMPTY; @@ -2810,18 +2980,18 @@ static void test_default_style(IHTMLStyle *style) /* Test posLeft */ hres = IHTMLStyle_get_posLeft(style, NULL); - ok(hres == E_POINTER, "get_left failed: %08x\n", hres); + ok(hres == E_POINTER, "get_posLeft failed: %08x\n", hres); f = 1.0f; hres = IHTMLStyle_get_posLeft(style, &f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "get_posLeft failed: %08x\n", hres); ok(f == 0.0, "expected 0.0 got %f\n", f); hres = IHTMLStyle_put_posLeft(style, 4.9f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "put_posLeft failed: %08x\n", hres); hres = IHTMLStyle_get_posLeft(style, &f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "get_posLeft failed: %08x\n", hres); ok(f == 4.0, "expected 4.0 got %f\n", f); /* Ensure left is updated correctly. */ @@ -2840,7 +3010,7 @@ static void test_default_style(IHTMLStyle *style) VariantClear(&v); hres = IHTMLStyle_get_posLeft(style, &f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "get_posLeft failed: %08x\n", hres); ok(f == 3.0, "expected 3.0 got %f\n", f); V_VT(&v) = VT_EMPTY; @@ -2870,18 +3040,18 @@ static void test_default_style(IHTMLStyle *style) /* Test posTop */ hres = IHTMLStyle_get_posTop(style, NULL); - ok(hres == E_POINTER, "get_left failed: %08x\n", hres); + ok(hres == E_POINTER, "get_posTop failed: %08x\n", hres); f = 1.0f; hres = IHTMLStyle_get_posTop(style, &f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "get_posTop failed: %08x\n", hres); ok(f == 0.0, "expected 0.0 got %f\n", f); hres = IHTMLStyle_put_posTop(style, 4.9f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "put_posTop failed: %08x\n", hres); hres = IHTMLStyle_get_posTop(style, &f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "get_posTop failed: %08x\n", hres); ok(f == 4.0, "expected 4.0 got %f\n", f); V_VT(&v) = VT_BSTR; @@ -2898,7 +3068,7 @@ static void test_default_style(IHTMLStyle *style) VariantClear(&v); hres = IHTMLStyle_get_posTop(style, &f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "get_posTop failed: %08x\n", hres); ok(f == 3.0, "expected 3.0 got %f\n", f); V_VT(&v) = VT_NULL; @@ -2914,7 +3084,7 @@ static void test_default_style(IHTMLStyle *style) /* Test posHeight */ hres = IHTMLStyle_get_posHeight(style, NULL); - ok(hres == E_POINTER, "get_left failed: %08x\n", hres); + ok(hres == E_POINTER, "get_posHeight failed: %08x\n", hres); V_VT(&v) = VT_EMPTY; hres = IHTMLStyle_get_height(style, &v); @@ -2925,14 +3095,14 @@ static void test_default_style(IHTMLStyle *style) f = 1.0f; hres = IHTMLStyle_get_posHeight(style, &f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "get_posHeight failed: %08x\n", hres); ok(f == 0.0, "expected 0.0 got %f\n", f); hres = IHTMLStyle_put_posHeight(style, 4.9f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "put_posHeight failed: %08x\n", hres); hres = IHTMLStyle_get_posHeight(style, &f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "get_posHeight failed: %08x\n", hres); ok(f == 4.0, "expected 4.0 got %f\n", f); V_VT(&v) = VT_BSTR; @@ -2949,7 +3119,7 @@ static void test_default_style(IHTMLStyle *style) VariantClear(&v); hres = IHTMLStyle_get_posHeight(style, &f); - ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(hres == S_OK, "get_posHeight failed: %08x\n", hres); ok(f == 64.0, "expected 64.0 got %f\n", f); str = (void*)0xdeadbeef; @@ -2960,7 +3130,7 @@ static void test_default_style(IHTMLStyle *style) str = a2bstr("default"); hres = IHTMLStyle_put_cursor(style, str); - ok(hres == S_OK, "get_cursor failed: %08x\n", hres); + ok(hres == S_OK, "put_cursor failed: %08x\n", hres); SysFreeString(str); str = NULL; @@ -3060,7 +3230,8 @@ static void test_default_style(IHTMLStyle *style) SysFreeString(str); hres = IHTMLStyle_put_fontStyle(style, sDefault); - ok(hres == S_OK, "get_fontStyle failed: %08x\n", hres); + ok(hres == S_OK, "put_fontStyle failed: %08x\n", hres); + SysFreeString(sDefault); /* overflow */ hres = IHTMLStyle_get_overflow(style, NULL); @@ -3118,7 +3289,7 @@ static void test_default_style(IHTMLStyle *style) VariantClear(&v); hres = IHTMLStyle_setAttribute(style, NULL, v, 1); - ok(hres == E_INVALIDARG, "getAttribute failed: %08x\n", hres); + ok(hres == E_INVALIDARG, "setAttribute failed: %08x\n", hres); V_VT(&v) = VT_BSTR; V_BSTR(&v) = a2bstr("absolute"); @@ -3156,6 +3327,56 @@ static void test_default_style(IHTMLStyle *style) test_border_styles(style, str); SysFreeString(str); + hres = IHTMLStyle_get_borderStyle(style, &sDefault); + ok(hres == S_OK, "get_borderStyle failed: %08x\n", hres); + + str = a2bstr("none dotted dashed solid"); + hres = IHTMLStyle_put_borderStyle(style, str); + ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("none dotted dashed solid"); + hres = IHTMLStyle_get_borderStyle(style, &str); + ok(hres == S_OK, "get_borderStyle failed: %08x\n", hres); + ok(!strcmp_wa(str, "none dotted dashed solid"), + "expected (none dotted dashed solid) = (%s)\n", dbgstr_w(V_BSTR(&v))); + SysFreeString(str); + + str = a2bstr("double groove ridge inset"); + hres = IHTMLStyle_put_borderStyle(style, str); + ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("window-inset outset ridge inset"); + hres = IHTMLStyle_put_borderStyle(style, str); + ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("window-inset"); + hres = IHTMLStyle_put_borderStyle(style, str); + ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("none none none none none"); + hres = IHTMLStyle_put_borderStyle(style, str); + ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("invalid none none none"); + hres = IHTMLStyle_put_borderStyle(style, str); + ok(hres == E_INVALIDARG, "put_borderStyle failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("none invalid none none"); + hres = IHTMLStyle_put_borderStyle(style, str); + ok(hres == E_INVALIDARG, "put_borderStyle failed: %08x\n", hres); + SysFreeString(str); + + hres = IHTMLStyle_put_borderStyle(style, sDefault); + ok(hres == S_OK, "put_borderStyle failed: %08x\n", hres); + SysFreeString(sDefault); + + /* backgoundColor */ hres = IHTMLStyle_get_backgroundColor(style, &v); ok(hres == S_OK, "get_backgroundColor: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "type failed: %d\n", V_VT(&v)); @@ -3169,7 +3390,7 @@ static void test_default_style(IHTMLStyle *style) V_VT(&v) = VT_BSTR; V_BSTR(&v) = a2bstr("10"); hres = IHTMLStyle_put_paddingLeft(style, v); - ok(hres == S_OK, "get_paddingLeft: %08x\n", hres); + ok(hres == S_OK, "put_paddingLeft: %08x\n", hres); VariantClear(&v); hres = IHTMLStyle_get_paddingLeft(style, &v); @@ -3177,7 +3398,192 @@ static void test_default_style(IHTMLStyle *style) ok(!strcmp_wa(V_BSTR(&v), "10px"), "expecte 10 = %s\n", dbgstr_w(V_BSTR(&v))); hres = IHTMLStyle_put_paddingLeft(style, vDefault); - ok(hres == S_OK, "get_paddingLeft: %08x\n", hres); + ok(hres == S_OK, "put_paddingLeft: %08x\n", hres); + + /* BackgroundRepeat */ + hres = IHTMLStyle_get_backgroundRepeat(style, &sDefault); + ok(hres == S_OK, "get_backgroundRepeat failed: %08x\n", hres); + + str = a2bstr("invalid"); + hres = IHTMLStyle_put_backgroundRepeat(style, str); + ok(hres == E_INVALIDARG, "put_backgroundRepeat failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("repeat"); + hres = IHTMLStyle_put_backgroundRepeat(style, str); + ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("no-repeat"); + hres = IHTMLStyle_put_backgroundRepeat(style, str); + ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("repeat-x"); + hres = IHTMLStyle_put_backgroundRepeat(style, str); + ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres); + SysFreeString(str); + + str = a2bstr("repeat-y"); + hres = IHTMLStyle_put_backgroundRepeat(style, str); + ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres); + SysFreeString(str); + + hres = IHTMLStyle_get_backgroundRepeat(style, &str); + ok(hres == S_OK, "get_backgroundRepeat failed: %08x\n", hres); + ok(!strcmp_wa(str, "repeat-y"), "str=%s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLStyle_put_backgroundRepeat(style, sDefault); + ok(hres == S_OK, "put_backgroundRepeat failed: %08x\n", hres); + SysFreeString(sDefault); + + /* BorderColor */ + hres = IHTMLStyle_get_borderColor(style, &sDefault); + ok(hres == S_OK, "get_borderColor failed: %08x\n", hres); + + str = a2bstr("red green red blue"); + hres = IHTMLStyle_put_borderColor(style, str); + ok(hres == S_OK, "put_borderColor failed: %08x\n", hres); + SysFreeString(str); + + hres = IHTMLStyle_get_borderColor(style, &str); + ok(hres == S_OK, "get_borderColor failed: %08x\n", hres); + ok(!strcmp_wa(str, "red green red blue"), "str=%s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLStyle_put_borderColor(style, sDefault); + ok(hres == S_OK, "put_borderColor failed: %08x\n", hres); + SysFreeString(sDefault); + + /* BorderLeft */ + hres = IHTMLStyle_get_borderLeft(style, &sDefault); + ok(hres == S_OK, "get_borderLeft failed: %08x\n", hres); + + str = a2bstr("thick dotted red"); + hres = IHTMLStyle_put_borderLeft(style, str); + ok(hres == S_OK, "put_borderLeft failed: %08x\n", hres); + SysFreeString(str); + + /* IHTMLStyle_get_borderLeft appears to have a bug where + it returns the first letter of the color. So we check + each style individually. + */ + V_BSTR(&v) = NULL; + hres = IHTMLStyle_get_borderLeftColor(style, &v); + todo_wine ok(hres == S_OK, "get_borderLeftColor failed: %08x\n", hres); + todo_wine ok(!strcmp_wa(V_BSTR(&v), "red"), "str=%s\n", dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + V_BSTR(&v) = NULL; + hres = IHTMLStyle_get_borderLeftWidth(style, &v); + todo_wine ok(hres == S_OK, "get_borderLeftWidth failed: %08x\n", hres); + todo_wine ok(!strcmp_wa(V_BSTR(&v), "thick"), "str=%s\n", dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + hres = IHTMLStyle_get_borderLeftStyle(style, &str); + ok(hres == S_OK, "get_borderLeftStyle failed: %08x\n", hres); + ok(!strcmp_wa(str, "dotted"), "str=%s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLStyle_put_borderLeft(style, sDefault); + ok(hres == S_OK, "put_borderLeft failed: %08x\n", hres); + SysFreeString(sDefault); + + /* backgroundPositionX */ + hres = IHTMLStyle_get_backgroundPositionX(style, &vDefault); + ok(hres == S_OK, "get_backgroundPositionX failed: %08x\n", hres); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = a2bstr("10px"); + hres = IHTMLStyle_put_backgroundPositionX(style, v); + ok(hres == S_OK, "put_backgroundPositionX failed: %08x\n", hres); + VariantClear(&v); + + hres = IHTMLStyle_get_backgroundPositionX(style, &v); + ok(hres == S_OK, "get_backgroundPositionX failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v)); + VariantClear(&v); + + hres = IHTMLStyle_put_backgroundPositionX(style, vDefault); + ok(hres == S_OK, "put_backgroundPositionX failed: %08x\n", hres); + VariantClear(&vDefault); + + /* backgroundPositionY */ + hres = IHTMLStyle_get_backgroundPositionY(style, &vDefault); + ok(hres == S_OK, "get_backgroundPositionY failed: %08x\n", hres); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = a2bstr("10px"); + hres = IHTMLStyle_put_backgroundPositionY(style, v); + ok(hres == S_OK, "put_backgroundPositionY failed: %08x\n", hres); + VariantClear(&v); + + hres = IHTMLStyle_get_backgroundPositionY(style, &v); + ok(hres == S_OK, "get_backgroundPositionY failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v)=%d\n", V_VT(&v)); + VariantClear(&v); + + hres = IHTMLStyle_put_backgroundPositionY(style, vDefault); + ok(hres == S_OK, "put_backgroundPositionY failed: %08x\n", hres); + VariantClear(&vDefault); + + /* borderTopWidth */ + hres = IHTMLStyle_get_borderTopWidth(style, &vDefault); + ok(hres == S_OK, "get_borderTopWidth: %08x\n", hres); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = a2bstr("10px"); + hres = IHTMLStyle_put_borderTopWidth(style, v); + ok(hres == S_OK, "put_borderTopWidth: %08x\n", hres); + VariantClear(&v); + + hres = IHTMLStyle_get_borderTopWidth(style, &v); + ok(hres == S_OK, "get_borderTopWidth: %08x\n", hres); + ok(!strcmp_wa(V_BSTR(&v), "10px"), "expected 10px = %s\n", dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + hres = IHTMLStyle_put_borderTopWidth(style, vDefault); + ok(hres == S_OK, "put_borderTopWidth: %08x\n", hres); + VariantClear(&vDefault); + + /* borderRightWidth */ + hres = IHTMLStyle_get_borderRightWidth(style, &vDefault); + ok(hres == S_OK, "get_borderRightWidth: %08x\n", hres); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = a2bstr("10"); + hres = IHTMLStyle_put_borderRightWidth(style, v); + ok(hres == S_OK, "put_borderRightWidth: %08x\n", hres); + VariantClear(&v); + + hres = IHTMLStyle_get_borderRightWidth(style, &v); + ok(hres == S_OK, "get_borderRightWidth: %08x\n", hres); + ok(!strcmp_wa(V_BSTR(&v), "10px"), "expected 10px = %s\n", dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + hres = IHTMLStyle_put_borderRightWidth(style, vDefault); + ok(hres == S_OK, "put_borderRightWidth: %08x\n", hres); + VariantClear(&vDefault); + + /* borderBottomWidth */ + hres = IHTMLStyle_get_borderBottomWidth(style, &vDefault); + ok(hres == S_OK, "get_borderBottomWidth: %08x\n", hres); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = a2bstr("10"); + hres = IHTMLStyle_put_borderBottomWidth(style, v); + ok(hres == S_OK, "put_borderBottomWidth: %08x\n", hres); + VariantClear(&v); + + hres = IHTMLStyle_get_borderBottomWidth(style, &v); + ok(hres == S_OK, "get_borderBottomWidth: %08x\n", hres); + ok(!strcmp_wa(V_BSTR(&v), "10px"), "expected 10px = %s\n", dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + hres = IHTMLStyle_put_borderBottomWidth(style, vDefault); + ok(hres == S_OK, "put_borderBottomWidth: %08x\n", hres); + VariantClear(&vDefault); hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle2, (void**)&style2); ok(hres == S_OK, "Could not get IHTMLStyle2 iface: %08x\n", hres); @@ -3194,6 +3600,20 @@ static void test_default_style(IHTMLStyle *style) } } +static void test_set_csstext(IHTMLStyle *style) +{ + VARIANT v; + HRESULT hres; + + test_style_set_csstext(style, "background-color: black;"); + + hres = IHTMLStyle_get_backgroundColor(style, &v); + ok(hres == S_OK, "get_backgroundColor: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "type failed: %d\n", V_VT(&v)); + ok(!strcmp_wa(V_BSTR(&v), "black"), "str=%s\n", dbgstr_w(V_BSTR(&v))); + VariantClear(&v); +} + static void test_default_selection(IHTMLDocument2 *doc) { IHTMLSelectionObject *selection; @@ -3224,7 +3644,7 @@ static void test_default_selection(IHTMLDocument2 *doc) static void test_default_body(IHTMLBodyElement *body) { - long l; + LONG l; BSTR bstr; HRESULT hres; VARIANT v; @@ -3242,7 +3662,7 @@ static void test_default_body(IHTMLBodyElement *body) l = elem_get_scroll_width((IUnknown*)body); ok(l != -1, "scrollWidth == -1\n"); l = elem_get_scroll_top((IUnknown*)body); - ok(!l, "scrollTop = %ld\n", l); + ok(!l, "scrollTop = %d\n", l); elem_get_scroll_left((IUnknown*)body); /* get_text tests */ @@ -3288,24 +3708,24 @@ static void test_body_funs(IHTMLBodyElement *body) HRESULT hres; hres = IHTMLBodyElement_get_bgColor(body, &vDefaultbg); - ok(hres == S_OK, "get_background failed: %08x\n", hres); + ok(hres == S_OK, "get_bgColor failed: %08x\n", hres); ok(V_VT(&vDefaultbg) == VT_BSTR, "bstr != NULL\n"); V_VT(&vbg) = VT_BSTR; V_BSTR(&vbg) = SysAllocString(sRed); hres = IHTMLBodyElement_put_bgColor(body, vbg); - ok(hres == S_OK, "get_background failed: %08x\n", hres); + ok(hres == S_OK, "put_bgColor failed: %08x\n", hres); VariantClear(&vbg); hres = IHTMLBodyElement_get_bgColor(body, &vbg); - ok(hres == S_OK, "get_background failed: %08x\n", hres); + ok(hres == S_OK, "get_bgColor failed: %08x\n", hres); ok(V_VT(&vDefaultbg) == VT_BSTR, "V_VT(&vDefaultbg) != VT_BSTR\n"); ok(!lstrcmpW(V_BSTR(&vbg), sRedbg), "Unexpected type %s\n", dbgstr_w(V_BSTR(&vbg))); VariantClear(&vbg); /* Restore Originial */ hres = IHTMLBodyElement_put_bgColor(body, vDefaultbg); - ok(hres == S_OK, "get_background failed: %08x\n", hres); + ok(hres == S_OK, "put_bgColor failed: %08x\n", hres); VariantClear(&vDefaultbg); } @@ -3317,7 +3737,7 @@ static void test_window(IHTMLDocument2 *doc) HRESULT hres; hres = IHTMLDocument2_get_parentWindow(doc, &window); - ok(hres == S_OK, "get_parentElement failed: %08x\n", hres); + ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres); test_ifaces((IUnknown*)window, window_iids); test_disp((IUnknown*)window, &DIID_DispHTMLWindow2); @@ -3332,7 +3752,7 @@ static void test_window(IHTMLDocument2 *doc) ok(window2 != NULL, "window2 == NULL\n"); hres = IHTMLWindow2_get_self(window, &self); - ok(hres == S_OK, "get_window failed: %08x\n", hres); + ok(hres == S_OK, "get_self failed: %08x\n", hres); ok(window2 != NULL, "self == NULL\n"); ok(self == window2, "self != window2\n"); @@ -3357,7 +3777,7 @@ static void test_defaults(IHTMLDocument2 *doc) IHTMLElement2 *elem2; IHTMLElement *elem; IHTMLStyle *style; - long l; + LONG l; HRESULT hres; IHTMLElementCollection *collection; @@ -3434,8 +3854,6 @@ static void test_defaults(IHTMLDocument2 *doc) test_location(doc); test_navigator(doc); - IHTMLStyle_Release(style); - elem2 = get_elem2_iface((IUnknown*)elem); hres = IHTMLElement2_get_currentStyle(elem2, &cstyle); ok(hres == S_OK, "get_currentStyle failed: %08x\n", hres); @@ -3447,13 +3865,16 @@ static void test_defaults(IHTMLDocument2 *doc) IHTMLElement_Release(elem); + test_set_csstext(style); + IHTMLStyle_Release(style); + hres = IHTMLDocument2_get_styleSheets(doc, &stylesheetcol); ok(hres == S_OK, "get_styleSheets failed: %08x\n", hres); l = 0xdeadbeef; hres = IHTMLStyleSheetsCollection_get_length(stylesheetcol, &l); ok(hres == S_OK, "get_length failed: %08x\n", hres); - ok(l == 0, "length = %ld\n", l); + ok(l == 0, "length = %d\n", l); IHTMLStyleSheetsCollection_Release(stylesheetcol); @@ -3611,7 +4032,7 @@ static void test_stylesheets(IHTMLDocument2 *doc) { IHTMLStyleSheetsCollection *col = NULL; VARIANT idx, res; - long len = 0; + LONG len = 0; HRESULT hres; hres = IHTMLDocument2_get_styleSheets(doc, &col); @@ -3620,7 +4041,7 @@ static void test_stylesheets(IHTMLDocument2 *doc) hres = IHTMLStyleSheetsCollection_get_length(col, &len); ok(hres == S_OK, "get_length failed: %08x\n", hres); - ok(len == 1, "len=%ld\n", len); + ok(len == 1, "len=%d\n", len); VariantInit(&res); V_VT(&idx) = VT_I4; @@ -3653,7 +4074,7 @@ static void test_child_col_disp(IHTMLDOMChildrenCollection *col) DISPPARAMS dp = {NULL, NULL, 0, 0}; VARIANT var; EXCEPINFO ei; - long type; + LONG type; DISPID id; BSTR bstr; HRESULT hres; @@ -3676,7 +4097,7 @@ static void test_child_col_disp(IHTMLDOMChildrenCollection *col) ok(V_DISPATCH(&var) != NULL, "V_DISPATCH(var) == NULL\n"); node = get_node_iface((IUnknown*)V_DISPATCH(&var)); type = get_node_type((IUnknown*)node); - ok(type == 3, "type=%ld\n", type); + ok(type == 3, "type=%d\n", type); IHTMLDOMNode_Release(node); VariantClear(&var); @@ -3697,22 +4118,12 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElement *elem, *elem2, *elem3; IHTMLDOMNode *node, *node2; IDispatch *disp; - long type; + LONG type; HRESULT hres; IHTMLElementCollection *collection; IHTMLDocument3 *doc3; BSTR str; - static const WCHAR imgidW[] = {'i','m','g','i','d',0}; - static const WCHAR inW[] = {'i','n',0}; - static const WCHAR xW[] = {'x',0}; - static const WCHAR sW[] = {'s',0}; - static const WCHAR scW[] = {'s','c',0}; - static const WCHAR xxxW[] = {'x','x','x',0}; - static const WCHAR tblW[] = {'t','b','l',0}; - static const WCHAR row2W[] = {'r','o','w','2',0}; - static const WCHAR ifrW[] = {'i','f','r',0}; - static const elem_type_t all_types[] = { ET_HTML, ET_HEAD, @@ -3747,7 +4158,7 @@ static void test_elems(IHTMLDocument2 *doc) hres = IHTMLDocument2_get_all(doc, &col); ok(hres == S_OK, "get_all failed: %08x\n", hres); test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0])); - test_elem_col_item(col, xW, item_types, sizeof(item_types)/sizeof(item_types[0])); + test_elem_col_item(col, "x", item_types, sizeof(item_types)/sizeof(item_types[0])); IHTMLElementCollection_Release(col); hres = IHTMLDocument2_get_images(doc, &collection); @@ -3792,16 +4203,16 @@ static void test_elems(IHTMLDocument2 *doc) test_elem_collection((IUnknown*)col, all_types+1, sizeof(all_types)/sizeof(all_types[0])-1); IHTMLElementCollection_Release(col); - get_elem_by_id(doc, xxxW, FALSE); - elem = get_doc_elem_by_id(doc, xxxW); + get_elem_by_id(doc, "xxx", FALSE); + elem = get_doc_elem_by_id(doc, "xxx"); ok(!elem, "elem != NULL\n"); - elem = get_doc_elem_by_id(doc, sW); + elem = get_doc_elem_by_id(doc, "s"); ok(elem != NULL, "elem == NULL\n"); if(elem) { test_elem_type((IUnknown*)elem, ET_SELECT); - test_elem_attr(elem, xxxW, NULL); - test_elem_attr(elem, idW, sW); + test_elem_attr(elem, "xxx", NULL); + test_elem_attr(elem, "id", "s"); test_elem_class((IUnknown*)elem, NULL); test_elem_set_class((IUnknown*)elem, "cl"); test_elem_set_class((IUnknown*)elem, NULL); @@ -3822,7 +4233,7 @@ static void test_elems(IHTMLDocument2 *doc) { test_node_name((IUnknown*)node, "#document"); type = get_node_type((IUnknown*)node); - ok(type == 9, "type=%ld, expected 9\n", type); + ok(type == 9, "type=%d, expected 9\n", type); node2 = test_node_get_parent((IUnknown*)node); IHTMLDOMNode_Release(node); ok(node2 == NULL, "node != NULL\n"); @@ -3848,7 +4259,7 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElement_Release(elem); } - elem = get_elem_by_id(doc, sW, TRUE); + elem = get_elem_by_id(doc, "s", TRUE); if(elem) { IHTMLSelectElement *select; @@ -3870,7 +4281,7 @@ static void test_elems(IHTMLDocument2 *doc) } type = get_node_type((IUnknown*)select); - ok(type == 1, "type=%ld\n", type); + ok(type == 1, "type=%d\n", type); IHTMLSelectElement_Release(select); @@ -3881,7 +4292,7 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElement_Release(elem); } - elem = get_elem_by_id(doc, scW, TRUE); + elem = get_elem_by_id(doc, "sc", TRUE); if(elem) { IHTMLScriptElement *script; BSTR type; @@ -3900,20 +4311,20 @@ static void test_elems(IHTMLDocument2 *doc) /* test defer */ hres = IHTMLScriptElement_put_defer(script, VARIANT_TRUE); - ok(hres == S_OK, "get_type failed: %08x\n", hres); + ok(hres == S_OK, "put_defer failed: %08x\n", hres); hres = IHTMLScriptElement_get_defer(script, &vb); - ok(hres == S_OK, "get_type failed: %08x\n", hres); - ok(vb == VARIANT_TRUE, "get_type failed: %08x\n", hres); + ok(hres == S_OK, "get_defer failed: %08x\n", hres); + ok(vb == VARIANT_TRUE, "get_defer result is %08x\n", hres); hres = IHTMLScriptElement_put_defer(script, VARIANT_FALSE); - ok(hres == S_OK, "get_type failed: %08x\n", hres); + ok(hres == S_OK, "put_defer failed: %08x\n", hres); } IHTMLScriptElement_Release(script); } - elem = get_elem_by_id(doc, inW, TRUE); + elem = get_elem_by_id(doc, "in", TRUE); if(elem) { IHTMLInputElement *input; @@ -3954,7 +4365,7 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElement_Release(elem); } - elem = get_elem_by_id(doc, imgidW, TRUE); + elem = get_elem_by_id(doc, "imgid", TRUE); if(elem) { test_img_src((IUnknown*)elem, ""); test_img_set_src((IUnknown*)elem, "about:blank"); @@ -3963,21 +4374,21 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElement_Release(elem); } - elem = get_doc_elem_by_id(doc, tblW); + elem = get_doc_elem_by_id(doc, "tbl"); ok(elem != NULL, "elem == NULL\n"); if(elem) { test_table_elem(elem); IHTMLElement_Release(elem); } - elem = get_doc_elem_by_id(doc, row2W); + elem = get_doc_elem_by_id(doc, "row2"); ok(elem != NULL, "elem == NULL\n"); if(elem) { test_tr_elem(elem); IHTMLElement_Release(elem); } - elem = get_doc_elem_by_id(doc, ifrW); + elem = get_doc_elem_by_id(doc, "ifr"); ok(elem != NULL, "elem == NULL\n"); if(elem) { test_iframe_elem(elem); @@ -3997,7 +4408,7 @@ static void test_elems(IHTMLDocument2 *doc) ok(!node2, "node2 != NULL\n"); type = get_node_type((IUnknown*)node); - ok(type == 3, "type=%ld\n", type); + ok(type == 3, "type=%d\n", type); test_node_get_value_str((IUnknown*)node, "text test"); test_node_put_value_str((IUnknown*)elem, "test text"); @@ -4009,7 +4420,7 @@ static void test_elems(IHTMLDocument2 *doc) child_col = get_child_nodes((IUnknown*)elem); ok(child_col != NULL, "child_coll == NULL\n"); if(child_col) { - long length = 0; + LONG length = 0; test_disp((IUnknown*)child_col, &DIID_DispDOMChildrenCollection); @@ -4021,7 +4432,7 @@ static void test_elems(IHTMLDocument2 *doc) ok(node != NULL, "node == NULL\n"); if(node) { type = get_node_type((IUnknown*)node); - ok(type == 3, "type=%ld\n", type); + ok(type == 3, "type=%d\n", type); IHTMLDOMNode_Release(node); } @@ -4029,7 +4440,7 @@ static void test_elems(IHTMLDocument2 *doc) ok(node != NULL, "node == NULL\n"); if(node) { type = get_node_type((IUnknown*)node); - ok(type == 8, "type=%ld\n", type); + ok(type == 8, "type=%d\n", type); test_elem_id((IUnknown*)node, NULL); IHTMLDOMNode_Release(node); @@ -4059,7 +4470,7 @@ static void test_elems(IHTMLDocument2 *doc) test_stylesheets(doc); test_create_option_elem(doc); - elem = get_doc_elem_by_id(doc, tblW); + elem = get_doc_elem_by_id(doc, "tbl"); ok(elem != NULL, "elem = NULL\n"); test_elem_set_innertext(elem, "inner text"); IHTMLElement_Release(elem); @@ -4094,8 +4505,8 @@ static void test_elems(IHTMLDocument2 *doc) str = a2bstr("img"); hres = IHTMLDocument3_getElementsByTagName(doc3, str, &col); + ok(hres == S_OK, "getElementsByTagName(%s) failed: %08x\n", dbgstr_w(str), hres); SysFreeString(str); - ok(hres == S_OK, "getElementByTag(%s) failed: %08x\n", dbgstr_w(ifrW), hres); if(hres == S_OK) { static const elem_type_t img_types[] = { ET_IMG }; @@ -4104,6 +4515,13 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElementCollection_Release(col); } + elem = get_doc_elem_by_id(doc, "y"); + test_elem_set_innerhtml((IUnknown*)elem, "inner html"); + test_elem_innerhtml((IUnknown*)elem, "inner html"); + test_elem_set_innerhtml((IUnknown*)elem, ""); + test_elem_innerhtml((IUnknown*)elem, NULL); + IHTMLElement_Release(elem); + IHTMLDocument3_Release(doc3); } @@ -4114,7 +4532,7 @@ static void test_create_elems(IHTMLDocument2 *doc) IHTMLDocument5 *doc5; IDispatch *disp; VARIANT var; - long type; + LONG type; HRESULT hres; BSTR str; @@ -4123,7 +4541,7 @@ static void test_create_elems(IHTMLDocument2 *doc) elem = test_create_elem(doc, "TEST"); test_elem_tag((IUnknown*)elem, "TEST"); type = get_node_type((IUnknown*)elem); - ok(type == 1, "type=%ld\n", type); + ok(type == 1, "type=%d\n", type); test_ifaces((IUnknown*)elem, elem_iids); test_disp((IUnknown*)elem, &DIID_DispHTMLGenericElement); @@ -4170,6 +4588,7 @@ static void test_create_elems(IHTMLDocument2 *doc) IHTMLDOMNode_Release(node3); test_elem_innertext(body, "insert test"); + test_elem_innerhtml((IUnknown*)body, "insert test"); hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); if(hres == S_OK) @@ -4181,7 +4600,7 @@ static void test_create_elems(IHTMLDocument2 *doc) if(hres == S_OK) { type = get_node_type((IUnknown*)comment); - ok(type == 8, "type=%ld, expected 8\n", type); + ok(type == 8, "type=%d, expected 8\n", type); test_node_get_value_str((IUnknown*)comment, "testing"); diff --git a/rostests/winetests/mshtml/htmldoc.c b/rostests/winetests/mshtml/htmldoc.c index e4ae1449875..60b3d2e2cf8 100644 --- a/rostests/winetests/mshtml/htmldoc.c +++ b/rostests/winetests/mshtml/htmldoc.c @@ -36,6 +36,7 @@ #include "dispex.h" #include "idispids.h" #include "shlguid.h" +#include "perhist.h" DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); DEFINE_GUID(IID_IProxyManager,0x00000008,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); @@ -102,6 +103,7 @@ DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1); DEFINE_EXPECT(Exec_ShellDocView_37); DEFINE_EXPECT(Exec_ShellDocView_84); DEFINE_EXPECT(Exec_ShellDocView_103); +DEFINE_EXPECT(Exec_ShellDocView_105); DEFINE_EXPECT(Exec_UPDATECOMMANDS); DEFINE_EXPECT(Exec_SETTITLE); DEFINE_EXPECT(Exec_HTTPEQUIV); @@ -148,7 +150,7 @@ static BOOL expect_LockContainer_fLock; static BOOL expect_InPlaceUIWindow_SetActiveObject_active = TRUE; static BOOL ipsex; static BOOL set_clientsite = FALSE, container_locked = FALSE; -static BOOL readystate_set_loading = FALSE, load_from_stream; +static BOOL readystate_set_loading = FALSE, readystate_set_interactive = FALSE, load_from_stream; static BOOL editmode = FALSE, show_failed; static int stream_read, protocol_read; static enum load_state_t { @@ -334,7 +336,7 @@ static ULONG WINAPI Protocol_Release(IInternetProtocol *iface) static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, - DWORD grfPI, DWORD dwReserved) + DWORD grfPI, HANDLE_PTR dwReserved) { BINDINFO bindinfo; DWORD bindf = 0; @@ -348,7 +350,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, ok(pOIProtSink != NULL, "pOIProtSink == NULL\n"); ok(pOIBindInfo != NULL, "pOIBindInfo == NULL\n"); ok(!grfPI, "grfPI = %x\n", grfPI); - ok(!dwReserved, "dwReserved = %d\n", dwReserved); + ok(!dwReserved, "dwReserved = %lx\n", dwReserved); memset(&bindinfo, 0, sizeof(bindinfo)); bindinfo.cbSize = sizeof(bindinfo); @@ -647,9 +649,15 @@ static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, D switch(dispID) { case DISPID_READYSTATE: CHECK_EXPECT2(OnChanged_READYSTATE); - test_MSHTML_QueryStatus(NULL, OLECMDF_SUPPORTED - | (editmode && (load_state == LD_INTERACTIVE || load_state == LD_COMPLETE) - ? OLECMDF_ENABLED : 0)); + + if(readystate_set_interactive) { + readystate_set_interactive = FALSE; + load_state = LD_INTERACTIVE; + } + else + test_MSHTML_QueryStatus(NULL, OLECMDF_SUPPORTED + | (editmode && (load_state == LD_INTERACTIVE || load_state == LD_COMPLETE) + ? OLECMDF_ENABLED : 0)); if(readystate_set_loading) { readystate_set_loading = FALSE; @@ -662,7 +670,7 @@ static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, D CHECK_EXPECT(OnChanged_1005); if(!editmode) test_readyState(NULL); - load_state = LD_INTERACTIVE; + readystate_set_interactive = (load_state != LD_INTERACTIVE); return S_OK; } @@ -2137,6 +2145,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID break; case 1: CHECK_EXPECT(Exec_SETDOWNLOADSTATE_1); + readystate_set_interactive = (load_state != LD_INTERACTIVE); break; default: ok(0, "unexpevted V_I4(pvaIn)=%d\n", V_I4(pvaIn)); @@ -2205,6 +2214,14 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID return E_NOTIMPL; + case 105: + CHECK_EXPECT2(Exec_ShellDocView_105); + + ok(pvaIn != NULL, "pvaIn == NULL\n"); + ok(pvaOut == NULL, "pvaOut != NULL\n"); + + return E_NOTIMPL; + default: ok(0, "unexpected command %d\n", nCmdID); return E_FAIL; @@ -2749,6 +2766,7 @@ static void test_download(BOOL verb_done, BOOL css_dwl, BOOL css_try_dwl) SET_EXPECT(Exec_SETPROGRESSPOS); SET_EXPECT(Exec_SETDOWNLOADSTATE_0); SET_EXPECT(Exec_ShellDocView_103); + SET_EXPECT(Exec_ShellDocView_105); SET_EXPECT(Exec_MSHTML_PARSECOMPLETE); SET_EXPECT(Exec_HTTPEQUIV_DONE); SET_EXPECT(SetStatusText); @@ -2801,6 +2819,7 @@ static void test_download(BOOL verb_done, BOOL css_dwl, BOOL css_try_dwl) CHECK_CALLED(Exec_SETPROGRESSPOS); CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); SET_CALLED(Exec_ShellDocView_103); + SET_CALLED(Exec_ShellDocView_105); CHECK_CALLED(Exec_MSHTML_PARSECOMPLETE); CHECK_CALLED(Exec_HTTPEQUIV_DONE); SET_CALLED(SetStatusText); @@ -4160,6 +4179,26 @@ static void test_HTMLDoc_ISupportErrorInfo(void) ok(ref == 0, "ref=%d, expected 0\n", ref); } +static void test_IPersistHistory(void) +{ + HRESULT hres; + IUnknown *unk; + LONG ref; + IPersistHistory *phist; + + hres = create_document(&unk); + if(FAILED(hres)) + return; + + hres = IUnknown_QueryInterface(unk, &IID_IPersistHistory, (void**)&phist); + ok(hres == S_OK, "QueryInterface returned %08x, expected S_OK\n", hres); + if(hres == S_OK) + IPersistHistory_Release(phist); + + ref = IUnknown_Release(unk); + ok(ref == 0, "ref=%d, expected 0\n", ref); +} + START_TEST(htmldoc) { gecko_installer_workaround(TRUE); @@ -4177,6 +4216,7 @@ START_TEST(htmldoc) test_editing_mode(TRUE); } test_HTMLDoc_ISupportErrorInfo(); + test_IPersistHistory(); DestroyWindow(container_hwnd); CoUninitialize(); diff --git a/rostests/winetests/msi/automation.c b/rostests/winetests/msi/automation.c index f831ef494a4..88ce287ae26 100644 --- a/rostests/winetests/msi/automation.c +++ b/rostests/winetests/msi/automation.c @@ -1046,7 +1046,7 @@ static HRESULT Session_EvaluateCondition(IDispatch *pSession, LPCWSTR szConditio return hr; } -static HRESULT Session_Message(IDispatch *pSession, long kind, IDispatch *record, int *ret) +static HRESULT Session_Message(IDispatch *pSession, LONG kind, IDispatch *record, int *ret) { VARIANT varresult; VARIANTARG vararg[2]; @@ -1067,7 +1067,7 @@ static HRESULT Session_Message(IDispatch *pSession, long kind, IDispatch *record return hr; } -static HRESULT Session_SetInstallLevel(IDispatch *pSession, long iInstallLevel) +static HRESULT Session_SetInstallLevel(IDispatch *pSession, LONG iInstallLevel) { VARIANT varresult; VARIANTARG vararg[1]; @@ -2022,7 +2022,7 @@ static void test_Installer_Products(BOOL bProductInstalled) } } - if (bProductInstalled) todo_wine + if (bProductInstalled) { ok(bProductInstalled == bProductFound, "Product expected to %s installed but product code was %s\n", bProductInstalled ? "be" : "not be", @@ -2295,12 +2295,22 @@ static void test_Installer_InstallProduct(void) ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = find_registry_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData", "05FA3C1F65B896A40AC00077F34EF203", &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(res == ERROR_SUCCESS || + broken(res == ERROR_FILE_NOT_FOUND), /* win9x */ + "Expected ERROR_SUCCESS, got %d\n", res); if (res == ERROR_SUCCESS) { res = delete_registry_key(hkey, "05FA3C1F65B896A40AC00077F34EF203"); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); RegCloseKey(hkey); + + res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Products\\05FA3C1F65B896A40AC00077F34EF203"); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + } + else + { + /* win9x defaults to a per-machine install. */ + RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Products\\05FA3C1F65B896A40AC00077F34EF203"); } /* Remove registry keys written by PublishProduct standard action */ @@ -2315,16 +2325,12 @@ static void test_Installer_InstallProduct(void) RegCloseKey(hkey); - res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Products\\05FA3C1F65B896A40AC00077F34EF203"); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - /* Delete installation files we installed */ delete_test_files(); } static void test_Installer(void) { - static WCHAR szBackslash[] = { '\\',0 }; static WCHAR szCreateRecordException[] = { 'C','r','e','a','t','e','R','e','c','o','r','d',',','C','o','u','n','t',0 }; static WCHAR szIntegerDataException[] = { 'I','n','t','e','g','e','r','D','a','t','a',',','F','i','e','l','d',0 }; WCHAR szPath[MAX_PATH]; @@ -2388,8 +2394,9 @@ static void test_Installer(void) ok(len, "MultiByteToWideChar returned error %d\n", GetLastError()); if (!len) return; - lstrcatW(szPath, szBackslash); - lstrcatW(szPath, szMsifile); + /* lstrcatW does not work on win95 */ + szPath[len - 1] = '\\'; + memcpy(&szPath[len], szMsifile, sizeof(szMsifile)); /* Installer::OpenPackage */ hr = Installer_OpenPackage(szPath, 0, &pSession); diff --git a/rostests/winetests/msi/db.c b/rostests/winetests/msi/db.c index cb58de0c3fa..41f65f18498 100644 --- a/rostests/winetests/msi/db.c +++ b/rostests/winetests/msi/db.c @@ -321,10 +321,8 @@ static void test_msiinsert(void) r = MsiRecordGetFieldCount(hrec); ok(r == 3, "record count wrong\n"); - todo_wine { r = MsiRecordIsNull(hrec, 0); ok(r == FALSE, "field 0 not null\n"); - } r = MsiRecordGetInteger(hrec, 1); ok(r == 1, "field 1 contents wrong\n"); @@ -651,7 +649,10 @@ static void test_msibadqueries(void) ok(r == ERROR_SUCCESS , "query failed\n"); r = try_query( hdb, "select * from c where b = 'x"); - todo_wine ok(r == ERROR_BAD_QUERY_SYNTAX, "query failed\n"); + ok(r == ERROR_BAD_QUERY_SYNTAX, "query failed\n"); + + r = try_query( hdb, "select * from c where b = 'x'"); + ok(r == ERROR_SUCCESS, "query failed\n"); r = try_query( hdb, "select * from 'c'"); ok(r == ERROR_BAD_QUERY_SYNTAX, "query failed\n"); @@ -900,10 +901,7 @@ static void test_viewmodify(void) ok(r == ERROR_SUCCESS, "failed to set string\n"); r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec); - todo_wine - { - ok(r == ERROR_FUNCTION_FAILED, "MsiViewModify failed\n"); - } + ok(r == ERROR_FUNCTION_FAILED, "MsiViewModify failed\n"); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n"); @@ -1072,8 +1070,8 @@ static MSIHANDLE get_column_info(MSIHANDLE hdb, const char *query, MSICOLINFO ty if( r == ERROR_SUCCESS ) { MsiViewGetColumnInfo( hview, type, &rec ); - MsiViewClose(hview); } + MsiViewClose(hview); MsiCloseHandle(hview); return rec; } @@ -1103,9 +1101,8 @@ static UINT get_columns_table_type(MSIHANDLE hdb, const char *table, UINT field) type = MsiRecordGetInteger( rec, 4 ); MsiCloseHandle( rec ); } - - MsiViewClose(hview); } + MsiViewClose(hview); MsiCloseHandle(hview); return type; } @@ -1131,7 +1128,14 @@ static void test_viewgetcolumninfo(void) r = run_query( hdb, 0, "CREATE TABLE `Properties` " - "( `Property` CHAR(255), `Value` CHAR(1) PRIMARY KEY `Property`)" ); + "( `Property` CHAR(255), " + " `Value` CHAR(1), " + " `Intvalue` INT, " + " `Integervalue` INTEGER, " + " `Shortvalue` SHORT, " + " `Longvalue` LONG, " + " `Longcharvalue` LONGCHAR " + " PRIMARY KEY `Property`)" ); ok( r == ERROR_SUCCESS , "Failed to create table\n" ); /* check the column types */ @@ -1140,12 +1144,22 @@ static void test_viewgetcolumninfo(void) ok( check_record( rec, 1, "S255"), "wrong record type\n"); ok( check_record( rec, 2, "S1"), "wrong record type\n"); + ok( check_record( rec, 3, "I2"), "wrong record type\n"); + ok( check_record( rec, 4, "I2"), "wrong record type\n"); + ok( check_record( rec, 5, "I2"), "wrong record type\n"); + ok( check_record( rec, 6, "I4"), "wrong record type\n"); + ok( check_record( rec, 7, "S0"), "wrong record type\n"); MsiCloseHandle( rec ); /* check the type in _Columns */ ok( 0x3dff == get_columns_table_type(hdb, "Properties", 1 ), "_columns table wrong\n"); ok( 0x1d01 == get_columns_table_type(hdb, "Properties", 2 ), "_columns table wrong\n"); + ok( 0x1502 == get_columns_table_type(hdb, "Properties", 3 ), "_columns table wrong\n"); + ok( 0x1502 == get_columns_table_type(hdb, "Properties", 4 ), "_columns table wrong\n"); + ok( 0x1502 == get_columns_table_type(hdb, "Properties", 5 ), "_columns table wrong\n"); + ok( 0x1104 == get_columns_table_type(hdb, "Properties", 6 ), "_columns table wrong\n"); + ok( 0x1d00 == get_columns_table_type(hdb, "Properties", 7 ), "_columns table wrong\n"); /* now try the names */ rec = get_column_info( hdb, "select * from `Properties`", MSICOLINFO_NAMES ); @@ -1153,6 +1167,11 @@ static void test_viewgetcolumninfo(void) ok( check_record( rec, 1, "Property"), "wrong record type\n"); ok( check_record( rec, 2, "Value"), "wrong record type\n"); + ok( check_record( rec, 3, "Intvalue"), "wrong record type\n"); + ok( check_record( rec, 4, "Integervalue"), "wrong record type\n"); + ok( check_record( rec, 5, "Shortvalue"), "wrong record type\n"); + ok( check_record( rec, 6, "Longvalue"), "wrong record type\n"); + ok( check_record( rec, 7, "Longcharvalue"), "wrong record type\n"); MsiCloseHandle( rec ); @@ -1327,6 +1346,7 @@ static void test_longstrings(void) r = MsiViewFetch(hview, &hrec); ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n"); + MsiViewClose(hview); MsiCloseHandle(hview); r = MsiRecordGetString(hrec, 2, NULL, &len); @@ -1427,6 +1447,7 @@ static void test_streamtable(void) ok( r == ERROR_SUCCESS, "Failed to execute view: %d\n", r); MsiCloseHandle( rec ); + MsiViewClose( view ); MsiCloseHandle( view ); r = MsiDatabaseOpenView( hdb, @@ -1455,6 +1476,7 @@ static void test_streamtable(void) r = MsiViewFetch( view, &rec ); ok( r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + MsiViewClose( view ); MsiCloseHandle( view ); MsiCloseHandle( hdb ); DeleteFile(msifile); @@ -1716,6 +1738,7 @@ static void test_msiimport(void) ok(i == -2147483640, "Expected -2147483640, got %d\n", i); MsiCloseHandle(rec); + MsiViewClose(view); MsiCloseHandle(view); query = "SELECT * FROM `TwoPrimary`"; @@ -2044,6 +2067,7 @@ static void test_handle_limit(void) for (i=0; i | D | C | A | E | B | + * --------------------- --------------------- + * + * set primary key `E` + * --------------------- --------------------- + * | D | C | A | E | B | -> | D | E | A | C | B | + * --------------------- --------------------- + */ + + query = "CREATE TABLE `T` ( `B` SHORT NOT NULL, `C` SHORT NOT NULL, " + "`A` CHAR(255), `E` INT, `D` CHAR(255) NOT NULL " + "PRIMARY KEY `D`, `E`)"; + r = run_query(hdb, 0, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + query = "SELECT * FROM `T`"; + r = MsiDatabaseOpenView(hdb, query, &view); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiViewGetColumnInfo(view, MSICOLINFO_TYPES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("s255", buf), "Expected \"s255\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 2, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("I2", buf), "Expected \"I2\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("S255", buf), "Expected \"S255\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 4, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("i2", buf), "Expected \"i2\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 5, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("i2", buf), "Expected \"i2\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewGetColumnInfo(view, MSICOLINFO_NAMES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("D", buf), "Expected \"D\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 2, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("E", buf), "Expected \"E\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("A", buf), "Expected \"A\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 4, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("C", buf), "Expected \"C\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 5, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("B", buf), "Expected \"B\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + MsiViewClose(view); + MsiCloseHandle(view); + + query = "INSERT INTO `T` ( `B`, `C`, `A`, `E`, `D` ) " + "VALUES ( 1, 2, 'a', 3, 'bc' )"; + r = run_query(hdb, 0, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + query = "SELECT * FROM `T`"; + r = do_query(hdb, query, &rec); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("bc", buf), "Expected \"bc\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 3, "Expected 3, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("a", buf), "Expected \"a\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 4); + ok(r == 2, "Expected 2, got %d\n", r); + + r = MsiRecordGetInteger(rec, 5); + ok(r == 1, "Expected 1, got %d\n", r); + + MsiCloseHandle(rec); + + query = "SELECT * FROM `_Columns` WHERE `Table` = 'T'"; + r = MsiDatabaseOpenView(hdb, query, &view); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = MsiViewExecute(view, 0); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 1, "Expected 1, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("D", buf), "Expected \"D\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 2, "Expected 2, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("E", buf), "Expected \"E\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 3, "Expected 3, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("A", buf), "Expected \"A\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 4, "Expected 4, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("C", buf), "Expected \"C\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 5, "Expected 5, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("B", buf), "Expected \"B\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + + MsiViewClose(view); + MsiCloseHandle(view); + + query = "CREATE TABLE `Z` ( `B` SHORT NOT NULL, `C` SHORT NOT NULL, " + "`A` CHAR(255), `E` INT, `D` CHAR(255) NOT NULL " + "PRIMARY KEY `C`, `A`, `D`)"; + r = run_query(hdb, 0, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + query = "SELECT * FROM `Z`"; + r = MsiDatabaseOpenView(hdb, query, &view); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiViewGetColumnInfo(view, MSICOLINFO_TYPES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("i2", buf), "Expected \"i2\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 2, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("S255", buf), "Expected \"S255\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("s255", buf), "Expected \"s255\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 4, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("I2", buf), "Expected \"I2\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 5, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("i2", buf), "Expected \"i2\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewGetColumnInfo(view, MSICOLINFO_NAMES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("C", buf), "Expected \"C\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 2, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("A", buf), "Expected \"A\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("D", buf), "Expected \"D\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 4, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("E", buf), "Expected \"E\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 5, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("B", buf), "Expected \"B\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + MsiViewClose(view); + MsiCloseHandle(view); + + query = "INSERT INTO `Z` ( `B`, `C`, `A`, `E`, `D` ) " + "VALUES ( 1, 2, 'a', 3, 'bc' )"; + r = run_query(hdb, 0, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + query = "SELECT * FROM `Z`"; + r = do_query(hdb, query, &rec); + + r = MsiRecordGetInteger(rec, 1); + ok(r == 2, "Expected 2, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 2, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("a", buf), "Expected \"a\", got \"%s\"\n", buf); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("bc", buf), "Expected \"bc\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 4); + ok(r == 3, "Expected 3, got %d\n", r); + + r = MsiRecordGetInteger(rec, 5); + ok(r == 1, "Expected 1, got %d\n", r); + + MsiCloseHandle(rec); + + query = "SELECT * FROM `_Columns` WHERE `Table` = 'T'"; + r = MsiDatabaseOpenView(hdb, query, &view); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = MsiViewExecute(view, 0); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 1, "Expected 1, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("D", buf), "Expected \"D\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 2, "Expected 2, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("E", buf), "Expected \"E\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 3, "Expected 3, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("A", buf), "Expected \"A\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 4, "Expected 4, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("C", buf), "Expected \"C\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("T", buf), "Expected \"T\", got \"%s\"\n", buf); + + r = MsiRecordGetInteger(rec, 2); + ok(r == 5, "Expected 5, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "kiwi"); + r = MsiRecordGetString(rec, 3, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA("B", buf), "Expected \"B\", got \"%s\"\n", buf); + + MsiCloseHandle(rec); + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + + MsiViewClose(view); + MsiCloseHandle(view); + + MsiCloseHandle(hdb); + DeleteFileA(msifile); +} + START_TEST(db) { test_msidatabase(); @@ -6971,4 +7557,6 @@ START_TEST(db) test_dbtopackage(); test_droptable(); test_dbmerge(); + test_insertorder(); + test_columnorder(); } diff --git a/rostests/winetests/msi/format.c b/rostests/winetests/msi/format.c index 316eed6b711..2b2661cfddb 100644 --- a/rostests/winetests/msi/format.c +++ b/rostests/winetests/msi/format.c @@ -2361,12 +2361,14 @@ static void test_formatrecord_tables(void) /* component with INSTALLSTATE_SOURCE */ lstrcpy( expected, "1: " ); lstrcat( expected, curr_dir ); - lstrcat( expected, "\\ " ); + if (strlen(curr_dir) > 3) + lstrcat( expected, "\\" ); + lstrcat( expected, " " ); size = MAX_PATH; MsiRecordSetString( hrec, 1, "[$parietal]" ); r = MsiFormatRecord( hpkg, hrec, buf, &size ); ok( r == ERROR_SUCCESS, "format record failed: %d\n", r); - ok( !lstrcmp( buf, expected ), "Expected '%s', got %s\n", expected, buf); + ok( !lstrcmp( buf, expected ), "Expected '%s', got '%s'\n", expected, buf); sprintf( buf, "%sI am a really long directory\\temporal.txt", root ); DeleteFile( buf ); diff --git a/rostests/winetests/msi/install.c b/rostests/winetests/msi/install.c index 95dd03a29c4..35000070296 100644 --- a/rostests/winetests/msi/install.c +++ b/rostests/winetests/msi/install.c @@ -1721,6 +1721,21 @@ static void test_MsiInstallProduct(void) return; } + /* szPackagePath is NULL */ + r = MsiInstallProductA(NULL, "INSTALL=ALL"); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + + /* both szPackagePath and szCommandLine are NULL */ + r = MsiInstallProductA(NULL, NULL); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + + /* szPackagePath is empty */ + r = MsiInstallProductA("", "INSTALL=ALL"); + ok(r == ERROR_PATH_NOT_FOUND, + "Expected ERROR_PATH_NOT_FOUND, got %d\n", r); + create_test_files(); create_database(msifile, tables, sizeof(tables) / sizeof(msi_table)); @@ -1764,7 +1779,7 @@ static void test_MsiInstallProduct(void) type = REG_SZ; res = RegQueryValueExA(hkey, "OrderTestName", NULL, &type, (LPBYTE)path, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(!lstrcmpA(path, "OrderTestValue"), "Expected imaname, got %s\n", path); + ok(!lstrcmpA(path, "OrderTestValue"), "Expected OrderTestValue, got %s\n", path); check_service_is_installed(); @@ -2280,6 +2295,7 @@ static void test_setpropertyfolder(void) { UINT r; CHAR path[MAX_PATH]; + DWORD attr; lstrcpyA(path, PROG_FILES_DIR); lstrcatA(path, "\\msitest\\added"); @@ -2293,7 +2309,8 @@ static void test_setpropertyfolder(void) r = MsiInstallProductA(msifile, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - if (GetFileAttributesA(path) == FILE_ATTRIBUTE_DIRECTORY) + attr = GetFileAttributesA(path); + if (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY)) { ok(delete_pf("msitest\\added\\maximus", TRUE), "File not installed\n"); ok(delete_pf("msitest\\added", FALSE), "File not installed\n"); @@ -3213,7 +3230,7 @@ static void test_publish_processcomponents(void) lstrcpyA(program_files_maximus,PROG_FILES_DIR); lstrcatA(program_files_maximus,"\\msitest\\maximus"); - ok(!lstrcmpA(val, program_files_maximus), + ok(!lstrcmpiA(val, program_files_maximus), "Expected \"%s\", got \"%s\"\n", program_files_maximus, val); res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey); @@ -3257,7 +3274,7 @@ static void test_publish_processcomponents(void) res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL, NULL, (LPBYTE)val, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(!lstrcmpA(val, program_files_maximus), + ok(!lstrcmpiA(val, program_files_maximus), "Expected \"%s\", got \"%s\"\n", program_files_maximus, val); res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey); @@ -4193,8 +4210,8 @@ static void test_transformprop(void) static void test_currentworkingdir(void) { UINT r; - CHAR path[MAX_PATH]; - LPSTR ptr, ptr2; + CHAR drive[MAX_PATH], path[MAX_PATH]; + LPSTR ptr; CreateDirectoryA("msitest", NULL); create_file("msitest\\augustus", 500); @@ -4221,18 +4238,17 @@ static void test_currentworkingdir(void) ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - lstrcpyA(path, CURR_DIR); + lstrcpyA(drive, CURR_DIR); + drive[2] = '\\'; + drive[3] = '\0'; + SetCurrentDirectoryA(drive); + + lstrcpy(path, CURR_DIR); if (path[lstrlenA(path) - 1] != '\\') lstrcatA(path, "\\"); - lstrcatA(path, "msitest.msi"); - - ptr2 = strrchr(path, '\\'); - *ptr2 = '\0'; - ptr = strrchr(path, '\\'); - *ptr2 = '\\'; - *(ptr++) = '\0'; - - SetCurrentDirectoryA(path); + lstrcatA(path, msifile); + ptr = strchr(path, ':'); + ptr +=2; r = MsiInstallProductA(ptr, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -4628,10 +4644,15 @@ static void test_missingcab(void) create_pf_data("msitest\\caesar", "abcdefgh", TRUE); r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); + ok(r == ERROR_SUCCESS || + broken(r == ERROR_INSTALL_FAILURE), /* win9x */ + "Expected ERROR_SUCCESS, got %u\n", r); + if (r == ERROR_SUCCESS) + { + ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + } ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); diff --git a/rostests/winetests/msi/msi.c b/rostests/winetests/msi/msi.c index fec9d89c76d..c3ef72b47fc 100644 --- a/rostests/winetests/msi/msi.c +++ b/rostests/winetests/msi/msi.c @@ -516,15 +516,19 @@ static void create_test_guid(LPSTR prodcode, LPSTR squashed) static void get_user_sid(LPSTR *usersid) { HANDLE token; - BYTE buf[1024]; DWORD size; PTOKEN_USER user; OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token); - size = sizeof(buf); - GetTokenInformation(token, TokenUser, buf, size, &size); - user = (PTOKEN_USER)buf; + + size = 0; + GetTokenInformation(token, TokenUser, NULL, size, &size); + user = HeapAlloc(GetProcessHeap(), 0, size); + + GetTokenInformation(token, TokenUser, user, size, &size); pConvertSidToStringSidA(user->User.Sid, usersid); + + HeapFree(GetProcessHeap(), 0, user); CloseHandle(token); } @@ -757,10 +761,8 @@ static const char table_enc85[] = /* * Encodes a base85 guid given a GUID pointer * Caller should provide a 21 character buffer for the encoded string. - * - * returns TRUE if successful, FALSE if not */ -static BOOL encode_base85_guid( GUID *guid, LPWSTR str ) +static void encode_base85_guid( GUID *guid, LPWSTR str ) { unsigned int x, *p, i; @@ -779,8 +781,6 @@ static BOOL encode_base85_guid( GUID *guid, LPWSTR str ) *str++ = table_enc85[x%85]; } *str = 0; - - return TRUE; } static void compose_base85_guid(LPSTR component, LPSTR comp_base85, LPSTR squashed) @@ -807,12 +807,12 @@ static void compose_base85_guid(LPSTR component, LPSTR comp_base85, LPSTR squash static void test_MsiQueryFeatureState(void) { - HKEY userkey, localkey, compkey; + HKEY userkey, localkey, compkey, compkey2; CHAR prodcode[MAX_PATH]; CHAR prod_squashed[MAX_PATH]; CHAR component[MAX_PATH]; CHAR comp_base85[MAX_PATH]; - CHAR comp_squashed[MAX_PATH]; + CHAR comp_squashed[MAX_PATH], comp_squashed2[MAX_PATH]; CHAR keypath[MAX_PATH*2]; INSTALLSTATE state; LPSTR usersid; @@ -820,6 +820,7 @@ static void test_MsiQueryFeatureState(void) create_test_guid(prodcode, prod_squashed); compose_base85_guid(component, comp_base85, comp_squashed); + compose_base85_guid(component, comp_base85 + 20, comp_squashed2); get_user_sid(&usersid); /* NULL prodcode */ @@ -908,7 +909,7 @@ static void test_MsiQueryFeatureState(void) state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); - res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)comp_base85, 21); + res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)comp_base85, 41); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); @@ -922,6 +923,14 @@ static void test_MsiQueryFeatureState(void) res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); + lstrcatA(keypath, usersid); + lstrcatA(keypath, "\\Components\\"); + lstrcatA(keypath, comp_squashed2); + + res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey2); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); @@ -929,9 +938,15 @@ static void test_MsiQueryFeatureState(void) ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); - res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"apple", 1); + res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"apple", 6); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + state = MsiQueryFeatureStateA(prodcode, "feature"); + ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + + res = RegSetValueExA(compkey2, prod_squashed, 0, REG_SZ, (const BYTE *)"orange", 7); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* INSTALLSTATE_LOCAL */ @@ -967,11 +982,14 @@ static void test_MsiQueryFeatureState(void) ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); RegDeleteValueA(compkey, prod_squashed); + RegDeleteValueA(compkey2, prod_squashed); RegDeleteKeyA(compkey, ""); + RegDeleteKeyA(compkey2, ""); RegDeleteValueA(localkey, "feature"); RegDeleteValueA(userkey, "feature"); RegDeleteKeyA(userkey, ""); RegCloseKey(compkey); + RegCloseKey(compkey2); RegCloseKey(localkey); RegCloseKey(userkey); @@ -989,7 +1007,7 @@ static void test_MsiQueryFeatureState(void) state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - res = RegSetValueExA(userkey, "feature", 0, REG_SZ, (const BYTE *)"", 2); + res = RegSetValueExA(userkey, "feature", 0, REG_SZ, (const BYTE *)"", 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* feature value exists */ @@ -1027,7 +1045,7 @@ static void test_MsiQueryFeatureState(void) state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); - res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)comp_base85, 21); + res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)comp_base85, 41); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); @@ -1041,6 +1059,14 @@ static void test_MsiQueryFeatureState(void) res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); + lstrcatA(keypath, usersid); + lstrcatA(keypath, "\\Components\\"); + lstrcatA(keypath, comp_squashed2); + + res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey2); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); @@ -1048,20 +1074,29 @@ static void test_MsiQueryFeatureState(void) ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); - res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"apple", 1); + res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"apple", 6); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + state = MsiQueryFeatureStateA(prodcode, "feature"); + ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + + res = RegSetValueExA(compkey2, prod_squashed, 0, REG_SZ, (const BYTE *)"orange", 7); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); RegDeleteValueA(compkey, prod_squashed); + RegDeleteValueA(compkey2, prod_squashed); RegDeleteKeyA(compkey, ""); + RegDeleteKeyA(compkey2, ""); RegDeleteValueA(localkey, "feature"); RegDeleteValueA(userkey, "feature"); RegDeleteKeyA(userkey, ""); RegCloseKey(compkey); + RegCloseKey(compkey2); RegCloseKey(localkey); RegCloseKey(userkey); @@ -1077,7 +1112,7 @@ static void test_MsiQueryFeatureState(void) state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - res = RegSetValueExA(userkey, "feature", 0, REG_SZ, (const BYTE *)"", 2); + res = RegSetValueExA(userkey, "feature", 0, REG_SZ, (const BYTE *)"", 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* feature value exists */ @@ -1114,7 +1149,7 @@ static void test_MsiQueryFeatureState(void) state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); - res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)comp_base85, 21); + res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)comp_base85, 41); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); @@ -1127,6 +1162,13 @@ static void test_MsiQueryFeatureState(void) res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); + lstrcatA(keypath, "S-1-5-18\\Components\\"); + lstrcatA(keypath, comp_squashed2); + + res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey2); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); @@ -1134,20 +1176,29 @@ static void test_MsiQueryFeatureState(void) ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); - res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"apple", 1); + res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"apple", 6); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + state = MsiQueryFeatureStateA(prodcode, "feature"); + ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + + res = RegSetValueExA(compkey2, prod_squashed, 0, REG_SZ, (const BYTE *)"orange", 7); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); RegDeleteValueA(compkey, prod_squashed); + RegDeleteValueA(compkey2, prod_squashed); RegDeleteKeyA(compkey, ""); + RegDeleteKeyA(compkey2, ""); RegDeleteValueA(localkey, "feature"); RegDeleteValueA(userkey, "feature"); RegDeleteKeyA(userkey, ""); RegCloseKey(compkey); + RegCloseKey(compkey2); RegCloseKey(localkey); RegCloseKey(userkey); } @@ -3649,12 +3700,31 @@ static void test_MsiGetProductInfo(void) ok(!lstrcmpA(buf, "42"), "Expected \"42\", got \"%s\"\n", buf); ok(sz == 2, "Expected 2, got %d\n", sz); + /* SourceList key does not exist */ + sz = MAX_PATH; + lstrcpyA(buf, "apple"); + r = MsiGetProductInfoA(prodcode, INSTALLPROPERTY_PACKAGENAME, buf, &sz); + ok(r == ERROR_UNKNOWN_PRODUCT, + "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(!lstrcmpA(buf, "apple"), + "Expected buf to be unchanged, got \"%s\"\n", buf); + ok(sz == MAX_PATH, "Expected sz to be unchanged, got %d\n", sz); + res = RegCreateKeyA(prodkey, "SourceList", &source); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + /* SourceList key exists, but PackageName val does not exist */ + sz = MAX_PATH; + lstrcpyA(buf, "apple"); + r = MsiGetProductInfoA(prodcode, INSTALLPROPERTY_PACKAGENAME, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); + ok(sz == 0, "Expected 0, got %d\n", sz); + res = RegSetValueExA(source, "PackageName", 0, REG_SZ, (LPBYTE)"packname", 9); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + /* PackageName val exists */ sz = MAX_PATH; lstrcpyA(buf, "apple"); r = MsiGetProductInfoA(prodcode, INSTALLPROPERTY_PACKAGENAME, buf, &sz); @@ -7405,263 +7475,20 @@ static void test_MsiOpenProduct(void) DeleteFileA(msifile); } -static void test_MsiEnumPatchesEx(void) +static void test_MsiEnumPatchesEx_usermanaged(LPCSTR usersid, LPCSTR expectedsid) { + MSIINSTALLCONTEXT context; CHAR keypath[MAX_PATH], patch[MAX_PATH]; CHAR patch_squashed[MAX_PATH], patchcode[MAX_PATH]; CHAR targetsid[MAX_PATH], targetprod[MAX_PATH]; CHAR prodcode[MAX_PATH], prod_squashed[MAX_PATH]; - HKEY prodkey, patches, udprod, udpatch; - HKEY userkey, hpatch; - MSIINSTALLCONTEXT context; + HKEY prodkey, patches, udprod, udpatch, hpatch; DWORD size, data; - LPSTR usersid; LONG res; UINT r; - if (!pMsiEnumPatchesExA) - { - win_skip("MsiEnumPatchesExA not implemented\n"); - return; - } - create_test_guid(prodcode, prod_squashed); create_test_guid(patch, patch_squashed); - get_user_sid(&usersid); - - /* empty szProductCode */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, - MSIPATCHSTATE_ALL, 0, patchcode, targetprod, &context, - targetsid, &size); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* garbage szProductCode */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, - MSIPATCHSTATE_ALL, 0, patchcode, targetprod, &context, - targetsid, &size); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* guid without brackets */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA("6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D", usersid, - MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_ALL, - 0, patchcode, targetprod, &context, - targetsid, &size); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* guid with brackets */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA("{6700E8CF-95AB-4D9C-BC2C-15840DDA7A5D}", usersid, - MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_ALL, - 0, patchcode, targetprod, &context, - targetsid, &size); - ok(r == ERROR_NO_MORE_ITEMS, - "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"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* szUserSid is S-1-5-18 */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA(prodcode, "S-1-5-18", - MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_ALL, - 0, patchcode, targetprod, &context, - targetsid, &size); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* dwContext is MSIINSTALLCONTEXT_MACHINE, but szUserSid is non-NULL */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_MACHINE, - MSIPATCHSTATE_ALL, 0, patchcode, targetprod, - &context, targetsid, &size); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* dwContext is out of bounds */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA(prodcode, usersid, 0, - MSIPATCHSTATE_ALL, 0, patchcode, targetprod, - &context, targetsid, &size); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* dwContext is out of bounds */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_ALL + 1, - MSIPATCHSTATE_ALL, 0, patchcode, targetprod, - &context, targetsid, &size); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* dwFilter is out of bounds */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, - MSIPATCHSTATE_INVALID, 0, patchcode, targetprod, - &context, targetsid, &size); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* dwFilter is out of bounds */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - size = MAX_PATH; - r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, - MSIPATCHSTATE_ALL + 1, 0, patchcode, targetprod, - &context, targetsid, &size); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - - /* pcchTargetUserSid is NULL while szTargetUserSid is non-NULL */ - lstrcpyA(patchcode, "apple"); - lstrcpyA(targetprod, "banana"); - context = 0xdeadbeef; - lstrcpyA(targetsid, "kiwi"); - r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, - MSIPATCHSTATE_ALL, 0, patchcode, targetprod, - &context, targetsid, NULL); - ok(r == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - ok(!lstrcmpA(patchcode, "apple"), - "Expected patchcode to be unchanged, got %s\n", patchcode); - ok(!lstrcmpA(targetprod, "banana"), - "Expected targetprod to be unchanged, got %s\n", targetprod); - ok(context == 0xdeadbeef, - "Expected context to be unchanged, got %d\n", context); - ok(!lstrcmpA(targetsid, "kiwi"), - "Expected targetsid to be unchanged, got %s\n", targetsid); - - /* MSIINSTALLCONTEXT_USERMANAGED */ /* MSIPATCHSTATE_APPLIED */ @@ -7685,7 +7512,7 @@ static void test_MsiEnumPatchesEx(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); - lstrcatA(keypath, usersid); + lstrcatA(keypath, expectedsid); lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); @@ -7771,7 +7598,7 @@ static void test_MsiEnumPatchesEx(void) context = 0xdeadbeef; lstrcpyA(targetsid, "kiwi"); size = MAX_PATH; - r = pMsiEnumPatchesExA(prodcode, NULL, MSIINSTALLCONTEXT_USERMANAGED, + r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSIPATCHSTATE_APPLIED, 0, patchcode, targetprod, &context, targetsid, &size); ok(r == ERROR_BAD_CONFIGURATION, @@ -7832,10 +7659,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERMANAGED, "Expected MSIINSTALLCONTEXT_USERMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* increase the index */ lstrcpyA(patchcode, "apple"); @@ -7891,10 +7718,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERMANAGED, "Expected MSIINSTALLCONTEXT_USERMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* szTargetProductCode is NULL */ lstrcpyA(patchcode, "apple"); @@ -7909,10 +7736,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", patch, patchcode); ok(context == MSIINSTALLCONTEXT_USERMANAGED, "Expected MSIINSTALLCONTEXT_USERMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* pdwTargetProductContext is NULL */ lstrcpyA(patchcode, "apple"); @@ -7927,10 +7754,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", patch, patchcode); ok(!lstrcmpA(targetprod, prodcode), "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* szTargetUserSid is NULL */ lstrcpyA(patchcode, "apple"); @@ -7947,15 +7774,15 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERMANAGED, "Expected MSIINSTALLCONTEXT_USERMANAGED, got %d\n", context); - ok(size == lstrlenA(usersid) * sizeof(WCHAR), - "Got %d\n", size); + ok(size == lstrlenA(expectedsid) * sizeof(WCHAR), + "Expected %d*sizeof(WCHAR), got %d\n", lstrlenA(expectedsid), size); /* pcchTargetUserSid is exactly the length of szTargetUserSid */ lstrcpyA(patchcode, "apple"); lstrcpyA(targetprod, "banana"); context = 0xdeadbeef; lstrcpyA(targetsid, "kiwi"); - size = lstrlenA(usersid); + size = lstrlenA(expectedsid); r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSIPATCHSTATE_APPLIED, 0, patchcode, targetprod, &context, targetsid, &size); @@ -7966,17 +7793,17 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERMANAGED, "Expected MSIINSTALLCONTEXT_USERMANAGED, got %d\n", context); - ok(!strncmp(targetsid, usersid, lstrlenA(usersid) - 1), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid) * sizeof(WCHAR), - "Got %d\n", size); + ok(!strncmp(targetsid, expectedsid, lstrlenA(expectedsid) - 1), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid) * sizeof(WCHAR), + "Expected %d*sizeof(WCHAR), got %d\n", lstrlenA(expectedsid), size); /* pcchTargetUserSid has enough room for NULL terminator */ lstrcpyA(patchcode, "apple"); lstrcpyA(targetprod, "banana"); context = 0xdeadbeef; lstrcpyA(targetsid, "kiwi"); - size = lstrlenA(usersid) + 1; + size = lstrlenA(expectedsid) + 1; r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSIPATCHSTATE_APPLIED, 0, patchcode, targetprod, &context, targetsid, &size); @@ -7987,10 +7814,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERMANAGED, "Expected MSIINSTALLCONTEXT_USERMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* both szTargetuserSid and pcchTargetUserSid are NULL */ lstrcpyA(patchcode, "apple"); @@ -8029,7 +7856,7 @@ static void test_MsiEnumPatchesEx(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); - lstrcatA(keypath, usersid); + lstrcatA(keypath, expectedsid); lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); @@ -8124,10 +7951,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERMANAGED, "Expected MSIINSTALLCONTEXT_USERMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* MSIPATCHSTATE_OBSOLETED */ @@ -8171,10 +7998,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERMANAGED, "Expected MSIINSTALLCONTEXT_USERMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* MSIPATCHSTATE_REGISTERED */ /* FIXME */ @@ -8197,10 +8024,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERMANAGED, "Expected MSIINSTALLCONTEXT_USERMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* same patch in multiple places, only one is enumerated */ lstrcpyA(patchcode, "apple"); @@ -8234,8 +8061,23 @@ static void test_MsiEnumPatchesEx(void) RegCloseKey(patches); RegDeleteKeyA(prodkey, ""); RegCloseKey(prodkey); +} - /* MSIINSTALLCONTEXT_USERUNMANAGED */ +static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expectedsid) +{ + MSIINSTALLCONTEXT context; + CHAR keypath[MAX_PATH], patch[MAX_PATH]; + CHAR patch_squashed[MAX_PATH], patchcode[MAX_PATH]; + CHAR targetsid[MAX_PATH], targetprod[MAX_PATH]; + CHAR prodcode[MAX_PATH], prod_squashed[MAX_PATH]; + HKEY prodkey, patches, udprod, udpatch; + HKEY userkey, hpatch; + DWORD size, data; + LONG res; + UINT r; + + create_test_guid(prodcode, prod_squashed); + create_test_guid(patch, patch_squashed); /* MSIPATCHSTATE_APPLIED */ @@ -8408,7 +8250,7 @@ static void test_MsiEnumPatchesEx(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); - lstrcatA(keypath, usersid); + lstrcatA(keypath, expectedsid); lstrcatA(keypath, "\\Patches\\"); lstrcatA(keypath, patch_squashed); @@ -8431,10 +8273,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERUNMANAGED, "Expected MSIINSTALLCONTEXT_USERUNMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* MSIPATCHSTATE_SUPERSEDED */ @@ -8458,7 +8300,7 @@ static void test_MsiEnumPatchesEx(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); - lstrcatA(keypath, usersid); + lstrcatA(keypath, expectedsid); lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); @@ -8553,10 +8395,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERUNMANAGED, "Expected MSIINSTALLCONTEXT_USERUNMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* MSIPATCHSTATE_OBSOLETED */ @@ -8600,10 +8442,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERUNMANAGED, "Expected MSIINSTALLCONTEXT_USERUNMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* MSIPATCHSTATE_REGISTERED */ /* FIXME */ @@ -8626,10 +8468,10 @@ static void test_MsiEnumPatchesEx(void) "Expected \"%s\", got \"%s\"\n", prodcode, targetprod); ok(context == MSIINSTALLCONTEXT_USERUNMANAGED, "Expected MSIINSTALLCONTEXT_USERUNMANAGED, got %d\n", context); - ok(!lstrcmpA(targetsid, usersid), - "Expected \"%s\", got \"%s\"\n", usersid, targetsid); - ok(size == lstrlenA(usersid), - "Expected %d, got %d\n", lstrlenA(usersid), size); + ok(!lstrcmpA(targetsid, expectedsid), + "Expected \"%s\", got \"%s\"\n", expectedsid, targetsid); + ok(size == lstrlenA(expectedsid), + "Expected %d, got %d\n", lstrlenA(expectedsid), size); /* same patch in multiple places, only one is enumerated */ lstrcpyA(patchcode, "apple"); @@ -8656,6 +8498,8 @@ static void test_MsiEnumPatchesEx(void) RegCloseKey(hpatch); RegDeleteKeyA(udpatch, ""); RegCloseKey(udpatch); + RegDeleteKeyA(udprod, ""); + RegCloseKey(udprod); RegDeleteKeyA(userkey, ""); RegCloseKey(userkey); RegDeleteValueA(patches, patch_squashed); @@ -8664,8 +8508,23 @@ static void test_MsiEnumPatchesEx(void) RegCloseKey(patches); RegDeleteKeyA(prodkey, ""); RegCloseKey(prodkey); +} - /* MSIINSTALLCONTEXT_MACHINE */ +static void test_MsiEnumPatchesEx_machine() +{ + CHAR keypath[MAX_PATH], patch[MAX_PATH]; + CHAR patch_squashed[MAX_PATH], patchcode[MAX_PATH]; + CHAR targetsid[MAX_PATH], targetprod[MAX_PATH]; + CHAR prodcode[MAX_PATH], prod_squashed[MAX_PATH]; + HKEY prodkey, patches, udprod, udpatch; + HKEY hpatch; + MSIINSTALLCONTEXT context; + DWORD size, data; + LONG res; + UINT r; + + create_test_guid(prodcode, prod_squashed); + create_test_guid(patch, patch_squashed); /* MSIPATCHSTATE_APPLIED */ @@ -9084,12 +8943,273 @@ static void test_MsiEnumPatchesEx(void) RegCloseKey(prodkey); } +static void test_MsiEnumPatchesEx(void) +{ + CHAR targetsid[MAX_PATH], targetprod[MAX_PATH]; + CHAR prodcode[MAX_PATH], prod_squashed[MAX_PATH]; + CHAR patchcode[MAX_PATH]; + MSIINSTALLCONTEXT context; + LPSTR usersid; + DWORD size; + UINT r; + + if (!pMsiEnumPatchesExA) + { + win_skip("MsiEnumPatchesExA not implemented\n"); + return; + } + + create_test_guid(prodcode, prod_squashed); + get_user_sid(&usersid); + + /* empty szProductCode */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA("", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSIPATCHSTATE_ALL, 0, patchcode, targetprod, &context, + targetsid, &size); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* garbage szProductCode */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSIPATCHSTATE_ALL, 0, patchcode, targetprod, &context, + targetsid, &size); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* guid without brackets */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA("6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D", usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_ALL, + 0, patchcode, targetprod, &context, + targetsid, &size); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* guid with brackets */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA("{6700E8CF-95AB-4D9C-BC2C-15840DDA7A5D}", usersid, + MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_ALL, + 0, patchcode, targetprod, &context, + targetsid, &size); + ok(r == ERROR_NO_MORE_ITEMS, + "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"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* szUserSid is S-1-5-18 */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA(prodcode, "S-1-5-18", + MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_ALL, + 0, patchcode, targetprod, &context, + targetsid, &size); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* dwContext is MSIINSTALLCONTEXT_MACHINE, but szUserSid is non-NULL */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_MACHINE, + MSIPATCHSTATE_ALL, 0, patchcode, targetprod, + &context, targetsid, &size); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* dwContext is out of bounds */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA(prodcode, usersid, 0, + MSIPATCHSTATE_ALL, 0, patchcode, targetprod, + &context, targetsid, &size); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* dwContext is out of bounds */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_ALL + 1, + MSIPATCHSTATE_ALL, 0, patchcode, targetprod, + &context, targetsid, &size); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* dwFilter is out of bounds */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSIPATCHSTATE_INVALID, 0, patchcode, targetprod, + &context, targetsid, &size); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* dwFilter is out of bounds */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + size = MAX_PATH; + r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSIPATCHSTATE_ALL + 1, 0, patchcode, targetprod, + &context, targetsid, &size); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + + /* pcchTargetUserSid is NULL while szTargetUserSid is non-NULL */ + lstrcpyA(patchcode, "apple"); + lstrcpyA(targetprod, "banana"); + context = 0xdeadbeef; + lstrcpyA(targetsid, "kiwi"); + r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, + MSIPATCHSTATE_ALL, 0, patchcode, targetprod, + &context, targetsid, NULL); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + ok(!lstrcmpA(patchcode, "apple"), + "Expected patchcode to be unchanged, got %s\n", patchcode); + ok(!lstrcmpA(targetprod, "banana"), + "Expected targetprod to be unchanged, got %s\n", targetprod); + ok(context == 0xdeadbeef, + "Expected context to be unchanged, got %d\n", context); + ok(!lstrcmpA(targetsid, "kiwi"), + "Expected targetsid to be unchanged, got %s\n", targetsid); + + test_MsiEnumPatchesEx_usermanaged(usersid, usersid); + test_MsiEnumPatchesEx_usermanaged(NULL, usersid); + test_MsiEnumPatchesEx_usermanaged("S-1-2-34", "S-1-2-34"); + test_MsiEnumPatchesEx_userunmanaged(usersid, usersid); + test_MsiEnumPatchesEx_userunmanaged(NULL, usersid); + /* FIXME: Successfully test userunmanaged with a different user */ + test_MsiEnumPatchesEx_machine(); +} + static void test_MsiEnumPatches(void) { CHAR keypath[MAX_PATH], patch[MAX_PATH]; CHAR patchcode[MAX_PATH], patch_squashed[MAX_PATH]; CHAR prodcode[MAX_PATH], prod_squashed[MAX_PATH]; CHAR transforms[MAX_PATH]; + WCHAR patchW[MAX_PATH], prodcodeW[MAX_PATH], transformsW[MAX_PATH]; HKEY prodkey, patches, udprod; HKEY userkey, hpatch, udpatch; DWORD size, data; @@ -9298,7 +9418,7 @@ static void test_MsiEnumPatches(void) "Expected \"%s\", got \"%s\"\n", patchcode, patch); ok(!lstrcmpA(transforms, "whatever"), "Expected \"whatever\", got \"%s\"\n", transforms); - ok(size == 8, "Expected 8, got %d\n", size); + ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); /* lpPatchBuf is NULL */ size = MAX_PATH; @@ -9341,7 +9461,7 @@ static void test_MsiEnumPatches(void) "Expected \"%s\", got \"%s\"\n", patchcode, patch); ok(!lstrcmpA(transforms, "whate"), "Expected \"whate\", got \"%s\"\n", transforms); - ok(size == 16, "Expected 16, got %d\n", size); + ok(size == 8 || size == 16, "Expected 8 or 16, got %d\n", size); /* increase the index */ size = MAX_PATH; @@ -9507,7 +9627,7 @@ static void test_MsiEnumPatches(void) "Expected \"%s\", got \"%s\"\n", patchcode, patch); ok(!lstrcmpA(transforms, "whatever"), "Expected \"whatever\", got \"%s\"\n", transforms); - ok(size == 8, "Expected 8, got %d\n", size); + ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); RegDeleteKeyA(userkey, ""); RegCloseKey(userkey); @@ -9632,7 +9752,7 @@ static void test_MsiEnumPatches(void) "Expected \"%s\", got \"%s\"\n", patchcode, patch); ok(!lstrcmpA(transforms, "whatever"), "Expected \"whatever\", got \"%s\"\n", transforms); - ok(size == 8, "Expected 8, got %d\n", size); + ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); @@ -9651,7 +9771,7 @@ static void test_MsiEnumPatches(void) "Expected \"%s\", got \"%s\"\n", patchcode, patch); ok(!lstrcmpA(transforms, "whatever"), "Expected \"whatever\", got \"%s\"\n", transforms); - ok(size == 8, "Expected 8, got %d\n", size); + ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); res = RegCreateKeyA(udprod, "Patches", &udpatch); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); @@ -9666,7 +9786,7 @@ static void test_MsiEnumPatches(void) "Expected \"%s\", got \"%s\"\n", patchcode, patch); ok(!lstrcmpA(transforms, "whatever"), "Expected \"whatever\", got \"%s\"\n", transforms); - ok(size == 8, "Expected 8, got %d\n", size); + ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); res = RegCreateKeyA(udpatch, patch_squashed, &hpatch); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); @@ -9698,8 +9818,39 @@ static void test_MsiEnumPatches(void) "Expected \"%s\", got \"%s\"\n", patchcode, patch); ok(!lstrcmpA(transforms, "whatever"), "Expected \"whatever\", got \"%s\"\n", transforms); + ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); + + /* now duplicate some of the tests for the W version */ + + /* pcchTransformsBuf is too small */ + size = 6; + MultiByteToWideChar( CP_ACP, 0, prodcode, -1, prodcodeW, MAX_PATH ); + MultiByteToWideChar( CP_ACP, 0, "apple", -1, patchW, MAX_PATH ); + MultiByteToWideChar( CP_ACP, 0, "banana", -1, transformsW, MAX_PATH ); + r = MsiEnumPatchesW(prodcodeW, 0, patchW, transformsW, &size); + ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); + WideCharToMultiByte( CP_ACP, 0, patchW, -1, patch, MAX_PATH, NULL, NULL ); + 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"), + "Expected \"whate\", got \"%s\"\n", transforms); ok(size == 8, "Expected 8, got %d\n", size); + /* patch code value exists */ + size = MAX_PATH; + MultiByteToWideChar( CP_ACP, 0, "apple", -1, patchW, MAX_PATH ); + MultiByteToWideChar( CP_ACP, 0, "banana", -1, transformsW, MAX_PATH ); + r = MsiEnumPatchesW(prodcodeW, 0, patchW, transformsW, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + WideCharToMultiByte( CP_ACP, 0, patchW, -1, patch, MAX_PATH, NULL, NULL ); + 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, "whatever"), + "Expected \"whatever\", got \"%s\"\n", transforms); + ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); + RegDeleteValueA(patches, patch_squashed); RegDeleteValueA(patches, "Patches"); RegDeleteKeyA(patches, ""); @@ -10727,6 +10878,76 @@ static void test_MsiGetPatchInfoEx(void) RegCloseKey(udprod); } +static void test_MsiEnumProducts(void) +{ + UINT r; + int found1, found2, found3; + DWORD index; + char product1[39], product2[39], product3[39], guid[39]; + char product_squashed1[33], product_squashed2[33], product_squashed3[33]; + char keypath1[MAX_PATH], keypath2[MAX_PATH], keypath3[MAX_PATH]; + char *usersid; + HKEY key1, key2, key3; + + create_test_guid(product1, product_squashed1); + create_test_guid(product2, product_squashed2); + create_test_guid(product3, product_squashed3); + get_user_sid(&usersid); + + strcpy(keypath1, "Software\\Classes\\Installer\\Products\\"); + strcat(keypath1, product_squashed1); + + r = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath1, &key1); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + strcpy(keypath2, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); + strcat(keypath2, usersid); + strcat(keypath2, "\\Installer\\Products\\"); + strcat(keypath2, product_squashed2); + + r = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath2, &key2); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + strcpy(keypath3, "Software\\Microsoft\\Installer\\Products\\"); + strcat(keypath3, product_squashed3); + + r = RegCreateKeyA(HKEY_CURRENT_USER, keypath3, &key3); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + index = 0; + r = MsiEnumProductsA(index, NULL); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r); + + index = 2; + r = MsiEnumProductsA(index, guid); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r); + + index = 0; + r = MsiEnumProductsA(index, guid); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + found1 = found2 = found3 = 0; + while ((r = MsiEnumProductsA(index, guid)) == ERROR_SUCCESS) + { + if (!strcmp(product1, guid)) found1 = 1; + if (!strcmp(product2, guid)) found2 = 1; + if (!strcmp(product3, guid)) found3 = 1; + index++; + } + ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %u\n", r); + ok(found1, "product1 not found\n"); + ok(found2, "product2 not found\n"); + ok(found3, "product3 not found\n"); + + RegDeleteKeyA(key1, ""); + RegDeleteKeyA(key2, ""); + RegDeleteKeyA(key3, ""); + RegCloseKey(key1); + RegCloseKey(key2); + RegCloseKey(key3); + LocalFree(usersid); +} + START_TEST(msi) { init_functionpointers(); @@ -10754,6 +10975,7 @@ START_TEST(msi) test_MsiEnumPatchesEx(); test_MsiEnumPatches(); test_MsiGetPatchInfoEx(); + test_MsiEnumProducts(); } test_MsiGetFileVersion(); diff --git a/rostests/winetests/msi/package.c b/rostests/winetests/msi/package.c index 04ad64c83e3..308a9ccd142 100644 --- a/rostests/winetests/msi/package.c +++ b/rostests/winetests/msi/package.c @@ -32,6 +32,8 @@ static const char msifile[] = "winetest.msi"; char CURR_DIR[MAX_PATH]; +static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR); + static void get_user_sid(LPSTR *usersid) { HANDLE token; @@ -1072,6 +1074,15 @@ static void test_condition(void) r = MsiEvaluateCondition(hpkg, "not LicView"); ok( r == MSICONDITION_TRUE, "wrong return val\n"); + r = MsiEvaluateCondition(hpkg, "\"Testing\" ~<< \"Testing\""); + ok (r == MSICONDITION_TRUE, "wrong return val\n"); + + r = MsiEvaluateCondition(hpkg, "LicView ~<< \"Testing\""); + ok (r == MSICONDITION_FALSE, "wrong return val\n"); + + r = MsiEvaluateCondition(hpkg, "Not LicView ~<< \"Testing\""); + ok (r == MSICONDITION_TRUE, "wrong return val\n"); + r = MsiEvaluateCondition(hpkg, "not \"A\""); ok( r == MSICONDITION_FALSE, "wrong return val\n"); @@ -2252,6 +2263,7 @@ static void test_states(void) static const CHAR msifile2[] = "winetest2.msi"; static const CHAR msifile3[] = "winetest3.msi"; + static const CHAR msifile4[] = "winetest4.msi"; hdb = create_package_db(); ok ( hdb, "failed to create package database\n" ); @@ -2422,6 +2434,27 @@ static void test_states(void) r = add_component_entry( hdb, "'sigma', '{5CE9DDA8-B67B-4736-9D93-99D61C5B93E7}', 'TARGETDIR', 8, '', 'sigma_file'" ); ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r ); + /* msidbFeatureAttributesFavorLocal */ + r = add_feature_entry( hdb, "'eight', '', '', '', 2, 1, '', 0" ); + ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r ); + + r = add_component_entry( hdb, "'tau', '{07DEB510-677C-4A6F-A0A6-7CD8EFEA77ED}', 'TARGETDIR', 1, '', 'tau_file'" ); + ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r ); + + /* msidbFeatureAttributesFavorSource */ + r = add_feature_entry( hdb, "'nine', '', '', '', 2, 1, '', 1" ); + ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r ); + + r = add_component_entry( hdb, "'phi', '{9F0594C5-35AD-43EA-94DD-8DF73FAA664D}', 'TARGETDIR', 1, '', 'phi_file'" ); + ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r ); + + /* msidbFeatureAttributesFavorAdvertise */ + r = add_feature_entry( hdb, "'ten', '', '', '', 2, 1, '', 4" ); + ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r ); + + r = add_component_entry( hdb, "'chi', '{E6B539AB-5DA9-4236-A2D2-E341A50B4C38}', 'TARGETDIR', 1, '', 'chi_file'" ); + ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r ); + r = create_feature_components_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r ); @@ -2482,6 +2515,15 @@ static void test_states(void) r = add_feature_components_entry( hdb, "'seven', 'sigma'" ); ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r ); + r = add_feature_components_entry( hdb, "'eight', 'tau'" ); + ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r ); + + r = add_feature_components_entry( hdb, "'nine', 'phi'" ); + ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r ); + + r = add_feature_components_entry( hdb, "'ten', 'chi'" ); + ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r ); + r = create_file_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r ); @@ -2540,6 +2582,15 @@ static void test_states(void) r = add_file_entry( hdb, "'sigma_file', 'sigma', 'sigma.txt', 100, '', '1033', 8192, 1" ); ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r); + r = add_file_entry( hdb, "'tau_file', 'tau', 'tau.txt', 100, '', '1033', 8192, 1" ); + ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r); + + r = add_file_entry( hdb, "'phi_file', 'phi', 'phi.txt', 100, '', '1033', 8192, 1" ); + ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r); + + r = add_file_entry( hdb, "'chi_file', 'chi', 'chi.txt', 100, '', '1033', 8192, 1" ); + ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r); + MsiDatabaseCommit(hdb); /* these properties must not be in the saved msi file */ @@ -2552,6 +2603,12 @@ static void test_states(void) r = add_property_entry( hdb, "'REMOVE', 'six,seven'"); ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); + r = add_property_entry( hdb, "'REINSTALL', 'eight,nine,ten'"); + ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); + + r = add_property_entry( hdb, "'REINSTALLMODE', 'omus'"); + ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); + hpkg = package_from_db( hdb ); ok( hpkg, "failed to create package\n"); @@ -2559,6 +2616,7 @@ static void test_states(void) CopyFileA(msifile, msifile2, FALSE); CopyFileA(msifile, msifile3, FALSE); + CopyFileA(msifile, msifile4, FALSE); state = 0xdeadbee; action = 0xdeadbee; @@ -2609,6 +2667,27 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -2735,6 +2814,27 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -2787,6 +2887,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -2913,6 +3034,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "FileCost"); ok( r == ERROR_SUCCESS, "file cost failed\n"); @@ -2965,6 +3107,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -3091,6 +3254,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); @@ -3143,6 +3327,27 @@ static void test_states(void) ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -3269,10 +3474,31 @@ static void test_states(void) ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + MsiCloseHandle( hpkg ); /* publish the features and components */ - r = MsiInstallProduct(msifile, "ADDLOCAL=one,four ADDSOURCE=two,three REMOVE=six,seven"); + r = MsiInstallProduct(msifile, "ADDLOCAL=one,four ADDSOURCE=two,three REMOVE=six,seven REINSTALL=eight,nine,ten"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiOpenDatabase(msifile, MSIDBOPEN_DIRECT, &hdb); @@ -3288,6 +3514,9 @@ static void test_states(void) r = add_property_entry( hdb, "'REMOVE', 'six,seven'"); ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); + r = add_property_entry( hdb, "'REINSTALL', 'eight,nine,ten'"); + ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); + hpkg = package_from_db( hdb ); ok( hpkg, "failed to create package\n"); @@ -3342,6 +3571,27 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -3468,6 +3718,27 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -3520,6 +3791,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -3646,6 +3938,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "FileCost"); ok( r == ERROR_SUCCESS, "file cost failed\n"); @@ -3698,6 +4011,20 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -3824,6 +4151,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); @@ -3876,6 +4224,27 @@ static void test_states(void) ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4002,6 +4371,27 @@ static void test_states(void) ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + MsiCloseHandle(hpkg); /* uninstall the product */ @@ -4016,7 +4406,7 @@ static void test_states(void) ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r); /* these properties must not be in the saved msi file */ - r = add_property_entry( hdb, "'ADDLOCAL', 'one,two,three,four,five,six,seven'"); + r = add_property_entry( hdb, "'ADDLOCAL', 'one,two,three,four,five,six,seven,eight,nine,ten'"); ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); hpkg = package_from_db( hdb ); @@ -4071,6 +4461,27 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4197,6 +4608,27 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -4249,6 +4681,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4375,6 +4828,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "FileCost"); ok( r == ERROR_SUCCESS, "file cost failed\n"); @@ -4427,6 +4901,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4553,6 +5048,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); @@ -4605,6 +5121,27 @@ static void test_states(void) ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4731,6 +5268,27 @@ static void test_states(void) ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + MsiCloseHandle(hpkg); /* uninstall the product */ @@ -4745,7 +5303,7 @@ static void test_states(void) ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r); /* this property must not be in the saved msi file */ - r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven'"); + r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven,eight,nine,ten'"); ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); hpkg = package_from_db( hdb ); @@ -4800,6 +5358,27 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4926,6 +5505,27 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -4978,6 +5578,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -5104,6 +5725,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "FileCost"); ok( r == ERROR_SUCCESS, "file cost failed\n"); @@ -5156,6 +5798,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -5282,6 +5945,27 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); @@ -5334,6 +6018,27 @@ static void test_states(void) ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -5460,15 +6165,930 @@ static void test_states(void) ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + MsiCloseHandle(hpkg); + + /* reinstall the product */ + r = MsiInstallProduct(msifile3, "REINSTALL=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiOpenDatabase(msifile4, MSIDBOPEN_DIRECT, &hdb); + ok(r == ERROR_SUCCESS, "failed to open database: %d\n", r); + + /* this property must not be in the saved msi file */ + r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven,eight,nine,ten'"); + ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); + + hpkg = package_from_db( hdb ); + ok( hpkg, "failed to create package\n"); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "one", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "two", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "three", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "four", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "five", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "six", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "seven", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "alpha", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "beta", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "gamma", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "theta", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "delta", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "epsilon", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "zeta", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "iota", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "eta", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "kappa", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "lambda", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "mu", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "nu", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "xi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "omicron", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "pi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "rho", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "sigma", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + + r = MsiDoAction( hpkg, "CostInitialize"); + ok( r == ERROR_SUCCESS, "cost init failed\n"); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "one", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "two", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "three", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "four", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "five", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "six", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "seven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "alpha", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "beta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "gamma", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "theta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "delta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "epsilon", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "zeta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "iota", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "eta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "kappa", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "lambda", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "mu", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "nu", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "xi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "omicron", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "pi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "rho", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "sigma", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + r = MsiDoAction( hpkg, "FileCost"); + ok( r == ERROR_SUCCESS, "file cost failed\n"); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "one", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "two", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "three", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "four", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "five", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "six", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "seven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "alpha", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "beta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "gamma", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "theta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "delta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "epsilon", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "zeta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "iota", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "eta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "kappa", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "lambda", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "mu", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "nu", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "xi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "omicron", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "pi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "rho", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "sigma", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + r = MsiDoAction( hpkg, "CostFinalize"); + ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "one", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "two", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "three", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "four", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "five", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "six", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "seven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eight", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "nine", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "ten", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "alpha", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "beta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "gamma", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "theta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "delta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "epsilon", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "zeta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "iota", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "eta", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "kappa", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "lambda", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "mu", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "nu", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "xi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "omicron", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "pi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "rho", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "sigma", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "tau", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "phi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "chi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + MsiCloseHandle(hpkg); /* uninstall the product */ - r = MsiInstallProduct(msifile3, "REMOVE=ALL"); + r = MsiInstallProduct(msifile4, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); DeleteFileA(msifile); DeleteFileA(msifile2); DeleteFileA(msifile3); + DeleteFileA(msifile4); } static void test_getproperty(void) @@ -6007,6 +7627,8 @@ static void test_appsearch_reglocator(void) BOOL space, version; HKEY hklm, classes; HKEY hkcu, users; + LPSTR pathdata; + LPSTR pathvar; LPCSTR str; LPSTR ptr; LONG res; @@ -6449,12 +8071,28 @@ static void test_appsearch_reglocator(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(prop, "#-42"), "Expected \"#-42\", got \"%s\"\n", prop); - ExpandEnvironmentStringsA("%PATH%", path, MAX_PATH); + size = ExpandEnvironmentStringsA("%PATH%", NULL, 0); + if (size == 0 && GetLastError() == ERROR_INVALID_PARAMETER) + { + /* Workaround for Win95 */ + CHAR tempbuf[1]; + size = ExpandEnvironmentStringsA("%PATH%", tempbuf, 0); + } + pathvar = HeapAlloc(GetProcessHeap(), 0, size); + ExpandEnvironmentStringsA("%PATH%", pathvar, size); - size = MAX_PATH; - r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size); + size = 0; + r = MsiGetPropertyA(hpkg, "SIGPROP4", NULL, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop); + + pathdata = HeapAlloc(GetProcessHeap(), 0, ++size); + r = MsiGetPropertyA(hpkg, "SIGPROP4", pathdata, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(pathdata, pathvar), + "Expected \"%s\", got \"%s\"\n", pathvar, pathdata); + + HeapFree(GetProcessHeap(), 0, pathvar); + HeapFree(GetProcessHeap(), 0, pathdata); size = MAX_PATH; r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size); @@ -6919,6 +8557,42 @@ static void test_appsearch_inilocator(void) DeleteFileA(msifile); } +/* + * MSI AppSearch action on DrLocator table always returns absolute paths. + * If a relative path was set, it returns the first absolute path that + * matches or an empty string if it didn't find anything. + * This helper function replicates this behaviour. + */ +static void search_absolute_directory(LPSTR absolute, LPCSTR relative) +{ + int i, size; + DWORD attr, drives; + + size = lstrlenA(relative); + drives = GetLogicalDrives(); + lstrcpyA(absolute, "A:\\"); + for (i = 0; i < 26; absolute[0] = '\0', i++) + { + if (!(drives & (1 << i))) + continue; + + absolute[0] = 'A' + i; + if (GetDriveType(absolute) != DRIVE_FIXED) + continue; + + lstrcpynA(absolute + 3, relative, size + 1); + attr = GetFileAttributesA(absolute); + if (attr != INVALID_FILE_ATTRIBUTES && + (attr & FILE_ATTRIBUTE_DIRECTORY)) + { + if (absolute[3 + size - 1] != '\\') + lstrcatA(absolute, "\\"); + break; + } + absolute[3] = '\0'; + } +} + static void test_appsearch_drlocator(void) { MSIHANDLE hpkg, hdb; @@ -6981,6 +8655,9 @@ static void test_appsearch_drlocator(void) r = add_appsearch_entry(hdb, "'SIGPROP10', 'NewSignature10'"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = add_appsearch_entry(hdb, "'SIGPROP11', 'NewSignature11'"); + 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); @@ -7034,6 +8711,11 @@ static void test_appsearch_drlocator(void) r = add_drlocator_entry(hdb, path); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + /* no parent, relative empty path, depth 0, no signature */ + sprintf(path, "'NewSignature11', '', '', 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); @@ -7088,7 +8770,7 @@ static void test_appsearch_drlocator(void) ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop); size = MAX_PATH; - sprintf(path, "%s\\", CURR_DIR); + search_absolute_directory(path, CURR_DIR + 3); r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop); @@ -7134,6 +8816,12 @@ static void test_appsearch_drlocator(void) ok(!lstrcmpA(prop, ""), "Expected \"\", got \"%s\"\n", prop); } + size = MAX_PATH; + search_absolute_directory(path, ""); + r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop); + DeleteFileA("FileName1"); DeleteFileA("FileName3.dll"); DeleteFileA("FileName4.dll"); @@ -9738,8 +11426,201 @@ static void test_MsiGetProductProperty(void) DeleteFileA(msifile); } +static void test_MsiSetProperty(void) +{ + MSIHANDLE hpkg, hdb, hrec; + CHAR buf[MAX_PATH]; + LPCSTR query; + DWORD size; + UINT r; + + hpkg = package_from_db(create_package_db()); + ok(hpkg != 0, "Expected a valid package\n"); + + /* invalid hInstall */ + r = MsiSetPropertyA(0, "Prop", "Val"); + ok(r == ERROR_INVALID_HANDLE, + "Expected ERROR_INVALID_HANDLE, got %d\n", r); + + /* invalid hInstall */ + r = MsiSetPropertyA(0xdeadbeef, "Prop", "Val"); + ok(r == ERROR_INVALID_HANDLE, + "Expected ERROR_INVALID_HANDLE, got %d\n", r); + + /* szName is NULL */ + r = MsiSetPropertyA(hpkg, NULL, "Val"); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + + /* both szName and szValue are NULL */ + r = MsiSetPropertyA(hpkg, NULL, NULL); + ok(r == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", r); + + /* szName is empty */ + r = MsiSetPropertyA(hpkg, "", "Val"); + ok(r == ERROR_FUNCTION_FAILED, + "Expected ERROR_FUNCTION_FAILED, got %d\n", r); + + /* szName is empty and szValue is NULL */ + r = MsiSetPropertyA(hpkg, "", NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* set a property */ + r = MsiSetPropertyA(hpkg, "Prop", "Val"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* get the property */ + size = MAX_PATH; + r = MsiGetPropertyA(hpkg, "Prop", buf, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, "Val"), "Expected \"Val\", got \"%s\"\n", buf); + ok(size == 3, "Expected 3, got %d\n", size); + + /* update the property */ + r = MsiSetPropertyA(hpkg, "Prop", "Nuvo"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* get the property */ + size = MAX_PATH; + r = MsiGetPropertyA(hpkg, "Prop", buf, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, "Nuvo"), "Expected \"Nuvo\", got \"%s\"\n", buf); + ok(size == 4, "Expected 4, got %d\n", size); + + hdb = MsiGetActiveDatabase(hpkg); + ok(hdb != 0, "Expected a valid database handle\n"); + + /* set prop is not in the _Property table */ + query = "SELECT * FROM `_Property` WHERE `Property` = 'Prop'"; + r = do_query(hdb, query, &hrec); + ok(r == ERROR_BAD_QUERY_SYNTAX, + "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + /* set prop is not in the Property table */ + query = "SELECT * FROM `Property` WHERE `Property` = 'Prop'"; + r = do_query(hdb, query, &hrec); + ok(r == ERROR_BAD_QUERY_SYNTAX, + "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r); + + MsiCloseHandle(hdb); + + /* szValue is an empty string */ + r = MsiSetPropertyA(hpkg, "Prop", ""); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* try to get the property */ + size = MAX_PATH; + r = MsiGetPropertyA(hpkg, "Prop", buf, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); + ok(size == 0, "Expected 0, got %d\n", size); + + /* reset the property */ + r = MsiSetPropertyA(hpkg, "Prop", "BlueTap"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* delete the property */ + r = MsiSetPropertyA(hpkg, "Prop", NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* try to get the property */ + size = MAX_PATH; + r = MsiGetPropertyA(hpkg, "Prop", buf, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); + ok(size == 0, "Expected 0, got %d\n", size); + + MsiCloseHandle(hpkg); + DeleteFileA(msifile); +} + +static void test_MsiApplyMultiplePatches(void) +{ + UINT r, type = GetDriveType(NULL); + + if (!pMsiApplyMultiplePatchesA) { + win_skip("MsiApplyMultiplePatchesA not found\n"); + return; + } + + r = pMsiApplyMultiplePatchesA(NULL, NULL, NULL); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r); + + r = pMsiApplyMultiplePatchesA("", NULL, NULL); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r); + + r = pMsiApplyMultiplePatchesA(";", NULL, NULL); + todo_wine + { + if (type == DRIVE_FIXED) + ok(r == ERROR_PATH_NOT_FOUND, + "Expected ERROR_PATH_NOT_FOUND, got %u\n", r); + else + ok(r == ERROR_INVALID_NAME, + "Expected ERROR_INVALID_NAME, got %u\n", r); + } + + r = pMsiApplyMultiplePatchesA(" ;", NULL, NULL); + todo_wine + { + if (type == DRIVE_FIXED) + ok(r == ERROR_PATCH_PACKAGE_OPEN_FAILED, + "Expected ERROR_PATCH_PACKAGE_OPEN_FAILED, got %u\n", r); + else + ok(r == ERROR_INVALID_NAME, + "Expected ERROR_INVALID_NAME, got %u\n", r); + } + + r = pMsiApplyMultiplePatchesA(";;", NULL, NULL); + todo_wine + { + if (type == DRIVE_FIXED) + ok(r == ERROR_PATH_NOT_FOUND, + "Expected ERROR_PATH_NOT_FOUND, got %u\n", r); + else + ok(r == ERROR_INVALID_NAME, + "Expected ERROR_INVALID_NAME, got %u\n", r); + } + + r = pMsiApplyMultiplePatchesA("nosuchpatchpackage;", NULL, NULL); + todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r); + + r = pMsiApplyMultiplePatchesA(";nosuchpatchpackage", NULL, NULL); + todo_wine + { + if (type == DRIVE_FIXED) + ok(r == ERROR_PATH_NOT_FOUND, + "Expected ERROR_PATH_NOT_FOUND, got %u\n", r); + else + ok(r == ERROR_INVALID_NAME, + "Expected ERROR_INVALID_NAME, got %u\n", r); + } + + r = pMsiApplyMultiplePatchesA("nosuchpatchpackage;nosuchpatchpackage", NULL, NULL); + todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r); + + r = pMsiApplyMultiplePatchesA(" nosuchpatchpackage ; nosuchpatchpackage ", NULL, NULL); + todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r); +} + +static void test_MsiApplyPatch(void) +{ + UINT r; + + r = MsiApplyPatch(NULL, NULL, INSTALLTYPE_DEFAULT, NULL); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r); + + r = MsiApplyPatch("", NULL, INSTALLTYPE_DEFAULT, NULL); + ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r); +} + START_TEST(package) { + HMODULE hmsi = GetModuleHandleA("msi.dll"); + + pMsiApplyMultiplePatchesA = (void *)GetProcAddress(hmsi, "MsiApplyMultiplePatchesA"); + GetCurrentDirectoryA(MAX_PATH, CURR_DIR); test_createpackage(); @@ -9770,4 +11651,7 @@ START_TEST(package) test_access(); test_emptypackage(); test_MsiGetProductProperty(); + test_MsiSetProperty(); + test_MsiApplyMultiplePatches(); + test_MsiApplyPatch(); } diff --git a/rostests/winetests/msi/record.c b/rostests/winetests/msi/record.c index 29a57a04f30..e8dd6f55596 100644 --- a/rostests/winetests/msi/record.c +++ b/rostests/winetests/msi/record.c @@ -24,6 +24,8 @@ #include "wine/test.h" +static const char *msifile = "winetest.msi"; + static BOOL create_temp_file(char *name) { UINT r; @@ -120,15 +122,45 @@ static void test_msirecord(void) r = MsiRecordGetInteger(h, 0); ok(r == 1, "failed to get integer\n"); - /* same record, but add a string to it */ + /* same record, but add a null or empty string to it */ r = MsiRecordSetString(h, 0, NULL); ok(r == ERROR_SUCCESS, "Failed to set null string at 0\n"); r = MsiRecordIsNull(h, 0); ok(r == TRUE, "null string not null field\n"); + r = MsiRecordDataSize(h, 0); + ok(r == 0, "size of string record is strlen\n"); + buf[0] = 0; + sz = sizeof buf; + r = MsiRecordGetStringA(h, 0, buf, &sz); + ok(r == ERROR_SUCCESS, "Failed to get string at 0\n"); + ok(buf[0] == 0, "MsiRecordGetStringA returned the wrong string\n"); + ok(sz == 0, "MsiRecordGetStringA returned the wrong length\n"); + bufW[0] = 0; + sz = sizeof bufW / sizeof bufW[0]; + r = MsiRecordGetStringW(h, 0, bufW, &sz); + ok(r == ERROR_SUCCESS, "Failed to get string at 0\n"); + ok(bufW[0] == 0, "MsiRecordGetStringW returned the wrong string\n"); + ok(sz == 0, "MsiRecordGetStringW returned the wrong length\n"); r = MsiRecordSetString(h, 0, ""); ok(r == ERROR_SUCCESS, "Failed to set empty string at 0\n"); r = MsiRecordIsNull(h, 0); ok(r == TRUE, "null string not null field\n"); + r = MsiRecordDataSize(h, 0); + ok(r == 0, "size of string record is strlen\n"); + buf[0] = 0; + sz = sizeof buf; + r = MsiRecordGetStringA(h, 0, buf, &sz); + ok(r == ERROR_SUCCESS, "Failed to get string at 0\n"); + ok(buf[0] == 0, "MsiRecordGetStringA returned the wrong string\n"); + ok(sz == 0, "MsiRecordGetStringA returned the wrong length\n"); + bufW[0] = 0; + sz = sizeof bufW / sizeof bufW[0]; + r = MsiRecordGetStringW(h, 0, bufW, &sz); + ok(r == ERROR_SUCCESS, "Failed to get string at 0\n"); + ok(bufW[0] == 0, "MsiRecordGetStringW returned the wrong string\n"); + ok(sz == 0, "MsiRecordGetStringW returned the wrong length\n"); + + /* same record, but add a string to it */ r = MsiRecordSetString(h,0,str); ok(r == ERROR_SUCCESS, "Failed to set string at 0\n"); r = MsiRecordGetInteger(h, 0); @@ -443,9 +475,143 @@ static void test_MsiRecordGetInteger(void) MsiCloseHandle(rec); } +static void test_fieldzero(void) +{ + MSIHANDLE hdb, hview, rec; + CHAR buf[MAX_PATH]; + LPCSTR query; + DWORD sz; + UINT r; + + rec = MsiCreateRecord(1); + ok(rec != 0, "Expected a valid handle\n"); + + r = MsiRecordGetInteger(rec, 0); + ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "apple"); + r = MsiRecordGetString(rec, 0, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); + ok(sz == 0, "Expectd 0, got %d\n", sz); + + r = MsiRecordIsNull(rec, 0); + ok(r == TRUE, "Expected TRUE, got %d\n", r); + + r = MsiRecordGetInteger(rec, 1); + ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); + + r = MsiRecordSetInteger(rec, 1, 42); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiRecordGetInteger(rec, 0); + ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "apple"); + r = MsiRecordGetString(rec, 0, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); + ok(sz == 0, "Expectd 0, got %d\n", sz); + + r = MsiRecordIsNull(rec, 0); + ok(r == TRUE, "Expected TRUE, got %d\n", r); + + r = MsiRecordGetInteger(rec, 1); + ok(r == 42, "Expected 42, got %d\n", r); + + r = MsiRecordSetString(rec, 1, "bologna"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiRecordGetInteger(rec, 0); + ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "apple"); + r = MsiRecordGetString(rec, 0, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); + ok(sz == 0, "Expectd 0, got %d\n", sz); + + r = MsiRecordIsNull(rec, 0); + ok(r == TRUE, "Expected TRUE, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "apple"); + r = MsiRecordGetString(rec, 1, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, "bologna"), "Expected \"bologna\", got \"%s\"\n", buf); + ok(sz == 7, "Expectd 7, got %d\n", sz); + + MsiCloseHandle(rec); + + r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb); + ok(r == ERROR_SUCCESS, "MsiOpenDatabase failed\n"); + + query = "CREATE TABLE `drone` ( " + "`id` INT, `name` CHAR(32), `number` CHAR(32) " + "PRIMARY KEY `id`)"; + r = MsiDatabaseOpenView(hdb, query, &hview); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = MsiViewExecute(hview, 0); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = MsiViewClose(hview); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); + r = MsiCloseHandle(hview); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + + query = "INSERT INTO `drone` ( `id`, `name`, `number` )" + "VALUES('1', 'Abe', '8675309')"; + r = MsiDatabaseOpenView(hdb, query, &hview); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + r = MsiViewExecute(hview, 0); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + r = MsiViewClose(hview); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); + r = MsiCloseHandle(hview); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + + r = MsiDatabaseGetPrimaryKeysA(hdb, "drone", &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiRecordGetInteger(rec, 0); + ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); + + sz = MAX_PATH; + lstrcpyA(buf, "apple"); + r = MsiRecordGetString(rec, 0, buf, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(buf, "drone"), "Expected \"drone\", got \"%s\"\n", buf); + ok(sz == 5, "Expectd 5, got %d\n", sz); + + r = MsiRecordIsNull(rec, 0); + ok(r == FALSE, "Expected FALSE, got %d\n", r); + + MsiCloseHandle(rec); + + query = "SELECT * FROM `drone` WHERE `id` = 1"; + r = MsiDatabaseOpenView(hdb, query, &hview); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = MsiViewExecute(hview, 0); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = MsiViewFetch(hview, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiRecordGetInteger(rec, 0); + ok(r != MSI_NULL_INTEGER && r != 0, "Expected non-NULL value, got %d\n", r); + + r = MsiRecordIsNull(rec, 0); + ok(r == FALSE, "Expected FALSE, got %d\n", r); + + MsiCloseHandle(hdb); + DeleteFileA(msifile); +} + START_TEST(record) { test_msirecord(); test_MsiRecordGetString(); test_MsiRecordGetInteger(); + test_fieldzero(); } diff --git a/rostests/winetests/msi/source.c b/rostests/winetests/msi/source.c index b508a15a03b..2e9e3ff3e5d 100644 --- a/rostests/winetests/msi/source.c +++ b/rostests/winetests/msi/source.c @@ -27,10 +27,12 @@ #include #include #include +#include #include "wine/test.h" static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*); +static BOOLEAN (WINAPI *pGetUserNameExA)(EXTENDED_NAME_FORMAT, LPSTR, PULONG); static UINT (WINAPI *pMsiSourceListAddMediaDiskA) (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPCSTR, LPCSTR); static UINT (WINAPI *pMsiSourceListAddSourceExA) @@ -51,6 +53,7 @@ static void init_functionpointers(void) { HMODULE hmsi = GetModuleHandleA("msi.dll"); HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); + HMODULE hsecur32 = LoadLibraryA("secur32.dll"); #define GET_PROC(dll, func) \ p ## func = (void *)GetProcAddress(dll, #func); \ @@ -67,6 +70,8 @@ static void init_functionpointers(void) GET_PROC(hadvapi32, ConvertSidToStringSidA) + GET_PROC(hsecur32, GetUserNameExA) + #undef GET_PROC } @@ -3139,11 +3144,17 @@ static void test_MsiSourceListAddSource(void) /* MACHINENAME\username */ size = MAX_PATH; - GetComputerNameA(username, &size); - lstrcatA(username, "\\"); - ptr = username + lstrlenA(username); - size = MAX_PATH; - GetUserNameA(ptr, &size); + if (pGetUserNameExA != NULL) + pGetUserNameExA(NameSamCompatible, username, &size); + else + { + GetComputerNameA(username, &size); + lstrcatA(username, "\\"); + ptr = username + lstrlenA(username); + size = MAX_PATH - (ptr - username); + GetUserNameA(ptr, &size); + } + trace("username: %s\n", username); /* GetLastError is not set by the function */ diff --git a/rostests/winetests/msvcrt/data.c b/rostests/winetests/msvcrt/data.c index a981c876cb9..40ff46b21d1 100644 --- a/rostests/winetests/msvcrt/data.c +++ b/rostests/winetests/msvcrt/data.c @@ -67,13 +67,51 @@ static void test_initterm(void) initterm_test(&callbacks[0], &callbacks[3], 2); } +static void test_initvar( HMODULE hmsvcrt ) +{ + OSVERSIONINFO osvi = { sizeof(OSVERSIONINFO) }; + int* (*pp_winver)() = (int*(*)())GetProcAddress(hmsvcrt, "__p__winver"); + int* (*pp_winmajor)() = (int*(*)())GetProcAddress(hmsvcrt, "__p__winmajor"); + int* (*pp_winminor)() = (int*(*)())GetProcAddress(hmsvcrt, "__p__winminor"); + int* (*pp_osver)() = (int*(*)())GetProcAddress(hmsvcrt, "__p__osver"); + int winver, winmajor, winminor, osver; + + if( !( pp_winmajor && pp_winminor && pp_winver)) { + win_skip("_winver variables are not available\n"); + return; + } + winver = *pp_winver(); + winminor = *pp_winminor(); + winmajor = *pp_winmajor(); + GetVersionEx( &osvi); + ok( winminor == osvi.dwMinorVersion, "Wrong value for _winminor %02x expected %02x\n", + winminor, osvi.dwMinorVersion); + ok( winmajor == osvi.dwMajorVersion, "Wrong value for _winmajor %02x expected %02x\n", + winmajor, osvi.dwMajorVersion); + ok( winver == ((osvi.dwMajorVersion << 8) | osvi.dwMinorVersion), + "Wrong value for _winver %02x expected %02x\n", + winver, ((osvi.dwMajorVersion << 8) | osvi.dwMinorVersion)); + if( !pp_osver) { + win_skip("_osver variables are not available\n"); + return; + } + osver = *pp_osver(); + ok( osver == (osvi.dwBuildNumber & 0xffff) || + ((osvi.dwBuildNumber >> 24) == osvi.dwMajorVersion && + ((osvi.dwBuildNumber >> 16) & 0xff) == osvi.dwMinorVersion), /* 95/98/ME */ + "Wrong value for _osver %04x expected %04x\n", + osver, osvi.dwBuildNumber); +} + START_TEST(data) { HMODULE hmsvcrt; + hmsvcrt = GetModuleHandleA("msvcrt.dll"); if (!hmsvcrt) hmsvcrt = GetModuleHandleA("msvcrtd.dll"); if (hmsvcrt) p_initterm=(void*)GetProcAddress(hmsvcrt, "_initterm"); test_initterm(); + test_initvar(hmsvcrt); } diff --git a/rostests/winetests/msvcrt/printf.c b/rostests/winetests/msvcrt/printf.c index d25734e195e..66bab153f6b 100644 --- a/rostests/winetests/msvcrt/printf.c +++ b/rostests/winetests/msvcrt/printf.c @@ -698,6 +698,90 @@ static void test_fcvt(void) ok( 0 == sign, "sign wrong\n"); } +static struct { + double value; + int nrdigits; + const char *expstr_e; + const char *expstr_f; + int expdecpt_e; + int expdecpt_f; + int expsign; +} test_cvt_testcases[] = { + { 45.0, 2, "45", "4500", 2, 2, 0 }, + /* Numbers less than 1.0 with different precisions */ + { 0.0001, 1, "1", "", -3, -3, 0 }, + { 0.0001, -10, "", "", -3, -3, 0 }, + { 0.0001, 10,"1000000000", "1000000", -3, -3, 0 }, + /* Basic sign test */ + { -111.0001, 5, "11100", "11100010", 3, 3, 1 }, + { 111.0001, 5, "11100", "11100010", 3, 3, 0 }, + /* big numbers with low precision */ + { 3333.3, 2, "33", "333330", 4, 4, 0 }, + {999999999999.9, 3, "100","999999999999900", 13, 12, 0 }, + /* 0.0 with different precisions */ + { 0.0, 5, "00000", "00000", 0, 0, 0 }, + { 0.0, 0, "", "", 0, 0, 0 }, + { 0.0, -1, "", "", 0, 0, 0 }, + /* Numbers > 1.0 with 0 or -ve precision */ + { -123.0001, 0, "", "123", 3, 3, 1 }, + { -123.0001, -1, "", "12", 3, 3, 1 }, + { -123.0001, -2, "", "1", 3, 3, 1 }, + { -123.0001, -3, "", "", 3, 3, 1 }, + /* Numbers > 1.0, but with rounding at the point of precision */ + { 99.99, 1, "1", "1000", 3, 3, 0 }, + /* Numbers < 1.0 where rounding occurs at the point of precision */ + { 0.0063, 2, "63", "1", -2, -1, 0 }, + { 0.0063, 3, "630", "6", -2, -2, 0 }, + { 0.09999999996, 2, "10", "10", 0, 0, 0 }, + { 0.6, 1, "6", "6", 0, 0, 0 }, + { 0.6, 0, "", "1", 1, 1, 0 }, + { 0.4, 0, "", "", 0, 0, 0 }, + { 0.49, 0, "", "", 0, 0, 0 }, + { 0.51, 0, "", "1", 1, 1, 0 }, + /* ask ridiculous amunt of precision, ruin formatting this table */ + { 1.0, 30, "100000000000000000000000000000", + "1000000000000000000000000000000", 1, 1, 0}, + { 123456789012345678901.0, 30, "123456789012345680000000000000", + "123456789012345680000000000000000000000000000000000", 21, 21, 0}, + /* end marker */ + { 0, 0, "END"} +}; + +static void test_xcvt(void) +{ + char *str; + int i, decpt, sign; + for( i = 0; strcmp( test_cvt_testcases[i].expstr_e, "END"); i++){ + decpt = sign = 100; + str = _ecvt( test_cvt_testcases[i].value, + test_cvt_testcases[i].nrdigits, + &decpt, + &sign); + ok( 0 == strncmp( str, test_cvt_testcases[i].expstr_e, 15), + "_ecvt() bad return, got \n'%s' expected \n'%s'\n", str, + test_cvt_testcases[i].expstr_e); + ok( decpt == test_cvt_testcases[i].expdecpt_e, + "_ecvt() decimal point wrong, got %d expected %d\n", decpt, + test_cvt_testcases[i].expdecpt_e); + } + for( i = 0; strcmp( test_cvt_testcases[i].expstr_e, "END"); i++){ + decpt = sign = 100; + str = _fcvt( test_cvt_testcases[i].value, + test_cvt_testcases[i].nrdigits, + &decpt, + &sign); + ok( 0 == strncmp( str, test_cvt_testcases[i].expstr_f, 15), + "_fcvt() bad return, got \n'%s' expected \n'%s'\n", str, + test_cvt_testcases[i].expstr_f); + ok( decpt == test_cvt_testcases[i].expdecpt_f, + "_fcvt() decimal point wrong, got %d expected %d\n", decpt, + test_cvt_testcases[i].expdecpt_f); + ok( sign == test_cvt_testcases[i].expsign, + "_ecvt() sign wrong, got %d expected %d\n", sign, + test_cvt_testcases[i].expsign); + } +} + static int _vsnwprintf_wrapper(wchar_t *str, size_t len, const wchar_t *format, ...) { int ret; @@ -726,11 +810,60 @@ static void test_vsnwprintf(void) ok( !strcmp(buf, "onetwothree"), "got %s expected 'onetwothree'\n", buf ); } +static int (*p__vscprintf)(const char *format, __ms_va_list valist); +static int (*p__vscwprintf)(const wchar_t *format, __ms_va_list valist); + +static int __cdecl _vscprintf_wrapper(const char *format, ...) +{ + int ret; + __ms_va_list valist; + __ms_va_start(valist, format); + ret = p__vscprintf(format, valist); + __ms_va_end(valist); + return ret; +} + +static void test_vscprintf(void) +{ + int ret; + + ret = _vscprintf_wrapper( "%s %d", "number", 1 ); + ok( ret == 8, "got %d expected 8\n", ret ); +} + +static int __cdecl _vscwprintf_wrapper(const wchar_t *format, ...) +{ + int ret; + __ms_va_list valist; + __ms_va_start(valist, format); + ret = p__vscwprintf(format, valist); + __ms_va_end(valist); + return ret; +} + +static void test_vscwprintf(void) +{ + const wchar_t format[] = {'%','s',' ','%','d',0}; + const wchar_t number[] = {'n','u','m','b','e','r',0}; + + int ret; + + ret = _vscwprintf_wrapper( format, number, 1 ); + ok( ret == 8, "got %d expected 8\n", ret ); +} + START_TEST(printf) { test_sprintf(); test_swprintf(); test_snprintf(); test_fcvt(); + test_xcvt(); test_vsnwprintf(); + + p__vscprintf = (void *)GetProcAddress(GetModuleHandle("msvcrt.dll"), "_vscprintf"); + p__vscwprintf = (void *)GetProcAddress(GetModuleHandle("msvcrt.dll"), "_vscwprintf"); + + if (p__vscprintf) test_vscprintf(); + if (p__vscwprintf) test_vscwprintf(); } diff --git a/rostests/winetests/msvcrt/string.c b/rostests/winetests/msvcrt/string.c index 45c40d5dc4b..3286e91bc71 100644 --- a/rostests/winetests/msvcrt/string.c +++ b/rostests/winetests/msvcrt/string.c @@ -619,6 +619,50 @@ static void test_mbcjisjms(void) } while(jisjms[i++][0] != 0); } +static const struct { + const char* string; + const char* delimiter; + int exp_offsetret1; /* returned offset from string after first call to strtok() + -1 means NULL */ + int exp_offsetret2; /* returned offset from string after second call to strtok() + -1 means NULL */ + int exp_offsetret3; /* returned offset from string after third call to strtok() + -1 means NULL */ +} testcases_strtok[] = { + { "red cabernet", " ", 0, 4, -1 }, + { "sparkling white riesling", " ", 0, 10, 16 }, + { " pale cream sherry", "e ", 1, 6, 9 }, + /* end mark */ + { 0} +}; + +static void test_strtok(void) +{ + int i; + char *strret; + char teststr[100]; + for( i = 0; testcases_strtok[i].string; i++){ + strcpy( teststr, testcases_strtok[i].string); + strret = strtok( teststr, testcases_strtok[i].delimiter); + ok( (int)(strret - teststr) == testcases_strtok[i].exp_offsetret1 || + (!strret && testcases_strtok[i].exp_offsetret1 == -1), + "string (%p) \'%s\' return %p\n", + teststr, testcases_strtok[i].string, strret); + if( !strret) continue; + strret = strtok( NULL, testcases_strtok[i].delimiter); + ok( (int)(strret - teststr) == testcases_strtok[i].exp_offsetret2 || + (!strret && testcases_strtok[i].exp_offsetret2 == -1), + "second call string (%p) \'%s\' return %p\n", + teststr, testcases_strtok[i].string, strret); + if( !strret) continue; + strret = strtok( NULL, testcases_strtok[i].delimiter); + ok( (int)(strret - teststr) == testcases_strtok[i].exp_offsetret3 || + (!strret && testcases_strtok[i].exp_offsetret3 == -1), + "third call string (%p) \'%s\' return %p\n", + teststr, testcases_strtok[i].string, strret); + } +} + START_TEST(string) { char mem[100]; @@ -660,6 +704,6 @@ START_TEST(string) test_strcat_s(); test__mbsnbcpy_s(); test_mbcjisjms(); - + test_strtok(); test_wcscpy_s(); } diff --git a/rostests/winetests/msvfw32/msvfw.c b/rostests/winetests/msvfw32/msvfw.c index 537c230ffeb..b0d820815a1 100644 --- a/rostests/winetests/msvfw32/msvfw.c +++ b/rostests/winetests/msvfw32/msvfw.c @@ -42,12 +42,22 @@ static void test_OpenCase(void) ok(ICClose(h)==ICERR_OK,"ICClose failed\n"); } h = ICOpen(mmioFOURCC('V','I','D','C'),mmioFOURCC('m','s','v','c'),ICMODE_DECOMPRESS); - todo_wine ok(0!=h,"ICOpen(VIDC.msvc) failed\n"); + ok(0!=h,"ICOpen(VIDC.msvc) failed\n"); if (h) { ok(ICClose(h)==ICERR_OK,"ICClose failed\n"); } h = ICOpen(mmioFOURCC('V','I','D','C'),mmioFOURCC('M','S','V','C'),ICMODE_DECOMPRESS); - todo_wine ok(0!=h,"ICOpen(VIDC.MSVC) failed\n"); + ok(0!=h,"ICOpen(VIDC.MSVC) failed\n"); + if (h) { + ok(ICClose(h)==ICERR_OK,"ICClose failed\n"); + } + h = ICOpen(mmioFOURCC('v','i','d','c'),mmioFOURCC('m','S','v','C'),ICMODE_DECOMPRESS); + ok(0!=h,"ICOpen(vidc.mSvC) failed\n"); + if (h) { + ok(ICClose(h)==ICERR_OK,"ICClose failed\n"); + } + h = ICOpen(mmioFOURCC('v','I','d','C'),mmioFOURCC('m','s','v','c'),ICMODE_DECOMPRESS); + ok(0!=h,"ICOpen(vIdC.msvc) failed\n"); if (h) { ok(ICClose(h)==ICERR_OK,"ICClose failed\n"); } diff --git a/rostests/winetests/msxml3/domdoc.c b/rostests/winetests/msxml3/domdoc.c index c70e6edb3e2..18b9576cbbc 100644 --- a/rostests/winetests/msxml3/domdoc.c +++ b/rostests/winetests/msxml3/domdoc.c @@ -376,7 +376,7 @@ static char *list_to_string(IXMLDOMNodeList *list) { static char buf[4096]; char *pos = buf; - long len = 0; + LONG len = 0; int i; if (list == NULL) @@ -418,8 +418,8 @@ static void test_domdoc( void ) VARIANT_BOOL b; VARIANT var; BSTR str; - long code; - long nLength = 0; + LONG code; + LONG nLength = 0; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -571,7 +571,7 @@ static void test_domdoc( void ) r = IXMLDOMParseError_get_errorCode( error, &code ); ok( r == S_FALSE, "returns %08x\n", r ); - ok( code == 0, "code %ld\n", code ); + ok( code == 0, "code %d\n", code ); IXMLDOMParseError_Release( error ); /* test createTextNode */ @@ -618,7 +618,7 @@ static void test_domdoc( void ) r = IXMLDOMText_get_length(nodetext, &nLength); ok(r == S_OK, "ret %08x\n", r ); - ok(nLength == 4, "expected 4 got %ld\n", nLength); + ok(nLength == 4, "expected 4 got %d\n", nLength); /* test nodeTypeString */ r = IXMLDOMText_get_nodeTypeString(nodetext, &str); @@ -909,7 +909,7 @@ static void test_domnode( void ) VARIANT_BOOL b; BSTR str; VARIANT var; - long count; + LONG count; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -1244,7 +1244,7 @@ todo_wine r = IXMLDOMNodeList_get_length( list, &count ); ok( r == S_OK, "get_length returns %08x\n", r ); - ok( count == 4, "get_length got %ld\n", count ); + ok( count == 4, "get_length got %d\n", count ); r = IXMLDOMNodeList_nextNode(list, NULL); ok(r == E_INVALIDARG, "Exected E_INVALIDARG got %08x\n", r); @@ -1439,7 +1439,7 @@ static void test_create(void) IXMLDOMNamedNodeMap *attr_map; IUnknown *unk; LONG ref; - long num; + LONG num; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -1536,7 +1536,7 @@ static void test_create(void) ok( r == S_OK, "returns %08x\n", r ); r = IXMLDOMNamedNodeMap_get_length( attr_map, &num ); ok( r == S_OK, "returns %08x\n", r ); - ok( num == 0, "num %ld\n", num ); + ok( num == 0, "num %d\n", num ); IXMLDOMNamedNodeMap_Release( attr_map ); V_VT(&var) = VT_BSTR; @@ -1548,7 +1548,7 @@ static void test_create(void) ok( r == S_OK, "returns %08x\n", r ); r = IXMLDOMNamedNodeMap_get_length( attr_map, &num ); ok( r == S_OK, "returns %08x\n", r ); - ok( num == 1, "num %ld\n", num ); + ok( num == 1, "num %d\n", num ); IXMLDOMNamedNodeMap_Release( attr_map ); VariantClear(&var); @@ -1560,7 +1560,7 @@ static void test_create(void) ok( r == S_OK, "returns %08x\n", r ); r = IXMLDOMNamedNodeMap_get_length( attr_map, &num ); ok( r == S_OK, "returns %08x\n", r ); - ok( num == 1, "num %ld\n", num ); + ok( num == 1, "num %d\n", num ); IXMLDOMNamedNodeMap_Release( attr_map ); VariantClear(&var); r = IXMLDOMElement_getAttribute( element, name, &var ); @@ -1578,7 +1578,7 @@ static void test_create(void) ok( r == S_OK, "returns %08x\n", r ); r = IXMLDOMNamedNodeMap_get_length( attr_map, &num ); ok( r == S_OK, "returns %08x\n", r ); - ok( num == 2, "num %ld\n", num ); + ok( num == 2, "num %d\n", num ); IXMLDOMNamedNodeMap_Release( attr_map ); VariantClear(&var); SysFreeString(name); @@ -1626,7 +1626,7 @@ static void test_getElementsByTagName(void) IXMLDOMDocument *doc; IXMLDOMNodeList *node_list; IDispatchEx *dispex; - long len; + LONG len; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -1644,7 +1644,7 @@ static void test_getElementsByTagName(void) ok( r == S_OK, "ret %08x\n", r ); r = IXMLDOMNodeList_get_length( node_list, &len ); ok( r == S_OK, "ret %08x\n", r ); - ok( len == 6, "len %ld\n", len ); + ok( len == 6, "len %d\n", len ); r = IXMLDOMNodeList_QueryInterface( node_list, &IID_IDispatchEx, (void**)&dispex ); ok( r == S_OK, "rets %08x\n", r); @@ -1692,7 +1692,7 @@ static void test_getElementsByTagName(void) ok( r == S_OK, "ret %08x\n", r ); r = IXMLDOMNodeList_get_length( node_list, &len ); ok( r == S_OK, "ret %08x\n", r ); - ok( len == 1, "len %ld\n", len ); + ok( len == 1, "len %d\n", len ); IXMLDOMNodeList_Release( node_list ); SysFreeString( str ); @@ -1701,7 +1701,7 @@ static void test_getElementsByTagName(void) ok( r == S_OK, "ret %08x\n", r ); r = IXMLDOMNodeList_get_length( node_list, &len ); ok( r == S_OK, "ret %08x\n", r ); - ok( len == 0, "len %ld\n", len ); + ok( len == 0, "len %d\n", len ); IXMLDOMNodeList_Release( node_list ); SysFreeString( str ); @@ -1710,7 +1710,7 @@ static void test_getElementsByTagName(void) ok( r == S_OK, "ret %08x\n", r ); r = IXMLDOMNodeList_get_length( node_list, &len ); ok( r == S_OK, "ret %08x\n", r ); - ok( len == 0, "len %ld\n", len ); + ok( len == 0, "len %d\n", len ); IXMLDOMNodeList_Release( node_list ); SysFreeString( str ); @@ -1727,7 +1727,7 @@ static void test_get_text(void) IXMLDOMNode *nodeRoot; IXMLDOMNodeList *node_list; IXMLDOMNamedNodeMap *node_map; - long len; + LONG len; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -1769,7 +1769,7 @@ static void test_get_text(void) r = IXMLDOMNodeList_get_length( node_list, &len ); ok( r == S_OK, "ret %08x\n", r ); - ok( len == 1, "expect 1 got %ld\n", len ); + ok( len == 1, "expect 1 got %d\n", len ); r = IXMLDOMNodeList_get_item( node_list, 0, NULL ); ok( r == E_INVALIDARG, "ret %08x\n", r ); @@ -1828,7 +1828,7 @@ static void test_get_childNodes(void) IXMLDOMElement *element; IXMLDOMNode *node, *node2; IXMLDOMNodeList *node_list, *node_list2; - long len; + LONG len; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -1849,7 +1849,7 @@ static void test_get_childNodes(void) r = IXMLDOMNodeList_get_length( node_list, &len ); ok( r == S_OK, "ret %08x\n", r); - ok( len == 4, "len %ld\n", len); + ok( len == 4, "len %d\n", len); r = IXMLDOMNodeList_get_item( node_list, 2, &node ); ok( r == S_OK, "ret %08x\n", r); @@ -1859,7 +1859,7 @@ static void test_get_childNodes(void) r = IXMLDOMNodeList_get_length( node_list2, &len ); ok( r == S_OK, "ret %08x\n", r); - ok( len == 0, "len %ld\n", len); + ok( len == 0, "len %d\n", len); r = IXMLDOMNodeList_get_item( node_list2, 0, &node2); ok( r == S_FALSE, "ret %08x\n", r); @@ -1968,7 +1968,7 @@ static void test_replaceChild(void) IXMLDOMNode *fo_node, *ba_node, *lc_node, *removed_node, *temp_node; IXMLDOMNodeList *root_list, *fo_list; IUnknown * unk1, *unk2; - long len; + LONG len; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -2056,7 +2056,7 @@ static void test_replaceChild(void) r = IXMLDOMNodeList_get_length( fo_list, &len); ok( r == S_OK, "ret %08x\n", r ); - ok( len == 0, "len %ld\n", len); + ok( len == 0, "len %d\n", len); IXMLDOMNodeList_Release( fo_list ); @@ -2077,7 +2077,7 @@ static void test_removeNamedItem(void) IXMLDOMNamedNodeMap * pr_attrs; VARIANT_BOOL b; BSTR str; - long len; + LONG len; HRESULT r; r = CoCreateInstance( &CLSID_DOMDocument, NULL, @@ -2105,7 +2105,7 @@ static void test_removeNamedItem(void) r = IXMLDOMNamedNodeMap_get_length( pr_attrs, &len ); ok( r == S_OK, "ret %08x\n", r); - ok( len == 3, "length %ld\n", len); + ok( len == 3, "length %d\n", len); removed_node = (void*)0xdeadbeef; r = IXMLDOMNamedNodeMap_removeNamedItem( pr_attrs, NULL, &removed_node); @@ -2124,7 +2124,7 @@ static void test_removeNamedItem(void) r = IXMLDOMNamedNodeMap_get_length( pr_attrs, &len ); ok( r == S_OK, "ret %08x\n", r); - ok( len == 2, "length %ld\n", len); + ok( len == 2, "length %d\n", len); r = IXMLDOMNamedNodeMap_setNamedItem( pr_attrs, removed_node, NULL); ok ( r == S_OK, "ret %08x\n", r); @@ -2132,14 +2132,14 @@ static void test_removeNamedItem(void) r = IXMLDOMNamedNodeMap_get_length( pr_attrs, &len ); ok( r == S_OK, "ret %08x\n", r); - ok( len == 3, "length %ld\n", len); + ok( len == 3, "length %d\n", len); r = IXMLDOMNamedNodeMap_removeNamedItem( pr_attrs, str, NULL); ok ( r == S_OK, "ret %08x\n", r); r = IXMLDOMNamedNodeMap_get_length( pr_attrs, &len ); ok( r == S_OK, "ret %08x\n", r); - ok( len == 2, "length %ld\n", len); + ok( len == 2, "length %d\n", len); r = IXMLDOMNamedNodeMap_removeNamedItem( pr_attrs, str, NULL); ok ( r == S_FALSE, "ret %08x\n", r); @@ -2400,8 +2400,8 @@ static void test_cloneNode(void ) VARIANT_BOOL b; IXMLDOMNodeList *pList; IXMLDOMNamedNodeMap *mapAttr; - long nLength = 0, nLength1 = 0; - long nAttrCnt = 0, nAttrCnt1 = 0; + LONG nLength = 0, nLength1 = 0; + LONG nAttrCnt = 0, nAttrCnt1 = 0; IXMLDOMNode *node; IXMLDOMNode *node_clone; IXMLDOMNode *node_first; @@ -2495,8 +2495,8 @@ static void test_cloneNode(void ) IXMLDOMNamedNodeMap_Release(mapAttr); } - ok(nLength == nLength1, "wrong Child count (%ld, %ld)\n", nLength, nLength1); - ok(nAttrCnt == nAttrCnt1, "wrong Attribute count (%ld, %ld)\n", nAttrCnt, nAttrCnt1); + ok(nLength == nLength1, "wrong Child count (%d, %d)\n", nLength, nLength1); + ok(nAttrCnt == nAttrCnt1, "wrong Attribute count (%d, %d)\n", nAttrCnt, nAttrCnt1); IXMLDOMNode_Release(node_clone); /* No Children */ @@ -2530,7 +2530,7 @@ static void test_cloneNode(void ) if (pList) { IXMLDOMNodeList_get_length(pList, &nLength1); - ok( nLength1 == 0, "Length should be 0 (%ld)\n", nLength1); + ok( nLength1 == 0, "Length should be 0 (%d)\n", nLength1); IXMLDOMNodeList_Release(pList); } @@ -2539,12 +2539,12 @@ static void test_cloneNode(void ) if(mapAttr) { IXMLDOMNamedNodeMap_get_length(mapAttr, &nAttrCnt1); - ok( nAttrCnt1 == 3, "Attribute count should be 3 (%ld)\n", nAttrCnt1); + ok( nAttrCnt1 == 3, "Attribute count should be 3 (%d)\n", nAttrCnt1); IXMLDOMNamedNodeMap_Release(mapAttr); } - ok(nLength != nLength1, "wrong Child count (%ld, %ld)\n", nLength, nLength1); - ok(nAttrCnt == nAttrCnt1, "wrong Attribute count (%ld, %ld)\n", nAttrCnt, nAttrCnt1); + ok(nLength != nLength1, "wrong Child count (%d, %d)\n", nLength, nLength1); + ok(nAttrCnt == nAttrCnt1, "wrong Attribute count (%d, %d)\n", nAttrCnt, nAttrCnt1); IXMLDOMNode_Release(node_clone); @@ -2568,7 +2568,7 @@ static void test_xmlTypes(void) BSTR str; IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1; /* Used for testing Siblings */ VARIANT v; - long len = 0; + LONG len = 0; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); if( hr != S_OK ) @@ -2744,7 +2744,7 @@ static void test_xmlTypes(void) /* test length property */ hr = IXMLDOMComment_get_length(pComment, &len); ok(hr == S_OK, "ret %08x\n", hr ); - ok(len == 21, "expected 21 got %ld\n", len); + ok(len == 21, "expected 21 got %d\n", len); /* test substringData */ hr = IXMLDOMComment_substringData(pComment, 0, 4, NULL); @@ -3072,7 +3072,7 @@ static void test_xmlTypes(void) /* test length property */ hr = IXMLDOMCDATASection_get_length(pCDataSec, &len); ok(hr == S_OK, "ret %08x\n", hr ); - ok(len == 21, "expected 21 got %ld\n", len); + ok(len == 21, "expected 21 got %d\n", len); /* test get nodeValue */ hr = IXMLDOMCDATASection_get_nodeValue(pCDataSec, &var); diff --git a/rostests/winetests/msxml3/xmldoc.c b/rostests/winetests/msxml3/xmldoc.c index 5c1c4f87f5b..d2d99fc23f1 100644 --- a/rostests/winetests/msxml3/xmldoc.c +++ b/rostests/winetests/msxml3/xmldoc.c @@ -61,7 +61,7 @@ static void test_xmldoc(void) LPVOID ptr; DWORD file_size, read; CHAR path[MAX_PATH]; - long type, num_child; + LONG type, num_child; VARIANT vIndex, vName; BSTR name = NULL; @@ -121,7 +121,7 @@ static void test_xmldoc(void) hr = IXMLElement_get_type(element, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); hr = IXMLElement_get_tagName(element, &name); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -134,7 +134,7 @@ static void test_xmldoc(void) hr = IXMLElementCollection_get_length(collection, &num_child); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(num_child == 2, "Expected 2, got %ld\n", num_child); + ok(num_child == 2, "Expected 2, got %d\n", num_child); V_VT(&vIndex) = VT_I4; V_I4(&vIndex) = 0; @@ -146,7 +146,7 @@ static void test_xmldoc(void) hr = IXMLElement_get_type(child, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); hr = IXMLElement_get_tagName(child, &name); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -159,7 +159,7 @@ static void test_xmldoc(void) hr = IXMLElementCollection_get_length(inner, &num_child); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(num_child == 1, "Expected 1, got %ld\n", num_child); + ok(num_child == 1, "Expected 1, got %d\n", num_child); hr = IXMLElementCollection_item(inner, vIndex, vName, (IDispatch **)&value); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -167,7 +167,7 @@ static void test_xmldoc(void) hr = IXMLElement_get_type(value, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_TEXT, "Expected XMLELEMTYPE_TEXT, got %ld\n", type); + ok(type == XMLELEMTYPE_TEXT, "Expected XMLELEMTYPE_TEXT, got %d\n", type); hr = IXMLElement_get_text(value, &name); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -193,7 +193,7 @@ static void test_xmldoc(void) hr = IXMLElement_get_type(child, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); hr = IXMLElement_get_tagName(child, &name); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -206,7 +206,7 @@ static void test_xmldoc(void) hr = IXMLElementCollection_get_length(inner, &num_child); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(num_child == 1, "Expected 1, got %ld\n", num_child); + ok(num_child == 1, "Expected 1, got %d\n", num_child); V_I4(&vIndex) = 0; hr = IXMLElementCollection_item(inner, vIndex, vName, (IDispatch **)&value); @@ -215,7 +215,7 @@ static void test_xmldoc(void) hr = IXMLElement_get_type(value, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_TEXT, "Expected XMLELEMTYPE_TEXT, got %ld\n", type); + ok(type == XMLELEMTYPE_TEXT, "Expected XMLELEMTYPE_TEXT, got %d\n", type); hr = IXMLElement_get_text(value, &name); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -247,7 +247,7 @@ static void test_createElement(void) IXMLDocument *doc = NULL; IXMLElement *element = NULL, *root = NULL; VARIANT vType, vName; - long type; + LONG type; hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (LPVOID*)&doc); @@ -280,7 +280,7 @@ static void test_createElement(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); /* SP7 returns an XMLELEMTYPE_ELEMENT */ ok(type == XMLELEMTYPE_OTHER || type == XMLELEMTYPE_ELEMENT, - "Expected XMLELEMTYPE_OTHER || XMLELEMTYPE_ELEMENT, got %ld\n", type); + "Expected XMLELEMTYPE_OTHER || XMLELEMTYPE_ELEMENT, got %d\n", type); IXMLElement_Release(element); } @@ -301,7 +301,7 @@ static void test_createElement(void) hr = IXMLElement_get_type(element, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); IXMLElement_Release(element); diff --git a/rostests/winetests/msxml3/xmlelem.c b/rostests/winetests/msxml3/xmlelem.c index f0b195da485..1738b2ce50b 100644 --- a/rostests/winetests/msxml3/xmlelem.c +++ b/rostests/winetests/msxml3/xmlelem.c @@ -42,7 +42,7 @@ static void test_xmlelem(void) VARIANT vType, vName; VARIANT vIndex, vValue; BSTR str, val; - long type, num_child; + LONG type, num_child; static const WCHAR propName[] = {'p','r','o','p',0}; static const WCHAR propVal[] = {'v','a','l',0}; @@ -136,7 +136,7 @@ static void test_xmlelem(void) hr = IXMLElement_get_type(element, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); hr = IXMLElement_get_text(element, &str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -171,7 +171,7 @@ static void test_xmlelem(void) hr = IXMLElement_get_type(parent, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); children = (IXMLElementCollection *)0xdeadbeef; hr = IXMLElement_get_children(element, &children); @@ -180,7 +180,7 @@ static void test_xmlelem(void) hr = IXMLElementCollection_get_length(children, &num_child); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(num_child == 1, "Expected 1, got %ld\n", num_child); + ok(num_child == 1, "Expected 1, got %d\n", num_child); V_VT(&vIndex) = VT_I4; V_I4(&vIndex) = 0; @@ -192,7 +192,7 @@ static void test_xmlelem(void) hr = IXMLElement_get_type(child2, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_TEXT, "Expected XMLELEMTYPE_TEXT, got %ld\n", type); + ok(type == XMLELEMTYPE_TEXT, "Expected XMLELEMTYPE_TEXT, got %d\n", type); hr = IXMLElement_get_text(element, &str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -255,7 +255,7 @@ static void test_xmlelem_collection(void) IEnumVARIANT *enumVar = NULL; CHAR pathA[MAX_PATH]; WCHAR path[MAX_PATH]; - long length, type; + LONG length, type; ULONG num_vars; VARIANT var, vIndex, vName; BSTR url, str; @@ -296,7 +296,7 @@ static void test_xmlelem_collection(void) hr = IXMLElementCollection_get_length(collection, &length); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(length == 2, "Expected 2, got %ld\n", length); + ok(length == 2, "Expected 2, got %d\n", length); /* IXMLElementCollection:put_length does nothing */ hr = IXMLElementCollection_put_length(collection, -1); @@ -320,7 +320,7 @@ static void test_xmlelem_collection(void) /* make sure the length hasn't changed */ hr = IXMLElementCollection_get_length(collection, &length); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(length == 2, "Expected 2, got %ld\n", length); + ok(length == 2, "Expected 2, got %d\n", length); /* IXMLElementCollection implements IEnumVARIANT */ hr = IXMLElementCollection_QueryInterface(collection, &IID_IEnumVARIANT, (LPVOID *)&enumVar); @@ -351,7 +351,7 @@ static void test_xmlelem_collection(void) hr = IXMLElement_get_type(child, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); hr = IXMLElement_get_tagName(child, &str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -373,7 +373,7 @@ static void test_xmlelem_collection(void) hr = IXMLElement_get_type(child, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); hr = IXMLElement_get_tagName(child, &str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -392,7 +392,7 @@ static void test_xmlelem_collection(void) hr = IXMLElement_get_type(child, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); hr = IXMLElement_get_tagName(child, &str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -411,7 +411,7 @@ static void test_xmlelem_collection(void) hr = IXMLElement_get_type(child, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %ld\n", type); + ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); hr = IXMLElement_get_tagName(child, &str); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); diff --git a/rostests/winetests/netapi32/apibuf.c b/rostests/winetests/netapi32/apibuf.c index 2438ecd7e44..0972e76569a 100644 --- a/rostests/winetests/netapi32/apibuf.c +++ b/rostests/winetests/netapi32/apibuf.c @@ -42,12 +42,12 @@ static void run_apibuf_tests(void) NET_API_STATUS res; /* test normal logic */ - ok(pNetApiBufferAllocate(1024, (LPVOID *)&p) == NERR_Success, + ok(pNetApiBufferAllocate(1024, &p) == NERR_Success, "Reserved memory\n"); ok(pNetApiBufferSize(p, &dwSize) == NERR_Success, "Got size\n"); ok(dwSize >= 1024, "The size is correct\n"); - ok(pNetApiBufferReallocate(p, 1500, (LPVOID *) &p) == NERR_Success, + ok(pNetApiBufferReallocate(p, 1500, &p) == NERR_Success, "Reallocated\n"); ok(pNetApiBufferSize(p, &dwSize) == NERR_Success, "Got size\n"); ok(dwSize >= 1500, "The size is correct\n"); @@ -58,14 +58,14 @@ static void run_apibuf_tests(void) ok(pNetApiBufferSize(NULL, &dwSize) == ERROR_INVALID_PARAMETER, "Error for NULL pointer\n"); /* border reallocate cases */ - ok(pNetApiBufferReallocate(0, 1500, (LPVOID *) &p) == NERR_Success, "Reallocate with OldBuffer = NULL failed\n"); + ok(pNetApiBufferReallocate(0, 1500, &p) == NERR_Success, "Reallocate with OldBuffer = NULL failed\n"); ok(p != NULL, "No memory got allocated\n"); - ok(pNetApiBufferAllocate(1024, (LPVOID *)&p) == NERR_Success, "Memory not reserved\n"); - ok(pNetApiBufferReallocate(p, 0, (LPVOID *) &p) == NERR_Success, "Not freed\n"); + ok(pNetApiBufferAllocate(1024, &p) == NERR_Success, "Memory not reserved\n"); + ok(pNetApiBufferReallocate(p, 0, &p) == NERR_Success, "Not freed\n"); ok(p == NULL, "Pointer not cleared\n"); - + /* 0-length buffer */ - ok(pNetApiBufferAllocate(0, (LPVOID *)&p) == NERR_Success, + ok(pNetApiBufferAllocate(0, &p) == NERR_Success, "Reserved memory\n"); ok(pNetApiBufferSize(p, &dwSize) == NERR_Success, "Got size\n"); ok(dwSize < 0xFFFFFFFF, "The size of the 0-length buffer\n"); diff --git a/rostests/winetests/ntdll/atom.c b/rostests/winetests/ntdll/atom.c index 7526654fcb8..220ea40482f 100755 --- a/rostests/winetests/ntdll/atom.c +++ b/rostests/winetests/ntdll/atom.c @@ -295,7 +295,7 @@ static void test_NtIntAtom(void) RTL_ATOM_TABLE AtomTable; RTL_ATOM testAtom; ULONG RefCount = 0, PinCount = 0; - int i; + INT_PTR i; WCHAR Name[64]; ULONG Len; @@ -311,25 +311,25 @@ static void test_NtIntAtom(void) ok(res == STATUS_INVALID_PARAMETER, "Didn't get expected result from adding 0 int atom, retval: %x\n", res); for (i = 1; i <= 0xbfff; i++) { - res = pRtlAddAtomToAtomTable(AtomTable, (PWSTR)i, &testAtom); - ok(!res, "Unable to add valid integer atom %i, retval: %x\n", i, res); + res = pRtlAddAtomToAtomTable(AtomTable, (LPWSTR)i, &testAtom); + ok(!res, "Unable to add valid integer atom %li, retval: %x\n", i, res); } for (i = 1; i <= 0xbfff; i++) { - res = pRtlLookupAtomInAtomTable(AtomTable, (PWSTR)i, &testAtom); - ok(!res, "Unable to find int atom %i, retval: %x\n", i, res); + res = pRtlLookupAtomInAtomTable(AtomTable, (LPWSTR)i, &testAtom); + ok(!res, "Unable to find int atom %li, retval: %x\n", i, res); if (!res) { res = pRtlPinAtomInAtomTable(AtomTable, testAtom); - ok(!res, "Unable to pin int atom %i, retval: %x\n", i, res); + ok(!res, "Unable to pin int atom %li, retval: %x\n", i, res); } } for (i = 0xc000; i <= 0xffff; i++) { - res = pRtlAddAtomToAtomTable(AtomTable, (PWSTR)i, &testAtom); - ok(res, "Able to illeageal integer atom %i, retval: %x\n", i, res); + res = pRtlAddAtomToAtomTable(AtomTable, (LPWSTR)i, &testAtom); + ok(res, "Able to illeageal integer atom %li, retval: %x\n", i, res); } res = pRtlDestroyAtomTable(AtomTable); diff --git a/rostests/winetests/ntdll/change.c b/rostests/winetests/ntdll/change.c index d3ba58fc1c1..f395962ec23 100644 --- a/rostests/winetests/ntdll/change.c +++ b/rostests/winetests/ntdll/change.c @@ -318,7 +318,7 @@ START_TEST(change) HMODULE hntdll = GetModuleHandle("ntdll"); if (!hntdll) { - skip("not running on NT, skipping test\n"); + win_skip("not running on NT, skipping test\n"); return; } @@ -329,7 +329,7 @@ START_TEST(change) if (!pNtNotifyChangeDirectoryFile || !pNtCancelIoFile) { - skip("missing functions, skipping test\n"); + win_skip("missing functions, skipping test\n"); return; } diff --git a/rostests/winetests/ntdll/env.c b/rostests/winetests/ntdll/env.c index 92f654e7674..82898412643 100755 --- a/rostests/winetests/ntdll/env.c +++ b/rostests/winetests/ntdll/env.c @@ -86,11 +86,12 @@ static void testQuery(void) WCHAR bv[257]; UNICODE_STRING name; UNICODE_STRING value; - const struct test* test; NTSTATUS nts; + unsigned int i; - for (test = tests; test->var; test++) + for (i = 0; tests[i].var; i++) { + const struct test *test = &tests[i]; name.Length = strlen(test->var) * 2; name.MaximumLength = name.Length + 2; name.Buffer = bn; @@ -103,7 +104,7 @@ static void testQuery(void) nts = pRtlQueryEnvironmentVariable_U(small_env, &name, &value); ok( nts == test->status || (test->alt && nts == test->alt), "[%d]: Wrong status for '%s', expecting %x got %x\n", - test - tests, test->var, test->status, nts ); + i, test->var, test->status, nts ); if (nts == test->status) switch (nts) { case STATUS_SUCCESS: diff --git a/rostests/winetests/ntdll/exception.c b/rostests/winetests/ntdll/exception.c index e5c2bd43709..6ed641c6dad 100644 --- a/rostests/winetests/ntdll/exception.c +++ b/rostests/winetests/ntdll/exception.c @@ -206,14 +206,12 @@ static LONG CALLBACK rtlraiseexception_vectored_handler(EXCEPTION_POINTERS *Exce trace("vect. handler %08x addr:%p context.Eip:%x\n", rec->ExceptionCode, rec->ExceptionAddress, context->Eip); - todo_wine { ok(rec->ExceptionAddress == (char *)code_mem + 0xb, "ExceptionAddress at %p instead of %p\n", 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", context->Eax, pRtlRaiseException); - } /* check that context.Eip is fixed up only for EXCEPTION_BREAKPOINT * even if raised by RtlRaiseException @@ -242,10 +240,8 @@ static DWORD rtlraiseexception_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTR trace( "exception: %08x flags:%x addr:%p context: Eip:%x\n", rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, context->Eip ); - todo_wine { ok(rec->ExceptionAddress == (char *)code_mem + 0xb, "ExceptionAddress at %p instead of %p\n", rec->ExceptionAddress, (char *)code_mem + 0xb); - } /* check that context.Eip is fixed up only for EXCEPTION_BREAKPOINT * even if raised by RtlRaiseException @@ -320,6 +316,8 @@ static void run_rtlraiseexception_test(DWORD exceptioncode) } func(pRtlRaiseException, &record); + ok( record.ExceptionAddress == (char *)code_mem + 0x0b, + "address set to %p instead of %p\n", record.ExceptionAddress, (char *)code_mem + 0x0b ); if (have_vectored_api) pRtlRemoveVectoredExceptionHandler(vectored_handler); @@ -841,6 +839,82 @@ static void test_simd_exceptions(void) ok( got_exception == 1, "got exception: %i, should be 1\n", got_exception); } +struct fpu_exception_info +{ + DWORD exception_code; + DWORD exception_offset; + DWORD eip_offset; +}; + +static DWORD fpu_exception_handler(EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher) +{ + struct fpu_exception_info *info = *(struct fpu_exception_info **)(frame + 1); + + info->exception_code = rec->ExceptionCode; + info->exception_offset = (BYTE *)rec->ExceptionAddress - (BYTE *)code_mem; + info->eip_offset = context->Eip - (DWORD)code_mem; + + ++context->Eip; + return ExceptionContinueExecution; +} + +static void test_fpu_exceptions(void) +{ + static const BYTE fpu_exception_test_ie[] = + { + 0x83, 0xec, 0x04, /* sub $0x4,%esp */ + 0x66, 0xc7, 0x04, 0x24, 0xfe, 0x03, /* movw $0x3fe,(%esp) */ + 0x9b, 0xd9, 0x7c, 0x24, 0x02, /* fstcw 0x2(%esp) */ + 0xd9, 0x2c, 0x24, /* fldcw (%esp) */ + 0xd9, 0xee, /* fldz */ + 0xd9, 0xe8, /* fld1 */ + 0xde, 0xf1, /* fdivp */ + 0xdd, 0xd8, /* fstp %st(0) */ + 0xdd, 0xd8, /* fstp %st(0) */ + 0x9b, /* fwait */ + 0xdb, 0xe2, /* fnclex */ + 0xd9, 0x6c, 0x24, 0x02, /* fldcw 0x2(%esp) */ + 0x83, 0xc4, 0x04, /* add $0x4,%esp */ + 0xc3, /* ret */ + }; + + static const BYTE fpu_exception_test_de[] = + { + 0x83, 0xec, 0x04, /* sub $0x4,%esp */ + 0x66, 0xc7, 0x04, 0x24, 0xfb, 0x03, /* movw $0x3fb,(%esp) */ + 0x9b, 0xd9, 0x7c, 0x24, 0x02, /* fstcw 0x2(%esp) */ + 0xd9, 0x2c, 0x24, /* fldcw (%esp) */ + 0xdd, 0xd8, /* fstp %st(0) */ + 0xd9, 0xee, /* fldz */ + 0xd9, 0xe8, /* fld1 */ + 0xde, 0xf1, /* fdivp */ + 0x9b, /* fwait */ + 0xdb, 0xe2, /* fnclex */ + 0xdd, 0xd8, /* fstp %st(0) */ + 0xdd, 0xd8, /* fstp %st(0) */ + 0xd9, 0x6c, 0x24, 0x02, /* fldcw 0x2(%esp) */ + 0x83, 0xc4, 0x04, /* add $0x4,%esp */ + 0xc3, /* ret */ + }; + + struct fpu_exception_info info; + + memset(&info, 0, sizeof(info)); + run_exception_test(fpu_exception_handler, &info, fpu_exception_test_ie, sizeof(fpu_exception_test_ie)); + 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.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)); + 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.eip_offset == 0x19, "Got EIP offset %#x, expected 0x19\n", info.eip_offset); +} + #endif /* __i386__ */ START_TEST(exception) @@ -918,6 +992,7 @@ START_TEST(exception) test_rtlraiseexception(); test_debugger(); test_simd_exceptions(); + test_fpu_exceptions(); VirtualFree(code_mem, 1024, MEM_RELEASE); #endif diff --git a/rostests/winetests/ntdll/file.c b/rostests/winetests/ntdll/file.c index e4f1d0a5f1f..164c2da2430 100644 --- a/rostests/winetests/ntdll/file.c +++ b/rostests/winetests/ntdll/file.c @@ -108,7 +108,7 @@ static long get_pending_msgs(HANDLE h) NTSTATUS res; ULONG a, req; - res = pNtQueryIoCompletion( h, IoCompletionBasicInformation, (PVOID)&a, sizeof(a), &req ); + res = pNtQueryIoCompletion( h, IoCompletionBasicInformation, &a, sizeof(a), &req ); ok( res == STATUS_SUCCESS, "NtQueryIoCompletion failed: %x\n", res ); if (res != STATUS_SUCCESS) return -1; ok( req == sizeof(a), "Unexpected response size: %x\n", req ); diff --git a/rostests/winetests/ntdll/generated.c b/rostests/winetests/ntdll/generated.c index 4818c9e50eb..b7bfa6dd14a 100755 --- a/rostests/winetests/ntdll/generated.c +++ b/rostests/winetests/ntdll/generated.c @@ -1,4 +1,4 @@ -/* File generated automatically from tools/winapi/test.dat; do not edit! */ +/* File generated automatically from tools/winapi/tests.dat; do not edit! */ /* This file can be copied, modified and distributed without restriction. */ /* @@ -27,22 +27,14 @@ * Windows API extension */ -#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) -# define FIELD_ALIGNMENT(type, field) __alignof(((type*)0)->field) -#elif defined(__GNUC__) -# define FIELD_ALIGNMENT(type, field) __alignof__(((type*)0)->field) -#else -/* FIXME: Not sure if is possible to do without compiler extension */ -#endif - #if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) # define _TYPE_ALIGNMENT(type) __alignof(type) #elif defined(__GNUC__) # define _TYPE_ALIGNMENT(type) __alignof__(type) #else /* - * FIXME: Not sure if is possible to do without compiler extension - * (if type is not just a name that is, if so the normal) + * FIXME: May not be possible without a compiler extension + * (if type is not just a name that is, otherwise the normal * TYPE_ALIGNMENT can be used) */ #endif @@ -59,392 +51,517 @@ * Test helper macros */ -#ifdef FIELD_ALIGNMENT -# define TEST_FIELD_ALIGNMENT(type, field, align) \ - ok(FIELD_ALIGNMENT(type, field) == align, \ - "FIELD_ALIGNMENT(" #type ", " #field ") == %d (expected " #align ")\n", \ - (int)FIELD_ALIGNMENT(type, field)) +#ifdef _WIN64 + +# define TEST_TYPE_SIZE(type, size) +# define TEST_TYPE_ALIGN(type, align) +# define TEST_TARGET_ALIGN(type, align) +# define TEST_FIELD_ALIGN(type, field, align) +# define TEST_FIELD_OFFSET(type, field, offset) + #else -# define TEST_FIELD_ALIGNMENT(type, field, align) do { } while (0) + +# 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) \ - ok(FIELD_OFFSET(type, field) == offset, \ - "FIELD_OFFSET(" #type ", " #field ") == %ld (expected " #offset ")\n", \ - (long int)FIELD_OFFSET(type, field)) +#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 _TYPE_ALIGNMENT -#define TEST__TYPE_ALIGNMENT(type, align) \ - ok(_TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)_TYPE_ALIGNMENT(type)) -#else -# define TEST__TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#ifdef TYPE_ALIGNMENT -#define TEST_TYPE_ALIGNMENT(type, align) \ - ok(TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)TYPE_ALIGNMENT(type)) -#else -# define TEST_TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#define TEST_TYPE_SIZE(type, size) \ - ok(sizeof(type) == size, "sizeof(" #type ") == %d (expected " #size ")\n", ((int) sizeof(type))) - -/*********************************************************************** - * Test macros - */ - -#define TEST_FIELD(type, field_type, field_name, field_offset, field_size, field_align) \ - TEST_TYPE_SIZE(field_type, field_size); \ - TEST_FIELD_ALIGNMENT(type, field_name, field_align); \ - TEST_FIELD_OFFSET(type, field_name, field_offset); \ - -#define TEST_TYPE(type, size, align) \ - TEST_TYPE_ALIGNMENT(type, align); \ - TEST_TYPE_SIZE(type, size) - -#define TEST_TYPE_POINTER(type, size, align) \ - TEST__TYPE_ALIGNMENT(*(type)0, align); \ - TEST_TYPE_SIZE(*(type)0, size) - -#define TEST_TYPE_SIGNED(type) \ - ok((type) -1 < 0, "(" #type ") -1 < 0\n"); - -#define TEST_TYPE_UNSIGNED(type) \ - ok((type) -1 > 0, "(" #type ") -1 > 0\n"); static void test_pack_DWORD32(void) { /* DWORD32 */ - TEST_TYPE(DWORD32, 4, 4); - TEST_TYPE_UNSIGNED(DWORD32); + TEST_TYPE_SIZE (DWORD32, 4) + TEST_TYPE_ALIGN (DWORD32, 4) + TEST_TYPE_UNSIGNED(DWORD32) } static void test_pack_DWORD64(void) { /* DWORD64 */ - TEST_TYPE(DWORD64, 8, 8); - TEST_TYPE_UNSIGNED(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(DWORD_PTR, 4, 4); + TEST_TYPE_SIZE (DWORD_PTR, 4) + TEST_TYPE_ALIGN (DWORD_PTR, 4) } static void test_pack_HALF_PTR(void) { /* HALF_PTR */ - TEST_TYPE(HALF_PTR, 2, 2); - TEST_TYPE_SIGNED(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(INT16, 2, 2); - TEST_TYPE_SIGNED(INT16); + TEST_TYPE_SIZE (INT16, 2) + TEST_TYPE_ALIGN (INT16, 2) + TEST_TYPE_SIGNED(INT16) } static void test_pack_INT32(void) { /* INT32 */ - TEST_TYPE(INT32, 4, 4); - TEST_TYPE_SIGNED(INT32); + TEST_TYPE_SIZE (INT32, 4) + TEST_TYPE_ALIGN (INT32, 4) + TEST_TYPE_SIGNED(INT32) } static void test_pack_INT64(void) { /* INT64 */ - TEST_TYPE(INT64, 8, 8); - TEST_TYPE_SIGNED(INT64); + TEST_TYPE_SIZE (INT64, 8) + TEST_TYPE_ALIGN (INT64, 8) + TEST_TYPE_SIGNED(INT64) } static void test_pack_INT8(void) { /* INT8 */ - TEST_TYPE(INT8, 1, 1); - TEST_TYPE_SIGNED(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(INT_PTR, 4, 4); - TEST_TYPE_SIGNED(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(LONG32, 4, 4); - TEST_TYPE_SIGNED(LONG32); + TEST_TYPE_SIZE (LONG32, 4) + TEST_TYPE_ALIGN (LONG32, 4) + TEST_TYPE_SIGNED(LONG32) } static void test_pack_LONG64(void) { /* LONG64 */ - TEST_TYPE(LONG64, 8, 8); - TEST_TYPE_SIGNED(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(LONG_PTR, 4, 4); - TEST_TYPE_SIGNED(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_T, 4, 4); + TEST_TYPE_SIZE (SIZE_T, 4) + TEST_TYPE_ALIGN (SIZE_T, 4) } static void test_pack_SSIZE_T(void) { /* SSIZE_T */ - TEST_TYPE(SSIZE_T, 4, 4); + TEST_TYPE_SIZE (SSIZE_T, 4) + TEST_TYPE_ALIGN (SSIZE_T, 4) } static void test_pack_UHALF_PTR(void) { /* UHALF_PTR */ - TEST_TYPE(UHALF_PTR, 2, 2); - TEST_TYPE_UNSIGNED(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(UINT16, 2, 2); - TEST_TYPE_UNSIGNED(UINT16); + TEST_TYPE_SIZE (UINT16, 2) + TEST_TYPE_ALIGN (UINT16, 2) + TEST_TYPE_UNSIGNED(UINT16) } static void test_pack_UINT32(void) { /* UINT32 */ - TEST_TYPE(UINT32, 4, 4); - TEST_TYPE_UNSIGNED(UINT32); + TEST_TYPE_SIZE (UINT32, 4) + TEST_TYPE_ALIGN (UINT32, 4) + TEST_TYPE_UNSIGNED(UINT32) } static void test_pack_UINT64(void) { /* UINT64 */ - TEST_TYPE(UINT64, 8, 8); - TEST_TYPE_UNSIGNED(UINT64); + TEST_TYPE_SIZE (UINT64, 8) + TEST_TYPE_ALIGN (UINT64, 8) + TEST_TYPE_UNSIGNED(UINT64) } static void test_pack_UINT8(void) { /* UINT8 */ - TEST_TYPE(UINT8, 1, 1); - TEST_TYPE_UNSIGNED(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(UINT_PTR, 4, 4); - TEST_TYPE_UNSIGNED(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(ULONG32, 4, 4); - TEST_TYPE_UNSIGNED(ULONG32); + TEST_TYPE_SIZE (ULONG32, 4) + TEST_TYPE_ALIGN (ULONG32, 4) + TEST_TYPE_UNSIGNED(ULONG32) } static void test_pack_ULONG64(void) { /* ULONG64 */ - TEST_TYPE(ULONG64, 8, 8); - TEST_TYPE_UNSIGNED(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(ULONG_PTR, 4, 4); - TEST_TYPE_UNSIGNED(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 (pack 4) */ - TEST_TYPE(ACCESS_ALLOWED_ACE, 12, 4); - TEST_FIELD(ACCESS_ALLOWED_ACE, ACE_HEADER, Header, 0, 4, 2); - TEST_FIELD(ACCESS_ALLOWED_ACE, DWORD, Mask, 4, 4, 4); - TEST_FIELD(ACCESS_ALLOWED_ACE, DWORD, SidStart, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(ACCESS_DENIED_ACE, 12, 4); - TEST_FIELD(ACCESS_DENIED_ACE, ACE_HEADER, Header, 0, 4, 2); - TEST_FIELD(ACCESS_DENIED_ACE, DWORD, Mask, 4, 4, 4); - TEST_FIELD(ACCESS_DENIED_ACE, DWORD, SidStart, 8, 4, 4); + 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(ACCESS_MASK, 4, 4); - TEST_TYPE_UNSIGNED(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 (pack 4) */ - TEST_TYPE(ACE_HEADER, 4, 2); - TEST_FIELD(ACE_HEADER, BYTE, AceType, 0, 1, 1); - TEST_FIELD(ACE_HEADER, BYTE, AceFlags, 1, 1, 1); - TEST_FIELD(ACE_HEADER, WORD, AceSize, 2, 2, 2); + 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 (pack 4) */ - TEST_TYPE(ACL, 8, 2); - TEST_FIELD(ACL, BYTE, AclRevision, 0, 1, 1); - TEST_FIELD(ACL, BYTE, Sbz1, 1, 1, 1); - TEST_FIELD(ACL, WORD, AclSize, 2, 2, 2); - TEST_FIELD(ACL, WORD, AceCount, 4, 2, 2); - TEST_FIELD(ACL, WORD, Sbz2, 6, 2, 2); + 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 (pack 4) */ - TEST_TYPE(ACL_REVISION_INFORMATION, 4, 4); - TEST_FIELD(ACL_REVISION_INFORMATION, DWORD, AclRevision, 0, 4, 4); + 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 (pack 4) */ - TEST_TYPE(ACL_SIZE_INFORMATION, 12, 4); - TEST_FIELD(ACL_SIZE_INFORMATION, DWORD, AceCount, 0, 4, 4); - TEST_FIELD(ACL_SIZE_INFORMATION, DWORD, AclBytesInUse, 4, 4, 4); - TEST_FIELD(ACL_SIZE_INFORMATION, DWORD, AclBytesFree, 8, 4, 4); + 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(BOOLEAN, 1, 1); - TEST_TYPE_UNSIGNED(BOOLEAN); + TEST_TYPE_SIZE (BOOLEAN, 1) + TEST_TYPE_ALIGN (BOOLEAN, 1) + TEST_TYPE_UNSIGNED(BOOLEAN) } static void test_pack_CCHAR(void) { /* CCHAR */ - TEST_TYPE(CCHAR, 1, 1); - TEST_TYPE_SIGNED(CCHAR); + TEST_TYPE_SIZE (CCHAR, 1) + TEST_TYPE_ALIGN (CCHAR, 1) + TEST_TYPE_SIGNED(CCHAR) } static void test_pack_CHAR(void) { /* CHAR */ - TEST_TYPE(CHAR, 1, 1); - TEST_TYPE_SIGNED(CHAR); + TEST_TYPE_SIZE (CHAR, 1) + TEST_TYPE_ALIGN (CHAR, 1) + TEST_TYPE_SIGNED(CHAR) } static void test_pack_DWORDLONG(void) { /* DWORDLONG */ - TEST_TYPE(DWORDLONG, 8, 8); - TEST_TYPE_UNSIGNED(DWORDLONG); + TEST_TYPE_SIZE (DWORDLONG, 8) + TEST_TYPE_ALIGN (DWORDLONG, 8) + TEST_TYPE_UNSIGNED(DWORDLONG) } static void test_pack_EXCEPTION_POINTERS(void) { /* EXCEPTION_POINTERS (pack 4) */ - TEST_TYPE(EXCEPTION_POINTERS, 8, 4); - TEST_FIELD(EXCEPTION_POINTERS, PEXCEPTION_RECORD, ExceptionRecord, 0, 4, 4); - TEST_FIELD(EXCEPTION_POINTERS, PCONTEXT, ContextRecord, 4, 4, 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) + 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 (pack 4) */ - TEST_TYPE(EXCEPTION_RECORD, 80, 4); - TEST_FIELD(EXCEPTION_RECORD, DWORD, ExceptionCode, 0, 4, 4); - TEST_FIELD(EXCEPTION_RECORD, DWORD, ExceptionFlags, 4, 4, 4); - TEST_FIELD(EXCEPTION_RECORD, struct _EXCEPTION_RECORD *, ExceptionRecord, 8, 4, 4); - TEST_FIELD(EXCEPTION_RECORD, PVOID, ExceptionAddress, 12, 4, 4); - TEST_FIELD(EXCEPTION_RECORD, DWORD, NumberParameters, 16, 4, 4); - TEST_FIELD(EXCEPTION_RECORD, ULONG_PTR[EXCEPTION_MAXIMUM_PARAMETERS], ExceptionInformation, 20, 60, 4); + 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(EXECUTION_STATE, 4, 4); - TEST_TYPE_UNSIGNED(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 (pack 4) */ - TEST_TYPE(FLOATING_SAVE_AREA, 112, 4); - TEST_FIELD(FLOATING_SAVE_AREA, DWORD, ControlWord, 0, 4, 4); - TEST_FIELD(FLOATING_SAVE_AREA, DWORD, StatusWord, 4, 4, 4); - TEST_FIELD(FLOATING_SAVE_AREA, DWORD, TagWord, 8, 4, 4); - TEST_FIELD(FLOATING_SAVE_AREA, DWORD, ErrorOffset, 12, 4, 4); - TEST_FIELD(FLOATING_SAVE_AREA, DWORD, ErrorSelector, 16, 4, 4); - TEST_FIELD(FLOATING_SAVE_AREA, DWORD, DataOffset, 20, 4, 4); - TEST_FIELD(FLOATING_SAVE_AREA, DWORD, DataSelector, 24, 4, 4); - TEST_FIELD(FLOATING_SAVE_AREA, BYTE[SIZE_OF_80387_REGISTERS], RegisterArea, 28, 80, 1); - TEST_FIELD(FLOATING_SAVE_AREA, DWORD, Cr0NpxState, 108, 4, 4); + 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 (pack 4) */ - TEST_TYPE(FPO_DATA, 16, 4); - TEST_FIELD(FPO_DATA, DWORD, ulOffStart, 0, 4, 4); - TEST_FIELD(FPO_DATA, DWORD, cbProcSize, 4, 4, 4); - TEST_FIELD(FPO_DATA, DWORD, cdwLocals, 8, 4, 4); - TEST_FIELD(FPO_DATA, WORD, cdwParams, 12, 2, 2); + 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 (pack 4) */ - TEST_TYPE(GENERIC_MAPPING, 16, 4); - TEST_FIELD(GENERIC_MAPPING, ACCESS_MASK, GenericRead, 0, 4, 4); - TEST_FIELD(GENERIC_MAPPING, ACCESS_MASK, GenericWrite, 4, 4, 4); - TEST_FIELD(GENERIC_MAPPING, ACCESS_MASK, GenericExecute, 8, 4, 4); - TEST_FIELD(GENERIC_MAPPING, ACCESS_MASK, GenericAll, 12, 4, 4); + 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(HANDLE, 4, 4); + TEST_TYPE_SIZE (HANDLE, 4) + TEST_TYPE_ALIGN (HANDLE, 4) } static void test_pack_HRESULT(void) { /* HRESULT */ - TEST_TYPE(HRESULT, 4, 4); + TEST_TYPE_SIZE (HRESULT, 4) + TEST_TYPE_ALIGN (HRESULT, 4) } static void test_pack_IMAGE_ARCHIVE_MEMBER_HEADER(void) { /* IMAGE_ARCHIVE_MEMBER_HEADER (pack 4) */ - TEST_TYPE(IMAGE_ARCHIVE_MEMBER_HEADER, 60, 1); - TEST_FIELD(IMAGE_ARCHIVE_MEMBER_HEADER, BYTE[16], Name, 0, 16, 1); - TEST_FIELD(IMAGE_ARCHIVE_MEMBER_HEADER, BYTE[12], Date, 16, 12, 1); - TEST_FIELD(IMAGE_ARCHIVE_MEMBER_HEADER, BYTE[6], UserID, 28, 6, 1); - TEST_FIELD(IMAGE_ARCHIVE_MEMBER_HEADER, BYTE[6], GroupID, 34, 6, 1); - TEST_FIELD(IMAGE_ARCHIVE_MEMBER_HEADER, BYTE[8], Mode, 40, 8, 1); - TEST_FIELD(IMAGE_ARCHIVE_MEMBER_HEADER, BYTE[10], Size, 48, 10, 1); - TEST_FIELD(IMAGE_ARCHIVE_MEMBER_HEADER, BYTE[2], EndHeader, 58, 2, 1); + 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) @@ -455,146 +572,304 @@ static void test_pack_IMAGE_AUX_SYMBOL(void) static void test_pack_IMAGE_BASE_RELOCATION(void) { /* IMAGE_BASE_RELOCATION (pack 4) */ - TEST_TYPE(IMAGE_BASE_RELOCATION, 8, 4); - TEST_FIELD(IMAGE_BASE_RELOCATION, DWORD, VirtualAddress, 0, 4, 4); - TEST_FIELD(IMAGE_BASE_RELOCATION, DWORD, SizeOfBlock, 4, 4, 4); + 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 (pack 4) */ - TEST_TYPE(IMAGE_BOUND_FORWARDER_REF, 8, 4); - TEST_FIELD(IMAGE_BOUND_FORWARDER_REF, DWORD, TimeDateStamp, 0, 4, 4); - TEST_FIELD(IMAGE_BOUND_FORWARDER_REF, WORD, OffsetModuleName, 4, 2, 2); - TEST_FIELD(IMAGE_BOUND_FORWARDER_REF, WORD, Reserved, 6, 2, 2); + 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 (pack 4) */ - TEST_TYPE(IMAGE_BOUND_IMPORT_DESCRIPTOR, 8, 4); - TEST_FIELD(IMAGE_BOUND_IMPORT_DESCRIPTOR, DWORD, TimeDateStamp, 0, 4, 4); - TEST_FIELD(IMAGE_BOUND_IMPORT_DESCRIPTOR, WORD, OffsetModuleName, 4, 2, 2); - TEST_FIELD(IMAGE_BOUND_IMPORT_DESCRIPTOR, WORD, NumberOfModuleForwarderRefs, 6, 2, 2); + 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 (pack 4) */ - TEST_TYPE(IMAGE_COFF_SYMBOLS_HEADER, 32, 4); - TEST_FIELD(IMAGE_COFF_SYMBOLS_HEADER, DWORD, NumberOfSymbols, 0, 4, 4); - TEST_FIELD(IMAGE_COFF_SYMBOLS_HEADER, DWORD, LvaToFirstSymbol, 4, 4, 4); - TEST_FIELD(IMAGE_COFF_SYMBOLS_HEADER, DWORD, NumberOfLinenumbers, 8, 4, 4); - TEST_FIELD(IMAGE_COFF_SYMBOLS_HEADER, DWORD, LvaToFirstLinenumber, 12, 4, 4); - TEST_FIELD(IMAGE_COFF_SYMBOLS_HEADER, DWORD, RvaToFirstByteOfCode, 16, 4, 4); - TEST_FIELD(IMAGE_COFF_SYMBOLS_HEADER, DWORD, RvaToLastByteOfCode, 20, 4, 4); - TEST_FIELD(IMAGE_COFF_SYMBOLS_HEADER, DWORD, RvaToFirstByteOfData, 24, 4, 4); - TEST_FIELD(IMAGE_COFF_SYMBOLS_HEADER, DWORD, RvaToLastByteOfData, 28, 4, 4); + 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 (pack 4) */ - TEST_TYPE(IMAGE_DATA_DIRECTORY, 8, 4); - TEST_FIELD(IMAGE_DATA_DIRECTORY, DWORD, VirtualAddress, 0, 4, 4); - TEST_FIELD(IMAGE_DATA_DIRECTORY, DWORD, Size, 4, 4, 4); + 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 (pack 4) */ - TEST_TYPE(IMAGE_DEBUG_DIRECTORY, 28, 4); - TEST_FIELD(IMAGE_DEBUG_DIRECTORY, DWORD, Characteristics, 0, 4, 4); - TEST_FIELD(IMAGE_DEBUG_DIRECTORY, DWORD, TimeDateStamp, 4, 4, 4); - TEST_FIELD(IMAGE_DEBUG_DIRECTORY, WORD, MajorVersion, 8, 2, 2); - TEST_FIELD(IMAGE_DEBUG_DIRECTORY, WORD, MinorVersion, 10, 2, 2); - TEST_FIELD(IMAGE_DEBUG_DIRECTORY, DWORD, Type, 12, 4, 4); - TEST_FIELD(IMAGE_DEBUG_DIRECTORY, DWORD, SizeOfData, 16, 4, 4); - TEST_FIELD(IMAGE_DEBUG_DIRECTORY, DWORD, AddressOfRawData, 20, 4, 4); - TEST_FIELD(IMAGE_DEBUG_DIRECTORY, DWORD, PointerToRawData, 24, 4, 4); + 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 (pack 4) */ - TEST_TYPE(IMAGE_DEBUG_MISC, 16, 4); - TEST_FIELD(IMAGE_DEBUG_MISC, DWORD, DataType, 0, 4, 4); - TEST_FIELD(IMAGE_DEBUG_MISC, DWORD, Length, 4, 4, 4); - TEST_FIELD(IMAGE_DEBUG_MISC, BYTE, Unicode, 8, 1, 1); - TEST_FIELD(IMAGE_DEBUG_MISC, BYTE[ 3 ], Reserved, 9, 3, 1); - TEST_FIELD(IMAGE_DEBUG_MISC, BYTE[ 1 ], Data, 12, 1, 1); + 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(IMAGE_DOS_HEADER, 64, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_magic, 0, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_cblp, 2, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_cp, 4, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_crlc, 6, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_cparhdr, 8, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_minalloc, 10, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_maxalloc, 12, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_ss, 14, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_sp, 16, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_csum, 18, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_ip, 20, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_cs, 22, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_lfarlc, 24, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_ovno, 26, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD[4], e_res, 28, 8, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_oemid, 36, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD, e_oeminfo, 38, 2, 2); - TEST_FIELD(IMAGE_DOS_HEADER, WORD[10], e_res2, 40, 20, 2); - TEST_FIELD(IMAGE_DOS_HEADER, DWORD, e_lfanew, 60, 4, 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 (pack 4) */ - TEST_TYPE(IMAGE_EXPORT_DIRECTORY, 40, 4); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, DWORD, Characteristics, 0, 4, 4); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, DWORD, TimeDateStamp, 4, 4, 4); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, WORD, MajorVersion, 8, 2, 2); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, WORD, MinorVersion, 10, 2, 2); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, DWORD, Name, 12, 4, 4); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, DWORD, Base, 16, 4, 4); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, DWORD, NumberOfFunctions, 20, 4, 4); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, DWORD, NumberOfNames, 24, 4, 4); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, DWORD, AddressOfFunctions, 28, 4, 4); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, DWORD, AddressOfNames, 32, 4, 4); - TEST_FIELD(IMAGE_EXPORT_DIRECTORY, DWORD, AddressOfNameOrdinals, 36, 4, 4); + 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 (pack 4) */ - TEST_TYPE(IMAGE_FILE_HEADER, 20, 4); - TEST_FIELD(IMAGE_FILE_HEADER, WORD, Machine, 0, 2, 2); - TEST_FIELD(IMAGE_FILE_HEADER, WORD, NumberOfSections, 2, 2, 2); - TEST_FIELD(IMAGE_FILE_HEADER, DWORD, TimeDateStamp, 4, 4, 4); - TEST_FIELD(IMAGE_FILE_HEADER, DWORD, PointerToSymbolTable, 8, 4, 4); - TEST_FIELD(IMAGE_FILE_HEADER, DWORD, NumberOfSymbols, 12, 4, 4); - TEST_FIELD(IMAGE_FILE_HEADER, WORD, SizeOfOptionalHeader, 16, 2, 2); - TEST_FIELD(IMAGE_FILE_HEADER, WORD, Characteristics, 18, 2, 2); + 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 (pack 4) */ - TEST_TYPE(IMAGE_FUNCTION_ENTRY, 12, 4); - TEST_FIELD(IMAGE_FUNCTION_ENTRY, DWORD, StartingAddress, 0, 4, 4); - TEST_FIELD(IMAGE_FUNCTION_ENTRY, DWORD, EndingAddress, 4, 4, 4); - TEST_FIELD(IMAGE_FUNCTION_ENTRY, DWORD, EndOfPrologue, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(IMAGE_IMPORT_BY_NAME, 4, 2); - TEST_FIELD(IMAGE_IMPORT_BY_NAME, WORD, Hint, 0, 2, 2); - TEST_FIELD(IMAGE_IMPORT_BY_NAME, BYTE[1], Name, 2, 1, 1); + 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) @@ -610,69 +885,172 @@ static void test_pack_IMAGE_LINENUMBER(void) static void test_pack_IMAGE_LOAD_CONFIG_DIRECTORY(void) { /* IMAGE_LOAD_CONFIG_DIRECTORY (pack 4) */ - TEST_TYPE(IMAGE_LOAD_CONFIG_DIRECTORY, 72, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, Size, 0, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, TimeDateStamp, 4, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, WORD, MajorVersion, 8, 2, 2); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, WORD, MinorVersion, 10, 2, 2); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, GlobalFlagsClear, 12, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, GlobalFlagsSet, 16, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, CriticalSectionDefaultTimeout, 20, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, DeCommitFreeBlockThreshold, 24, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, DeCommitTotalFreeThreshold, 28, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, PVOID, LockPrefixTable, 32, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, MaximumAllocationSize, 36, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, VirtualMemoryThreshold, 40, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, ProcessHeapFlags, 44, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, ProcessAffinityMask, 48, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, WORD, CSDVersion, 52, 2, 2); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, WORD, Reserved1, 54, 2, 2); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, PVOID, EditList, 56, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, SecurityCookie, 60, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, SEHandlerTable, 64, 4, 4); - TEST_FIELD(IMAGE_LOAD_CONFIG_DIRECTORY, DWORD, SEHandlerCount, 68, 4, 4); + 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(IMAGE_NT_HEADERS, 248, 4); + TEST_TYPE_SIZE (IMAGE_NT_HEADERS, 248) + TEST_TYPE_ALIGN (IMAGE_NT_HEADERS, 4) } static void test_pack_IMAGE_OS2_HEADER(void) { /* IMAGE_OS2_HEADER (pack 2) */ - TEST_TYPE(IMAGE_OS2_HEADER, 64, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_magic, 0, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, BYTE, ne_ver, 2, 1, 1); - TEST_FIELD(IMAGE_OS2_HEADER, BYTE, ne_rev, 3, 1, 1); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_enttab, 4, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_cbenttab, 6, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, LONG, ne_crc, 8, 4, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_flags, 12, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_autodata, 14, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_heap, 16, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_stack, 18, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, DWORD, ne_csip, 20, 4, 2); - TEST_FIELD(IMAGE_OS2_HEADER, DWORD, ne_sssp, 24, 4, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_cseg, 28, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_cmod, 30, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_cbnrestab, 32, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_segtab, 34, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_rsrctab, 36, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_restab, 38, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_modtab, 40, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_imptab, 42, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, DWORD, ne_nrestab, 44, 4, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_cmovent, 48, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_align, 50, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_cres, 52, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, BYTE, ne_exetyp, 54, 1, 1); - TEST_FIELD(IMAGE_OS2_HEADER, BYTE, ne_flagsothers, 55, 1, 1); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_pretthunks, 56, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_psegrefbytes, 58, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_swaparea, 60, 2, 2); - TEST_FIELD(IMAGE_OS2_HEADER, WORD, ne_expver, 62, 2, 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) @@ -683,23 +1061,45 @@ static void test_pack_IMAGE_RELOCATION(void) static void test_pack_IMAGE_RESOURCE_DATA_ENTRY(void) { /* IMAGE_RESOURCE_DATA_ENTRY (pack 4) */ - TEST_TYPE(IMAGE_RESOURCE_DATA_ENTRY, 16, 4); - TEST_FIELD(IMAGE_RESOURCE_DATA_ENTRY, DWORD, OffsetToData, 0, 4, 4); - TEST_FIELD(IMAGE_RESOURCE_DATA_ENTRY, DWORD, Size, 4, 4, 4); - TEST_FIELD(IMAGE_RESOURCE_DATA_ENTRY, DWORD, CodePage, 8, 4, 4); - TEST_FIELD(IMAGE_RESOURCE_DATA_ENTRY, DWORD, Reserved, 12, 4, 4); + 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 (pack 4) */ - TEST_TYPE(IMAGE_RESOURCE_DIRECTORY, 16, 4); - TEST_FIELD(IMAGE_RESOURCE_DIRECTORY, DWORD, Characteristics, 0, 4, 4); - TEST_FIELD(IMAGE_RESOURCE_DIRECTORY, DWORD, TimeDateStamp, 4, 4, 4); - TEST_FIELD(IMAGE_RESOURCE_DIRECTORY, WORD, MajorVersion, 8, 2, 2); - TEST_FIELD(IMAGE_RESOURCE_DIRECTORY, WORD, MinorVersion, 10, 2, 2); - TEST_FIELD(IMAGE_RESOURCE_DIRECTORY, WORD, NumberOfNamedEntries, 12, 2, 2); - TEST_FIELD(IMAGE_RESOURCE_DIRECTORY, WORD, NumberOfIdEntries, 14, 2, 2); + 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) @@ -710,42 +1110,81 @@ static void test_pack_IMAGE_RESOURCE_DIRECTORY_ENTRY(void) static void test_pack_IMAGE_RESOURCE_DIRECTORY_STRING(void) { /* IMAGE_RESOURCE_DIRECTORY_STRING (pack 4) */ - TEST_TYPE(IMAGE_RESOURCE_DIRECTORY_STRING, 4, 2); - TEST_FIELD(IMAGE_RESOURCE_DIRECTORY_STRING, WORD, Length, 0, 2, 2); - TEST_FIELD(IMAGE_RESOURCE_DIRECTORY_STRING, CHAR[ 1 ], NameString, 2, 1, 1); + 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 (pack 4) */ - TEST_TYPE(IMAGE_RESOURCE_DIR_STRING_U, 4, 2); - TEST_FIELD(IMAGE_RESOURCE_DIR_STRING_U, WORD, Length, 0, 2, 2); - TEST_FIELD(IMAGE_RESOURCE_DIR_STRING_U, WCHAR[ 1 ], NameString, 2, 2, 2); + 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 (pack 4) */ - TEST_FIELD(IMAGE_SECTION_HEADER, BYTE[IMAGE_SIZEOF_SHORT_NAME], Name, 0, 8, 1); + 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 (pack 4) */ - TEST_TYPE(IMAGE_SEPARATE_DEBUG_HEADER, 48, 4); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, WORD, Signature, 0, 2, 2); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, WORD, Flags, 2, 2, 2); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, WORD, Machine, 4, 2, 2); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, WORD, Characteristics, 6, 2, 2); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, DWORD, TimeDateStamp, 8, 4, 4); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, DWORD, CheckSum, 12, 4, 4); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, DWORD, ImageBase, 16, 4, 4); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, DWORD, SizeOfImage, 20, 4, 4); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, DWORD, NumberOfSections, 24, 4, 4); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, DWORD, ExportedNamesSize, 28, 4, 4); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, DWORD, DebugDirectorySize, 32, 4, 4); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, DWORD, SectionAlignment, 36, 4, 4); - TEST_FIELD(IMAGE_SEPARATE_DEBUG_HEADER, DWORD[ 2 ], Reserved, 40, 8, 4); + 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) @@ -761,83 +1200,201 @@ static void test_pack_IMAGE_THUNK_DATA(void) static void test_pack_IMAGE_TLS_DIRECTORY(void) { /* IMAGE_TLS_DIRECTORY */ - TEST_TYPE(IMAGE_TLS_DIRECTORY, 24, 4); + TEST_TYPE_SIZE (IMAGE_TLS_DIRECTORY, 24) + TEST_TYPE_ALIGN (IMAGE_TLS_DIRECTORY, 4) } static void test_pack_IMAGE_VXD_HEADER(void) { /* IMAGE_VXD_HEADER (pack 2) */ - TEST_TYPE(IMAGE_VXD_HEADER, 196, 2); - TEST_FIELD(IMAGE_VXD_HEADER, WORD, e32_magic, 0, 2, 2); - TEST_FIELD(IMAGE_VXD_HEADER, BYTE, e32_border, 2, 1, 1); - TEST_FIELD(IMAGE_VXD_HEADER, BYTE, e32_worder, 3, 1, 1); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_level, 4, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, WORD, e32_cpu, 8, 2, 2); - TEST_FIELD(IMAGE_VXD_HEADER, WORD, e32_os, 10, 2, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_ver, 12, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_mflags, 16, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_mpages, 20, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_startobj, 24, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_eip, 28, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_stackobj, 32, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_esp, 36, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_pagesize, 40, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_lastpagesize, 44, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_fixupsize, 48, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_fixupsum, 52, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_ldrsize, 56, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_ldrsum, 60, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_objtab, 64, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_objcnt, 68, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_objmap, 72, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_itermap, 76, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_rsrctab, 80, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_rsrccnt, 84, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_restab, 88, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_enttab, 92, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_dirtab, 96, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_dircnt, 100, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_fpagetab, 104, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_frectab, 108, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_impmod, 112, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_impmodcnt, 116, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_impproc, 120, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_pagesum, 124, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_datapage, 128, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_preload, 132, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_nrestab, 136, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_cbnrestab, 140, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_nressum, 144, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_autodata, 148, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_debuginfo, 152, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_debuglen, 156, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_instpreload, 160, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_instdemand, 164, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_heapsize, 168, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, BYTE[12], e32_res3, 172, 12, 1); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_winresoff, 184, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, DWORD, e32_winreslen, 188, 4, 2); - TEST_FIELD(IMAGE_VXD_HEADER, WORD, e32_devid, 192, 2, 2); - TEST_FIELD(IMAGE_VXD_HEADER, WORD, e32_ddkver, 194, 2, 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(IO_COUNTERS, 48, 8); - TEST_FIELD(IO_COUNTERS, ULONGLONG, ReadOperationCount, 0, 8, 8); - TEST_FIELD(IO_COUNTERS, ULONGLONG, WriteOperationCount, 8, 8, 8); - TEST_FIELD(IO_COUNTERS, ULONGLONG, OtherOperationCount, 16, 8, 8); - TEST_FIELD(IO_COUNTERS, ULONGLONG, ReadTransferCount, 24, 8, 8); - TEST_FIELD(IO_COUNTERS, ULONGLONG, WriteTransferCount, 32, 8, 8); - TEST_FIELD(IO_COUNTERS, ULONGLONG, OtherTransferCount, 40, 8, 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(LANGID, 2, 2); - TEST_TYPE_UNSIGNED(LANGID); + TEST_TYPE_SIZE (LANGID, 2) + TEST_TYPE_ALIGN (LANGID, 2) + TEST_TYPE_UNSIGNED(LANGID) } static void test_pack_LARGE_INTEGER(void) @@ -848,955 +1405,1361 @@ static void test_pack_LARGE_INTEGER(void) static void test_pack_LCID(void) { /* LCID */ - TEST_TYPE(LCID, 4, 4); - TEST_TYPE_UNSIGNED(LCID); + TEST_TYPE_SIZE (LCID, 4) + TEST_TYPE_ALIGN (LCID, 4) + TEST_TYPE_UNSIGNED(LCID) } static void test_pack_LIST_ENTRY(void) { /* LIST_ENTRY (pack 4) */ - TEST_TYPE(LIST_ENTRY, 8, 4); - TEST_FIELD(LIST_ENTRY, struct _LIST_ENTRY *, Flink, 0, 4, 4); - TEST_FIELD(LIST_ENTRY, struct _LIST_ENTRY *, Blink, 4, 4, 4); + TEST_TYPE_SIZE (LIST_ENTRY, 8) + TEST_TYPE_ALIGN (LIST_ENTRY, 4) + TEST_FIELD_SIZE (LIST_ENTRY, Flink, 4) + TEST_FIELD_ALIGN (LIST_ENTRY, Flink, 4) + TEST_FIELD_OFFSET(LIST_ENTRY, Flink, 0) + TEST_FIELD_SIZE (LIST_ENTRY, Blink, 4) + TEST_FIELD_ALIGN (LIST_ENTRY, Blink, 4) + TEST_FIELD_OFFSET(LIST_ENTRY, Blink, 4) } static void test_pack_LONG(void) { /* LONG */ - TEST_TYPE(LONG, 4, 4); - TEST_TYPE_SIGNED(LONG); + TEST_TYPE_SIZE (LONG, 4) + TEST_TYPE_ALIGN (LONG, 4) + TEST_TYPE_SIGNED(LONG) } static void test_pack_LONGLONG(void) { /* LONGLONG */ - TEST_TYPE(LONGLONG, 8, 8); - TEST_TYPE_SIGNED(LONGLONG); + TEST_TYPE_SIZE (LONGLONG, 8) + TEST_TYPE_ALIGN (LONGLONG, 8) + TEST_TYPE_SIGNED(LONGLONG) } static void test_pack_LUID(void) { /* LUID (pack 4) */ - TEST_TYPE(LUID, 8, 4); - TEST_FIELD(LUID, DWORD, LowPart, 0, 4, 4); - TEST_FIELD(LUID, LONG, HighPart, 4, 4, 4); + 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(LUID_AND_ATTRIBUTES, 12, 4); - TEST_FIELD(LUID_AND_ATTRIBUTES, LUID, Luid, 0, 8, 4); - TEST_FIELD(LUID_AND_ATTRIBUTES, DWORD, Attributes, 8, 4, 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 (pack 4) */ - TEST_TYPE(MEMORY_BASIC_INFORMATION, 28, 4); - TEST_FIELD(MEMORY_BASIC_INFORMATION, LPVOID, BaseAddress, 0, 4, 4); - TEST_FIELD(MEMORY_BASIC_INFORMATION, LPVOID, AllocationBase, 4, 4, 4); - TEST_FIELD(MEMORY_BASIC_INFORMATION, DWORD, AllocationProtect, 8, 4, 4); - TEST_FIELD(MEMORY_BASIC_INFORMATION, SIZE_T, RegionSize, 12, 4, 4); - TEST_FIELD(MEMORY_BASIC_INFORMATION, DWORD, State, 16, 4, 4); - TEST_FIELD(MEMORY_BASIC_INFORMATION, DWORD, Protect, 20, 4, 4); - TEST_FIELD(MEMORY_BASIC_INFORMATION, DWORD, Type, 24, 4, 4); + TEST_TYPE_SIZE (MEMORY_BASIC_INFORMATION, 28) + TEST_TYPE_ALIGN (MEMORY_BASIC_INFORMATION, 4) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, BaseAddress, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, BaseAddress, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, BaseAddress, 0) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, AllocationBase, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, AllocationBase, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, AllocationBase, 4) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, AllocationProtect, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, AllocationProtect, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, AllocationProtect, 8) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, RegionSize, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, RegionSize, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, RegionSize, 12) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, State, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, State, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, State, 16) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, Protect, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, Protect, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, Protect, 20) + TEST_FIELD_SIZE (MEMORY_BASIC_INFORMATION, Type, 4) + TEST_FIELD_ALIGN (MEMORY_BASIC_INFORMATION, Type, 4) + TEST_FIELD_OFFSET(MEMORY_BASIC_INFORMATION, Type, 24) } static void test_pack_MESSAGE_RESOURCE_BLOCK(void) { /* MESSAGE_RESOURCE_BLOCK (pack 4) */ - TEST_TYPE(MESSAGE_RESOURCE_BLOCK, 12, 4); - TEST_FIELD(MESSAGE_RESOURCE_BLOCK, DWORD, LowId, 0, 4, 4); - TEST_FIELD(MESSAGE_RESOURCE_BLOCK, DWORD, HighId, 4, 4, 4); - TEST_FIELD(MESSAGE_RESOURCE_BLOCK, DWORD, OffsetToEntries, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(MESSAGE_RESOURCE_DATA, 16, 4); - TEST_FIELD(MESSAGE_RESOURCE_DATA, DWORD, NumberOfBlocks, 0, 4, 4); - TEST_FIELD(MESSAGE_RESOURCE_DATA, MESSAGE_RESOURCE_BLOCK[ 1 ], Blocks, 4, 12, 4); + 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 (pack 4) */ - TEST_TYPE(MESSAGE_RESOURCE_ENTRY, 6, 2); - TEST_FIELD(MESSAGE_RESOURCE_ENTRY, WORD, Length, 0, 2, 2); - TEST_FIELD(MESSAGE_RESOURCE_ENTRY, WORD, Flags, 2, 2, 2); - TEST_FIELD(MESSAGE_RESOURCE_ENTRY, BYTE[1], Text, 4, 1, 1); + 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 (pack 4) */ - TEST_FIELD(NT_TIB, struct _EXCEPTION_REGISTRATION_RECORD *, ExceptionList, 0, 4, 4); - TEST_FIELD(NT_TIB, PVOID, StackBase, 4, 4, 4); - TEST_FIELD(NT_TIB, PVOID, StackLimit, 8, 4, 4); - TEST_FIELD(NT_TIB, PVOID, SubSystemTib, 12, 4, 4); + TEST_FIELD_SIZE (NT_TIB, ExceptionList, 4) + TEST_FIELD_ALIGN (NT_TIB, ExceptionList, 4) + TEST_FIELD_OFFSET(NT_TIB, ExceptionList, 0) + TEST_FIELD_SIZE (NT_TIB, StackBase, 4) + TEST_FIELD_ALIGN (NT_TIB, StackBase, 4) + TEST_FIELD_OFFSET(NT_TIB, StackBase, 4) + TEST_FIELD_SIZE (NT_TIB, StackLimit, 4) + TEST_FIELD_ALIGN (NT_TIB, StackLimit, 4) + TEST_FIELD_OFFSET(NT_TIB, StackLimit, 8) + TEST_FIELD_SIZE (NT_TIB, SubSystemTib, 4) + TEST_FIELD_ALIGN (NT_TIB, SubSystemTib, 4) + TEST_FIELD_OFFSET(NT_TIB, SubSystemTib, 12) } static void test_pack_OBJECT_TYPE_LIST(void) { /* OBJECT_TYPE_LIST (pack 4) */ - TEST_TYPE(OBJECT_TYPE_LIST, 8, 4); - TEST_FIELD(OBJECT_TYPE_LIST, WORD, Level, 0, 2, 2); - TEST_FIELD(OBJECT_TYPE_LIST, WORD, Sbz, 2, 2, 2); - TEST_FIELD(OBJECT_TYPE_LIST, GUID *, ObjectType, 4, 4, 4); + TEST_TYPE_SIZE (OBJECT_TYPE_LIST, 8) + TEST_TYPE_ALIGN (OBJECT_TYPE_LIST, 4) + 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, 4) + TEST_FIELD_ALIGN (OBJECT_TYPE_LIST, ObjectType, 4) + TEST_FIELD_OFFSET(OBJECT_TYPE_LIST, ObjectType, 4) } static void test_pack_PACCESS_ALLOWED_ACE(void) { /* PACCESS_ALLOWED_ACE */ - TEST_TYPE(PACCESS_ALLOWED_ACE, 4, 4); - TEST_TYPE_POINTER(PACCESS_ALLOWED_ACE, 12, 4); + TEST_TYPE_SIZE (PACCESS_ALLOWED_ACE, 4) + TEST_TYPE_ALIGN (PACCESS_ALLOWED_ACE, 4) + 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(PACCESS_DENIED_ACE, 4, 4); - TEST_TYPE_POINTER(PACCESS_DENIED_ACE, 12, 4); + TEST_TYPE_SIZE (PACCESS_DENIED_ACE, 4) + TEST_TYPE_ALIGN (PACCESS_DENIED_ACE, 4) + 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(PACCESS_TOKEN, 4, 4); + TEST_TYPE_SIZE (PACCESS_TOKEN, 4) + TEST_TYPE_ALIGN (PACCESS_TOKEN, 4) } static void test_pack_PACE_HEADER(void) { /* PACE_HEADER */ - TEST_TYPE(PACE_HEADER, 4, 4); - TEST_TYPE_POINTER(PACE_HEADER, 4, 2); + TEST_TYPE_SIZE (PACE_HEADER, 4) + TEST_TYPE_ALIGN (PACE_HEADER, 4) + TEST_TARGET_SIZE (PACE_HEADER, 4) + TEST_TARGET_ALIGN(PACE_HEADER, 2) } static void test_pack_PACL(void) { /* PACL */ - TEST_TYPE(PACL, 4, 4); - TEST_TYPE_POINTER(PACL, 8, 2); + TEST_TYPE_SIZE (PACL, 4) + TEST_TYPE_ALIGN (PACL, 4) + TEST_TARGET_SIZE (PACL, 8) + TEST_TARGET_ALIGN(PACL, 2) } static void test_pack_PACL_REVISION_INFORMATION(void) { /* PACL_REVISION_INFORMATION */ - TEST_TYPE(PACL_REVISION_INFORMATION, 4, 4); - TEST_TYPE_POINTER(PACL_REVISION_INFORMATION, 4, 4); + TEST_TYPE_SIZE (PACL_REVISION_INFORMATION, 4) + TEST_TYPE_ALIGN (PACL_REVISION_INFORMATION, 4) + 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(PACL_SIZE_INFORMATION, 4, 4); - TEST_TYPE_POINTER(PACL_SIZE_INFORMATION, 12, 4); + TEST_TYPE_SIZE (PACL_SIZE_INFORMATION, 4) + TEST_TYPE_ALIGN (PACL_SIZE_INFORMATION, 4) + TEST_TARGET_SIZE (PACL_SIZE_INFORMATION, 12) + TEST_TARGET_ALIGN(PACL_SIZE_INFORMATION, 4) } static void test_pack_PCCH(void) { /* PCCH */ - TEST_TYPE(PCCH, 4, 4); - TEST_TYPE_POINTER(PCCH, 1, 1); + TEST_TYPE_SIZE (PCCH, 4) + TEST_TYPE_ALIGN (PCCH, 4) + TEST_TARGET_SIZE (PCCH, 1) + TEST_TARGET_ALIGN(PCCH, 1) } static void test_pack_PCH(void) { /* PCH */ - TEST_TYPE(PCH, 4, 4); - TEST_TYPE_POINTER(PCH, 1, 1); + TEST_TYPE_SIZE (PCH, 4) + TEST_TYPE_ALIGN (PCH, 4) + TEST_TARGET_SIZE (PCH, 1) + TEST_TARGET_ALIGN(PCH, 1) } static void test_pack_PCSTR(void) { /* PCSTR */ - TEST_TYPE(PCSTR, 4, 4); - TEST_TYPE_POINTER(PCSTR, 1, 1); + TEST_TYPE_SIZE (PCSTR, 4) + TEST_TYPE_ALIGN (PCSTR, 4) + TEST_TARGET_SIZE (PCSTR, 1) + TEST_TARGET_ALIGN(PCSTR, 1) } static void test_pack_PCTSTR(void) { /* PCTSTR */ - TEST_TYPE(PCTSTR, 4, 4); + TEST_TYPE_SIZE (PCTSTR, 4) + TEST_TYPE_ALIGN (PCTSTR, 4) } static void test_pack_PCWCH(void) { /* PCWCH */ - TEST_TYPE(PCWCH, 4, 4); - TEST_TYPE_POINTER(PCWCH, 2, 2); + TEST_TYPE_SIZE (PCWCH, 4) + TEST_TYPE_ALIGN (PCWCH, 4) + TEST_TARGET_SIZE (PCWCH, 2) + TEST_TARGET_ALIGN(PCWCH, 2) } static void test_pack_PCWSTR(void) { /* PCWSTR */ - TEST_TYPE(PCWSTR, 4, 4); - TEST_TYPE_POINTER(PCWSTR, 2, 2); + TEST_TYPE_SIZE (PCWSTR, 4) + TEST_TYPE_ALIGN (PCWSTR, 4) + TEST_TARGET_SIZE (PCWSTR, 2) + TEST_TARGET_ALIGN(PCWSTR, 2) } static void test_pack_PEXCEPTION_POINTERS(void) { /* PEXCEPTION_POINTERS */ - TEST_TYPE(PEXCEPTION_POINTERS, 4, 4); - TEST_TYPE_POINTER(PEXCEPTION_POINTERS, 8, 4); + TEST_TYPE_SIZE (PEXCEPTION_POINTERS, 4) + TEST_TYPE_ALIGN (PEXCEPTION_POINTERS, 4) + TEST_TARGET_SIZE (PEXCEPTION_POINTERS, 8) + TEST_TARGET_ALIGN(PEXCEPTION_POINTERS, 4) } static void test_pack_PEXCEPTION_RECORD(void) { /* PEXCEPTION_RECORD */ - TEST_TYPE(PEXCEPTION_RECORD, 4, 4); - TEST_TYPE_POINTER(PEXCEPTION_RECORD, 80, 4); + TEST_TYPE_SIZE (PEXCEPTION_RECORD, 4) + TEST_TYPE_ALIGN (PEXCEPTION_RECORD, 4) + TEST_TARGET_SIZE (PEXCEPTION_RECORD, 80) + TEST_TARGET_ALIGN(PEXCEPTION_RECORD, 4) } static void test_pack_PFLOATING_SAVE_AREA(void) { /* PFLOATING_SAVE_AREA */ - TEST_TYPE(PFLOATING_SAVE_AREA, 4, 4); - TEST_TYPE_POINTER(PFLOATING_SAVE_AREA, 112, 4); + TEST_TYPE_SIZE (PFLOATING_SAVE_AREA, 4) + TEST_TYPE_ALIGN (PFLOATING_SAVE_AREA, 4) + 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(PFPO_DATA, 4, 4); - TEST_TYPE_POINTER(PFPO_DATA, 16, 4); + TEST_TYPE_SIZE (PFPO_DATA, 4) + TEST_TYPE_ALIGN (PFPO_DATA, 4) + TEST_TARGET_SIZE (PFPO_DATA, 16) + TEST_TARGET_ALIGN(PFPO_DATA, 4) } static void test_pack_PGENERIC_MAPPING(void) { /* PGENERIC_MAPPING */ - TEST_TYPE(PGENERIC_MAPPING, 4, 4); - TEST_TYPE_POINTER(PGENERIC_MAPPING, 16, 4); + TEST_TYPE_SIZE (PGENERIC_MAPPING, 4) + TEST_TYPE_ALIGN (PGENERIC_MAPPING, 4) + TEST_TARGET_SIZE (PGENERIC_MAPPING, 16) + TEST_TARGET_ALIGN(PGENERIC_MAPPING, 4) } static void test_pack_PHANDLE(void) { /* PHANDLE */ - TEST_TYPE(PHANDLE, 4, 4); - TEST_TYPE_POINTER(PHANDLE, 4, 4); + TEST_TYPE_SIZE (PHANDLE, 4) + TEST_TYPE_ALIGN (PHANDLE, 4) + TEST_TARGET_SIZE (PHANDLE, 4) + TEST_TARGET_ALIGN(PHANDLE, 4) } static void test_pack_PIMAGE_ARCHIVE_MEMBER_HEADER(void) { /* PIMAGE_ARCHIVE_MEMBER_HEADER */ - TEST_TYPE(PIMAGE_ARCHIVE_MEMBER_HEADER, 4, 4); - TEST_TYPE_POINTER(PIMAGE_ARCHIVE_MEMBER_HEADER, 60, 1); + TEST_TYPE_SIZE (PIMAGE_ARCHIVE_MEMBER_HEADER, 4) + TEST_TYPE_ALIGN (PIMAGE_ARCHIVE_MEMBER_HEADER, 4) + 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(PIMAGE_AUX_SYMBOL, 4, 4); + TEST_TYPE_SIZE (PIMAGE_AUX_SYMBOL, 4) + TEST_TYPE_ALIGN (PIMAGE_AUX_SYMBOL, 4) } static void test_pack_PIMAGE_BASE_RELOCATION(void) { /* PIMAGE_BASE_RELOCATION */ - TEST_TYPE(PIMAGE_BASE_RELOCATION, 4, 4); - TEST_TYPE_POINTER(PIMAGE_BASE_RELOCATION, 8, 4); + TEST_TYPE_SIZE (PIMAGE_BASE_RELOCATION, 4) + TEST_TYPE_ALIGN (PIMAGE_BASE_RELOCATION, 4) + 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(PIMAGE_BOUND_FORWARDER_REF, 4, 4); - TEST_TYPE_POINTER(PIMAGE_BOUND_FORWARDER_REF, 8, 4); + TEST_TYPE_SIZE (PIMAGE_BOUND_FORWARDER_REF, 4) + TEST_TYPE_ALIGN (PIMAGE_BOUND_FORWARDER_REF, 4) + 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(PIMAGE_BOUND_IMPORT_DESCRIPTOR, 4, 4); - TEST_TYPE_POINTER(PIMAGE_BOUND_IMPORT_DESCRIPTOR, 8, 4); + TEST_TYPE_SIZE (PIMAGE_BOUND_IMPORT_DESCRIPTOR, 4) + TEST_TYPE_ALIGN (PIMAGE_BOUND_IMPORT_DESCRIPTOR, 4) + 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(PIMAGE_COFF_SYMBOLS_HEADER, 4, 4); - TEST_TYPE_POINTER(PIMAGE_COFF_SYMBOLS_HEADER, 32, 4); + TEST_TYPE_SIZE (PIMAGE_COFF_SYMBOLS_HEADER, 4) + TEST_TYPE_ALIGN (PIMAGE_COFF_SYMBOLS_HEADER, 4) + 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(PIMAGE_DATA_DIRECTORY, 4, 4); - TEST_TYPE_POINTER(PIMAGE_DATA_DIRECTORY, 8, 4); + TEST_TYPE_SIZE (PIMAGE_DATA_DIRECTORY, 4) + TEST_TYPE_ALIGN (PIMAGE_DATA_DIRECTORY, 4) + 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(PIMAGE_DEBUG_DIRECTORY, 4, 4); - TEST_TYPE_POINTER(PIMAGE_DEBUG_DIRECTORY, 28, 4); + TEST_TYPE_SIZE (PIMAGE_DEBUG_DIRECTORY, 4) + TEST_TYPE_ALIGN (PIMAGE_DEBUG_DIRECTORY, 4) + 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(PIMAGE_DEBUG_MISC, 4, 4); - TEST_TYPE_POINTER(PIMAGE_DEBUG_MISC, 16, 4); + TEST_TYPE_SIZE (PIMAGE_DEBUG_MISC, 4) + TEST_TYPE_ALIGN (PIMAGE_DEBUG_MISC, 4) + 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(PIMAGE_DOS_HEADER, 4, 4); - TEST_TYPE_POINTER(PIMAGE_DOS_HEADER, 64, 2); + TEST_TYPE_SIZE (PIMAGE_DOS_HEADER, 4) + TEST_TYPE_ALIGN (PIMAGE_DOS_HEADER, 4) + 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(PIMAGE_EXPORT_DIRECTORY, 4, 4); - TEST_TYPE_POINTER(PIMAGE_EXPORT_DIRECTORY, 40, 4); + TEST_TYPE_SIZE (PIMAGE_EXPORT_DIRECTORY, 4) + TEST_TYPE_ALIGN (PIMAGE_EXPORT_DIRECTORY, 4) + 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(PIMAGE_FILE_HEADER, 4, 4); - TEST_TYPE_POINTER(PIMAGE_FILE_HEADER, 20, 4); + TEST_TYPE_SIZE (PIMAGE_FILE_HEADER, 4) + TEST_TYPE_ALIGN (PIMAGE_FILE_HEADER, 4) + 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(PIMAGE_FUNCTION_ENTRY, 4, 4); - TEST_TYPE_POINTER(PIMAGE_FUNCTION_ENTRY, 12, 4); + TEST_TYPE_SIZE (PIMAGE_FUNCTION_ENTRY, 4) + TEST_TYPE_ALIGN (PIMAGE_FUNCTION_ENTRY, 4) + 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(PIMAGE_IMPORT_BY_NAME, 4, 4); - TEST_TYPE_POINTER(PIMAGE_IMPORT_BY_NAME, 4, 2); + TEST_TYPE_SIZE (PIMAGE_IMPORT_BY_NAME, 4) + TEST_TYPE_ALIGN (PIMAGE_IMPORT_BY_NAME, 4) + 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(PIMAGE_IMPORT_DESCRIPTOR, 4, 4); + TEST_TYPE_SIZE (PIMAGE_IMPORT_DESCRIPTOR, 4) + TEST_TYPE_ALIGN (PIMAGE_IMPORT_DESCRIPTOR, 4) } static void test_pack_PIMAGE_LINENUMBER(void) { /* PIMAGE_LINENUMBER */ - TEST_TYPE(PIMAGE_LINENUMBER, 4, 4); + TEST_TYPE_SIZE (PIMAGE_LINENUMBER, 4) + TEST_TYPE_ALIGN (PIMAGE_LINENUMBER, 4) } static void test_pack_PIMAGE_LOAD_CONFIG_DIRECTORY(void) { /* PIMAGE_LOAD_CONFIG_DIRECTORY */ - TEST_TYPE(PIMAGE_LOAD_CONFIG_DIRECTORY, 4, 4); - TEST_TYPE_POINTER(PIMAGE_LOAD_CONFIG_DIRECTORY, 72, 4); + TEST_TYPE_SIZE (PIMAGE_LOAD_CONFIG_DIRECTORY, 4) + TEST_TYPE_ALIGN (PIMAGE_LOAD_CONFIG_DIRECTORY, 4) + TEST_TARGET_SIZE (PIMAGE_LOAD_CONFIG_DIRECTORY, 72) + TEST_TARGET_ALIGN(PIMAGE_LOAD_CONFIG_DIRECTORY, 4) } static void test_pack_PIMAGE_NT_HEADERS(void) { /* PIMAGE_NT_HEADERS */ - TEST_TYPE(PIMAGE_NT_HEADERS, 4, 4); + TEST_TYPE_SIZE (PIMAGE_NT_HEADERS, 4) + TEST_TYPE_ALIGN (PIMAGE_NT_HEADERS, 4) } static void test_pack_PIMAGE_OPTIONAL_HEADER(void) { /* PIMAGE_OPTIONAL_HEADER */ - TEST_TYPE(PIMAGE_OPTIONAL_HEADER, 4, 4); + TEST_TYPE_SIZE (PIMAGE_OPTIONAL_HEADER, 4) + TEST_TYPE_ALIGN (PIMAGE_OPTIONAL_HEADER, 4) } static void test_pack_PIMAGE_OS2_HEADER(void) { /* PIMAGE_OS2_HEADER */ - TEST_TYPE(PIMAGE_OS2_HEADER, 4, 4); - TEST_TYPE_POINTER(PIMAGE_OS2_HEADER, 64, 2); + TEST_TYPE_SIZE (PIMAGE_OS2_HEADER, 4) + TEST_TYPE_ALIGN (PIMAGE_OS2_HEADER, 4) + 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(PIMAGE_RELOCATION, 4, 4); + TEST_TYPE_SIZE (PIMAGE_RELOCATION, 4) + TEST_TYPE_ALIGN (PIMAGE_RELOCATION, 4) } static void test_pack_PIMAGE_RESOURCE_DATA_ENTRY(void) { /* PIMAGE_RESOURCE_DATA_ENTRY */ - TEST_TYPE(PIMAGE_RESOURCE_DATA_ENTRY, 4, 4); - TEST_TYPE_POINTER(PIMAGE_RESOURCE_DATA_ENTRY, 16, 4); + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DATA_ENTRY, 4) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DATA_ENTRY, 4) + 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(PIMAGE_RESOURCE_DIRECTORY, 4, 4); - TEST_TYPE_POINTER(PIMAGE_RESOURCE_DIRECTORY, 16, 4); + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DIRECTORY, 4) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DIRECTORY, 4) + 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(PIMAGE_RESOURCE_DIRECTORY_ENTRY, 4, 4); + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DIRECTORY_ENTRY, 4) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DIRECTORY_ENTRY, 4) } static void test_pack_PIMAGE_RESOURCE_DIRECTORY_STRING(void) { /* PIMAGE_RESOURCE_DIRECTORY_STRING */ - TEST_TYPE(PIMAGE_RESOURCE_DIRECTORY_STRING, 4, 4); - TEST_TYPE_POINTER(PIMAGE_RESOURCE_DIRECTORY_STRING, 4, 2); + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DIRECTORY_STRING, 4) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DIRECTORY_STRING, 4) + 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(PIMAGE_RESOURCE_DIR_STRING_U, 4, 4); - TEST_TYPE_POINTER(PIMAGE_RESOURCE_DIR_STRING_U, 4, 2); + TEST_TYPE_SIZE (PIMAGE_RESOURCE_DIR_STRING_U, 4) + TEST_TYPE_ALIGN (PIMAGE_RESOURCE_DIR_STRING_U, 4) + 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(PIMAGE_SECTION_HEADER, 4, 4); + TEST_TYPE_SIZE (PIMAGE_SECTION_HEADER, 4) + TEST_TYPE_ALIGN (PIMAGE_SECTION_HEADER, 4) } static void test_pack_PIMAGE_SEPARATE_DEBUG_HEADER(void) { /* PIMAGE_SEPARATE_DEBUG_HEADER */ - TEST_TYPE(PIMAGE_SEPARATE_DEBUG_HEADER, 4, 4); - TEST_TYPE_POINTER(PIMAGE_SEPARATE_DEBUG_HEADER, 48, 4); + TEST_TYPE_SIZE (PIMAGE_SEPARATE_DEBUG_HEADER, 4) + TEST_TYPE_ALIGN (PIMAGE_SEPARATE_DEBUG_HEADER, 4) + 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(PIMAGE_SYMBOL, 4, 4); + TEST_TYPE_SIZE (PIMAGE_SYMBOL, 4) + TEST_TYPE_ALIGN (PIMAGE_SYMBOL, 4) } static void test_pack_PIMAGE_THUNK_DATA(void) { /* PIMAGE_THUNK_DATA */ - TEST_TYPE(PIMAGE_THUNK_DATA, 4, 4); + TEST_TYPE_SIZE (PIMAGE_THUNK_DATA, 4) + TEST_TYPE_ALIGN (PIMAGE_THUNK_DATA, 4) } static void test_pack_PIMAGE_TLS_CALLBACK(void) { /* PIMAGE_TLS_CALLBACK */ - TEST_TYPE(PIMAGE_TLS_CALLBACK, 4, 4); + TEST_TYPE_SIZE (PIMAGE_TLS_CALLBACK, 4) + TEST_TYPE_ALIGN (PIMAGE_TLS_CALLBACK, 4) } static void test_pack_PIMAGE_TLS_DIRECTORY(void) { /* PIMAGE_TLS_DIRECTORY */ - TEST_TYPE(PIMAGE_TLS_DIRECTORY, 4, 4); + TEST_TYPE_SIZE (PIMAGE_TLS_DIRECTORY, 4) + TEST_TYPE_ALIGN (PIMAGE_TLS_DIRECTORY, 4) } static void test_pack_PIMAGE_VXD_HEADER(void) { /* PIMAGE_VXD_HEADER */ - TEST_TYPE(PIMAGE_VXD_HEADER, 4, 4); - TEST_TYPE_POINTER(PIMAGE_VXD_HEADER, 196, 2); + TEST_TYPE_SIZE (PIMAGE_VXD_HEADER, 4) + TEST_TYPE_ALIGN (PIMAGE_VXD_HEADER, 4) + 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(PIO_COUNTERS, 4, 4); - TEST_TYPE_POINTER(PIO_COUNTERS, 48, 8); + TEST_TYPE_SIZE (PIO_COUNTERS, 4) + TEST_TYPE_ALIGN (PIO_COUNTERS, 4) + TEST_TARGET_SIZE (PIO_COUNTERS, 48) + TEST_TARGET_ALIGN(PIO_COUNTERS, 8) } static void test_pack_PISECURITY_DESCRIPTOR(void) { /* PISECURITY_DESCRIPTOR */ - TEST_TYPE(PISECURITY_DESCRIPTOR, 4, 4); - TEST_TYPE_POINTER(PISECURITY_DESCRIPTOR, 20, 4); + TEST_TYPE_SIZE (PISECURITY_DESCRIPTOR, 4) + TEST_TYPE_ALIGN (PISECURITY_DESCRIPTOR, 4) + TEST_TARGET_SIZE (PISECURITY_DESCRIPTOR, 20) + TEST_TARGET_ALIGN(PISECURITY_DESCRIPTOR, 4) } static void test_pack_PISECURITY_DESCRIPTOR_RELATIVE(void) { /* PISECURITY_DESCRIPTOR_RELATIVE */ - TEST_TYPE(PISECURITY_DESCRIPTOR_RELATIVE, 4, 4); - TEST_TYPE_POINTER(PISECURITY_DESCRIPTOR_RELATIVE, 20, 4); + TEST_TYPE_SIZE (PISECURITY_DESCRIPTOR_RELATIVE, 4) + TEST_TYPE_ALIGN (PISECURITY_DESCRIPTOR_RELATIVE, 4) + TEST_TARGET_SIZE (PISECURITY_DESCRIPTOR_RELATIVE, 20) + TEST_TARGET_ALIGN(PISECURITY_DESCRIPTOR_RELATIVE, 4) } static void test_pack_PISID(void) { /* PISID */ - TEST_TYPE(PISID, 4, 4); - TEST_TYPE_POINTER(PISID, 12, 4); + TEST_TYPE_SIZE (PISID, 4) + TEST_TYPE_ALIGN (PISID, 4) + TEST_TARGET_SIZE (PISID, 12) + TEST_TARGET_ALIGN(PISID, 4) } static void test_pack_PLARGE_INTEGER(void) { /* PLARGE_INTEGER */ - TEST_TYPE(PLARGE_INTEGER, 4, 4); + TEST_TYPE_SIZE (PLARGE_INTEGER, 4) + TEST_TYPE_ALIGN (PLARGE_INTEGER, 4) } static void test_pack_PLIST_ENTRY(void) { /* PLIST_ENTRY */ - TEST_TYPE(PLIST_ENTRY, 4, 4); - TEST_TYPE_POINTER(PLIST_ENTRY, 8, 4); + TEST_TYPE_SIZE (PLIST_ENTRY, 4) + TEST_TYPE_ALIGN (PLIST_ENTRY, 4) + TEST_TARGET_SIZE (PLIST_ENTRY, 8) + TEST_TARGET_ALIGN(PLIST_ENTRY, 4) } static void test_pack_PLUID(void) { /* PLUID */ - TEST_TYPE(PLUID, 4, 4); - TEST_TYPE_POINTER(PLUID, 8, 4); + TEST_TYPE_SIZE (PLUID, 4) + TEST_TYPE_ALIGN (PLUID, 4) + TEST_TARGET_SIZE (PLUID, 8) + TEST_TARGET_ALIGN(PLUID, 4) } static void test_pack_PLUID_AND_ATTRIBUTES(void) { /* PLUID_AND_ATTRIBUTES */ - TEST_TYPE(PLUID_AND_ATTRIBUTES, 4, 4); - TEST_TYPE_POINTER(PLUID_AND_ATTRIBUTES, 12, 4); + TEST_TYPE_SIZE (PLUID_AND_ATTRIBUTES, 4) + TEST_TYPE_ALIGN (PLUID_AND_ATTRIBUTES, 4) + 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(PMEMORY_BASIC_INFORMATION, 4, 4); - TEST_TYPE_POINTER(PMEMORY_BASIC_INFORMATION, 28, 4); + TEST_TYPE_SIZE (PMEMORY_BASIC_INFORMATION, 4) + TEST_TYPE_ALIGN (PMEMORY_BASIC_INFORMATION, 4) + TEST_TARGET_SIZE (PMEMORY_BASIC_INFORMATION, 28) + TEST_TARGET_ALIGN(PMEMORY_BASIC_INFORMATION, 4) } static void test_pack_PMESSAGE_RESOURCE_BLOCK(void) { /* PMESSAGE_RESOURCE_BLOCK */ - TEST_TYPE(PMESSAGE_RESOURCE_BLOCK, 4, 4); - TEST_TYPE_POINTER(PMESSAGE_RESOURCE_BLOCK, 12, 4); + TEST_TYPE_SIZE (PMESSAGE_RESOURCE_BLOCK, 4) + TEST_TYPE_ALIGN (PMESSAGE_RESOURCE_BLOCK, 4) + 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(PMESSAGE_RESOURCE_DATA, 4, 4); - TEST_TYPE_POINTER(PMESSAGE_RESOURCE_DATA, 16, 4); + TEST_TYPE_SIZE (PMESSAGE_RESOURCE_DATA, 4) + TEST_TYPE_ALIGN (PMESSAGE_RESOURCE_DATA, 4) + 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(PMESSAGE_RESOURCE_ENTRY, 4, 4); - TEST_TYPE_POINTER(PMESSAGE_RESOURCE_ENTRY, 6, 2); + TEST_TYPE_SIZE (PMESSAGE_RESOURCE_ENTRY, 4) + TEST_TYPE_ALIGN (PMESSAGE_RESOURCE_ENTRY, 4) + 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(PNT_TIB, 4, 4); + TEST_TYPE_SIZE (PNT_TIB, 4) + TEST_TYPE_ALIGN (PNT_TIB, 4) } static void test_pack_POBJECT_TYPE_LIST(void) { /* POBJECT_TYPE_LIST */ - TEST_TYPE(POBJECT_TYPE_LIST, 4, 4); - TEST_TYPE_POINTER(POBJECT_TYPE_LIST, 8, 4); + TEST_TYPE_SIZE (POBJECT_TYPE_LIST, 4) + TEST_TYPE_ALIGN (POBJECT_TYPE_LIST, 4) + TEST_TARGET_SIZE (POBJECT_TYPE_LIST, 8) + TEST_TARGET_ALIGN(POBJECT_TYPE_LIST, 4) } static void test_pack_PPRIVILEGE_SET(void) { /* PPRIVILEGE_SET */ - TEST_TYPE(PPRIVILEGE_SET, 4, 4); - TEST_TYPE_POINTER(PPRIVILEGE_SET, 20, 4); + TEST_TYPE_SIZE (PPRIVILEGE_SET, 4) + TEST_TYPE_ALIGN (PPRIVILEGE_SET, 4) + TEST_TARGET_SIZE (PPRIVILEGE_SET, 20) + TEST_TARGET_ALIGN(PPRIVILEGE_SET, 4) } static void test_pack_PRIVILEGE_SET(void) { /* PRIVILEGE_SET (pack 4) */ - TEST_TYPE(PRIVILEGE_SET, 20, 4); - TEST_FIELD(PRIVILEGE_SET, DWORD, PrivilegeCount, 0, 4, 4); - TEST_FIELD(PRIVILEGE_SET, DWORD, Control, 4, 4, 4); - TEST_FIELD(PRIVILEGE_SET, LUID_AND_ATTRIBUTES[ANYSIZE_ARRAY], Privilege, 8, 12, 4); + 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(PRLIST_ENTRY, 4, 4); - TEST_TYPE_POINTER(PRLIST_ENTRY, 8, 4); + TEST_TYPE_SIZE (PRLIST_ENTRY, 4) + TEST_TYPE_ALIGN (PRLIST_ENTRY, 4) + TEST_TARGET_SIZE (PRLIST_ENTRY, 8) + TEST_TARGET_ALIGN(PRLIST_ENTRY, 4) } static void test_pack_PRTL_CRITICAL_SECTION(void) { /* PRTL_CRITICAL_SECTION */ - TEST_TYPE(PRTL_CRITICAL_SECTION, 4, 4); - TEST_TYPE_POINTER(PRTL_CRITICAL_SECTION, 24, 4); + TEST_TYPE_SIZE (PRTL_CRITICAL_SECTION, 4) + TEST_TYPE_ALIGN (PRTL_CRITICAL_SECTION, 4) + TEST_TARGET_SIZE (PRTL_CRITICAL_SECTION, 24) + TEST_TARGET_ALIGN(PRTL_CRITICAL_SECTION, 4) } static void test_pack_PRTL_CRITICAL_SECTION_DEBUG(void) { /* PRTL_CRITICAL_SECTION_DEBUG */ - TEST_TYPE(PRTL_CRITICAL_SECTION_DEBUG, 4, 4); + TEST_TYPE_SIZE (PRTL_CRITICAL_SECTION_DEBUG, 4) + TEST_TYPE_ALIGN (PRTL_CRITICAL_SECTION_DEBUG, 4) } static void test_pack_PRTL_OSVERSIONINFOEXW(void) { /* PRTL_OSVERSIONINFOEXW */ - TEST_TYPE(PRTL_OSVERSIONINFOEXW, 4, 4); - TEST_TYPE_POINTER(PRTL_OSVERSIONINFOEXW, 284, 4); + TEST_TYPE_SIZE (PRTL_OSVERSIONINFOEXW, 4) + TEST_TYPE_ALIGN (PRTL_OSVERSIONINFOEXW, 4) + TEST_TARGET_SIZE (PRTL_OSVERSIONINFOEXW, 284) + TEST_TARGET_ALIGN(PRTL_OSVERSIONINFOEXW, 4) } static void test_pack_PRTL_OSVERSIONINFOW(void) { /* PRTL_OSVERSIONINFOW */ - TEST_TYPE(PRTL_OSVERSIONINFOW, 4, 4); - TEST_TYPE_POINTER(PRTL_OSVERSIONINFOW, 276, 4); + TEST_TYPE_SIZE (PRTL_OSVERSIONINFOW, 4) + TEST_TYPE_ALIGN (PRTL_OSVERSIONINFOW, 4) + 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(PRTL_RESOURCE_DEBUG, 4, 4); + TEST_TYPE_SIZE (PRTL_RESOURCE_DEBUG, 4) + TEST_TYPE_ALIGN (PRTL_RESOURCE_DEBUG, 4) } static void test_pack_PSECURITY_DESCRIPTOR(void) { /* PSECURITY_DESCRIPTOR */ - TEST_TYPE(PSECURITY_DESCRIPTOR, 4, 4); + TEST_TYPE_SIZE (PSECURITY_DESCRIPTOR, 4) + TEST_TYPE_ALIGN (PSECURITY_DESCRIPTOR, 4) } static void test_pack_PSECURITY_QUALITY_OF_SERVICE(void) { /* PSECURITY_QUALITY_OF_SERVICE */ - TEST_TYPE(PSECURITY_QUALITY_OF_SERVICE, 4, 4); + TEST_TYPE_SIZE (PSECURITY_QUALITY_OF_SERVICE, 4) + TEST_TYPE_ALIGN (PSECURITY_QUALITY_OF_SERVICE, 4) } static void test_pack_PSID(void) { /* PSID */ - TEST_TYPE(PSID, 4, 4); + TEST_TYPE_SIZE (PSID, 4) + TEST_TYPE_ALIGN (PSID, 4) } static void test_pack_PSID_IDENTIFIER_AUTHORITY(void) { /* PSID_IDENTIFIER_AUTHORITY */ - TEST_TYPE(PSID_IDENTIFIER_AUTHORITY, 4, 4); - TEST_TYPE_POINTER(PSID_IDENTIFIER_AUTHORITY, 6, 1); + TEST_TYPE_SIZE (PSID_IDENTIFIER_AUTHORITY, 4) + TEST_TYPE_ALIGN (PSID_IDENTIFIER_AUTHORITY, 4) + 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(PSINGLE_LIST_ENTRY, 4, 4); - TEST_TYPE_POINTER(PSINGLE_LIST_ENTRY, 4, 4); + TEST_TYPE_SIZE (PSINGLE_LIST_ENTRY, 4) + TEST_TYPE_ALIGN (PSINGLE_LIST_ENTRY, 4) + TEST_TARGET_SIZE (PSINGLE_LIST_ENTRY, 4) + TEST_TARGET_ALIGN(PSINGLE_LIST_ENTRY, 4) } static void test_pack_PSTR(void) { /* PSTR */ - TEST_TYPE(PSTR, 4, 4); - TEST_TYPE_POINTER(PSTR, 1, 1); + TEST_TYPE_SIZE (PSTR, 4) + TEST_TYPE_ALIGN (PSTR, 4) + TEST_TARGET_SIZE (PSTR, 1) + TEST_TARGET_ALIGN(PSTR, 1) } static void test_pack_PSYSTEM_ALARM_ACE(void) { /* PSYSTEM_ALARM_ACE */ - TEST_TYPE(PSYSTEM_ALARM_ACE, 4, 4); - TEST_TYPE_POINTER(PSYSTEM_ALARM_ACE, 12, 4); + TEST_TYPE_SIZE (PSYSTEM_ALARM_ACE, 4) + TEST_TYPE_ALIGN (PSYSTEM_ALARM_ACE, 4) + 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(PSYSTEM_AUDIT_ACE, 4, 4); - TEST_TYPE_POINTER(PSYSTEM_AUDIT_ACE, 12, 4); + TEST_TYPE_SIZE (PSYSTEM_AUDIT_ACE, 4) + TEST_TYPE_ALIGN (PSYSTEM_AUDIT_ACE, 4) + 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(PTOKEN_GROUPS, 4, 4); - TEST_TYPE_POINTER(PTOKEN_GROUPS, 12, 4); + TEST_TYPE_SIZE (PTOKEN_GROUPS, 4) + TEST_TYPE_ALIGN (PTOKEN_GROUPS, 4) + TEST_TARGET_SIZE (PTOKEN_GROUPS, 12) + TEST_TARGET_ALIGN(PTOKEN_GROUPS, 4) } static void test_pack_PTOKEN_PRIVILEGES(void) { /* PTOKEN_PRIVILEGES */ - TEST_TYPE(PTOKEN_PRIVILEGES, 4, 4); - TEST_TYPE_POINTER(PTOKEN_PRIVILEGES, 16, 4); + TEST_TYPE_SIZE (PTOKEN_PRIVILEGES, 4) + TEST_TYPE_ALIGN (PTOKEN_PRIVILEGES, 4) + TEST_TARGET_SIZE (PTOKEN_PRIVILEGES, 16) + TEST_TARGET_ALIGN(PTOKEN_PRIVILEGES, 4) } static void test_pack_PTOKEN_USER(void) { /* PTOKEN_USER */ - TEST_TYPE(PTOKEN_USER, 4, 4); - TEST_TYPE_POINTER(PTOKEN_USER, 8, 4); + TEST_TYPE_SIZE (PTOKEN_USER, 4) + TEST_TYPE_ALIGN (PTOKEN_USER, 4) + TEST_TARGET_SIZE (PTOKEN_USER, 8) + TEST_TARGET_ALIGN(PTOKEN_USER, 4) } static void test_pack_PTSTR(void) { /* PTSTR */ - TEST_TYPE(PTSTR, 4, 4); + TEST_TYPE_SIZE (PTSTR, 4) + TEST_TYPE_ALIGN (PTSTR, 4) } static void test_pack_PULARGE_INTEGER(void) { /* PULARGE_INTEGER */ - TEST_TYPE(PULARGE_INTEGER, 4, 4); + TEST_TYPE_SIZE (PULARGE_INTEGER, 4) + TEST_TYPE_ALIGN (PULARGE_INTEGER, 4) } static void test_pack_PVECTORED_EXCEPTION_HANDLER(void) { /* PVECTORED_EXCEPTION_HANDLER */ - TEST_TYPE(PVECTORED_EXCEPTION_HANDLER, 4, 4); + TEST_TYPE_SIZE (PVECTORED_EXCEPTION_HANDLER, 4) + TEST_TYPE_ALIGN (PVECTORED_EXCEPTION_HANDLER, 4) } static void test_pack_PVOID(void) { /* PVOID */ - TEST_TYPE(PVOID, 4, 4); + TEST_TYPE_SIZE (PVOID, 4) + TEST_TYPE_ALIGN (PVOID, 4) } static void test_pack_PWCH(void) { /* PWCH */ - TEST_TYPE(PWCH, 4, 4); - TEST_TYPE_POINTER(PWCH, 2, 2); + TEST_TYPE_SIZE (PWCH, 4) + TEST_TYPE_ALIGN (PWCH, 4) + TEST_TARGET_SIZE (PWCH, 2) + TEST_TARGET_ALIGN(PWCH, 2) } static void test_pack_PWSTR(void) { /* PWSTR */ - TEST_TYPE(PWSTR, 4, 4); - TEST_TYPE_POINTER(PWSTR, 2, 2); + TEST_TYPE_SIZE (PWSTR, 4) + TEST_TYPE_ALIGN (PWSTR, 4) + TEST_TARGET_SIZE (PWSTR, 2) + TEST_TARGET_ALIGN(PWSTR, 2) } static void test_pack_RTL_CRITICAL_SECTION(void) { /* RTL_CRITICAL_SECTION (pack 4) */ - TEST_TYPE(RTL_CRITICAL_SECTION, 24, 4); - TEST_FIELD(RTL_CRITICAL_SECTION, PRTL_CRITICAL_SECTION_DEBUG, DebugInfo, 0, 4, 4); - TEST_FIELD(RTL_CRITICAL_SECTION, LONG, LockCount, 4, 4, 4); - TEST_FIELD(RTL_CRITICAL_SECTION, LONG, RecursionCount, 8, 4, 4); - TEST_FIELD(RTL_CRITICAL_SECTION, HANDLE, OwningThread, 12, 4, 4); - TEST_FIELD(RTL_CRITICAL_SECTION, HANDLE, LockSemaphore, 16, 4, 4); - TEST_FIELD(RTL_CRITICAL_SECTION, ULONG_PTR, SpinCount, 20, 4, 4); + TEST_TYPE_SIZE (RTL_CRITICAL_SECTION, 24) + TEST_TYPE_ALIGN (RTL_CRITICAL_SECTION, 4) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, DebugInfo, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, DebugInfo, 4) + 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, 4) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, RecursionCount, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, RecursionCount, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, RecursionCount, 8) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, OwningThread, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, OwningThread, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, OwningThread, 12) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, LockSemaphore, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, LockSemaphore, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, LockSemaphore, 16) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION, SpinCount, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION, SpinCount, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION, SpinCount, 20) } static void test_pack_RTL_CRITICAL_SECTION_DEBUG(void) { /* RTL_CRITICAL_SECTION_DEBUG (pack 4) */ - TEST_FIELD(RTL_CRITICAL_SECTION_DEBUG, WORD, Type, 0, 2, 2); - TEST_FIELD(RTL_CRITICAL_SECTION_DEBUG, WORD, CreatorBackTraceIndex, 2, 2, 2); - TEST_FIELD(RTL_CRITICAL_SECTION_DEBUG, struct _RTL_CRITICAL_SECTION *, CriticalSection, 4, 4, 4); - TEST_FIELD(RTL_CRITICAL_SECTION_DEBUG, LIST_ENTRY, ProcessLocksList, 8, 8, 4); - TEST_FIELD(RTL_CRITICAL_SECTION_DEBUG, DWORD, EntryCount, 16, 4, 4); - TEST_FIELD(RTL_CRITICAL_SECTION_DEBUG, DWORD, ContentionCount, 20, 4, 4); + 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, 4) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION_DEBUG, CriticalSection, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION_DEBUG, CriticalSection, 4) + TEST_FIELD_SIZE (RTL_CRITICAL_SECTION_DEBUG, ProcessLocksList, 8) + TEST_FIELD_ALIGN (RTL_CRITICAL_SECTION_DEBUG, ProcessLocksList, 4) + TEST_FIELD_OFFSET(RTL_CRITICAL_SECTION_DEBUG, ProcessLocksList, 8) + 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, 16) + 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, 20) } static void test_pack_RTL_OSVERSIONINFOEXW(void) { /* RTL_OSVERSIONINFOEXW (pack 4) */ - TEST_TYPE(RTL_OSVERSIONINFOEXW, 284, 4); - TEST_FIELD(RTL_OSVERSIONINFOEXW, DWORD, dwOSVersionInfoSize, 0, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOEXW, DWORD, dwMajorVersion, 4, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOEXW, DWORD, dwMinorVersion, 8, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOEXW, DWORD, dwBuildNumber, 12, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOEXW, DWORD, dwPlatformId, 16, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOEXW, WCHAR[128], szCSDVersion, 20, 256, 2); - TEST_FIELD(RTL_OSVERSIONINFOEXW, WORD, wServicePackMajor, 276, 2, 2); - TEST_FIELD(RTL_OSVERSIONINFOEXW, WORD, wServicePackMinor, 278, 2, 2); - TEST_FIELD(RTL_OSVERSIONINFOEXW, WORD, wSuiteMask, 280, 2, 2); - TEST_FIELD(RTL_OSVERSIONINFOEXW, BYTE, wProductType, 282, 1, 1); - TEST_FIELD(RTL_OSVERSIONINFOEXW, BYTE, wReserved, 283, 1, 1); + 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 (pack 4) */ - TEST_TYPE(RTL_OSVERSIONINFOW, 276, 4); - TEST_FIELD(RTL_OSVERSIONINFOW, DWORD, dwOSVersionInfoSize, 0, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOW, DWORD, dwMajorVersion, 4, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOW, DWORD, dwMinorVersion, 8, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOW, DWORD, dwBuildNumber, 12, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOW, DWORD, dwPlatformId, 16, 4, 4); - TEST_FIELD(RTL_OSVERSIONINFOW, WCHAR[128], szCSDVersion, 20, 256, 2); + 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 (pack 4) */ - TEST_FIELD(RTL_RESOURCE_DEBUG, WORD, Type, 0, 2, 2); - TEST_FIELD(RTL_RESOURCE_DEBUG, WORD, CreatorBackTraceIndex, 2, 2, 2); - TEST_FIELD(RTL_RESOURCE_DEBUG, struct _RTL_CRITICAL_SECTION *, CriticalSection, 4, 4, 4); - TEST_FIELD(RTL_RESOURCE_DEBUG, LIST_ENTRY, ProcessLocksList, 8, 8, 4); - TEST_FIELD(RTL_RESOURCE_DEBUG, DWORD, EntryCount, 16, 4, 4); - TEST_FIELD(RTL_RESOURCE_DEBUG, DWORD, ContentionCount, 20, 4, 4); + 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, 4) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, CriticalSection, 4) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, CriticalSection, 4) + TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, ProcessLocksList, 8) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, ProcessLocksList, 4) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, ProcessLocksList, 8) + TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, EntryCount, 4) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, EntryCount, 4) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, EntryCount, 16) + TEST_FIELD_SIZE (RTL_RESOURCE_DEBUG, ContentionCount, 4) + TEST_FIELD_ALIGN (RTL_RESOURCE_DEBUG, ContentionCount, 4) + TEST_FIELD_OFFSET(RTL_RESOURCE_DEBUG, ContentionCount, 20) } static void test_pack_SECURITY_CONTEXT_TRACKING_MODE(void) { /* SECURITY_CONTEXT_TRACKING_MODE */ - TEST_TYPE(SECURITY_CONTEXT_TRACKING_MODE, 1, 1); + 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 (pack 4) */ - TEST_TYPE(SECURITY_DESCRIPTOR, 20, 4); - TEST_FIELD(SECURITY_DESCRIPTOR, BYTE, Revision, 0, 1, 1); - TEST_FIELD(SECURITY_DESCRIPTOR, BYTE, Sbz1, 1, 1, 1); - TEST_FIELD(SECURITY_DESCRIPTOR, SECURITY_DESCRIPTOR_CONTROL, Control, 2, 2, 2); - TEST_FIELD(SECURITY_DESCRIPTOR, PSID, Owner, 4, 4, 4); - TEST_FIELD(SECURITY_DESCRIPTOR, PSID, Group, 8, 4, 4); - TEST_FIELD(SECURITY_DESCRIPTOR, PACL, Sacl, 12, 4, 4); - TEST_FIELD(SECURITY_DESCRIPTOR, PACL, Dacl, 16, 4, 4); + TEST_TYPE_SIZE (SECURITY_DESCRIPTOR, 20) + TEST_TYPE_ALIGN (SECURITY_DESCRIPTOR, 4) + 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, 4) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Owner, 4) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Owner, 4) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Group, 4) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Group, 4) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Group, 8) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Sacl, 4) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Sacl, 4) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Sacl, 12) + TEST_FIELD_SIZE (SECURITY_DESCRIPTOR, Dacl, 4) + TEST_FIELD_ALIGN (SECURITY_DESCRIPTOR, Dacl, 4) + TEST_FIELD_OFFSET(SECURITY_DESCRIPTOR, Dacl, 16) } static void test_pack_SECURITY_DESCRIPTOR_CONTROL(void) { /* SECURITY_DESCRIPTOR_CONTROL */ - TEST_TYPE(SECURITY_DESCRIPTOR_CONTROL, 2, 2); - TEST_TYPE_UNSIGNED(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 (pack 4) */ - TEST_TYPE(SECURITY_DESCRIPTOR_RELATIVE, 20, 4); - TEST_FIELD(SECURITY_DESCRIPTOR_RELATIVE, BYTE, Revision, 0, 1, 1); - TEST_FIELD(SECURITY_DESCRIPTOR_RELATIVE, BYTE, Sbz1, 1, 1, 1); - TEST_FIELD(SECURITY_DESCRIPTOR_RELATIVE, SECURITY_DESCRIPTOR_CONTROL, Control, 2, 2, 2); - TEST_FIELD(SECURITY_DESCRIPTOR_RELATIVE, DWORD, Owner, 4, 4, 4); - TEST_FIELD(SECURITY_DESCRIPTOR_RELATIVE, DWORD, Group, 8, 4, 4); - TEST_FIELD(SECURITY_DESCRIPTOR_RELATIVE, DWORD, Sacl, 12, 4, 4); - TEST_FIELD(SECURITY_DESCRIPTOR_RELATIVE, DWORD, Dacl, 16, 4, 4); + 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(SECURITY_INFORMATION, 4, 4); - TEST_TYPE_UNSIGNED(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 (pack 4) */ - TEST_FIELD(SECURITY_QUALITY_OF_SERVICE, DWORD, Length, 0, 4, 4); + 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(SHORT, 2, 2); - TEST_TYPE_SIGNED(SHORT); + TEST_TYPE_SIZE (SHORT, 2) + TEST_TYPE_ALIGN (SHORT, 2) + TEST_TYPE_SIGNED(SHORT) } static void test_pack_SID(void) { /* SID (pack 4) */ - TEST_TYPE(SID, 12, 4); - TEST_FIELD(SID, BYTE, Revision, 0, 1, 1); - TEST_FIELD(SID, BYTE, SubAuthorityCount, 1, 1, 1); - TEST_FIELD(SID, SID_IDENTIFIER_AUTHORITY, IdentifierAuthority, 2, 6, 1); - TEST_FIELD(SID, DWORD[1], SubAuthority, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(SID_AND_ATTRIBUTES, 8, 4); - TEST_FIELD(SID_AND_ATTRIBUTES, PSID, Sid, 0, 4, 4); - TEST_FIELD(SID_AND_ATTRIBUTES, DWORD, Attributes, 4, 4, 4); + TEST_TYPE_SIZE (SID_AND_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (SID_AND_ATTRIBUTES, 4) + TEST_FIELD_SIZE (SID_AND_ATTRIBUTES, Sid, 4) + TEST_FIELD_ALIGN (SID_AND_ATTRIBUTES, Sid, 4) + 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, 4) } static void test_pack_SID_IDENTIFIER_AUTHORITY(void) { /* SID_IDENTIFIER_AUTHORITY (pack 4) */ - TEST_TYPE(SID_IDENTIFIER_AUTHORITY, 6, 1); - TEST_FIELD(SID_IDENTIFIER_AUTHORITY, BYTE[6], Value, 0, 6, 1); + 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 (pack 4) */ - TEST_TYPE(SINGLE_LIST_ENTRY, 4, 4); - TEST_FIELD(SINGLE_LIST_ENTRY, struct _SINGLE_LIST_ENTRY *, Next, 0, 4, 4); + TEST_TYPE_SIZE (SINGLE_LIST_ENTRY, 4) + TEST_TYPE_ALIGN (SINGLE_LIST_ENTRY, 4) + TEST_FIELD_SIZE (SINGLE_LIST_ENTRY, Next, 4) + TEST_FIELD_ALIGN (SINGLE_LIST_ENTRY, Next, 4) + TEST_FIELD_OFFSET(SINGLE_LIST_ENTRY, Next, 0) } static void test_pack_SYSTEM_ALARM_ACE(void) { /* SYSTEM_ALARM_ACE (pack 4) */ - TEST_TYPE(SYSTEM_ALARM_ACE, 12, 4); - TEST_FIELD(SYSTEM_ALARM_ACE, ACE_HEADER, Header, 0, 4, 2); - TEST_FIELD(SYSTEM_ALARM_ACE, DWORD, Mask, 4, 4, 4); - TEST_FIELD(SYSTEM_ALARM_ACE, DWORD, SidStart, 8, 4, 4); + 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 (pack 4) */ - TEST_TYPE(SYSTEM_AUDIT_ACE, 12, 4); - TEST_FIELD(SYSTEM_AUDIT_ACE, ACE_HEADER, Header, 0, 4, 2); - TEST_FIELD(SYSTEM_AUDIT_ACE, DWORD, Mask, 4, 4, 4); - TEST_FIELD(SYSTEM_AUDIT_ACE, DWORD, SidStart, 8, 4, 4); + 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(TCHAR, 1, 1); + TEST_TYPE_SIZE (TCHAR, 1) + TEST_TYPE_ALIGN (TCHAR, 1) } static void test_pack_TOKEN_DEFAULT_DACL(void) { /* TOKEN_DEFAULT_DACL (pack 4) */ - TEST_TYPE(TOKEN_DEFAULT_DACL, 4, 4); - TEST_FIELD(TOKEN_DEFAULT_DACL, PACL, DefaultDacl, 0, 4, 4); + TEST_TYPE_SIZE (TOKEN_DEFAULT_DACL, 4) + TEST_TYPE_ALIGN (TOKEN_DEFAULT_DACL, 4) + TEST_FIELD_SIZE (TOKEN_DEFAULT_DACL, DefaultDacl, 4) + TEST_FIELD_ALIGN (TOKEN_DEFAULT_DACL, DefaultDacl, 4) + TEST_FIELD_OFFSET(TOKEN_DEFAULT_DACL, DefaultDacl, 0) } static void test_pack_TOKEN_GROUPS(void) { /* TOKEN_GROUPS (pack 4) */ - TEST_TYPE(TOKEN_GROUPS, 12, 4); - TEST_FIELD(TOKEN_GROUPS, DWORD, GroupCount, 0, 4, 4); - TEST_FIELD(TOKEN_GROUPS, SID_AND_ATTRIBUTES[ANYSIZE_ARRAY], Groups, 4, 8, 4); + TEST_TYPE_SIZE (TOKEN_GROUPS, 12) + TEST_TYPE_ALIGN (TOKEN_GROUPS, 4) + 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, 8) + TEST_FIELD_ALIGN (TOKEN_GROUPS, Groups, 4) + TEST_FIELD_OFFSET(TOKEN_GROUPS, Groups, 4) } static void test_pack_TOKEN_OWNER(void) { /* TOKEN_OWNER (pack 4) */ - TEST_TYPE(TOKEN_OWNER, 4, 4); - TEST_FIELD(TOKEN_OWNER, PSID, Owner, 0, 4, 4); + TEST_TYPE_SIZE (TOKEN_OWNER, 4) + TEST_TYPE_ALIGN (TOKEN_OWNER, 4) + TEST_FIELD_SIZE (TOKEN_OWNER, Owner, 4) + TEST_FIELD_ALIGN (TOKEN_OWNER, Owner, 4) + TEST_FIELD_OFFSET(TOKEN_OWNER, Owner, 0) } static void test_pack_TOKEN_PRIMARY_GROUP(void) { /* TOKEN_PRIMARY_GROUP (pack 4) */ - TEST_TYPE(TOKEN_PRIMARY_GROUP, 4, 4); - TEST_FIELD(TOKEN_PRIMARY_GROUP, PSID, PrimaryGroup, 0, 4, 4); + TEST_TYPE_SIZE (TOKEN_PRIMARY_GROUP, 4) + TEST_TYPE_ALIGN (TOKEN_PRIMARY_GROUP, 4) + TEST_FIELD_SIZE (TOKEN_PRIMARY_GROUP, PrimaryGroup, 4) + TEST_FIELD_ALIGN (TOKEN_PRIMARY_GROUP, PrimaryGroup, 4) + TEST_FIELD_OFFSET(TOKEN_PRIMARY_GROUP, PrimaryGroup, 0) } static void test_pack_TOKEN_PRIVILEGES(void) { /* TOKEN_PRIVILEGES (pack 4) */ - TEST_TYPE(TOKEN_PRIVILEGES, 16, 4); - TEST_FIELD(TOKEN_PRIVILEGES, DWORD, PrivilegeCount, 0, 4, 4); - TEST_FIELD(TOKEN_PRIVILEGES, LUID_AND_ATTRIBUTES[ANYSIZE_ARRAY], Privileges, 4, 12, 4); + 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 (pack 4) */ - TEST_TYPE(TOKEN_SOURCE, 16, 4); - TEST_FIELD(TOKEN_SOURCE, char[TOKEN_SOURCE_LENGTH], SourceName, 0, 8, 1); - TEST_FIELD(TOKEN_SOURCE, LUID, SourceIdentifier, 8, 8, 4); + 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(TOKEN_STATISTICS, LUID, TokenId, 0, 8, 4); - TEST_FIELD(TOKEN_STATISTICS, LUID, AuthenticationId, 8, 8, 4); - TEST_FIELD(TOKEN_STATISTICS, LARGE_INTEGER, ExpirationTime, 16, 8, 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 (pack 4) */ - TEST_TYPE(TOKEN_USER, 8, 4); - TEST_FIELD(TOKEN_USER, SID_AND_ATTRIBUTES, User, 0, 8, 4); + TEST_TYPE_SIZE (TOKEN_USER, 8) + TEST_TYPE_ALIGN (TOKEN_USER, 4) + TEST_FIELD_SIZE (TOKEN_USER, User, 8) + TEST_FIELD_ALIGN (TOKEN_USER, User, 4) + TEST_FIELD_OFFSET(TOKEN_USER, User, 0) } static void test_pack_ULARGE_INTEGER(void) @@ -1807,324 +2770,408 @@ static void test_pack_ULARGE_INTEGER(void) static void test_pack_ULONGLONG(void) { /* ULONGLONG */ - TEST_TYPE(ULONGLONG, 8, 8); - TEST_TYPE_UNSIGNED(ULONGLONG); + TEST_TYPE_SIZE (ULONGLONG, 8) + TEST_TYPE_ALIGN (ULONGLONG, 8) + TEST_TYPE_UNSIGNED(ULONGLONG) } static void test_pack_WAITORTIMERCALLBACKFUNC(void) { /* WAITORTIMERCALLBACKFUNC */ - TEST_TYPE(WAITORTIMERCALLBACKFUNC, 4, 4); + TEST_TYPE_SIZE (WAITORTIMERCALLBACKFUNC, 4) + TEST_TYPE_ALIGN (WAITORTIMERCALLBACKFUNC, 4) } static void test_pack_WCHAR(void) { /* WCHAR */ - TEST_TYPE(WCHAR, 2, 2); - TEST_TYPE_UNSIGNED(WCHAR); + TEST_TYPE_SIZE (WCHAR, 2) + TEST_TYPE_ALIGN (WCHAR, 2) + TEST_TYPE_UNSIGNED(WCHAR) } static void test_pack_ATOM(void) { /* ATOM */ - TEST_TYPE(ATOM, 2, 2); - TEST_TYPE_UNSIGNED(ATOM); + TEST_TYPE_SIZE (ATOM, 2) + TEST_TYPE_ALIGN (ATOM, 2) + TEST_TYPE_UNSIGNED(ATOM) } static void test_pack_BOOL(void) { /* BOOL */ - TEST_TYPE(BOOL, 4, 4); - TEST_TYPE_SIGNED(BOOL); + TEST_TYPE_SIZE (BOOL, 4) + TEST_TYPE_ALIGN (BOOL, 4) + TEST_TYPE_SIGNED(BOOL) } static void test_pack_BYTE(void) { /* BYTE */ - TEST_TYPE(BYTE, 1, 1); - TEST_TYPE_UNSIGNED(BYTE); + TEST_TYPE_SIZE (BYTE, 1) + TEST_TYPE_ALIGN (BYTE, 1) + TEST_TYPE_UNSIGNED(BYTE) } static void test_pack_COLORREF(void) { /* COLORREF */ - TEST_TYPE(COLORREF, 4, 4); - TEST_TYPE_UNSIGNED(COLORREF); + TEST_TYPE_SIZE (COLORREF, 4) + TEST_TYPE_ALIGN (COLORREF, 4) + TEST_TYPE_UNSIGNED(COLORREF) } static void test_pack_DWORD(void) { /* DWORD */ - TEST_TYPE(DWORD, 4, 4); - TEST_TYPE_UNSIGNED(DWORD); + TEST_TYPE_SIZE (DWORD, 4) + TEST_TYPE_ALIGN (DWORD, 4) + TEST_TYPE_UNSIGNED(DWORD) } static void test_pack_FARPROC(void) { /* FARPROC */ - TEST_TYPE(FARPROC, 4, 4); + TEST_TYPE_SIZE (FARPROC, 4) + TEST_TYPE_ALIGN (FARPROC, 4) } static void test_pack_FLOAT(void) { /* FLOAT */ - TEST_TYPE(FLOAT, 4, 4); + TEST_TYPE_SIZE (FLOAT, 4) + TEST_TYPE_ALIGN (FLOAT, 4) } static void test_pack_GLOBALHANDLE(void) { /* GLOBALHANDLE */ - TEST_TYPE(GLOBALHANDLE, 4, 4); + TEST_TYPE_SIZE (GLOBALHANDLE, 4) + TEST_TYPE_ALIGN (GLOBALHANDLE, 4) } static void test_pack_HCURSOR(void) { /* HCURSOR */ - TEST_TYPE(HCURSOR, 4, 4); - TEST_TYPE_UNSIGNED(HCURSOR); + TEST_TYPE_SIZE (HCURSOR, 4) + TEST_TYPE_ALIGN (HCURSOR, 4) } static void test_pack_HFILE(void) { /* HFILE */ - TEST_TYPE(HFILE, 4, 4); - TEST_TYPE_SIGNED(HFILE); + TEST_TYPE_SIZE (HFILE, 4) + TEST_TYPE_ALIGN (HFILE, 4) + TEST_TYPE_SIGNED(HFILE) } static void test_pack_HGDIOBJ(void) { /* HGDIOBJ */ - TEST_TYPE(HGDIOBJ, 4, 4); + TEST_TYPE_SIZE (HGDIOBJ, 4) + TEST_TYPE_ALIGN (HGDIOBJ, 4) } static void test_pack_HGLOBAL(void) { /* HGLOBAL */ - TEST_TYPE(HGLOBAL, 4, 4); + TEST_TYPE_SIZE (HGLOBAL, 4) + TEST_TYPE_ALIGN (HGLOBAL, 4) } static void test_pack_HLOCAL(void) { /* HLOCAL */ - TEST_TYPE(HLOCAL, 4, 4); + TEST_TYPE_SIZE (HLOCAL, 4) + TEST_TYPE_ALIGN (HLOCAL, 4) } static void test_pack_HMODULE(void) { /* HMODULE */ - TEST_TYPE(HMODULE, 4, 4); - TEST_TYPE_UNSIGNED(HMODULE); + TEST_TYPE_SIZE (HMODULE, 4) + TEST_TYPE_ALIGN (HMODULE, 4) } static void test_pack_INT(void) { /* INT */ - TEST_TYPE(INT, 4, 4); - TEST_TYPE_SIGNED(INT); + TEST_TYPE_SIZE (INT, 4) + TEST_TYPE_ALIGN (INT, 4) + TEST_TYPE_SIGNED(INT) } static void test_pack_LOCALHANDLE(void) { /* LOCALHANDLE */ - TEST_TYPE(LOCALHANDLE, 4, 4); + TEST_TYPE_SIZE (LOCALHANDLE, 4) + TEST_TYPE_ALIGN (LOCALHANDLE, 4) } static void test_pack_LPARAM(void) { /* LPARAM */ - TEST_TYPE(LPARAM, 4, 4); + TEST_TYPE_SIZE (LPARAM, 4) + TEST_TYPE_ALIGN (LPARAM, 4) } static void test_pack_LPCRECT(void) { /* LPCRECT */ - TEST_TYPE(LPCRECT, 4, 4); - TEST_TYPE_POINTER(LPCRECT, 16, 4); + TEST_TYPE_SIZE (LPCRECT, 4) + TEST_TYPE_ALIGN (LPCRECT, 4) + TEST_TARGET_SIZE (LPCRECT, 16) + TEST_TARGET_ALIGN(LPCRECT, 4) } static void test_pack_LPCRECTL(void) { /* LPCRECTL */ - TEST_TYPE(LPCRECTL, 4, 4); - TEST_TYPE_POINTER(LPCRECTL, 16, 4); + TEST_TYPE_SIZE (LPCRECTL, 4) + TEST_TYPE_ALIGN (LPCRECTL, 4) + TEST_TARGET_SIZE (LPCRECTL, 16) + TEST_TARGET_ALIGN(LPCRECTL, 4) } static void test_pack_LPCVOID(void) { /* LPCVOID */ - TEST_TYPE(LPCVOID, 4, 4); + TEST_TYPE_SIZE (LPCVOID, 4) + TEST_TYPE_ALIGN (LPCVOID, 4) } static void test_pack_LPPOINT(void) { /* LPPOINT */ - TEST_TYPE(LPPOINT, 4, 4); - TEST_TYPE_POINTER(LPPOINT, 8, 4); + TEST_TYPE_SIZE (LPPOINT, 4) + TEST_TYPE_ALIGN (LPPOINT, 4) + TEST_TARGET_SIZE (LPPOINT, 8) + TEST_TARGET_ALIGN(LPPOINT, 4) } static void test_pack_LPRECT(void) { /* LPRECT */ - TEST_TYPE(LPRECT, 4, 4); - TEST_TYPE_POINTER(LPRECT, 16, 4); + TEST_TYPE_SIZE (LPRECT, 4) + TEST_TYPE_ALIGN (LPRECT, 4) + TEST_TARGET_SIZE (LPRECT, 16) + TEST_TARGET_ALIGN(LPRECT, 4) } static void test_pack_LPRECTL(void) { /* LPRECTL */ - TEST_TYPE(LPRECTL, 4, 4); - TEST_TYPE_POINTER(LPRECTL, 16, 4); + TEST_TYPE_SIZE (LPRECTL, 4) + TEST_TYPE_ALIGN (LPRECTL, 4) + TEST_TARGET_SIZE (LPRECTL, 16) + TEST_TARGET_ALIGN(LPRECTL, 4) } static void test_pack_LPSIZE(void) { /* LPSIZE */ - TEST_TYPE(LPSIZE, 4, 4); - TEST_TYPE_POINTER(LPSIZE, 8, 4); + TEST_TYPE_SIZE (LPSIZE, 4) + TEST_TYPE_ALIGN (LPSIZE, 4) + TEST_TARGET_SIZE (LPSIZE, 8) + TEST_TARGET_ALIGN(LPSIZE, 4) } static void test_pack_LRESULT(void) { /* LRESULT */ - TEST_TYPE(LRESULT, 4, 4); + TEST_TYPE_SIZE (LRESULT, 4) + TEST_TYPE_ALIGN (LRESULT, 4) } static void test_pack_POINT(void) { /* POINT (pack 4) */ - TEST_TYPE(POINT, 8, 4); - TEST_FIELD(POINT, LONG, x, 0, 4, 4); - TEST_FIELD(POINT, LONG, y, 4, 4, 4); + 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 (pack 4) */ - TEST_TYPE(POINTL, 8, 4); - TEST_FIELD(POINTL, LONG, x, 0, 4, 4); - TEST_FIELD(POINTL, LONG, y, 4, 4, 4); + 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(PPOINT, 4, 4); - TEST_TYPE_POINTER(PPOINT, 8, 4); + TEST_TYPE_SIZE (PPOINT, 4) + TEST_TYPE_ALIGN (PPOINT, 4) + TEST_TARGET_SIZE (PPOINT, 8) + TEST_TARGET_ALIGN(PPOINT, 4) } static void test_pack_PPOINTL(void) { /* PPOINTL */ - TEST_TYPE(PPOINTL, 4, 4); - TEST_TYPE_POINTER(PPOINTL, 8, 4); + TEST_TYPE_SIZE (PPOINTL, 4) + TEST_TYPE_ALIGN (PPOINTL, 4) + TEST_TARGET_SIZE (PPOINTL, 8) + TEST_TARGET_ALIGN(PPOINTL, 4) } static void test_pack_PRECT(void) { /* PRECT */ - TEST_TYPE(PRECT, 4, 4); - TEST_TYPE_POINTER(PRECT, 16, 4); + TEST_TYPE_SIZE (PRECT, 4) + TEST_TYPE_ALIGN (PRECT, 4) + TEST_TARGET_SIZE (PRECT, 16) + TEST_TARGET_ALIGN(PRECT, 4) } static void test_pack_PRECTL(void) { /* PRECTL */ - TEST_TYPE(PRECTL, 4, 4); - TEST_TYPE_POINTER(PRECTL, 16, 4); + TEST_TYPE_SIZE (PRECTL, 4) + TEST_TYPE_ALIGN (PRECTL, 4) + TEST_TARGET_SIZE (PRECTL, 16) + TEST_TARGET_ALIGN(PRECTL, 4) } static void test_pack_PROC(void) { /* PROC */ - TEST_TYPE(PROC, 4, 4); + TEST_TYPE_SIZE (PROC, 4) + TEST_TYPE_ALIGN (PROC, 4) } static void test_pack_PSIZE(void) { /* PSIZE */ - TEST_TYPE(PSIZE, 4, 4); - TEST_TYPE_POINTER(PSIZE, 8, 4); + TEST_TYPE_SIZE (PSIZE, 4) + TEST_TYPE_ALIGN (PSIZE, 4) + TEST_TARGET_SIZE (PSIZE, 8) + TEST_TARGET_ALIGN(PSIZE, 4) } static void test_pack_PSZ(void) { /* PSZ */ - TEST_TYPE(PSZ, 4, 4); + TEST_TYPE_SIZE (PSZ, 4) + TEST_TYPE_ALIGN (PSZ, 4) } static void test_pack_RECT(void) { /* RECT (pack 4) */ - TEST_TYPE(RECT, 16, 4); - TEST_FIELD(RECT, LONG, left, 0, 4, 4); - TEST_FIELD(RECT, LONG, top, 4, 4, 4); - TEST_FIELD(RECT, LONG, right, 8, 4, 4); - TEST_FIELD(RECT, LONG, bottom, 12, 4, 4); + 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 (pack 4) */ - TEST_TYPE(RECTL, 16, 4); - TEST_FIELD(RECTL, LONG, left, 0, 4, 4); - TEST_FIELD(RECTL, LONG, top, 4, 4, 4); - TEST_FIELD(RECTL, LONG, right, 8, 4, 4); - TEST_FIELD(RECTL, LONG, bottom, 12, 4, 4); + 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 (pack 4) */ - TEST_TYPE(SIZE, 8, 4); - TEST_FIELD(SIZE, LONG, cx, 0, 4, 4); - TEST_FIELD(SIZE, LONG, cy, 4, 4, 4); + 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(SIZEL, 8, 4); + TEST_TYPE_SIZE (SIZEL, 8) + TEST_TYPE_ALIGN (SIZEL, 4) } static void test_pack_UCHAR(void) { /* UCHAR */ - TEST_TYPE(UCHAR, 1, 1); - TEST_TYPE_UNSIGNED(UCHAR); + TEST_TYPE_SIZE (UCHAR, 1) + TEST_TYPE_ALIGN (UCHAR, 1) + TEST_TYPE_UNSIGNED(UCHAR) } static void test_pack_UINT(void) { /* UINT */ - TEST_TYPE(UINT, 4, 4); - TEST_TYPE_UNSIGNED(UINT); + TEST_TYPE_SIZE (UINT, 4) + TEST_TYPE_ALIGN (UINT, 4) + TEST_TYPE_UNSIGNED(UINT) } static void test_pack_ULONG(void) { /* ULONG */ - TEST_TYPE(ULONG, 4, 4); - TEST_TYPE_UNSIGNED(ULONG); + TEST_TYPE_SIZE (ULONG, 4) + TEST_TYPE_ALIGN (ULONG, 4) + TEST_TYPE_UNSIGNED(ULONG) } static void test_pack_USHORT(void) { /* USHORT */ - TEST_TYPE(USHORT, 2, 2); - TEST_TYPE_UNSIGNED(USHORT); + TEST_TYPE_SIZE (USHORT, 2) + TEST_TYPE_ALIGN (USHORT, 2) + TEST_TYPE_UNSIGNED(USHORT) } static void test_pack_WORD(void) { /* WORD */ - TEST_TYPE(WORD, 2, 2); - TEST_TYPE_UNSIGNED(WORD); + TEST_TYPE_SIZE (WORD, 2) + TEST_TYPE_ALIGN (WORD, 2) + TEST_TYPE_UNSIGNED(WORD) } static void test_pack_WPARAM(void) { /* WPARAM */ - TEST_TYPE(WPARAM, 4, 4); + TEST_TYPE_SIZE (WPARAM, 4) + TEST_TYPE_ALIGN (WPARAM, 4) } static void test_pack(void) @@ -2387,5 +3434,9 @@ 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/large_int.c b/rostests/winetests/ntdll/large_int.c index bec8ad9bf8f..69de5b78947 100755 --- a/rostests/winetests/ntdll/large_int.c +++ b/rostests/winetests/ntdll/large_int.c @@ -286,6 +286,14 @@ static void one_RtlInt64ToUnicodeString_test(int test_num, const largeint2str_t STRING ansi_str; NTSTATUS result; +#ifdef _WIN64 + if (largeint2str->value >> 32 == 0xffffffff) /* this crashes on 64-bit Vista */ + { + skip( "Value ffffffff%08x broken on 64-bit windows\n", (DWORD)largeint2str->value ); + return; + } +#endif + for (pos = 0; pos < LARGE_STRI_BUFFER_LENGTH; pos++) { expected_str_Buffer[pos] = largeint2str->Buffer[pos]; } /* for */ @@ -367,6 +375,14 @@ static void one_RtlLargeIntegerToChar_test(int test_num, const largeint2str_t *l char dest_str[LARGE_STRI_BUFFER_LENGTH + 1]; ULONGLONG value; +#ifdef _WIN64 + if (largeint2str->value >> 32 == 0xffffffff) /* this crashes on 64-bit Vista */ + { + skip( "Value ffffffff%08x broken on 64-bit windows\n", (DWORD)largeint2str->value ); + return; + } +#endif + memset(dest_str, '-', LARGE_STRI_BUFFER_LENGTH); dest_str[LARGE_STRI_BUFFER_LENGTH] = '\0'; value = largeint2str->value; diff --git a/rostests/winetests/ntdll/om.c b/rostests/winetests/ntdll/om.c index bde6032fdfb..ed3eb46e85e 100644 --- a/rostests/winetests/ntdll/om.c +++ b/rostests/winetests/ntdll/om.c @@ -536,6 +536,7 @@ static void test_symboliclink(void) IO_STATUS_BLOCK iosb; /* No name and/or no attributes */ + InitializeObjectAttributes(&attr, NULL, 0, 0, NULL); SYMLNK_TEST_CREATE_OPEN_FAILURE2(NULL, "", "", STATUS_ACCESS_VIOLATION, STATUS_INVALID_PARAMETER) status = pNtCreateSymbolicLinkObject(&h, SYMBOLIC_LINK_QUERY, NULL, NULL); diff --git a/rostests/winetests/ntdll/port.c b/rostests/winetests/ntdll/port.c index c63820a37fd..0795b4ce307 100644 --- a/rostests/winetests/ntdll/port.c +++ b/rostests/winetests/ntdll/port.c @@ -62,8 +62,8 @@ typedef struct _LPC_MESSAGE USHORT MessageType; USHORT VirtualRangesOffset; CLIENT_ID ClientId; - ULONG MessageId; - ULONG SectionSize; + ULONG_PTR MessageId; + ULONG_PTR SectionSize; UCHAR Data[ANYSIZE_ARRAY]; } LPC_MESSAGE, *PLPC_MESSAGE; @@ -90,10 +90,7 @@ static const WCHAR PORTNAME[] = {'\\','M','y','P','o','r','t',0}; #define MAX_MESSAGE_LEN 30 -UNICODE_STRING port; -static char selfname[MAX_PATH]; -static int myARGC; -static char** myARGV; +static UNICODE_STRING port; /* Function pointers for ntdll calls */ static HMODULE hntdll = 0; @@ -155,10 +152,10 @@ static void ProcessConnectionRequest(PLPC_MESSAGE LpcMessage, PHANDLE pAcceptPor ok(!*LpcMessage->Data, "Expected empty string!\n"); status = pNtAcceptConnectPort(pAcceptPortHandle, 0, LpcMessage, 1, 0, NULL); - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status); + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); status = pNtCompleteConnectPort(*pAcceptPortHandle); - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status); + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); } static void ProcessLpcRequest(HANDLE PortHandle, PLPC_MESSAGE LpcMessage) @@ -173,7 +170,7 @@ static void ProcessLpcRequest(HANDLE PortHandle, PLPC_MESSAGE LpcMessage) lstrcpy((LPSTR)LpcMessage->Data, REPLY); status = pNtReplyPort(PortHandle, LpcMessage); - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status); + 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), @@ -194,11 +191,11 @@ static DWORD WINAPI test_ports_client(LPVOID arg) sqos.EffectiveOnly = TRUE; status = pNtConnectPort(&PortHandle, &port, &sqos, 0, 0, &len, NULL, NULL); - todo_wine ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status); + todo_wine ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %x\n", status); if (status != STATUS_SUCCESS) return 1; status = pNtRegisterThreadTerminatePort(PortHandle); - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status); + 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); @@ -209,7 +206,7 @@ static DWORD WINAPI test_ports_client(LPVOID arg) lstrcpy((LPSTR)LpcMessage->Data, REQUEST1); status = pNtRequestPort(PortHandle, LpcMessage); - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status); + 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); @@ -222,7 +219,7 @@ static DWORD WINAPI test_ports_client(LPVOID arg) /* Send the message and wait for the reply */ status = pNtRequestWaitReplyPort(PortHandle, LpcMessage, out); - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status); + 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); @@ -232,34 +229,14 @@ static DWORD WINAPI test_ports_client(LPVOID arg) return 0; } -static void test_ports_server(void) +static void test_ports_server( HANDLE PortHandle ) { - OBJECT_ATTRIBUTES obj; - HANDLE PortHandle; HANDLE AcceptPortHandle; PLPC_MESSAGE LpcMessage; ULONG size; NTSTATUS status; BOOL done = FALSE; - pRtlInitUnicodeString(&port, PORTNAME); - - memset(&obj, 0, sizeof(OBJECT_ATTRIBUTES)); - obj.Length = sizeof(OBJECT_ATTRIBUTES); - obj.ObjectName = &port; - - status = pNtCreatePort(&PortHandle, &obj, 100, 100, 0); - if (status == STATUS_ACCESS_DENIED) - { - skip("Not enough rights\n"); - return; - } - todo_wine - { - ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status); - } - if (status != STATUS_SUCCESS) return; - size = FIELD_OFFSET(LPC_MESSAGE, Data) + MAX_MESSAGE_LEN; LpcMessage = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); @@ -308,20 +285,32 @@ static void test_ports_server(void) START_TEST(port) { - HANDLE thread; - DWORD id; + OBJECT_ATTRIBUTES obj; + HANDLE port_handle; + NTSTATUS status; if (!init_function_ptrs()) return; - myARGC = winetest_get_mainargs(&myARGV); - strcpy(selfname, myARGV[0]); + pRtlInitUnicodeString(&port, PORTNAME); - thread = CreateThread(NULL, 0, test_ports_client, NULL, 0, &id); - ok(thread != NULL, "Expected non-NULL thread handle!\n"); + memset(&obj, 0, sizeof(OBJECT_ATTRIBUTES)); + obj.Length = sizeof(OBJECT_ATTRIBUTES); + obj.ObjectName = &port; - test_ports_server(); - CloseHandle(thread); + status = pNtCreatePort(&port_handle, &obj, 100, 100, 0); + if (status == STATUS_ACCESS_DENIED) skip("Not enough rights\n"); + else todo_wine ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status); + if (status == STATUS_SUCCESS) + { + DWORD id; + HANDLE thread = CreateThread(NULL, 0, test_ports_client, NULL, 0, &id); + ok(thread != NULL, "Expected non-NULL thread handle!\n"); + + test_ports_server( port_handle ); + ok( WaitForSingleObject( thread, 10000 ) == 0, "thread didn't exit\n" ); + CloseHandle(thread); + } FreeLibrary(hntdll); } diff --git a/rostests/winetests/ntdll/reg.c b/rostests/winetests/ntdll/reg.c index 0e25c0639ec..730f818e88d 100755 --- a/rostests/winetests/ntdll/reg.c +++ b/rostests/winetests/ntdll/reg.c @@ -373,7 +373,8 @@ static void test_NtCreateKey(void) /* All NULL */ status = pNtCreateKey(NULL, 0, NULL, 0, 0, 0, 0); - ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08x\n", status); + ok(status == STATUS_ACCESS_VIOLATION || status == STATUS_INVALID_PARAMETER, + "Expected STATUS_ACCESS_VIOLATION or STATUS_INVALID_PARAMETER, got: 0x%08x\n", status); /* Only the key */ status = pNtCreateKey(&key, 0, NULL, 0, 0, 0, 0); @@ -382,7 +383,8 @@ static void test_NtCreateKey(void) /* Only accessmask */ status = pNtCreateKey(NULL, am, NULL, 0, 0, 0, 0); - ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08x\n", status); + ok(status == STATUS_ACCESS_VIOLATION || status == STATUS_INVALID_PARAMETER, + "Expected STATUS_ACCESS_VIOLATION or STATUS_INVALID_PARAMETER, got: 0x%08x\n", status); /* Key and accessmask */ status = pNtCreateKey(&key, am, NULL, 0, 0, 0, 0); @@ -556,7 +558,7 @@ static void test_NtQueryValueKey(void) status = pNtQueryValueKey(key, &ValName, KeyValuePartialInformation, NULL, 0, &len); todo_wine ok(status == STATUS_BUFFER_TOO_SMALL, "NtQueryValueKey should have returned STATUS_BUFFER_TOO_SMALL instead of 0x%08x\n", status); partial_info = HeapAlloc(GetProcessHeap(), 0, len+1); - memset((BYTE*)partial_info, 0xbd, len+1); + memset(partial_info, 0xbd, len+1); status = pNtQueryValueKey(key, &ValName, KeyValuePartialInformation, partial_info, len, &len); ok(status == STATUS_SUCCESS, "NtQueryValueKey should have returned STATUS_SUCCESS instead of 0x%08x\n", status); ok(partial_info->TitleIndex == 0, "NtQueryValueKey returned wrong TitleIndex %d\n", partial_info->TitleIndex); diff --git a/rostests/winetests/ntdll/rtl.c b/rostests/winetests/ntdll/rtl.c index bcf63b4db48..7beef6d9865 100755 --- a/rostests/winetests/ntdll/rtl.c +++ b/rostests/winetests/ntdll/rtl.c @@ -571,7 +571,7 @@ static void test_RtlUniform(void) } -static ULONG WINAPI my_RtlRandom(PULONG seed) +static ULONG my_RtlRandom(PULONG seed) { static ULONG saved_value[128] = { /* 0 */ 0x4c8bc0aa, 0x4c022957, 0x2232827a, 0x2f1e7626, 0x7f8bdafb, 0x5c37d02a, 0x0ab48f72, 0x2f0c4ffa, diff --git a/rostests/winetests/ntdll/rtlstr.c b/rostests/winetests/ntdll/rtlstr.c index f4442730221..e1d4be7ea83 100755 --- a/rostests/winetests/ntdll/rtlstr.c +++ b/rostests/winetests/ntdll/rtlstr.c @@ -191,7 +191,7 @@ static void test_RtlInitUnicodeStringEx(void) UNICODE_STRING uni; NTSTATUS result; - teststring2 = (WCHAR *) malloc((TESTSTRING2_LEN + 1) * sizeof(WCHAR)); + teststring2 = malloc((TESTSTRING2_LEN + 1) * sizeof(WCHAR)); memset(teststring2, 'X', TESTSTRING2_LEN * sizeof(WCHAR)); teststring2[TESTSTRING2_LEN] = '\0'; diff --git a/rostests/winetests/ntdll/string.c b/rostests/winetests/ntdll/string.c index 205a880d670..16c11926016 100755 --- a/rostests/winetests/ntdll/string.c +++ b/rostests/winetests/ntdll/string.c @@ -591,20 +591,23 @@ static void one_i64toa_test(int test_num, const ulonglong2str_t *ulonglong2str) dest_str[LARGE_STRI_BUFFER_LENGTH] = '\0'; result = p_i64toa(ulonglong2str->value, dest_str, ulonglong2str->base); ok(result == dest_str, - "(test %d): _i64toa(%Lu, [out], %d) has result %p, expected: %p\n", - test_num, ulonglong2str->value, ulonglong2str->base, result, dest_str); + "(test %d): _i64toa(%08x%08x, [out], %d) has result %p, expected: %p\n", + test_num, (DWORD)(ulonglong2str->value >> 32), (DWORD)ulonglong2str->value, + ulonglong2str->base, result, dest_str); if (ulonglong2str->mask & 0x04) { if (memcmp(dest_str, ulonglong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) != 0) { if (memcmp(dest_str, ulonglong2str[1].Buffer, LARGE_STRI_BUFFER_LENGTH) != 0) { ok(memcmp(dest_str, ulonglong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0, - "(test %d): _i64toa(%Lu, [out], %d) assigns string \"%s\", expected: \"%s\"\n", - test_num, ulonglong2str->value, ulonglong2str->base, dest_str, ulonglong2str->Buffer); + "(test %d): _i64toa(%08x%08x, [out], %d) assigns string \"%s\", expected: \"%s\"\n", + test_num, (DWORD)(ulonglong2str->value >> 32), (DWORD)ulonglong2str->value, + ulonglong2str->base, dest_str, ulonglong2str->Buffer); } /* if */ } /* if */ } else { ok(memcmp(dest_str, ulonglong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0, - "(test %d): _i64toa(%Lu, [out], %d) assigns string \"%s\", expected: \"%s\"\n", - test_num, ulonglong2str->value, ulonglong2str->base, dest_str, ulonglong2str->Buffer); + "(test %d): _i64toa(%08x%08x, [out], %d) assigns string \"%s\", expected: \"%s\"\n", + test_num, (DWORD)(ulonglong2str->value >> 32), (DWORD)ulonglong2str->value, + ulonglong2str->base, dest_str, ulonglong2str->Buffer); } /* if */ } @@ -618,11 +621,13 @@ static void one_ui64toa_test(int test_num, const ulonglong2str_t *ulonglong2str) dest_str[LARGE_STRI_BUFFER_LENGTH] = '\0'; result = p_ui64toa(ulonglong2str->value, dest_str, ulonglong2str->base); ok(result == dest_str, - "(test %d): _ui64toa(%Lu, [out], %d) has result %p, expected: %p\n", - test_num, ulonglong2str->value, ulonglong2str->base, result, dest_str); + "(test %d): _ui64toa(%08x%08x, [out], %d) has result %p, expected: %p\n", + test_num, (DWORD)(ulonglong2str->value >> 32), (DWORD)ulonglong2str->value, + ulonglong2str->base, result, dest_str); ok(memcmp(dest_str, ulonglong2str->Buffer, LARGE_STRI_BUFFER_LENGTH) == 0, - "(test %d): _ui64toa(%Lu, [out], %d) assigns string \"%s\", expected: \"%s\"\n", - test_num, ulonglong2str->value, ulonglong2str->base, dest_str, ulonglong2str->Buffer); + "(test %d): _ui64toa(%08x%08x, [out], %d) assigns string \"%s\", expected: \"%s\"\n", + test_num, (DWORD)(ulonglong2str->value >> 32), (DWORD)ulonglong2str->value, + ulonglong2str->base, dest_str, ulonglong2str->Buffer); } diff --git a/rostests/winetests/odbccp32/misc.c b/rostests/winetests/odbccp32/misc.c index ba8e5f45f87..044846cc7d4 100644 --- a/rostests/winetests/odbccp32/misc.c +++ b/rostests/winetests/odbccp32/misc.c @@ -112,14 +112,24 @@ static void test_SQLInstallDriverManager(void) /* Length OK */ bool_ret = SQLInstallDriverManager(target_path, MAX_PATH, NULL); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); - ok(bool_ret, "SQLInstallDriverManager unexpectedly failed\n"); - ok(sql_ret == SQL_NO_DATA, "Expected SQL_NO_DATA, got %d\n", sql_ret); + ok(bool_ret, "SQLInstallDriverManager unexpectedly failed: %d\n", + error_code); + if (bool_ret) + ok(sql_ret == SQL_NO_DATA, "Expected SQL_NO_DATA, got %d\n", sql_ret); + else + ok(sql_ret == SQL_SUCCESS_WITH_INFO, + "Expected SQL_SUCCESS_WITH_INFO, got %d\n", sql_ret); path_out = 0xcafe; bool_ret = SQLInstallDriverManager(target_path, MAX_PATH, &path_out); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); - ok(bool_ret, "SQLInstallDriverManager unexpectedly failed\n"); - ok(sql_ret == SQL_NO_DATA, "Expected SQL_NO_DATA, got %d\n", sql_ret); + ok(bool_ret, "SQLInstallDriverManager unexpectedly failed: %d\n", + error_code); + if (bool_ret) + ok(sql_ret == SQL_NO_DATA, "Expected SQL_NO_DATA, got %d\n", sql_ret); + else + ok(sql_ret == SQL_SUCCESS_WITH_INFO, + "Expected SQL_SUCCESS_WITH_INFO, got %d\n", sql_ret); /* path_out should in practice be less than 0xcafe */ ok(path_out != 0xcafe, "Expected path_out to show the correct amount of bytes\n"); } diff --git a/rostests/winetests/ole32/clipboard.c b/rostests/winetests/ole32/clipboard.c index a4f8a62d6cb..f06a4823ac0 100644 --- a/rostests/winetests/ole32/clipboard.c +++ b/rostests/winetests/ole32/clipboard.c @@ -19,8 +19,10 @@ */ #define COBJMACROS +#define NONAMELESSUNION #include +#include #include "windef.h" #include "winbase.h" @@ -37,6 +39,15 @@ (fe).lindex=-1;\ }; +static inline char *dump_fmtetc(FORMATETC *fmt) +{ + static char buf[100]; + + snprintf(buf, sizeof(buf), "cf %04x ptd %p aspect %x lindex %d tymed %x", + fmt->cfFormat, fmt->ptd, fmt->dwAspect, fmt->lindex, fmt->tymed); + return buf; +} + typedef struct DataObjectImpl { const IDataObjectVtbl *lpVtbl; LONG ref; @@ -45,6 +56,8 @@ typedef struct DataObjectImpl { UINT fmtetc_cnt; HANDLE text; + IStream *stm; + IStorage *stg; } DataObjectImpl; typedef struct EnumFormatImpl { @@ -59,6 +72,10 @@ typedef struct EnumFormatImpl { static BOOL expect_DataObjectImpl_QueryGetData = TRUE; static ULONG DataObjectImpl_GetData_calls = 0; +static ULONG DataObjectImpl_GetDataHere_calls = 0; +static ULONG DataObjectImpl_EnumFormatEtc_calls = 0; + +static UINT cf_stream, cf_storage, cf_global, cf_another, cf_onemore; static HRESULT EnumFormatImpl_Create(FORMATETC *fmtetc, UINT size, LPENUMFORMATETC *lplpformatetc); @@ -99,15 +116,23 @@ static HRESULT WINAPI EnumFormatImpl_Next(IEnumFORMATETC *iface, ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched) { EnumFormatImpl *This = (EnumFormatImpl*)iface; - ULONG count = 0; + ULONG count, i; + + trace("next: count %d cur %d\n", celt, This->cur); if(!rgelt) return E_INVALIDARG; - count = min(celt, This->fmtetc_cnt-This->cur); - if(count > 0) { - memcpy(rgelt, This->fmtetc+This->cur, count*sizeof(FORMATETC)); - This->cur += count; + count = min(celt, This->fmtetc_cnt - This->cur); + for(i = 0; i < count; i++, This->cur++, rgelt++) + { + *rgelt = This->fmtetc[This->cur]; + if(rgelt->ptd) + { + DWORD size = This->fmtetc[This->cur].ptd->tdSize; + rgelt->ptd = CoTaskMemAlloc(size); + memcpy(rgelt->ptd, This->fmtetc[This->cur].ptd, size); + } } if(pceltFetched) *pceltFetched = count; @@ -184,9 +209,15 @@ static ULONG WINAPI DataObjectImpl_Release(IDataObject* iface) DataObjectImpl *This = (DataObjectImpl*)iface; ULONG ref = InterlockedDecrement(&This->ref); - if(!ref) { + if(!ref) + { + int i; if(This->text) GlobalFree(This->text); - if(This->fmtetc) GlobalFree(This->fmtetc); + for(i = 0; i < This->fmtetc_cnt; i++) + HeapFree(GetProcessHeap(), 0, This->fmtetc[i].ptd); + HeapFree(GetProcessHeap(), 0, This->fmtetc); + if(This->stm) IStream_Release(This->stm); + if(This->stg) IStorage_Release(This->stg); HeapFree(GetProcessHeap(), 0, This); } @@ -196,29 +227,56 @@ static ULONG WINAPI DataObjectImpl_Release(IDataObject* iface) static HRESULT WINAPI DataObjectImpl_GetData(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium) { DataObjectImpl *This = (DataObjectImpl*)iface; + UINT i; + BOOL foundFormat = FALSE; + + trace("getdata: %s\n", dump_fmtetc(pformatetc)); DataObjectImpl_GetData_calls++; if(pformatetc->lindex != -1) return DV_E_FORMATETC; - if(!(pformatetc->tymed & TYMED_HGLOBAL)) - return DV_E_TYMED; + for(i = 0; i < This->fmtetc_cnt; i++) + { + if(This->fmtetc[i].cfFormat == pformatetc->cfFormat) + { + foundFormat = TRUE; + if(This->fmtetc[i].tymed & pformatetc->tymed) + { + pmedium->pUnkForRelease = (LPUNKNOWN)iface; + IUnknown_AddRef(pmedium->pUnkForRelease); - if(This->text && pformatetc->cfFormat == CF_TEXT) - U(*pmedium).hGlobal = This->text; - else - return DV_E_FORMATETC; + if(pformatetc->cfFormat == CF_TEXT || pformatetc->cfFormat == cf_global) + { + pmedium->tymed = TYMED_HGLOBAL; + U(*pmedium).hGlobal = This->text; + } + else if(pformatetc->cfFormat == cf_stream) + { + pmedium->tymed = TYMED_ISTREAM; + IStream_AddRef(This->stm); + U(*pmedium).pstm = This->stm; + } + else if(pformatetc->cfFormat == cf_storage || pformatetc->cfFormat == cf_another) + { + pmedium->tymed = TYMED_ISTORAGE; + IStorage_AddRef(This->stg); + U(*pmedium).pstg = This->stg; + } + return S_OK; + } + } + } - pmedium->tymed = TYMED_HGLOBAL; - pmedium->pUnkForRelease = (LPUNKNOWN)iface; - IUnknown_AddRef(pmedium->pUnkForRelease); - return S_OK; + return foundFormat ? DV_E_TYMED : DV_E_FORMATETC; } static HRESULT WINAPI DataObjectImpl_GetDataHere(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium) { - ok(0, "unexpected call\n"); + trace("getdatahere: %s\n", dump_fmtetc(pformatetc)); + DataObjectImpl_GetDataHere_calls++; + return E_NOTIMPL; } @@ -228,6 +286,7 @@ static HRESULT WINAPI DataObjectImpl_QueryGetData(IDataObject* iface, FORMATETC UINT i; BOOL foundFormat = FALSE; + trace("querygetdata: %s\n", dump_fmtetc(pformatetc)); if (!expect_DataObjectImpl_QueryGetData) ok(0, "unexpected call to DataObjectImpl_QueryGetData\n"); @@ -263,6 +322,8 @@ static HRESULT WINAPI DataObjectImpl_EnumFormatEtc(IDataObject* iface, DWORD dwD { DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl_EnumFormatEtc_calls++; + if(dwDirection != DATADIR_GET) { ok(0, "unexpected direction %d\n", dwDirection); return E_NOTIMPL; @@ -315,6 +376,8 @@ static HRESULT DataObjectImpl_CreateText(LPCSTR text, LPDATAOBJECT *lplpdataobj) obj->text = GlobalAlloc(GMEM_MOVEABLE, strlen(text) + 1); strcpy(GlobalLock(obj->text), text); GlobalUnlock(obj->text); + obj->stm = NULL; + obj->stg = NULL; obj->fmtetc_cnt = 1; obj->fmtetc = HeapAlloc(GetProcessHeap(), 0, obj->fmtetc_cnt*sizeof(FORMATETC)); @@ -324,6 +387,59 @@ static HRESULT DataObjectImpl_CreateText(LPCSTR text, LPDATAOBJECT *lplpdataobj) return S_OK; } +const char *cmpl_stm_data = "complex stream"; +const char *cmpl_text_data = "complex text"; +const WCHAR device_name[] = {'m','y','d','e','v',0}; + +static HRESULT DataObjectImpl_CreateComplex(LPDATAOBJECT *lplpdataobj) +{ + DataObjectImpl *obj; + ILockBytes *lbs; + DEVMODEW dm; + + obj = HeapAlloc(GetProcessHeap(), 0, sizeof(DataObjectImpl)); + obj->lpVtbl = &VT_DataObjectImpl; + obj->ref = 1; + obj->text = GlobalAlloc(GMEM_MOVEABLE, strlen(cmpl_text_data) + 1); + strcpy(GlobalLock(obj->text), cmpl_text_data); + GlobalUnlock(obj->text); + CreateStreamOnHGlobal(NULL, TRUE, &obj->stm); + IStream_Write(obj->stm, cmpl_stm_data, strlen(cmpl_stm_data), NULL); + + CreateILockBytesOnHGlobal(NULL, TRUE, &lbs); + StgCreateDocfileOnILockBytes(lbs, STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE, 0, &obj->stg); + ILockBytes_Release(lbs); + + obj->fmtetc_cnt = 8; + /* zeroing here since FORMATETC has a hole in it, and it's confusing to have this uninitialised. */ + obj->fmtetc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, obj->fmtetc_cnt*sizeof(FORMATETC)); + InitFormatEtc(obj->fmtetc[0], CF_TEXT, TYMED_HGLOBAL); + InitFormatEtc(obj->fmtetc[1], cf_stream, TYMED_ISTREAM); + InitFormatEtc(obj->fmtetc[2], cf_storage, TYMED_ISTORAGE); + InitFormatEtc(obj->fmtetc[3], cf_another, TYMED_ISTORAGE|TYMED_ISTREAM|TYMED_HGLOBAL); + memset(&dm, 0, sizeof(dm)); + dm.dmSize = sizeof(dm); + dm.dmDriverExtra = 0; + lstrcpyW(dm.dmDeviceName, device_name); + obj->fmtetc[3].ptd = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(DVTARGETDEVICE, tdData) + sizeof(device_name) + dm.dmSize + dm.dmDriverExtra); + obj->fmtetc[3].ptd->tdSize = FIELD_OFFSET(DVTARGETDEVICE, tdData) + sizeof(device_name) + dm.dmSize + dm.dmDriverExtra; + obj->fmtetc[3].ptd->tdDriverNameOffset = FIELD_OFFSET(DVTARGETDEVICE, tdData); + obj->fmtetc[3].ptd->tdDeviceNameOffset = 0; + obj->fmtetc[3].ptd->tdPortNameOffset = 0; + obj->fmtetc[3].ptd->tdExtDevmodeOffset = obj->fmtetc[3].ptd->tdDriverNameOffset + sizeof(device_name); + lstrcpyW((WCHAR*)obj->fmtetc[3].ptd->tdData, device_name); + memcpy(obj->fmtetc[3].ptd->tdData + sizeof(device_name), &dm, dm.dmSize + dm.dmDriverExtra); + + InitFormatEtc(obj->fmtetc[4], cf_global, TYMED_HGLOBAL); + InitFormatEtc(obj->fmtetc[5], cf_another, TYMED_HGLOBAL); + InitFormatEtc(obj->fmtetc[6], cf_another, 0xfffff); + InitFormatEtc(obj->fmtetc[7], cf_another, 0xfffff); + obj->fmtetc[7].dwAspect = DVASPECT_ICON; + + *lplpdataobj = (LPDATAOBJECT)obj; + return S_OK; +} + static void test_get_clipboard(void) { HRESULT hr; @@ -423,17 +539,288 @@ static void test_get_clipboard(void) IDataObject_Release(data_obj); } +static void test_enum_fmtetc(IDataObject *src) +{ + HRESULT hr; + IDataObject *data; + IEnumFORMATETC *enum_fmt, *src_enum; + FORMATETC fmt, src_fmt; + DWORD count = 0; + + hr = OleGetClipboard(&data); + ok(hr == S_OK, "OleGetClipboard failed with error 0x%08x\n", hr); + + hr = IDataObject_EnumFormatEtc(data, DATADIR_SET, &enum_fmt); + ok(hr == E_NOTIMPL || + broken(hr == E_INVALIDARG), /* win98 (not win98SE) */ + "got %08x\n", hr); + + DataObjectImpl_EnumFormatEtc_calls = 0; + hr = IDataObject_EnumFormatEtc(data, DATADIR_GET, &enum_fmt); + ok(hr == S_OK, "got %08x\n", hr); + ok(DataObjectImpl_EnumFormatEtc_calls == 0, "EnumFormatEtc was called\n"); + + if(src) IDataObject_EnumFormatEtc(src, DATADIR_GET, &src_enum); + + while((hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL)) == S_OK) + { + ok(src != NULL, "shouldn't be here\n"); + hr = IEnumFORMATETC_Next(src_enum, 1, &src_fmt, NULL); + ok(hr == S_OK, "%d: got %08x\n", count, hr); + trace("%d: %s\n", count, dump_fmtetc(&fmt)); + ok(fmt.cfFormat == src_fmt.cfFormat, "%d: %04x %04x\n", count, fmt.cfFormat, src_fmt.cfFormat); + ok(fmt.dwAspect == src_fmt.dwAspect, "%d: %08x %08x\n", count, fmt.dwAspect, src_fmt.dwAspect); + ok(fmt.lindex == src_fmt.lindex, "%d: %08x %08x\n", count, fmt.lindex, src_fmt.lindex); + ok(fmt.tymed == src_fmt.tymed, "%d: %08x %08x\n", count, fmt.tymed, src_fmt.tymed); + if(fmt.ptd) + { + ok(src_fmt.ptd != NULL, "%d: expected non-NULL\n", count); + CoTaskMemFree(fmt.ptd); + CoTaskMemFree(src_fmt.ptd); + } + count++; + } + + ok(hr == S_FALSE, "%d: got %08x\n", count, hr); + + if(src) + { + hr = IEnumFORMATETC_Next(src_enum, 1, &src_fmt, NULL); + ok(hr == S_FALSE || + broken(hr == S_OK && count == 5), /* win9x and winme don't enumerate duplicated cf's */ + "%d: got %08x\n", count, hr); + IEnumFORMATETC_Release(src_enum); + } + + hr = IEnumFORMATETC_Reset(enum_fmt); + ok(hr == S_OK, "got %08x\n", hr); + + if(src) /* Exercise the enumerator a bit */ + { + IEnumFORMATETC *clone; + FORMATETC third_fmt; + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &third_fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + hr = IEnumFORMATETC_Next(enum_fmt, 1, &third_fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + hr = IEnumFORMATETC_Next(enum_fmt, 1, &third_fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + + hr = IEnumFORMATETC_Reset(enum_fmt); + ok(hr == S_OK, "got %08x\n", hr); + hr = IEnumFORMATETC_Skip(enum_fmt, 2); + ok(hr == S_OK, "got %08x\n", hr); + + hr = IEnumFORMATETC_Clone(enum_fmt, &clone); + ok(hr == S_OK, "got %08x\n", hr); + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + ok(fmt.cfFormat == third_fmt.cfFormat, "formats don't match\n"); + hr = IEnumFORMATETC_Next(clone, 1, &fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + ok(fmt.cfFormat == third_fmt.cfFormat, "formats don't match\n"); + IEnumFORMATETC_Release(clone); + } + + IEnumFORMATETC_Release(enum_fmt); + IDataObject_Release(data); +} + +static void test_no_cf_dataobject(void) +{ + UINT cf_dataobject = RegisterClipboardFormatA("DataObject"); + UINT cf_ole_priv_data = RegisterClipboardFormatA("Ole Private Data"); + HANDLE h; + OpenClipboard(NULL); + + h = GetClipboardData(cf_dataobject); + ok(!h, "got %p\n", h); + h = GetClipboardData(cf_ole_priv_data); + ok(!h, "got %p\n", h); + + CloseClipboard(); +} + +static void test_cf_dataobject(IDataObject *data) +{ + UINT cf = 0; + UINT cf_dataobject = RegisterClipboardFormatA("DataObject"); + UINT cf_ole_priv_data = RegisterClipboardFormatA("Ole Private Data"); + BOOL found_dataobject = FALSE, found_priv_data = FALSE; + + OpenClipboard(NULL); + do + { + cf = EnumClipboardFormats(cf); + if(cf == cf_dataobject) + { + HGLOBAL h = GetClipboardData(cf); + HWND *ptr = GlobalLock(h); + DWORD size = GlobalSize(h); + HWND clip_owner = GetClipboardOwner(); + + found_dataobject = TRUE; + ok(size >= sizeof(*ptr), "size %d\n", size); + if(data) + ok(*ptr == clip_owner, "hwnd %p clip_owner %p\n", *ptr, clip_owner); + else /* ole clipboard flushed */ + ok(*ptr == NULL, "hwnd %p\n", *ptr); + GlobalUnlock(h); + } + else if(cf == cf_ole_priv_data) + { + found_priv_data = TRUE; + if(data) + { + HGLOBAL h = GetClipboardData(cf); + DWORD *ptr = GlobalLock(h); + DWORD size = GlobalSize(h); + + if(size != ptr[1]) + win_skip("Ole Private Data in win9x format\n"); + else + { + HRESULT hr; + IEnumFORMATETC *enum_fmt; + DWORD count = 0; + FORMATETC fmt; + struct formatetcetc + { + FORMATETC fmt; + BOOL first_use_of_cf; + DWORD res[2]; + } *fmt_ptr; + struct priv_data + { + DWORD res1; + DWORD size; + DWORD res2; + DWORD count; + DWORD res3[2]; + struct formatetcetc fmts[1]; + } *priv = (struct priv_data*)ptr; + CLIPFORMAT cfs_seen[10]; + + hr = IDataObject_EnumFormatEtc(data, DATADIR_GET, &enum_fmt); + ok(hr == S_OK, "got %08x\n", hr); + fmt_ptr = priv->fmts; + + while(IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL) == S_OK) + { + int i; + BOOL seen_cf = FALSE; + + ok(fmt_ptr->fmt.cfFormat == fmt.cfFormat, + "got %08x expected %08x\n", fmt_ptr->fmt.cfFormat, fmt.cfFormat); + ok(fmt_ptr->fmt.dwAspect == fmt.dwAspect, "got %08x expected %08x\n", + fmt_ptr->fmt.dwAspect, fmt.dwAspect); + ok(fmt_ptr->fmt.lindex == fmt.lindex, "got %08x expected %08x\n", + fmt_ptr->fmt.lindex, fmt.lindex); + ok(fmt_ptr->fmt.tymed == fmt.tymed, "got %08x expected %08x\n", + fmt_ptr->fmt.tymed, fmt.tymed); + for(i = 0; i < count; i++) + if(fmt_ptr->fmt.cfFormat == cfs_seen[i]) + { + seen_cf = TRUE; + break; + } + cfs_seen[count] = fmt.cfFormat; + ok(fmt_ptr->first_use_of_cf == seen_cf ? FALSE : TRUE, "got %08x expected %08x\n", + fmt_ptr->first_use_of_cf, !seen_cf); + ok(fmt_ptr->res[0] == 0, "got %08x\n", fmt_ptr->res[1]); + ok(fmt_ptr->res[1] == 0, "got %08x\n", fmt_ptr->res[2]); + if(fmt.ptd) + { + DVTARGETDEVICE *target; + + ok(fmt_ptr->fmt.ptd != NULL, "target device offset zero\n"); + target = (DVTARGETDEVICE*)((char*)priv + (DWORD)fmt_ptr->fmt.ptd); + ok(!memcmp(target, fmt.ptd, fmt.ptd->tdSize), "target devices differ\n"); + CoTaskMemFree(fmt.ptd); + } + fmt_ptr++; + count++; + } + ok(priv->res1 == 0, "got %08x\n", priv->res1); + ok(priv->res2 == 1, "got %08x\n", priv->res2); + ok(priv->count == count, "got %08x expected %08x\n", priv->count, count); + ok(priv->res3[0] == 0, "got %08x\n", priv->res3[0]); + + /* win64 sets the lsb */ + if(sizeof(fmt_ptr->fmt.ptd) == 8) + todo_wine ok(priv->res3[1] == 1, "got %08x\n", priv->res3[1]); + else + ok(priv->res3[1] == 0, "got %08x\n", priv->res3[1]); + + GlobalUnlock(h); + IEnumFORMATETC_Release(enum_fmt); + } + } + } + else if(cf == cf_stream) + { + HGLOBAL h; + void *ptr; + DWORD size; + + DataObjectImpl_GetDataHere_calls = 0; + h = GetClipboardData(cf); + ok(DataObjectImpl_GetDataHere_calls == 1, "got %d\n", DataObjectImpl_GetDataHere_calls); + ptr = GlobalLock(h); + size = GlobalSize(h); + ok(size == strlen(cmpl_stm_data) || + broken(size > strlen(cmpl_stm_data)), /* win9x, winme */ + "expected %d got %d\n", lstrlenA(cmpl_stm_data), size); + ok(!memcmp(ptr, cmpl_stm_data, strlen(cmpl_stm_data)), "mismatch\n"); + GlobalUnlock(h); + } + else if(cf == cf_global) + { + HGLOBAL h; + void *ptr; + DWORD size; + + DataObjectImpl_GetDataHere_calls = 0; + h = GetClipboardData(cf); + ok(DataObjectImpl_GetDataHere_calls == 0, "got %d\n", DataObjectImpl_GetDataHere_calls); + ptr = GlobalLock(h); + size = GlobalSize(h); + ok(size == strlen(cmpl_text_data) + 1 || + broken(size > strlen(cmpl_text_data) + 1), /* win9x, winme */ + "expected %d got %d\n", lstrlenA(cmpl_text_data) + 1, size); + ok(!memcmp(ptr, cmpl_text_data, strlen(cmpl_text_data) + 1), "mismatch\n"); + GlobalUnlock(h); + } + } while(cf); + CloseClipboard(); + ok(found_dataobject, "didn't find cf_dataobject\n"); + ok(found_priv_data, "didn't find cf_ole_priv_data\n"); +} + static void test_set_clipboard(void) { HRESULT hr; ULONG ref; - LPDATAOBJECT data1, data2; + LPDATAOBJECT data1, data2, data_cmpl; + HGLOBAL hblob, h; + + cf_stream = RegisterClipboardFormatA("stream format"); + cf_storage = RegisterClipboardFormatA("storage format"); + cf_global = RegisterClipboardFormatA("global format"); + cf_another = RegisterClipboardFormatA("another format"); + cf_onemore = RegisterClipboardFormatA("one more format"); + hr = DataObjectImpl_CreateText("data1", &data1); ok(SUCCEEDED(hr), "Failed to create data1 object: 0x%08x\n", hr); if(FAILED(hr)) return; hr = DataObjectImpl_CreateText("data2", &data2); ok(SUCCEEDED(hr), "Failed to create data2 object: 0x%08x\n", hr); + if(FAILED(hr)) + return; + hr = DataObjectImpl_CreateComplex(&data_cmpl); + ok(SUCCEEDED(hr), "Failed to create complex data object: 0x%08x\n", hr); if(FAILED(hr)) return; @@ -453,6 +840,9 @@ static void test_set_clipboard(void) hr = OleSetClipboard(data1); ok(hr == S_OK, "failed to set clipboard to data1, hr = 0x%08x\n", hr); + + test_cf_dataobject(data1); + hr = OleIsCurrentClipboard(data1); ok(hr == S_OK, "expected current clipboard to be data1, hr = 0x%08x\n", hr); hr = OleIsCurrentClipboard(data2); @@ -471,6 +861,18 @@ static void test_set_clipboard(void) hr = OleIsCurrentClipboard(NULL); ok(hr == S_FALSE, "expect S_FALSE, hr = 0x%08x\n", hr); + /* put a format directly onto the clipboard to show + OleFlushClipboard doesn't empty the clipboard */ + hblob = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE|GMEM_ZEROINIT, 10); + OpenClipboard(NULL); + h = SetClipboardData(cf_onemore, hblob); + ok(h == hblob, "got %p\n", h); + h = GetClipboardData(cf_onemore); + ok(h == hblob || + broken(h != NULL), /* win9x */ + "got %p\n", h); + CloseClipboard(); + hr = OleFlushClipboard(); ok(hr == S_OK, "failed to flush clipboard, hr = 0x%08x\n", hr); hr = OleIsCurrentClipboard(data1); @@ -480,18 +882,639 @@ static void test_set_clipboard(void) hr = OleIsCurrentClipboard(NULL); ok(hr == S_FALSE, "expect S_FALSE, hr = 0x%08x\n", hr); + /* format should survive the flush */ + OpenClipboard(NULL); + h = GetClipboardData(cf_onemore); + ok(h == hblob || + broken(h != NULL), /* win9x */ + "got %p\n", h); + CloseClipboard(); + + test_cf_dataobject(NULL); + ok(OleSetClipboard(NULL) == S_OK, "failed to clear clipboard, hr = 0x%08x\n", hr); + OpenClipboard(NULL); + h = GetClipboardData(cf_onemore); + ok(h == NULL, "got %p\n", h); + CloseClipboard(); + + trace("setting complex\n"); + hr = OleSetClipboard(data_cmpl); + ok(hr == S_OK, "failed to set clipboard to complex data, hr = 0x%08x\n", hr); + test_cf_dataobject(data_cmpl); + test_enum_fmtetc(data_cmpl); + + ok(OleSetClipboard(NULL) == S_OK, "failed to clear clipboard, hr = 0x%08x\n", hr); + + test_no_cf_dataobject(); + test_enum_fmtetc(NULL); + ref = IDataObject_Release(data1); ok(ref == 0, "expected data1 ref=0, got %d\n", ref); ref = IDataObject_Release(data2); ok(ref == 0, "expected data2 ref=0, got %d\n", ref); + ref = IDataObject_Release(data_cmpl); + ok(ref == 0, "expected data_cmpl ref=0, got %d\n", ref); OleUninitialize(); } +static inline ULONG count_refs(IDataObject *d) +{ + IDataObject_AddRef(d); + return IDataObject_Release(d); +} + +static void test_consumer_refs(void) +{ + HRESULT hr; + IDataObject *src, *src2, *get1, *get2, *get3; + ULONG refs, old_refs; + FORMATETC fmt; + STGMEDIUM med; + + InitFormatEtc(fmt, CF_TEXT, TYMED_HGLOBAL); + + OleInitialize(NULL); + + /* First show that each clipboard state results in + a different data object */ + + hr = DataObjectImpl_CreateText("data1", &src); + ok(hr == S_OK, "got %08x\n", hr); + hr = DataObjectImpl_CreateText("data2", &src2); + ok(hr == S_OK, "got %08x\n", hr); + + hr = OleSetClipboard(src); + ok(hr == S_OK, "got %08x\n", hr); + + hr = OleGetClipboard(&get1); + ok(hr == S_OK, "got %08x\n", hr); + + hr = OleGetClipboard(&get2); + ok(hr == S_OK, "got %08x\n", hr); + + ok(get1 == get2 || + broken(get1 != get2), /* win9x, winme & nt4 */ + "data objects differ\n"); + refs = IDataObject_Release(get2); + ok(refs == (get1 == get2 ? 1 : 0), "got %d\n", refs); + + OleFlushClipboard(); + + DataObjectImpl_GetData_calls = 0; + hr = IDataObject_GetData(get1, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(DataObjectImpl_GetData_calls == 0, "GetData called\n"); + ReleaseStgMedium(&med); + + hr = OleGetClipboard(&get2); + ok(hr == S_OK, "got %08x\n", hr); + + ok(get1 != get2, "data objects match\n"); + + OleSetClipboard(NULL); + + hr = OleGetClipboard(&get3); + ok(hr == S_OK, "got %08x\n", hr); + + ok(get1 != get3, "data objects match\n"); + ok(get2 != get3, "data objects match\n"); + + IDataObject_Release(get3); + IDataObject_Release(get2); + IDataObject_Release(get1); + + /* Now call GetData before the flush and show that this + takes a ref on our src data obj. */ + + hr = OleSetClipboard(src); + ok(hr == S_OK, "got %08x\n", hr); + + old_refs = count_refs(src); + + hr = OleGetClipboard(&get1); + ok(hr == S_OK, "got %08x\n", hr); + + refs = count_refs(src); + ok(refs == old_refs, "%d %d\n", refs, old_refs); + + DataObjectImpl_GetData_calls = 0; + hr = IDataObject_GetData(get1, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(DataObjectImpl_GetData_calls == 1, "GetData not called\n"); + ReleaseStgMedium(&med); + refs = count_refs(src); + ok(refs == old_refs + 1, "%d %d\n", refs, old_refs); + + OleFlushClipboard(); + + DataObjectImpl_GetData_calls = 0; + hr = IDataObject_GetData(get1, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(DataObjectImpl_GetData_calls == 1, "GetData not called\n"); + ReleaseStgMedium(&med); + + refs = count_refs(src); + ok(refs == 2, "%d\n", refs); + + IDataObject_Release(get1); + + refs = count_refs(src); + ok(refs == 1, "%d\n", refs); + + /* Now set a second src object before the call to GetData + and show that GetData calls that second src. */ + + hr = OleSetClipboard(src); + ok(hr == S_OK, "got %08x\n", hr); + + old_refs = count_refs(src); + + hr = OleGetClipboard(&get1); + ok(hr == S_OK, "got %08x\n", hr); + + refs = count_refs(src); + ok(refs == old_refs, "%d %d\n", refs, old_refs); + + hr = OleSetClipboard(src2); + ok(hr == S_OK, "got %08x\n", hr); + + old_refs = count_refs(src2); + + DataObjectImpl_GetData_calls = 0; + hr = IDataObject_GetData(get1, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(DataObjectImpl_GetData_calls == 1, "GetData not called\n"); + ReleaseStgMedium(&med); + + refs = count_refs(src); + ok(refs == 1, "%d\n", refs); + refs = count_refs(src2); + ok(refs == old_refs + 1, "%d %d\n", refs, old_refs); + + OleSetClipboard(NULL); + + refs = count_refs(src2); + ok(refs == 2, "%d\n", refs); + + IDataObject_Release(get1); + + IDataObject_Release(src2); + IDataObject_Release(src); + + OleUninitialize(); +} + +static void test_flushed_getdata(void) +{ + HRESULT hr; + IDataObject *src, *get; + FORMATETC fmt; + STGMEDIUM med; + STATSTG stat; + DEVMODEW dm; + + OleInitialize(NULL); + + hr = DataObjectImpl_CreateComplex(&src); + ok(hr == S_OK, "got %08x\n", hr); + + hr = OleSetClipboard(src); + ok(hr == S_OK, "got %08x\n", hr); + + hr = OleFlushClipboard(); + ok(hr == S_OK, "got %08x\n", hr); + + hr = OleGetClipboard(&get); + ok(hr == S_OK, "got %08x\n", hr); + + /* global format -> global & stream */ + + InitFormatEtc(fmt, CF_TEXT, TYMED_HGLOBAL); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + InitFormatEtc(fmt, CF_TEXT, TYMED_ISTREAM); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + InitFormatEtc(fmt, CF_TEXT, TYMED_ISTORAGE); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == E_FAIL, "got %08x\n", hr); + + InitFormatEtc(fmt, CF_TEXT, 0xffff); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + /* stream format -> global & stream */ + + InitFormatEtc(fmt, cf_stream, TYMED_ISTREAM); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + InitFormatEtc(fmt, cf_stream, TYMED_ISTORAGE); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == E_FAIL, "got %08x\n", hr); + + InitFormatEtc(fmt, cf_stream, TYMED_HGLOBAL); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + InitFormatEtc(fmt, cf_stream, 0xffff); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + /* storage format -> global, stream & storage */ + + InitFormatEtc(fmt, cf_storage, TYMED_ISTORAGE); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTORAGE, "got %x\n", med.tymed); + hr = IStorage_Stat(med.u.pstg, &stat, STATFLAG_NONAME); + ok(hr == S_OK, "got %08x\n", hr); + ok(stat.grfMode == (STGM_SHARE_EXCLUSIVE | STGM_READWRITE), "got %08x\n", stat.grfMode); + ReleaseStgMedium(&med); + + InitFormatEtc(fmt, cf_storage, TYMED_ISTREAM); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + InitFormatEtc(fmt, cf_storage, TYMED_HGLOBAL); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + InitFormatEtc(fmt, cf_storage, TYMED_HGLOBAL | TYMED_ISTREAM); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + InitFormatEtc(fmt, cf_storage, 0xffff); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTORAGE, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + /* complex format with target device */ + + InitFormatEtc(fmt, cf_another, 0xffff); + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == DV_E_FORMATETC || + broken(hr == S_OK), /* win9x, winme & nt4 */ + "got %08x\n", hr); + if(hr == S_OK) ReleaseStgMedium(&med); + + InitFormatEtc(fmt, cf_another, 0xffff); + memset(&dm, 0, sizeof(dm)); + dm.dmSize = sizeof(dm); + dm.dmDriverExtra = 0; + lstrcpyW(dm.dmDeviceName, device_name); + fmt.ptd = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(DVTARGETDEVICE, tdData) + sizeof(device_name) + dm.dmSize + dm.dmDriverExtra); + fmt.ptd->tdSize = FIELD_OFFSET(DVTARGETDEVICE, tdData) + sizeof(device_name) + dm.dmSize + dm.dmDriverExtra; + fmt.ptd->tdDriverNameOffset = FIELD_OFFSET(DVTARGETDEVICE, tdData); + fmt.ptd->tdDeviceNameOffset = 0; + fmt.ptd->tdPortNameOffset = 0; + fmt.ptd->tdExtDevmodeOffset = fmt.ptd->tdDriverNameOffset + sizeof(device_name); + lstrcpyW((WCHAR*)fmt.ptd->tdData, device_name); + memcpy(fmt.ptd->tdData + sizeof(device_name), &dm, dm.dmSize + dm.dmDriverExtra); + + hr = IDataObject_GetData(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTORAGE, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + + HeapFree(GetProcessHeap(), 0, fmt.ptd); + + + IDataObject_Release(get); + IDataObject_Release(src); + OleUninitialize(); +} + +static HGLOBAL create_text(void) +{ + HGLOBAL h = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE, 5); + char *p = GlobalLock(h); + strcpy(p, "test"); + GlobalUnlock(h); + return h; +} + +static HENHMETAFILE create_emf(void) +{ + const RECT rect = {0, 0, 100, 100}; + HDC hdc = CreateEnhMetaFileA(NULL, NULL, &rect, "HENHMETAFILE Ole Clipboard Test\0Test\0\0"); + ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rect, "Test String", strlen("Test String"), NULL); + return CloseEnhMetaFile(hdc); +} + +static void test_nonole_clipboard(void) +{ + HRESULT hr; + BOOL r; + IDataObject *get; + IEnumFORMATETC *enum_fmt; + FORMATETC fmt; + HGLOBAL h, hblob, htext; + HENHMETAFILE emf; + + r = OpenClipboard(NULL); + ok(r, "gle %d\n", GetLastError()); + r = EmptyClipboard(); + ok(r, "gle %d\n", GetLastError()); + r = CloseClipboard(); + ok(r, "gle %d\n", GetLastError()); + + OleInitialize(NULL); + + /* empty clipboard */ + hr = OleGetClipboard(&get); + ok(hr == S_OK, "got %08x\n", hr); + hr = IDataObject_EnumFormatEtc(get, DATADIR_GET, &enum_fmt); + ok(hr == S_OK, "got %08x\n", hr); + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_FALSE, "got %08x\n", hr); + IEnumFORMATETC_Release(enum_fmt); + + IDataObject_Release(get); + + /* set a user defined clipboard type */ + + htext = create_text(); + hblob = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE|GMEM_ZEROINIT, 10); + emf = create_emf(); + + r = OpenClipboard(NULL); + ok(r, "gle %d\n", GetLastError()); + h = SetClipboardData(CF_TEXT, htext); + ok(h == htext, "got %p\n", h); + h = SetClipboardData(cf_onemore, hblob); + ok(h == hblob, "got %p\n", h); + h = SetClipboardData(CF_ENHMETAFILE, emf); + ok(h == emf, "got %p\n", h); + r = CloseClipboard(); + ok(r, "gle %d\n", GetLastError()); + + hr = OleGetClipboard(&get); + ok(hr == S_OK, "got %08x\n", hr); + hr = IDataObject_EnumFormatEtc(get, DATADIR_GET, &enum_fmt); + ok(hr == S_OK, "got %08x\n", hr); + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + ok(fmt.cfFormat == CF_TEXT, "cf %04x\n", fmt.cfFormat); + ok(fmt.ptd == NULL, "ptd %p\n", fmt.ptd); + ok(fmt.dwAspect == DVASPECT_CONTENT, "aspect %x\n", fmt.dwAspect); + ok(fmt.lindex == -1, "lindex %d\n", fmt.lindex); + ok(fmt.tymed == (TYMED_ISTREAM | TYMED_HGLOBAL), "tymed %x\n", fmt.tymed); + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + ok(fmt.cfFormat == cf_onemore, "cf %04x\n", fmt.cfFormat); + ok(fmt.ptd == NULL, "ptd %p\n", fmt.ptd); + ok(fmt.dwAspect == DVASPECT_CONTENT, "aspect %x\n", fmt.dwAspect); + ok(fmt.lindex == -1, "lindex %d\n", fmt.lindex); + ok(fmt.tymed == (TYMED_ISTREAM | TYMED_HGLOBAL), "tymed %x\n", fmt.tymed); + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + ok(fmt.cfFormat == CF_ENHMETAFILE, "cf %04x\n", fmt.cfFormat); + ok(fmt.ptd == NULL, "ptd %p\n", fmt.ptd); + ok(fmt.dwAspect == DVASPECT_CONTENT, "aspect %x\n", fmt.dwAspect); + ok(fmt.lindex == -1, "lindex %d\n", fmt.lindex); + ok(fmt.tymed == TYMED_ENHMF, "tymed %x\n", fmt.tymed); + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); /* User32 adds some synthesised formats */ + + todo_wine ok(fmt.cfFormat == CF_LOCALE, "cf %04x\n", fmt.cfFormat); + if(fmt.cfFormat == CF_LOCALE) + { + ok(fmt.ptd == NULL, "ptd %p\n", fmt.ptd); + ok(fmt.dwAspect == DVASPECT_CONTENT, "aspect %x\n", fmt.dwAspect); + ok(fmt.lindex == -1, "lindex %d\n", fmt.lindex); + ok(fmt.tymed == (TYMED_ISTREAM | TYMED_HGLOBAL), "tymed %x\n", fmt.tymed); + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + } + + ok(fmt.cfFormat == CF_OEMTEXT, "cf %04x\n", fmt.cfFormat); + ok(fmt.ptd == NULL, "ptd %p\n", fmt.ptd); + ok(fmt.dwAspect == DVASPECT_CONTENT, "aspect %x\n", fmt.dwAspect); + ok(fmt.lindex == -1, "lindex %d\n", fmt.lindex); + ok(fmt.tymed == (TYMED_ISTREAM | TYMED_HGLOBAL), "tymed %x\n", fmt.tymed); + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + ok(fmt.cfFormat == CF_UNICODETEXT || + broken(fmt.cfFormat == CF_METAFILEPICT), /* win9x and winme don't have CF_UNICODETEXT */ + "cf %04x\n", fmt.cfFormat); + if(fmt.cfFormat == CF_UNICODETEXT) + { + ok(fmt.ptd == NULL, "ptd %p\n", fmt.ptd); + ok(fmt.dwAspect == DVASPECT_CONTENT, "aspect %x\n", fmt.dwAspect); + ok(fmt.lindex == -1, "lindex %d\n", fmt.lindex); + ok(fmt.tymed == (TYMED_ISTREAM | TYMED_HGLOBAL), "tymed %x\n", fmt.tymed); + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_OK, "got %08x\n", hr); + } + ok(fmt.cfFormat == CF_METAFILEPICT, "cf %04x\n", fmt.cfFormat); + ok(fmt.ptd == NULL, "ptd %p\n", fmt.ptd); + ok(fmt.dwAspect == DVASPECT_CONTENT, "aspect %x\n", fmt.dwAspect); + ok(fmt.lindex == -1, "lindex %d\n", fmt.lindex); + ok(fmt.tymed == TYMED_MFPICT, "tymed %x\n", fmt.tymed); + + hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL); + ok(hr == S_FALSE, "got %08x\n", hr); + IEnumFORMATETC_Release(enum_fmt); + + IDataObject_Release(get); + + r = OpenClipboard(NULL); + ok(r, "gle %d\n", GetLastError()); + r = EmptyClipboard(); + ok(r, "gle %d\n", GetLastError()); + r = CloseClipboard(); + ok(r, "gle %d\n", GetLastError()); + + OleUninitialize(); +} + +static void test_getdatahere(void) +{ + HRESULT hr; + IDataObject *src, *get; + FORMATETC fmt; + STGMEDIUM med; + + OleInitialize(NULL); + + hr = DataObjectImpl_CreateComplex(&src); + ok(hr == S_OK, "got %08x\n", hr); + + hr = OleSetClipboard(src); + ok(hr == S_OK, "got %08x\n", hr); + + hr = OleGetClipboard(&get); + ok(hr == S_OK, "got %08x\n", hr); + + /* global format -> global & stream */ + + DataObjectImpl_GetData_calls = 0; + DataObjectImpl_GetDataHere_calls = 0; + + InitFormatEtc(fmt, CF_TEXT, TYMED_HGLOBAL); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_HGLOBAL; + U(med).hGlobal = GlobalAlloc(GMEM_MOVEABLE, 100); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 1, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 1, "called %d\n", DataObjectImpl_GetData_calls); + + InitFormatEtc(fmt, CF_TEXT, 0); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_HGLOBAL; + U(med).hGlobal = GlobalAlloc(GMEM_MOVEABLE, 100); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 2, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 1, "called %d\n", DataObjectImpl_GetData_calls); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_HGLOBAL; + U(med).hGlobal = GlobalAlloc(GMEM_MOVEABLE, 1); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == E_FAIL, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 3, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 1, "called %d\n", DataObjectImpl_GetData_calls); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_ISTREAM; + CreateStreamOnHGlobal(NULL, TRUE, &U(med).pstm); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 4, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 1, "called %d\n", DataObjectImpl_GetData_calls); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_ISTORAGE; + StgCreateDocfile(NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DELETEONRELEASE, 0, &U(med).pstg); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == E_FAIL, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTORAGE, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 5, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 1, "called %d\n", DataObjectImpl_GetData_calls); + + InitFormatEtc(fmt, cf_stream, 0); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_HGLOBAL; + U(med).hGlobal = GlobalAlloc(GMEM_MOVEABLE, 100); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 7, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 2, "called %d\n", DataObjectImpl_GetData_calls); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_ISTREAM; + CreateStreamOnHGlobal(NULL, TRUE, &U(med).pstm); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 8, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 2, "called %d\n", DataObjectImpl_GetData_calls); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_ISTORAGE; + StgCreateDocfile(NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DELETEONRELEASE, 0, &U(med).pstg); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == E_FAIL, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTORAGE, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 9, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 2, "called %d\n", DataObjectImpl_GetData_calls); + + InitFormatEtc(fmt, cf_storage, 0); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_HGLOBAL; + U(med).hGlobal = GlobalAlloc(GMEM_MOVEABLE, 3000); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 11, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 3, "called %d\n", DataObjectImpl_GetData_calls); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_ISTREAM; + CreateStreamOnHGlobal(NULL, TRUE, &U(med).pstm); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 12, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 3, "called %d\n", DataObjectImpl_GetData_calls); + + med.pUnkForRelease = NULL; + med.tymed = TYMED_ISTORAGE; + StgCreateDocfile(NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DELETEONRELEASE, 0, &U(med).pstg); + hr = IDataObject_GetDataHere(get, &fmt, &med); + ok(hr == S_OK, "got %08x\n", hr); + ok(med.tymed == TYMED_ISTORAGE, "got %x\n", med.tymed); + ReleaseStgMedium(&med); + ok(DataObjectImpl_GetDataHere_calls == 13, "called %d\n", DataObjectImpl_GetDataHere_calls); + ok(DataObjectImpl_GetData_calls == 3, "called %d\n", DataObjectImpl_GetData_calls); + + + IDataObject_Release(get); + IDataObject_Release(src); + + OleUninitialize(); + +} START_TEST(clipboard) { test_set_clipboard(); + test_consumer_refs(); + test_flushed_getdata(); + test_nonole_clipboard(); + test_getdatahere(); } diff --git a/rostests/winetests/ole32/compobj.c b/rostests/winetests/ole32/compobj.c index a332d2756e3..7363f30f735 100644 --- a/rostests/winetests/ole32/compobj.c +++ b/rostests/winetests/ole32/compobj.c @@ -38,6 +38,7 @@ HRESULT (WINAPI * pCoInitializeEx)(LPVOID lpReserved, DWORD dwCoInit); HRESULT (WINAPI * pCoGetObjectContext)(REFIID riid, LPVOID *ppv); HRESULT (WINAPI * pCoSwitchCallContext)(IUnknown *pObject, IUnknown **ppOldObject); +HRESULT (WINAPI * pCoGetTreatAsClass)(REFCLSID clsidOld, LPCLSID pClsidNew); #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr) #define ok_more_than_one_lock() ok(cLocks > 0, "Number of locks should be > 0, but actually is %d\n", cLocks) @@ -217,11 +218,36 @@ static void test_StringFromGUID2(void) ok(len == 0, "len: %d (expected 0)\n", len); } +struct info +{ + HANDLE wait, stop; +}; + +static DWORD CALLBACK ole_initialize_thread(LPVOID pv) +{ + HRESULT hr; + struct info *info = pv; + + hr = pCoInitializeEx(NULL, COINIT_MULTITHREADED); + + SetEvent(info->wait); + WaitForSingleObject(info->stop, INFINITE); + + CoUninitialize(); + return hr; +} + static void test_CoCreateInstance(void) { - REFCLSID rclsid = &CLSID_MyComputer; - IUnknown *pUnk = (IUnknown *)0xdeadbeef; - HRESULT hr = CoCreateInstance(rclsid, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&pUnk); + HRESULT hr; + HANDLE thread; + DWORD tid, exitcode; + IUnknown *pUnk; + struct info info; + REFCLSID rclsid = &CLSID_InternetZoneManager; + + pUnk = (IUnknown *)0xdeadbeef; + hr = CoCreateInstance(rclsid, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&pUnk); ok(hr == CO_E_NOTINITIALIZED, "CoCreateInstance should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n", hr); ok(pUnk == NULL, "CoCreateInstance should have changed the passed in pointer to NULL, instead of %p\n", pUnk); @@ -233,19 +259,85 @@ static void test_CoCreateInstance(void) hr = CoCreateInstance(rclsid, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&pUnk); ok(hr == CO_E_NOTINITIALIZED, "CoCreateInstance should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n", hr); + + /* show that COM doesn't have to be initialized for multi-threaded apartments if another + thread has already done so */ + + info.wait = CreateEvent(NULL, TRUE, FALSE, NULL); + ok(info.wait != NULL, "CreateEvent failed with error %d\n", GetLastError()); + + info.stop = CreateEvent(NULL, TRUE, FALSE, NULL); + ok(info.stop != NULL, "CreateEvent failed with error %d\n", GetLastError()); + + thread = CreateThread(NULL, 0, ole_initialize_thread, &info, 0, &tid); + ok(thread != NULL, "CreateThread failed with error %d\n", GetLastError()); + + WaitForSingleObject(info.wait, INFINITE); + + pUnk = (IUnknown *)0xdeadbeef; + hr = CoCreateInstance(rclsid, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&pUnk); + ok(hr == S_OK, "CoCreateInstance should have returned S_OK instead of 0x%08x\n", hr); + if (pUnk) IUnknown_Release(pUnk); + + SetEvent(info.stop); + WaitForSingleObject(thread, INFINITE); + + GetExitCodeThread(thread, &exitcode); + hr = exitcode; + ok(hr == S_OK, "thread should have returned S_OK instead of 0x%08x\n", hr); + + CloseHandle(thread); + CloseHandle(info.wait); + CloseHandle(info.stop); } static void test_CoGetClassObject(void) { - IUnknown *pUnk = (IUnknown *)0xdeadbeef; - HRESULT hr = CoGetClassObject(&CLSID_MyComputer, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void **)&pUnk); + HRESULT hr; + HANDLE thread; + DWORD tid, exitcode; + IUnknown *pUnk; + struct info info; + REFCLSID rclsid = &CLSID_InternetZoneManager; + + hr = CoGetClassObject(rclsid, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void **)&pUnk); ok(hr == CO_E_NOTINITIALIZED, "CoGetClassObject should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n", hr); ok(pUnk == NULL, "CoGetClassObject should have changed the passed in pointer to NULL, instead of %p\n", pUnk); - hr = CoGetClassObject(&CLSID_MyComputer, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, NULL); + hr = CoGetClassObject(rclsid, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, NULL); ok(hr == E_INVALIDARG || broken(hr == CO_E_NOTINITIALIZED), /* win9x */ "CoGetClassObject should have returned E_INVALIDARG instead of 0x%08x\n", hr); + + /* show that COM doesn't have to be initialized for multi-threaded apartments if another + thread has already done so */ + + info.wait = CreateEvent(NULL, TRUE, FALSE, NULL); + ok(info.wait != NULL, "CreateEvent failed with error %d\n", GetLastError()); + + info.stop = CreateEvent(NULL, TRUE, FALSE, NULL); + ok(info.stop != NULL, "CreateEvent failed with error %d\n", GetLastError()); + + thread = CreateThread(NULL, 0, ole_initialize_thread, &info, 0, &tid); + ok(thread != NULL, "CreateThread failed with error %d\n", GetLastError()); + + WaitForSingleObject(info.wait, INFINITE); + + pUnk = (IUnknown *)0xdeadbeef; + hr = CoGetClassObject(rclsid, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void **)&pUnk); + ok(hr == S_OK, "CoGetClassObject should have returned S_OK instead of 0x%08x\n", hr); + if (pUnk) IUnknown_Release(pUnk); + + SetEvent(info.stop); + WaitForSingleObject(thread, INFINITE); + + GetExitCodeThread(thread, &exitcode); + hr = exitcode; + ok(hr == S_OK, "thread should have returned S_OK instead of 0x%08x\n", hr); + + CloseHandle(thread); + CloseHandle(info.wait); + CloseHandle(info.stop); } static ATOM register_dummy_class(void) @@ -1141,6 +1233,22 @@ static void test_CoGetCallContext(void) CoUninitialize(); } +static void test_CoGetTreatAsClass(void) +{ + HRESULT hr; + CLSID out; + static GUID deadbeef = {0xdeadbeef,0xdead,0xbeef,{0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef}}; + + if (!pCoGetTreatAsClass) + { + win_skip("CoGetTreatAsClass not present\n"); + return; + } + hr = pCoGetTreatAsClass(&deadbeef,&out); + ok (hr == S_FALSE, "expected S_FALSE got %x\n",hr); + ok (IsEqualGUID(&out,&deadbeef), "expected to get same clsid back\n"); +} + static void test_CoInitializeEx(void) { HRESULT hr; @@ -1167,6 +1275,7 @@ START_TEST(compobj) HMODULE hOle32 = GetModuleHandle("ole32"); pCoGetObjectContext = (void*)GetProcAddress(hOle32, "CoGetObjectContext"); pCoSwitchCallContext = (void*)GetProcAddress(hOle32, "CoSwitchCallContext"); + pCoGetTreatAsClass = (void*)GetProcAddress(hOle32,"CoGetTreatAsClass"); if (!(pCoInitializeEx = (void*)GetProcAddress(hOle32, "CoInitializeEx"))) { trace("You need DCOM95 installed to run this test\n"); @@ -1192,5 +1301,6 @@ START_TEST(compobj) test_CoFreeUnusedLibraries(); test_CoGetObjectContext(); test_CoGetCallContext(); + test_CoGetTreatAsClass(); test_CoInitializeEx(); } diff --git a/rostests/winetests/ole32/dragdrop.c b/rostests/winetests/ole32/dragdrop.c index b7599814ba8..b28a8313e1a 100644 --- a/rostests/winetests/ole32/dragdrop.c +++ b/rostests/winetests/ole32/dragdrop.c @@ -31,9 +31,6 @@ #include "wine/test.h" -/* functions that are not present on all versions of Windows */ -HRESULT (WINAPI * pCoInitializeEx)(LPVOID lpReserved, DWORD dwCoInit); - static int droptarget_addref_called; static int droptarget_release_called; diff --git a/rostests/winetests/ole32/marshal.c b/rostests/winetests/ole32/marshal.c index 73d6a081fdc..40824881b01 100644 --- a/rostests/winetests/ole32/marshal.c +++ b/rostests/winetests/ole32/marshal.c @@ -2040,17 +2040,17 @@ static void test_WM_QUIT_handling(void) } } -static SIZE_T round_heap_size(SIZE_T size) +static SIZE_T round_global_size(SIZE_T size) { - static SIZE_T heap_size_alignment = -1; - if (heap_size_alignment == -1) + static SIZE_T global_size_alignment = -1; + if (global_size_alignment == -1) { - void *p = HeapAlloc(GetProcessHeap(), 0, 1); - heap_size_alignment = HeapSize(GetProcessHeap(), 0, p); - HeapFree(GetProcessHeap(), 0, p); + void *p = GlobalAlloc(GMEM_FIXED, 1); + global_size_alignment = GlobalSize(p); + GlobalFree(p); } - return ((size + heap_size_alignment - 1) & ~(heap_size_alignment - 1)); + return ((size + global_size_alignment - 1) & ~(global_size_alignment - 1)); } static void test_freethreadedmarshaldata(IStream *pStream, MSHCTX mshctx, void *ptr, DWORD mshlflags) @@ -2069,22 +2069,27 @@ static void test_freethreadedmarshaldata(IStream *pStream, MSHCTX mshctx, void * if (mshctx == MSHCTX_INPROC) { - DWORD expected_size = round_heap_size(3*sizeof(DWORD) + sizeof(GUID)); - ok(size == expected_size, "size should have been %d instead of %d\n", expected_size, size); + DWORD expected_size = round_global_size(3*sizeof(DWORD) + sizeof(GUID)); + ok(size == expected_size || + broken(size == round_global_size(2*sizeof(DWORD))) /* Win9x & NT4 */, + "size should have been %d instead of %d\n", expected_size, size); ok(*(DWORD *)marshal_data == mshlflags, "expected 0x%x, but got 0x%x for mshctx\n", mshlflags, *(DWORD *)marshal_data); marshal_data += sizeof(DWORD); ok(*(void **)marshal_data == ptr, "expected %p, but got %p for mshctx\n", ptr, *(void **)marshal_data); marshal_data += sizeof(void *); - if (sizeof(void*) == 4) + if (sizeof(void*) == 4 && size >= 3*sizeof(DWORD)) { ok(*(DWORD *)marshal_data == 0, "expected 0x0, but got 0x%x\n", *(DWORD *)marshal_data); marshal_data += sizeof(DWORD); } - trace("got guid data: {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n", - ((GUID *)marshal_data)->Data1, ((GUID *)marshal_data)->Data2, ((GUID *)marshal_data)->Data3, - ((GUID *)marshal_data)->Data4[0], ((GUID *)marshal_data)->Data4[1], ((GUID *)marshal_data)->Data4[2], ((GUID *)marshal_data)->Data4[3], - ((GUID *)marshal_data)->Data4[4], ((GUID *)marshal_data)->Data4[5], ((GUID *)marshal_data)->Data4[6], ((GUID *)marshal_data)->Data4[7]); + if (size >= 3*sizeof(DWORD) + sizeof(GUID)) + { + trace("got guid data: {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n", + ((GUID *)marshal_data)->Data1, ((GUID *)marshal_data)->Data2, ((GUID *)marshal_data)->Data3, + ((GUID *)marshal_data)->Data4[0], ((GUID *)marshal_data)->Data4[1], ((GUID *)marshal_data)->Data4[2], ((GUID *)marshal_data)->Data4[3], + ((GUID *)marshal_data)->Data4[4], ((GUID *)marshal_data)->Data4[5], ((GUID *)marshal_data)->Data4[6], ((GUID *)marshal_data)->Data4[7]); + } } else { @@ -2583,7 +2588,7 @@ static void test_register_local_server(void) do { - wait = MsgWaitForMultipleObjects(1, &quit_event, FALSE, INFINITE, QS_ALLINPUT); + wait = MsgWaitForMultipleObjects(1, &quit_event, FALSE, 30000, QS_ALLINPUT); if (wait == WAIT_OBJECT_0+1) { MSG msg; @@ -2598,6 +2603,7 @@ static void test_register_local_server(void) } while (wait == WAIT_OBJECT_0+1); + ok( wait == WAIT_OBJECT_0, "quit event wait timed out\n" ); hr = CoRevokeClassObject(cookie); ok_ole_success(hr, CoRevokeClassObject); } diff --git a/rostests/winetests/ole32/moniker.c b/rostests/winetests/ole32/moniker.c index 08ef2ee04d5..413045a06b3 100644 --- a/rostests/winetests/ole32/moniker.c +++ b/rostests/winetests/ole32/moniker.c @@ -82,17 +82,17 @@ static void UnlockModule(void) InterlockedDecrement(&cLocks); } -static SIZE_T round_heap_size(SIZE_T size) +static SIZE_T round_global_size(SIZE_T size) { - static SIZE_T heap_size_alignment = -1; - if (heap_size_alignment == -1) + static SIZE_T global_size_alignment = -1; + if (global_size_alignment == -1) { - void *p = HeapAlloc(GetProcessHeap(), 0, 1); - heap_size_alignment = HeapSize(GetProcessHeap(), 0, p); - HeapFree(GetProcessHeap(), 0, p); + void *p = GlobalAlloc(GMEM_FIXED, 1); + global_size_alignment = GlobalSize(p); + GlobalFree(p); } - return ((size + heap_size_alignment - 1) & ~(heap_size_alignment - 1)); + return ((size + global_size_alignment - 1) & ~(global_size_alignment - 1)); } static HRESULT WINAPI Test_IClassFactory_QueryInterface( @@ -652,7 +652,9 @@ static void test_ROT(void) ROTFLAGS_REGISTRATIONKEEPSALIVE|ROTFLAGS_ALLOWANYCLIENT, (IUnknown*)&Test_ClassFactory, pMoniker, &dwCookie); todo_wine { - ok(hr == CO_E_WRONG_SERVER_IDENTITY, "IRunningObjectTable_Register should have returned CO_E_WRONG_SERVER_IDENTITY instead of 0x%08x\n", hr); + ok(hr == CO_E_WRONG_SERVER_IDENTITY || + broken(hr == S_OK) /* Win9x */, + "IRunningObjectTable_Register should have returned CO_E_WRONG_SERVER_IDENTITY instead of 0x%08x\n", hr); } if (hr == S_OK) IRunningObjectTable_Revoke(pROT, dwCookie); @@ -918,7 +920,8 @@ static void test_MkParseDisplayName(void) hr = IMoniker_BindToObject(pmk, pbc, NULL, &IID_IUnknown, (LPVOID*)&object); ok_ole_success(hr, IMoniker_BindToObject); - IUnknown_Release(object); + if (SUCCEEDED(hr)) + IUnknown_Release(object); IMoniker_Release(pmk); } IBindCtx_Release(pbc); @@ -1217,12 +1220,12 @@ static void test_moniker( moniker_data = GlobalLock(hglobal); /* first check we have the right amount of data */ - ok(moniker_size == round_heap_size(sizeof_expected_moniker_saved_data), + ok(moniker_size == round_global_size(sizeof_expected_moniker_saved_data), "%s: Size of saved data differs (expected %d, actual %d)\n", - testname, (DWORD)round_heap_size(sizeof_expected_moniker_saved_data), moniker_size); + testname, (DWORD)round_global_size(sizeof_expected_moniker_saved_data), moniker_size); /* then do a byte-by-byte comparison */ - for (i = 0; i < min(moniker_size, round_heap_size(sizeof_expected_moniker_saved_data)); i++) + for (i = 0; i < min(moniker_size, round_global_size(sizeof_expected_moniker_saved_data)); i++) { if (expected_moniker_saved_data[i] != moniker_data[i]) { @@ -1263,14 +1266,14 @@ static void test_moniker( moniker_data = GlobalLock(hglobal); /* first check we have the right amount of data */ - ok(moniker_size == round_heap_size(sizeof_expected_moniker_marshal_data), + ok(moniker_size == round_global_size(sizeof_expected_moniker_marshal_data), "%s: Size of marshaled data differs (expected %d, actual %d)\n", - testname, (DWORD)round_heap_size(sizeof_expected_moniker_marshal_data), moniker_size); + testname, (DWORD)round_global_size(sizeof_expected_moniker_marshal_data), moniker_size); /* then do a byte-by-byte comparison */ if (expected_moniker_marshal_data) { - for (i = 0; i < min(moniker_size, round_heap_size(sizeof_expected_moniker_marshal_data)); i++) + for (i = 0; i < min(moniker_size, round_global_size(sizeof_expected_moniker_marshal_data)); i++) { if (expected_moniker_marshal_data[i] != moniker_data[i]) { diff --git a/rostests/winetests/ole32/ole2.c b/rostests/winetests/ole32/ole2.c index 42b8fa6331e..214c17e95a5 100644 --- a/rostests/winetests/ole32/ole2.c +++ b/rostests/winetests/ole32/ole2.c @@ -44,7 +44,15 @@ static const CLSID CLSID_WineTest = {0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xe0} }; -static char const * const *expected_method_list; +#define TEST_OPTIONAL 0x1 + +struct expected_method +{ + const char *method; + unsigned int flags; +}; + +static const struct expected_method *expected_method_list; BOOL g_showRunnable = TRUE; BOOL g_isRunning = TRUE; @@ -52,15 +60,25 @@ BOOL g_isRunning = TRUE; #define CHECK_EXPECTED_METHOD(method_name) \ do { \ trace("%s\n", method_name); \ - ok(*expected_method_list != NULL, "Extra method %s called\n", method_name); \ - if (*expected_method_list) \ + ok(expected_method_list->method != NULL, "Extra method %s called\n", method_name); \ + if (expected_method_list->method) \ { \ - ok(!strcmp(*expected_method_list, method_name), "Expected %s to be called instead of %s\n", \ - *expected_method_list, method_name); \ + while (expected_method_list->flags & TEST_OPTIONAL && \ + strcmp(expected_method_list->method, method_name) != 0) \ + expected_method_list++; \ + ok(!strcmp(expected_method_list->method, method_name), "Expected %s to be called instead of %s\n", \ + expected_method_list->method, method_name); \ expected_method_list++; \ } \ } while(0) +#define CHECK_NO_EXTRA_METHODS() \ + do { \ + while (expected_method_list->flags & TEST_OPTIONAL) \ + expected_method_list++; \ + ok(!expected_method_list->method, "Method sequence starting from %s not called\n", expected_method_list->method); \ + } while (0) + static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv) { CHECK_EXPECTED_METHOD("OleObject_QueryInterface"); @@ -660,102 +678,122 @@ static void test_OleCreate(IStorage *pStorage) HRESULT hr; IOleObject *pObject; FORMATETC formatetc; - static const char *methods_olerender_none[] = + static const struct expected_method methods_olerender_none[] = { - "OleObject_QueryInterface", - "OleObject_AddRef", - "OleObject_QueryInterface", - "OleObjectPersistStg_AddRef", - "OleObjectPersistStg_InitNew", - "OleObjectPersistStg_Release", - "OleObject_Release", - NULL + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", TEST_OPTIONAL }, + { "OleObject_Release", TEST_OPTIONAL }, + { "OleObject_QueryInterface", TEST_OPTIONAL }, + { "OleObjectPersistStg_AddRef", 0 }, + { "OleObjectPersistStg_InitNew", 0 }, + { "OleObjectPersistStg_Release", 0 }, + { "OleObject_Release", 0 }, + { "OleObject_Release", TEST_OPTIONAL }, + { NULL, 0 } }; - static const char *methods_olerender_draw[] = + static const struct expected_method methods_olerender_draw[] = { - "OleObject_QueryInterface", - "OleObject_AddRef", - "OleObject_QueryInterface", - "OleObjectPersistStg_AddRef", - "OleObjectPersistStg_InitNew", - "OleObjectPersistStg_Release", - "OleObject_QueryInterface", - "OleObjectRunnable_AddRef", - "OleObjectRunnable_Run", - "OleObjectRunnable_Release", - "OleObject_QueryInterface", - "OleObjectCache_AddRef", - "OleObjectCache_Cache", - "OleObjectCache_Release", - "OleObject_Release", - NULL + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", TEST_OPTIONAL /* NT4 only */ }, + { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ }, + { "OleObject_QueryInterface", TEST_OPTIONAL /* NT4 only */ }, + { "OleObjectPersistStg_AddRef", 0 }, + { "OleObjectPersistStg_InitNew", 0 }, + { "OleObjectPersistStg_Release", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObjectRunnable_AddRef", 0 }, + { "OleObjectRunnable_Run", 0 }, + { "OleObjectRunnable_Release", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObjectCache_AddRef", 0 }, + { "OleObjectCache_Cache", 0 }, + { "OleObjectCache_Release", 0 }, + { "OleObject_Release", 0 }, + { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ }, + { NULL, 0 } }; - static const char *methods_olerender_format[] = + static const struct expected_method methods_olerender_format[] = { - "OleObject_QueryInterface", - "OleObject_AddRef", - "OleObject_QueryInterface", - "OleObject_AddRef", - "OleObject_GetMiscStatus", - "OleObject_QueryInterface", - "OleObjectPersistStg_AddRef", - "OleObjectPersistStg_InitNew", - "OleObjectPersistStg_Release", - "OleObject_SetClientSite", - "OleObject_Release", - "OleObject_QueryInterface", - "OleObjectRunnable_AddRef", - "OleObjectRunnable_Run", - "OleObjectRunnable_Release", - "OleObject_QueryInterface", - "OleObjectCache_AddRef", - "OleObjectCache_Cache", - "OleObjectCache_Release", - "OleObject_Release", - NULL + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", 0 }, + { "OleObject_GetMiscStatus", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObjectPersistStg_AddRef", 0 }, + { "OleObjectPersistStg_InitNew", 0 }, + { "OleObjectPersistStg_Release", 0 }, + { "OleObject_SetClientSite", 0 }, + { "OleObject_Release", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObjectRunnable_AddRef", 0 }, + { "OleObjectRunnable_Run", 0 }, + { "OleObjectRunnable_Release", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObjectCache_AddRef", 0 }, + { "OleObjectCache_Cache", 0 }, + { "OleObjectCache_Release", 0 }, + { "OleObject_Release", 0 }, + { NULL, 0 } }; - static const char *methods_olerender_asis[] = + static const struct expected_method methods_olerender_asis[] = { - "OleObject_QueryInterface", - "OleObject_AddRef", - "OleObject_QueryInterface", - "OleObjectPersistStg_AddRef", - "OleObjectPersistStg_InitNew", - "OleObjectPersistStg_Release", - "OleObject_Release", - NULL + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", TEST_OPTIONAL /* NT4 only */ }, + { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ }, + { "OleObject_QueryInterface", TEST_OPTIONAL /* NT4 only */ }, + { "OleObjectPersistStg_AddRef", 0 }, + { "OleObjectPersistStg_InitNew", 0 }, + { "OleObjectPersistStg_Release", 0 }, + { "OleObject_Release", 0 }, + { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ }, + { NULL, 0 } }; - static const char *methods_olerender_draw_no_runnable[] = + static const struct expected_method methods_olerender_draw_no_runnable[] = { - "OleObject_QueryInterface", - "OleObject_AddRef", - "OleObject_QueryInterface", - "OleObjectPersistStg_AddRef", - "OleObjectPersistStg_InitNew", - "OleObjectPersistStg_Release", - "OleObject_QueryInterface", - "OleObject_QueryInterface", - "OleObjectCache_AddRef", - "OleObjectCache_Cache", - "OleObjectCache_Release", - "OleObject_Release", - NULL + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", TEST_OPTIONAL /* NT4 only */ }, + { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ }, + { "OleObject_QueryInterface", TEST_OPTIONAL /* NT4 only */ }, + { "OleObjectPersistStg_AddRef", 0 }, + { "OleObjectPersistStg_InitNew", 0 }, + { "OleObjectPersistStg_Release", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObjectCache_AddRef", 0 }, + { "OleObjectCache_Cache", 0 }, + { "OleObjectCache_Release", 0 }, + { "OleObject_Release", 0 }, + { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ }, + { NULL, 0 }, }; - static const char *methods_olerender_draw_no_cache[] = + static const struct expected_method methods_olerender_draw_no_cache[] = { - "OleObject_QueryInterface", - "OleObject_AddRef", - "OleObject_QueryInterface", - "OleObjectPersistStg_AddRef", - "OleObjectPersistStg_InitNew", - "OleObjectPersistStg_Release", - "OleObject_QueryInterface", - "OleObjectRunnable_AddRef", - "OleObjectRunnable_Run", - "OleObjectRunnable_Release", - "OleObject_QueryInterface", - "OleObject_Release", - NULL + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", TEST_OPTIONAL /* NT4 only */ }, + { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ }, + { "OleObject_QueryInterface", TEST_OPTIONAL /* NT4 only */ }, + { "OleObjectPersistStg_AddRef", 0 }, + { "OleObjectPersistStg_InitNew", 0 }, + { "OleObjectPersistStg_Release", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObjectRunnable_AddRef", 0 }, + { "OleObjectRunnable_Run", 0 }, + { "OleObjectRunnable_Release", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_Release", 0 }, + { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ }, + { NULL, 0 } }; runnable = &OleObjectRunnable; @@ -765,14 +803,14 @@ static void test_OleCreate(IStorage *pStorage) hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_NONE, NULL, NULL, pStorage, (void **)&pObject); ok_ole_success(hr, "OleCreate"); IOleObject_Release(pObject); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); expected_method_list = methods_olerender_draw; trace("OleCreate with OLERENDER_DRAW:\n"); hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject); ok_ole_success(hr, "OleCreate"); IOleObject_Release(pObject); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); formatetc.cfFormat = CF_TEXT; formatetc.ptd = NULL; @@ -788,7 +826,7 @@ static void test_OleCreate(IStorage *pStorage) if (pObject) { IOleObject_Release(pObject); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); } expected_method_list = methods_olerender_asis; @@ -796,24 +834,24 @@ static void test_OleCreate(IStorage *pStorage) hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_ASIS, NULL, NULL, pStorage, (void **)&pObject); ok_ole_success(hr, "OleCreate"); IOleObject_Release(pObject); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); runnable = NULL; expected_method_list = methods_olerender_draw_no_runnable; - trace("OleCreate with OLERENDER_DRAW (no IOlObjectRunnable):\n"); + trace("OleCreate with OLERENDER_DRAW (no IRunnableObject):\n"); hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject); ok_ole_success(hr, "OleCreate"); IOleObject_Release(pObject); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); runnable = &OleObjectRunnable; cache = NULL; expected_method_list = methods_olerender_draw_no_cache; - trace("OleCreate with OLERENDER_DRAW (no IOlObjectRunnable):\n"); + trace("OleCreate with OLERENDER_DRAW (no IOleCache):\n"); hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject); ok_ole_success(hr, "OleCreate"); IOleObject_Release(pObject); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); trace("end\n"); } @@ -822,22 +860,22 @@ static void test_OleLoad(IStorage *pStorage) HRESULT hr; IOleObject *pObject; - static const char *methods_oleload[] = + static const struct expected_method methods_oleload[] = { - "OleObject_QueryInterface", - "OleObject_AddRef", - "OleObject_QueryInterface", - "OleObject_AddRef", - "OleObject_GetMiscStatus", - "OleObject_QueryInterface", - "OleObjectPersistStg_AddRef", - "OleObjectPersistStg_Load", - "OleObjectPersistStg_Release", - "OleObject_SetClientSite", - "OleObject_Release", - "OleObject_QueryInterface", - "OleObject_Release", - NULL + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_AddRef", 0 }, + { "OleObject_GetMiscStatus", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObjectPersistStg_AddRef", 0 }, + { "OleObjectPersistStg_Load", 0 }, + { "OleObjectPersistStg_Release", 0 }, + { "OleObject_SetClientSite", 0 }, + { "OleObject_Release", 0 }, + { "OleObject_QueryInterface", 0 }, + { "OleObject_Release", 0 }, + { NULL, 0 } }; expected_method_list = methods_oleload; @@ -849,7 +887,7 @@ static void test_OleLoad(IStorage *pStorage) if (pObject) { IOleObject_Release(pObject); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); } } @@ -1074,27 +1112,27 @@ static void test_data_cache(void) WCHAR wszPath[MAX_PATH]; static const WCHAR wszShell32[] = {'\\','s','h','e','l','l','3','2','.','d','l','l',0}; - static const char *methods_cacheinitnew[] = + static const struct expected_method methods_cacheinitnew[] = { - "AdviseSink_OnViewChange", - "AdviseSink_OnViewChange", - "draw_continue", - "DataObject_DAdvise", - "DataObject_DAdvise", - "DataObject_DUnadvise", - "DataObject_DUnadvise", - NULL + { "AdviseSink_OnViewChange", 0 }, + { "AdviseSink_OnViewChange", 0 }, + { "draw_continue", 0 }, + { "DataObject_DAdvise", 0 }, + { "DataObject_DAdvise", 0 }, + { "DataObject_DUnadvise", 0 }, + { "DataObject_DUnadvise", 0 }, + { NULL, 0 } }; - static const char *methods_cacheload[] = + static const struct expected_method methods_cacheload[] = { - "AdviseSink_OnViewChange", - "draw_continue", - "draw_continue", - "draw_continue", - "DataObject_GetData", - "DataObject_GetData", - "DataObject_GetData", - NULL + { "AdviseSink_OnViewChange", 0 }, + { "draw_continue", 0 }, + { "draw_continue", 0 }, + { "draw_continue", 0 }, + { "DataObject_GetData", 0 }, + { "DataObject_GetData", 0 }, + { "DataObject_GetData", 0 }, + { NULL, 0 } }; GetSystemDirectory(szSystemDir, sizeof(szSystemDir)/sizeof(szSystemDir[0])); @@ -1167,7 +1205,8 @@ static void test_data_cache(void) ok(hr == S_OK, "IOleCache_Cache cfFormat = %d, tymed = %d should have returned S_OK instead of 0x%08x\n", fmtetc.cfFormat, fmtetc.tymed, hr); else if (fmtetc.tymed == TYMED_HGLOBAL) - ok(hr == CACHE_S_FORMATETC_NOTSUPPORTED, + ok(hr == CACHE_S_FORMATETC_NOTSUPPORTED || + broken(hr == S_OK && fmtetc.cfFormat == CF_BITMAP) /* Win9x & NT4 */, "IOleCache_Cache cfFormat = %d, tymed = %d should have returned CACHE_S_FORMATETC_NOTSUPPORTED instead of 0x%08x\n", fmtetc.cfFormat, fmtetc.tymed, hr); else @@ -1251,7 +1290,7 @@ static void test_data_cache(void) IOleCacheControl_Release(pOleCacheControl); todo_wine { - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); } /* Test with loaded data */ @@ -1323,7 +1362,7 @@ static void test_data_cache(void) IOleCache_Release(pOleCache); todo_wine { - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); } IStorage_Release(pStorage); @@ -1482,36 +1521,36 @@ static void test_default_handler(void) static void test_runnable(void) { - static const char *methods_query_runnable[] = + static const struct expected_method methods_query_runnable[] = { - "OleObject_QueryInterface", - "OleObjectRunnable_AddRef", - "OleObjectRunnable_IsRunning", - "OleObjectRunnable_Release", - NULL + { "OleObject_QueryInterface", 0 }, + { "OleObjectRunnable_AddRef", 0 }, + { "OleObjectRunnable_IsRunning", 0 }, + { "OleObjectRunnable_Release", 0 }, + { NULL, 0 } }; - static const char *methods_no_runnable[] = + static const struct expected_method methods_no_runnable[] = { - "OleObject_QueryInterface", - NULL + { "OleObject_QueryInterface", 0 }, + { NULL, 0 } }; IOleObject *object = &OleObject; expected_method_list = methods_query_runnable; ok(OleIsRunning(object), "Object should be running\n"); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); g_isRunning = FALSE; expected_method_list = methods_query_runnable; ok(OleIsRunning(object) == FALSE, "Object should not be running\n"); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); g_showRunnable = FALSE; /* QueryInterface(IID_IRunnableObject, ...) will fail */ expected_method_list = methods_no_runnable; ok(OleIsRunning(object), "Object without IRunnableObject should be running\n"); - ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); + CHECK_NO_EXTRA_METHODS(); g_isRunning = TRUE; g_showRunnable = TRUE; diff --git a/rostests/winetests/ole32/propvariant.c b/rostests/winetests/ole32/propvariant.c index f1cbc76ecdc..380dc141652 100644 --- a/rostests/winetests/ole32/propvariant.c +++ b/rostests/winetests/ole32/propvariant.c @@ -23,13 +23,14 @@ #include "wine/test.h" /* invalid in all versions */ -#define PROP_INV 255 +#define PROP_INV 0x7f /* valid in v0 and above (NT4+) */ #define PROP_V0 0 /* valid in v1 and above (Win2k+) */ #define PROP_V1 1 /* valid in v1a and above (WinXP+) */ #define PROP_V1A 2 +#define PROP_TODO 0x80 struct valid_mapping { @@ -41,28 +42,28 @@ struct valid_mapping { { PROP_V0 , PROP_INV, PROP_INV, PROP_INV }, /* VT_EMPTY */ { PROP_V0 , PROP_INV, PROP_INV, PROP_INV }, /* VT_NULL */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_I2 */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_I4 */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_R4 */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_R8 */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_CY */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_DATE */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_BSTR */ - { PROP_V1 , PROP_V1 , PROP_INV, PROP_V1 }, /* VT_DISPATCH */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_ERROR */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_BOOL */ - { PROP_V1 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_VARIANT */ - { PROP_V1 , PROP_V1 , PROP_INV, PROP_V1 }, /* VT_UNKNOWN */ - { PROP_V1 , PROP_V1 , PROP_INV, PROP_V1 }, /* VT_DECIMAL */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_I2 */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_I4 */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_R4 */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_R8 */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_CY */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_DATE */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_BSTR */ + { PROP_V1 | PROP_TODO , PROP_V1 | PROP_TODO , PROP_INV, PROP_V1 | PROP_TODO }, /* VT_DISPATCH */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_ERROR */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_BOOL */ + { PROP_V1 | PROP_TODO , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_VARIANT */ + { PROP_V1 | PROP_TODO , PROP_V1 | PROP_TODO , PROP_INV, PROP_V1 | PROP_TODO }, /* VT_UNKNOWN */ + { PROP_V1 , PROP_V1 | PROP_TODO , PROP_INV, PROP_V1 | PROP_TODO }, /* VT_DECIMAL */ { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* 15 */ - { PROP_V1 , PROP_V1 , PROP_V1 , PROP_V1 }, /* VT_I1 */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_UI1 */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_UI2 */ - { PROP_V0 , PROP_V1 , PROP_V0 , PROP_V1 }, /* VT_UI4 */ - { PROP_V0 , PROP_V1A, PROP_V0 , PROP_V1A }, /* VT_I8 */ - { PROP_V0 , PROP_V1A, PROP_V0 , PROP_V1A }, /* VT_UI8 */ - { PROP_V1 , PROP_V1 , PROP_INV, PROP_V1 }, /* VT_INT */ - { PROP_V1 , PROP_V1 , PROP_INV, PROP_V1 }, /* VT_UINT */ + { PROP_V1 | PROP_TODO , PROP_V1 | PROP_TODO , PROP_V1 | PROP_TODO , PROP_V1 | PROP_TODO }, /* VT_I1 */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_UI1 */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_UI2 */ + { PROP_V0 , PROP_V1 | PROP_TODO , PROP_V0 , PROP_V1 | PROP_TODO }, /* VT_UI4 */ + { PROP_V0 , PROP_V1A | PROP_TODO, PROP_V0 , PROP_V1A | PROP_TODO }, /* VT_I8 */ + { PROP_V0 , PROP_V1A | PROP_TODO, PROP_V0 , PROP_V1A | PROP_TODO }, /* VT_UI8 */ + { PROP_V1 | PROP_TODO , PROP_V1 | PROP_TODO , PROP_INV, PROP_V1 | PROP_TODO }, /* VT_INT */ + { PROP_V1 | PROP_TODO , PROP_V1 | PROP_TODO , PROP_INV, PROP_V1 | PROP_TODO }, /* VT_UINT */ { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* VT_VOID */ { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* VT_HRESULT */ { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* VT_PTR */ @@ -75,7 +76,7 @@ struct valid_mapping { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* 33 */ { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* 34 */ { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* 35 */ - { PROP_V1 , PROP_V1 , PROP_INV, PROP_V1 }, /* VT_RECORD */ + { PROP_V1 | PROP_TODO , PROP_V1 | PROP_TODO , PROP_INV, PROP_V1 | PROP_TODO }, /* VT_RECORD */ { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* VT_INT_PTR */ { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* VT_UINT_PTR */ { PROP_INV, PROP_INV, PROP_INV, PROP_INV }, /* 39 */ @@ -126,74 +127,83 @@ static const char* wine_vtypes[VT_CLSID+1] = "VT_STREAMED_OBJECT","VT_STORED_OBJECT","VT_BLOB_OBJECT","VT_CF","VT_CLSID" }; + +static void expect(HRESULT hr, VARTYPE vt) +{ + int idx = vt & VT_TYPEMASK; + BYTE flags; + const char *modifier; + + if(vt & VT_BYREF) + { + flags = valid_types[idx].byref; + modifier = "byref"; + } + else if(vt & VT_ARRAY) + { + flags = valid_types[idx].with_array; + modifier = "array"; + } + else if(vt & VT_VECTOR) + { + flags = valid_types[idx].with_vector; + modifier = "vector"; + } + else + { + flags = valid_types[idx].simple; + modifier = "simple"; + } + + if(flags == PROP_INV) + ok(hr == STG_E_INVALIDPARAMETER, "%s (%s): got %08x\n", wine_vtypes[idx], modifier, hr); + else if(flags == PROP_V0) + ok(hr == S_OK, "%s (%s): got %08x\n", wine_vtypes[idx], modifier, hr); + else if(flags & PROP_TODO) + { + todo_wine + { + if(hr != S_OK) + win_skip("%s (%s): unsupported\n", wine_vtypes[idx], modifier); + else ok(hr == S_OK, "%s (%s): got %08x\n", wine_vtypes[idx], modifier, hr); + } + } + else + { + if(hr != S_OK) + win_skip("%s (%s): unsupported\n", wine_vtypes[idx], modifier); + else ok(hr == S_OK, "%s (%s): got %08x\n", wine_vtypes[idx], modifier, hr); + } +} + static void test_validtypes(void) { PROPVARIANT propvar; HRESULT hr; unsigned int i; - BYTE version; memset(&propvar, 0, sizeof(propvar)); - /* detect version */ - propvar.vt = VT_I2 | VT_ARRAY; - hr = PropVariantClear(&propvar); - if (hr == S_OK) - { - propvar.vt = VT_I8 | VT_ARRAY; - hr = PropVariantClear(&propvar); - if (hr == S_OK) - { - version = PROP_V1A; - trace("detected prop variant v1a\n"); - } - else - { - version = PROP_V1; - trace("detected prop variant v1\n"); - } - } - else - { - version = PROP_V0; - trace("detected prop variant v0\n"); - } - for (i = 0; i < sizeof(valid_types)/sizeof(valid_types[0]); i++) { - BOOL expected_result; + VARTYPE vt; - propvar.vt = i; + vt = propvar.vt = i; hr = PropVariantClear(&propvar); - expected_result = (valid_types[i].simple <= version ? TRUE : FALSE); - ok(expected_result == !(hr == STG_E_INVALIDPARAMETER), - "PropVariantClear(%s) should have returned 0x%08x, but returned 0x%08x\n", - wine_vtypes[i], - expected_result ? S_OK : STG_E_INVALIDPARAMETER, hr); + expect(hr, vt); - propvar.vt = i | VT_ARRAY; + vt = propvar.vt = i | VT_ARRAY; hr = PropVariantClear(&propvar); - expected_result = (valid_types[i].with_array <= version ? TRUE : FALSE); - ok(expected_result == !(hr == STG_E_INVALIDPARAMETER), - "PropVariantClear(%s|VT_ARRAY) should have returned 0x%08x, but returned 0x%08x\n", - wine_vtypes[i], - expected_result ? S_OK : STG_E_INVALIDPARAMETER, hr); + expect(hr, vt); - propvar.vt = i | VT_VECTOR; + vt = propvar.vt = i | VT_VECTOR; hr = PropVariantClear(&propvar); - expected_result = (valid_types[i].with_vector <= version ? TRUE : FALSE); - ok(expected_result == !(hr == STG_E_INVALIDPARAMETER), - "PropVariantClear(%s|VT_VECTOR) should have returned 0x%08x, but returned 0x%08x\n", - wine_vtypes[i], - expected_result ? S_OK : STG_E_INVALIDPARAMETER, hr); + expect(hr, vt); - propvar.vt = i | VT_BYREF; + vt = propvar.vt = i | VT_BYREF; hr = PropVariantClear(&propvar); - expected_result = (valid_types[i].byref <= version ? TRUE : FALSE); - ok(expected_result == !(hr == STG_E_INVALIDPARAMETER), - "PropVariantClear(%s|VT_BYREF) should have returned 0x%08x, but returned 0x%08x\n", - wine_vtypes[i], - expected_result ? S_OK : STG_E_INVALIDPARAMETER, hr); + expect(hr, vt); + } } diff --git a/rostests/winetests/ole32/stg_prop.c b/rostests/winetests/ole32/stg_prop.c index fbe2ae6b68f..82609462dc1 100644 --- a/rostests/winetests/ole32/stg_prop.c +++ b/rostests/winetests/ole32/stg_prop.c @@ -160,7 +160,7 @@ static void testProps(void) hr = IPropertyStorage_ReadMultiple(propertyStorage, 1, &spec, &var); ok(hr == S_OK, "ReadMultiple failed: 0x%08x\n", hr); ok(var.vt == VT_I4 && U(var).lVal == 1, - "Didn't get expected type or value for property (got type %d, value %ld)\n", + "Didn't get expected type or value for property (got type %d, value %d)\n", var.vt, U(var).lVal); /* read by name */ spec.ulKind = PRSPEC_LPWSTR; @@ -168,7 +168,7 @@ static void testProps(void) hr = IPropertyStorage_ReadMultiple(propertyStorage, 1, &spec, &var); ok(hr == S_OK, "ReadMultiple failed: 0x%08x\n", hr); ok(var.vt == VT_I4 && U(var).lVal == 2, - "Didn't get expected type or value for property (got type %d, value %ld)\n", + "Didn't get expected type or value for property (got type %d, value %d)\n", var.vt, U(var).lVal); /* read string value */ spec.ulKind = PRSPEC_PROPID; @@ -273,7 +273,7 @@ static void testProps(void) hr = IPropertyStorage_ReadMultiple(propertyStorage, 1, &spec, &var); ok(hr == S_OK, "ReadMultiple failed: 0x%08x\n", hr); ok(var.vt == VT_I4 && U(var).lVal == 2, - "Didn't get expected type or value for property (got type %d, value %ld)\n", + "Didn't get expected type or value for property (got type %d, value %d)\n", var.vt, U(var).lVal); spec.ulKind = PRSPEC_PROPID; U(spec).propid = PIDSI_AUTHOR; diff --git a/rostests/winetests/ole32/usrmarshal.c b/rostests/winetests/ole32/usrmarshal.c index 3ce71bc1d40..3411cc283b1 100644 --- a/rostests/winetests/ole32/usrmarshal.c +++ b/rostests/winetests/ole32/usrmarshal.c @@ -44,6 +44,37 @@ unsigned char * __RPC_USER HMETAFILEPICT_UserMarshal (ULONG *, unsigned char *, unsigned char * __RPC_USER HMETAFILEPICT_UserUnmarshal(ULONG *, unsigned char *, HMETAFILEPICT *); void __RPC_USER HMETAFILEPICT_UserFree(ULONG *, HMETAFILEPICT *); +static void * WINAPI user_allocate(SIZE_T size) +{ + return CoTaskMemAlloc(size); +} + +static void WINAPI user_free(void *p) +{ + CoTaskMemFree(p); +} + +static void init_user_marshal_cb(USER_MARSHAL_CB *umcb, + PMIDL_STUB_MESSAGE stub_msg, + PRPC_MESSAGE rpc_msg, unsigned char *buffer, + unsigned int size, MSHCTX context) +{ + memset(rpc_msg, 0, sizeof(*rpc_msg)); + rpc_msg->Buffer = buffer; + rpc_msg->BufferLength = size; + + memset(stub_msg, 0, sizeof(*stub_msg)); + stub_msg->RpcMsg = rpc_msg; + stub_msg->Buffer = buffer; + stub_msg->pfnAllocate = user_allocate; + stub_msg->pfnFree = user_free; + + memset(umcb, 0, sizeof(*umcb)); + umcb->Flags = MAKELONG(context, NDR_LOCAL_DATA_REPRESENTATION); + umcb->pStubMsg = stub_msg; + umcb->Signature = USER_MARSHAL_CB_SIGNATURE; + umcb->CBType = buffer ? USER_MARSHAL_CB_UNMARSHALL : USER_MARSHAL_CB_BUFFER_SIZE; +} static const char cf_marshaled[] = { @@ -59,111 +90,136 @@ static const char cf_marshaled[] = static void test_marshal_CLIPFORMAT(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; - ULONG size; - ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); - wireCLIPFORMAT wirecf; + ULONG i, size; CLIPFORMAT cf = RegisterClipboardFormatA("MyFormat"); CLIPFORMAT cf2; - size = CLIPFORMAT_UserSize(&flags, 0, &cf); - ok(size == sizeof(*wirecf) + sizeof(cf_marshaled), "Wrong size %d\n", size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = CLIPFORMAT_UserSize(&umcb.Flags, 0, &cf); + ok(size == 8 + sizeof(cf_marshaled) || + broken(size == 12 + sizeof(cf_marshaled)) || /* win64 adds 4 extra (unused) bytes */ + broken(size == 8 + sizeof(cf_marshaled) - 2), /* win9x and winnt don't include the '\0' */ + "CLIPFORMAT: Wrong size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - CLIPFORMAT_UserMarshal(&flags, buffer, &cf); - wirecf = (wireCLIPFORMAT)buffer; - ok(wirecf->fContext == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08lx\n", wirecf->fContext); - ok(wirecf->u.dwValue == cf, "Marshaled value should be 0x%04x instead of 0x%04x\n", cf, wirecf->u.dwValue); - ok(!memcmp(wirecf+1, cf_marshaled, sizeof(cf_marshaled)), "Marshaled data differs\n"); + memset( buffer, 0xcc, size ); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + CLIPFORMAT_UserMarshal(&umcb.Flags, buffer, &cf); + ok(*(LONG *)(buffer + 0) == WDT_REMOTE_CALL, "CLIPFORMAT: Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(LONG *)(buffer + 0)); + ok(*(DWORD *)(buffer + 4) == cf, "CLIPFORMAT: Marshaled value should be 0x%04x instead of 0x%04x\n", cf, *(DWORD *)(buffer + 4)); + ok(!memcmp(buffer + 8, cf_marshaled, min( sizeof(cf_marshaled), size-8 )), "Marshaled data differs\n"); + if (size > sizeof(cf_marshaled) + 8) /* make sure the extra bytes are not used */ + for (i = sizeof(cf_marshaled) + 8; i < size; i++) + ok( buffer[i] == 0xcc, "buffer offset %u has been set to %x\n", i, buffer[i] ); - CLIPFORMAT_UserUnmarshal(&flags, buffer, &cf2); - ok(cf == cf2, "Didn't unmarshal properly\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + CLIPFORMAT_UserUnmarshal(&umcb.Flags, buffer, &cf2); + ok(cf == cf2, "CLIPFORMAT: Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); - CLIPFORMAT_UserFree(&flags, &cf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + CLIPFORMAT_UserFree(&umcb.Flags, &cf2); } static void test_marshal_HWND(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size; - ULONG flags = MAKELONG(MSHCTX_LOCAL, NDR_LOCAL_DATA_REPRESENTATION); HWND hwnd = GetDesktopWindow(); HWND hwnd2; wireHWND wirehwnd; - size = HWND_UserSize(&flags, 0, &hwnd); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + size = HWND_UserSize(&umcb.Flags, 0, &hwnd); ok(size == sizeof(*wirehwnd), "Wrong size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HWND_UserMarshal(&flags, buffer, &hwnd); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HWND_UserMarshal(&umcb.Flags, buffer, &hwnd); wirehwnd = (wireHWND)buffer; - ok(wirehwnd->fContext == WDT_INPROC_CALL, "Context should be WDT_INPROC_CALL instead of 0x%08lx\n", wirehwnd->fContext); + ok(wirehwnd->fContext == WDT_INPROC_CALL, "Context should be WDT_INPROC_CALL instead of 0x%08x\n", wirehwnd->fContext); ok(wirehwnd->u.hInproc == (LONG_PTR)hwnd, "Marshaled value should be %p instead of %p\n", hwnd, (HANDLE)wirehwnd->u.hRemote); - HWND_UserUnmarshal(&flags, buffer, &hwnd2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HWND_UserUnmarshal(&umcb.Flags, buffer, &hwnd2); ok(hwnd == hwnd2, "Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); - HWND_UserFree(&flags, &hwnd2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + HWND_UserFree(&umcb.Flags, &hwnd2); } static void test_marshal_HGLOBAL(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size; - ULONG flags = MAKELONG(MSHCTX_LOCAL, NDR_LOCAL_DATA_REPRESENTATION); HGLOBAL hglobal; HGLOBAL hglobal2; unsigned char *wirehglobal; int i; hglobal = NULL; - flags = MAKELONG(MSHCTX_LOCAL, NDR_LOCAL_DATA_REPRESENTATION); - size = HGLOBAL_UserSize(&flags, 0, &hglobal); - /* native is poorly programmed and allocates 4 bytes more than it needs to + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal); + /* native is poorly programmed and allocates 4/8 bytes more than it needs to * here - Wine doesn't have to emulate that */ - ok((size == 8) || (size == 12), "Size should be 12, instead of %d\n", size); + ok((size == 8) || broken(size == 12) || broken(size == 16), "Size should be 8, instead of %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HGLOBAL_UserMarshal(&flags, buffer, &hglobal); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal); wirehglobal = buffer; ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); - ok(*(ULONG *)wirehglobal == (ULONG)hglobal, "buffer+4 should be HGLOBAL\n"); - HGLOBAL_UserUnmarshal(&flags, buffer, &hglobal2); + ok(*(ULONG *)wirehglobal == 0, "buffer+4 should be HGLOBAL\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2); ok(hglobal2 == hglobal, "Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); - HGLOBAL_UserFree(&flags, &hglobal2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + HGLOBAL_UserFree(&umcb.Flags, &hglobal2); hglobal = GlobalAlloc(0, 4); buffer = GlobalLock(hglobal); for (i = 0; i < 4; i++) buffer[i] = i; GlobalUnlock(hglobal); - flags = MAKELONG(MSHCTX_LOCAL, NDR_LOCAL_DATA_REPRESENTATION); - size = HGLOBAL_UserSize(&flags, 0, &hglobal); - /* native is poorly programmed and allocates 4 bytes more than it needs to + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal); + /* native is poorly programmed and allocates 4/8 bytes more than it needs to * here - Wine doesn't have to emulate that */ - ok((size == 24) || (size == 28), "Size should be 24 or 28, instead of %d\n", size); + ok((size == 24) || broken(size == 28) || broken(size == 32), "Size should be 24, instead of %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HGLOBAL_UserMarshal(&flags, buffer, &hglobal); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal); wirehglobal = buffer; ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); - ok(*(ULONG *)wirehglobal == (ULONG)hglobal, "buffer+0x4 should be HGLOBAL\n"); + ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0x4 should be HGLOBAL\n"); wirehglobal += sizeof(ULONG); - ok(*(ULONG *)wirehglobal == 4, "buffer+0x8 should be size of HGLOBAL\n"); + ok(*(ULONG *)wirehglobal == 4, "buffer+0x8 should be size of HGLOBAL instead of %d\n", *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); - ok(*(ULONG *)wirehglobal == (ULONG)hglobal, "buffer+0xc should be HGLOBAL\n"); + ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0xc should be HGLOBAL\n"); wirehglobal += sizeof(ULONG); - ok(*(ULONG *)wirehglobal == 4, "buffer+0x10 should be size of HGLOBAL\n"); + ok(*(ULONG *)wirehglobal == 4, "buffer+0x10 should be size of HGLOBAL instead of %d\n", *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); for (i = 0; i < 4; i++) ok(wirehglobal[i] == i, "buffer+0x%x should be %d\n", 0x10 + i, i); - HGLOBAL_UserUnmarshal(&flags, buffer, &hglobal2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2); ok(hglobal2 != NULL, "Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); - HGLOBAL_UserFree(&flags, &hglobal2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + HGLOBAL_UserFree(&umcb.Flags, &hglobal2); GlobalFree(hglobal); } @@ -177,19 +233,23 @@ static HENHMETAFILE create_emf(void) static void test_marshal_HENHMETAFILE(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size; - ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); HENHMETAFILE hemf; HENHMETAFILE hemf2 = NULL; unsigned char *wirehemf; hemf = create_emf(); - size = HENHMETAFILE_UserSize(&flags, 0, &hemf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HENHMETAFILE_UserSize(&umcb.Flags, 0, &hemf); ok(size > 20, "size should be at least 20 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HENHMETAFILE_UserMarshal(&flags, buffer, &hemf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserMarshal(&umcb.Flags, buffer, &hemf); wirehemf = buffer; ok(*(DWORD *)wirehemf == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehemf); wirehemf += sizeof(DWORD); @@ -204,29 +264,35 @@ static void test_marshal_HENHMETAFILE(void) /* ... rest of data not tested - refer to tests for GetEnhMetaFileBits * at this point */ - HENHMETAFILE_UserUnmarshal(&flags, buffer, &hemf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserUnmarshal(&umcb.Flags, buffer, &hemf2); ok(hemf2 != NULL, "HENHMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HENHMETAFILE_UserFree(&flags, &hemf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserFree(&umcb.Flags, &hemf2); DeleteEnhMetaFile(hemf); /* test NULL emf */ hemf = NULL; - size = HENHMETAFILE_UserSize(&flags, 0, &hemf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HENHMETAFILE_UserSize(&umcb.Flags, 0, &hemf); ok(size == 8, "size should be 8 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HENHMETAFILE_UserMarshal(&flags, buffer, &hemf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserMarshal(&umcb.Flags, buffer, &hemf); wirehemf = buffer; ok(*(DWORD *)wirehemf == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehemf); wirehemf += sizeof(DWORD); ok(*(DWORD *)wirehemf == (DWORD)(DWORD_PTR)hemf, "wirestgm + 0x4 should be hemf instead of 0x%08x\n", *(DWORD *)wirehemf); wirehemf += sizeof(DWORD); - HENHMETAFILE_UserUnmarshal(&flags, buffer, &hemf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserUnmarshal(&umcb.Flags, buffer, &hemf2); ok(hemf2 == NULL, "NULL HENHMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HENHMETAFILE_UserFree(&flags, &hemf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + HENHMETAFILE_UserFree(&umcb.Flags, &hemf2); } static HMETAFILE create_mf(void) @@ -239,19 +305,23 @@ static HMETAFILE create_mf(void) static void test_marshal_HMETAFILE(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size; - ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); HMETAFILE hmf; HMETAFILE hmf2 = NULL; unsigned char *wirehmf; hmf = create_mf(); - size = HMETAFILE_UserSize(&flags, 0, &hmf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HMETAFILE_UserSize(&umcb.Flags, 0, &hmf); ok(size > 20, "size should be at least 20 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HMETAFILE_UserMarshal(&flags, buffer, &hmf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILE_UserMarshal(&umcb.Flags, buffer, &hmf); wirehmf = buffer; ok(*(DWORD *)wirehmf == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmf); wirehmf += sizeof(DWORD); @@ -266,29 +336,32 @@ static void test_marshal_HMETAFILE(void) /* ... rest of data not tested - refer to tests for GetMetaFileBits * at this point */ - HMETAFILE_UserUnmarshal(&flags, buffer, &hmf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILE_UserUnmarshal(&umcb.Flags, buffer, &hmf2); ok(hmf2 != NULL, "HMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HMETAFILE_UserFree(&flags, &hmf2); + HMETAFILE_UserFree(&umcb.Flags, &hmf2); DeleteMetaFile(hmf); /* test NULL emf */ hmf = NULL; - size = HMETAFILE_UserSize(&flags, 0, &hmf); + size = HMETAFILE_UserSize(&umcb.Flags, 0, &hmf); ok(size == 8, "size should be 8 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HMETAFILE_UserMarshal(&flags, buffer, &hmf); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILE_UserMarshal(&umcb.Flags, buffer, &hmf); wirehmf = buffer; ok(*(DWORD *)wirehmf == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmf); wirehmf += sizeof(DWORD); ok(*(DWORD *)wirehmf == (DWORD)(DWORD_PTR)hmf, "wirestgm + 0x4 should be hmf instead of 0x%08x\n", *(DWORD *)wirehmf); wirehmf += sizeof(DWORD); - HMETAFILE_UserUnmarshal(&flags, buffer, &hmf2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILE_UserUnmarshal(&umcb.Flags, buffer, &hmf2); ok(hmf2 == NULL, "NULL HMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HMETAFILE_UserFree(&flags, &hmf2); + HMETAFILE_UserFree(&umcb.Flags, &hmf2); } #define USER_MARSHAL_PTR_PREFIX \ @@ -297,9 +370,11 @@ static void test_marshal_HMETAFILE(void) static void test_marshal_HMETAFILEPICT(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer, *buffer_end; ULONG size; - ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); HMETAFILEPICT hmfp; HMETAFILEPICT hmfp2 = NULL; METAFILEPICT *pmfp; @@ -313,11 +388,13 @@ static void test_marshal_HMETAFILEPICT(void) pmfp->hMF = create_mf(); GlobalUnlock(hmfp); - size = HMETAFILEPICT_UserSize(&flags, 0, &hmfp); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HMETAFILEPICT_UserSize(&umcb.Flags, 0, &hmfp); ok(size > 20, "size should be at least 20 bytes, not %d\n", size); trace("size is %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - buffer_end = HMETAFILEPICT_UserMarshal(&flags, buffer, &hmfp); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + buffer_end = HMETAFILEPICT_UserMarshal(&umcb.Flags, buffer, &hmfp); wirehmfp = buffer; ok(*(DWORD *)wirehmfp == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); @@ -348,10 +425,12 @@ static void test_marshal_HMETAFILEPICT(void) /* ... rest of data not tested - refer to tests for GetMetaFileBits * at this point */ - HMETAFILEPICT_UserUnmarshal(&flags, buffer, &hmfp2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserUnmarshal(&umcb.Flags, buffer, &hmfp2); ok(hmfp2 != NULL, "HMETAFILEPICT didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HMETAFILEPICT_UserFree(&flags, &hmfp2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserFree(&umcb.Flags, &hmfp2); pmfp = GlobalLock(hmfp); DeleteMetaFile(pmfp->hMF); GlobalUnlock(hmfp); @@ -360,10 +439,12 @@ static void test_marshal_HMETAFILEPICT(void) /* test NULL emf */ hmfp = NULL; - size = HMETAFILEPICT_UserSize(&flags, 0, &hmfp); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = HMETAFILEPICT_UserSize(&umcb.Flags, 0, &hmfp); ok(size == 8, "size should be 8 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); - HMETAFILEPICT_UserMarshal(&flags, buffer, &hmfp); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserMarshal(&umcb.Flags, buffer, &hmfp); wirehmfp = buffer; ok(*(DWORD *)wirehmfp == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); @@ -371,10 +452,12 @@ static void test_marshal_HMETAFILEPICT(void) wirehmfp += sizeof(DWORD); hmfp2 = NULL; - HMETAFILEPICT_UserUnmarshal(&flags, buffer, &hmfp2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserUnmarshal(&umcb.Flags, buffer, &hmfp2); ok(hmfp2 == NULL, "NULL HMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); - HMETAFILEPICT_UserFree(&flags, &hmfp2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + HMETAFILEPICT_UserFree(&umcb.Flags, &hmfp2); } static HRESULT WINAPI Test_IUnknown_QueryInterface( @@ -421,27 +504,21 @@ void __RPC_USER WdtpInterfacePointer_UserFree(IUnknown *); static void test_marshal_WdtpInterfacePointer(void) { + USER_MARSHAL_CB umcb; + MIDL_STUB_MESSAGE stub_msg; + RPC_MESSAGE rpc_msg; unsigned char *buffer, *buffer_end; ULONG size; - MIDL_STUB_MESSAGE stubmsg; - USER_MARSHAL_CB umcb; IUnknown *unk; IUnknown *unk2; unsigned char *wireip; const IID *iid; - memset(&stubmsg, 0xcc, sizeof(stubmsg)); - stubmsg.dwDestContext = MSHCTX_INPROC; - stubmsg.pvDestContext = NULL; - - memset(&umcb, 0xcc, sizeof(umcb)); - umcb.Flags = MAKELONG(MSHCTX_INPROC, NDR_LOCAL_DATA_REPRESENTATION); - umcb.pStubMsg = &stubmsg; - /* shows that the WdtpInterfacePointer functions don't marshal anything for * NULL pointers, so code using these functions must handle that case * itself */ unk = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_INPROC); size = WdtpInterfacePointer_UserSize(&umcb.Flags, umcb.Flags, 0, unk, &IID_IUnknown); ok(size == 0, "size should be 0 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); @@ -450,11 +527,13 @@ static void test_marshal_WdtpInterfacePointer(void) HeapFree(GetProcessHeap(), 0, buffer); unk = &Test_Unknown; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_INPROC); size = WdtpInterfacePointer_UserSize(&umcb.Flags, umcb.Flags, 0, unk, &IID_IUnknown); todo_wine ok(size > 28, "size should be > 28 bytes, not %d\n", size); trace("WdtpInterfacePointer_UserSize returned %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_INPROC); buffer_end = WdtpInterfacePointer_UserMarshal(&umcb.Flags, umcb.Flags, buffer, unk, &IID_IUnknown); wireip = buffer; if (size >= 28) @@ -482,10 +561,12 @@ static void test_marshal_WdtpInterfacePointer(void) } unk2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_INPROC); WdtpInterfacePointer_UserUnmarshal(&umcb.Flags, buffer, &unk2, &IID_IUnknown); todo_wine ok(unk2 != NULL, "IUnknown object didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_INPROC); WdtpInterfacePointer_UserFree(unk2); } diff --git a/rostests/winetests/oleaut32/olefont.c b/rostests/winetests/oleaut32/olefont.c index cce17777f4a..8e26a0ff505 100644 --- a/rostests/winetests/oleaut32/olefont.c +++ b/rostests/winetests/oleaut32/olefont.c @@ -808,7 +808,7 @@ START_TEST(olefont) pOleCreateFontIndirect = (void*)GetProcAddress(hOleaut32, "OleCreateFontIndirect"); if (!pOleCreateFontIndirect) { - skip("OleCreateFontIndirect not available\n"); + win_skip("OleCreateFontIndirect not available\n"); return; } diff --git a/rostests/winetests/oleaut32/olepicture.c b/rostests/winetests/oleaut32/olepicture.c index 11304104293..2dc1b05cf92 100644 --- a/rostests/winetests/oleaut32/olepicture.c +++ b/rostests/winetests/oleaut32/olepicture.c @@ -477,7 +477,7 @@ static void test_OleCreatePictureIndirect(void) if(!pOleCreatePictureIndirect) { - skip("Skipping OleCreatePictureIndirect tests\n"); + win_skip("Skipping OleCreatePictureIndirect tests\n"); return; } @@ -707,7 +707,7 @@ START_TEST(olepicture) pOleCreatePictureIndirect = (void*)GetProcAddress(hOleaut32, "OleCreatePictureIndirect"); if (!pOleLoadPicture) { - skip("OleLoadPicture is not available\n"); + win_skip("OleLoadPicture is not available\n"); return; } diff --git a/rostests/winetests/oleaut32/safearray.c b/rostests/winetests/oleaut32/safearray.c index a34f09582ee..d5390566a85 100644 --- a/rostests/winetests/oleaut32/safearray.c +++ b/rostests/winetests/oleaut32/safearray.c @@ -146,7 +146,7 @@ static const IRecordInfoVtbl IRecordInfoImpl_VTable = (PVOID)IRecordInfoImpl_Dummy, (PVOID)IRecordInfoImpl_Dummy, (PVOID)IRecordInfoImpl_Dummy, - (PVOID)IRecordInfoImpl_GetSize, + IRecordInfoImpl_GetSize, (PVOID)IRecordInfoImpl_Dummy, (PVOID)IRecordInfoImpl_Dummy, (PVOID)IRecordInfoImpl_Dummy, diff --git a/rostests/winetests/oleaut32/tmarshal.c b/rostests/winetests/oleaut32/tmarshal.c index adc5d9f28dd..a9392c5ff4c 100644 --- a/rostests/winetests/oleaut32/tmarshal.c +++ b/rostests/winetests/oleaut32/tmarshal.c @@ -849,7 +849,7 @@ static HRESULT WINAPI KindaEnum_Next( static HRESULT WINAPI KindaEnum_Count( IKindaEnumWidget *iface, - /* [out] */ unsigned long __RPC_FAR *count) + /* [out] */ ULONG __RPC_FAR *count) { return E_NOTIMPL; } diff --git a/rostests/winetests/oleaut32/typelib.c b/rostests/winetests/oleaut32/typelib.c index 7c0e2c595b9..277e97d396b 100644 --- a/rostests/winetests/oleaut32/typelib.c +++ b/rostests/winetests/oleaut32/typelib.c @@ -638,6 +638,10 @@ static void test_QueryPathOfRegTypeLib(void) { 3, 22, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } }, { 3, 37, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } }, { 3, 40, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } }, + { 0xffff, 0xffff, S_OK, {'f','a','k','e','_','5','_','3','7','.','d','l','l',0 } }, + { 0xffff, 0, TYPE_E_LIBNOTREGISTERED, { 0 } }, + { 3, 0xffff, TYPE_E_LIBNOTREGISTERED, { 0 } }, + { 5, 0xffff, TYPE_E_LIBNOTREGISTERED, { 0 } }, { 4, 0, TYPE_E_LIBNOTREGISTERED, { 0 } } }; static const WCHAR base[] = {'f','a','k','e',0}; @@ -657,6 +661,7 @@ static void test_QueryPathOfRegTypeLib(void) if (!do_typelib_reg_key(&uid, 3, 0, base, 0)) return; if (!do_typelib_reg_key(&uid, 3, 1, base, 0)) return; if (!do_typelib_reg_key(&uid, 3, 37, base, 0)) return; + if (!do_typelib_reg_key(&uid, 5, 37, base, 0)) return; for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) { @@ -767,15 +772,17 @@ if(use_midl_tlb) { hr = ITypeInfo_GetTypeAttr(pTI, &pTA); ok(hr == S_OK, "hr %08x\n", hr); - ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind); - ok(pTA->cbSizeVft == 7 * sizeof(void *), "sizevft %d\n", pTA->cbSizeVft); -if(use_midl_tlb) { - ok(pTA->wTypeFlags == TYPEFLAG_FDUAL, "typeflags %x\n", pTA->wTypeFlags); - } - ok(pTA->cFuncs == 8, "cfuncs %d\n", pTA->cFuncs); - ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes); - ITypeInfo_ReleaseTypeAttr(pTI, pTA); - + if (hr == S_OK) + { + ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind); + ok(pTA->cbSizeVft == 7 * sizeof(void *), "sizevft %d\n", pTA->cbSizeVft); + if(use_midl_tlb) { + ok(pTA->wTypeFlags == TYPEFLAG_FDUAL, "typeflags %x\n", pTA->wTypeFlags); + } + ok(pTA->cFuncs == 8, "cfuncs %d\n", pTA->cFuncs); + ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes); + ITypeInfo_ReleaseTypeAttr(pTI, pTA); + } hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href); ok(hr == S_OK, "hr %08x\n", hr); hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p); diff --git a/rostests/winetests/oleaut32/usrmarshal.c b/rostests/winetests/oleaut32/usrmarshal.c index 9b12b2e0002..38827b1dcd9 100644 --- a/rostests/winetests/oleaut32/usrmarshal.c +++ b/rostests/winetests/oleaut32/usrmarshal.c @@ -35,10 +35,8 @@ # define V_U2(A) (*(A)) #endif -/* doesn't work on Windows due to needing more of the - * MIDL_STUB_MESSAGE structure to be filled out */ -#define LPSAFEARRAY_UNMARSHAL_WORKS 0 -#define BSTR_UNMARSHAL_WORKS 0 +#define LPSAFEARRAY_UNMARSHAL_WORKS 1 +#define BSTR_UNMARSHAL_WORKS 1 #define VARIANT_UNMARSHAL_WORKS 1 static inline SF_TYPE get_union_type(SAFEARRAY *psa) @@ -148,8 +146,8 @@ static void check_safearray(void *buffer, LPSAFEARRAY lpsa) wiresa += sizeof(DWORD); ok(*(DWORD *)wiresa == cell_count, "wiresa + 0x1c should be %u instead of %u\n", cell_count, *(DWORD *)wiresa); wiresa += sizeof(DWORD); - ok(*(DWORD_PTR *)wiresa == (DWORD_PTR)lpsa->pvData, "wiresa + 0x20 should be lpsa->pvData instead of 0x%08lx\n", *(DWORD_PTR *)wiresa); - wiresa += sizeof(DWORD_PTR); + ok(*(DWORD *)wiresa, "wiresa + 0x20 should be non-zero instead of 0x%08x\n", *(DWORD *)wiresa); + wiresa += sizeof(DWORD); if(sftype == SF_HAVEIID) { GUID guid; @@ -165,22 +163,51 @@ static void check_safearray(void *buffer, LPSAFEARRAY lpsa) /* elements are now pointed to by wiresa */ } +static void * WINAPI user_allocate(SIZE_T size) +{ + return CoTaskMemAlloc(size); +} + +static void WINAPI user_free(void *p) +{ + CoTaskMemFree(p); +} + +static void init_user_marshal_cb(USER_MARSHAL_CB *umcb, + PMIDL_STUB_MESSAGE stub_msg, + PRPC_MESSAGE rpc_msg, unsigned char *buffer, + unsigned int size, MSHCTX context) +{ + memset(rpc_msg, 0, sizeof(*rpc_msg)); + rpc_msg->Buffer = buffer; + rpc_msg->BufferLength = size; + + memset(stub_msg, 0, sizeof(*stub_msg)); + stub_msg->RpcMsg = rpc_msg; + stub_msg->Buffer = buffer; + stub_msg->pfnAllocate = user_allocate; + stub_msg->pfnFree = user_free; + + memset(umcb, 0, sizeof(*umcb)); + umcb->Flags = MAKELONG(context, NDR_LOCAL_DATA_REPRESENTATION); + umcb->pStubMsg = stub_msg; + umcb->Signature = USER_MARSHAL_CB_SIGNATURE; + umcb->CBType = buffer ? USER_MARSHAL_CB_UNMARSHALL : USER_MARSHAL_CB_BUFFER_SIZE; +} + static void test_marshal_LPSAFEARRAY(void) { unsigned char *buffer; - unsigned long size; + ULONG size; LPSAFEARRAY lpsa; LPSAFEARRAY lpsa2 = NULL; SAFEARRAYBOUND sab; - MIDL_STUB_MESSAGE stubMsg = { 0 }; - USER_MARSHAL_CB umcb = { 0 }; + RPC_MESSAGE rpc_msg; + MIDL_STUB_MESSAGE stub_msg; + USER_MARSHAL_CB umcb; HRESULT hr; VARTYPE vt; - umcb.Flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); - umcb.pReserve = NULL; - umcb.pStubMsg = &stubMsg; - sab.lLbound = 5; sab.cElements = 10; @@ -188,11 +215,14 @@ static void test_marshal_LPSAFEARRAY(void) *(DWORD *)lpsa->pvData = 0xcafebabe; lpsa->cLocks = 7; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 1, &lpsa); - ok(size == 68, "size should be 68 bytes, not %ld\n", size); + ok(size == 68, "size should be 68 bytes, not %d\n", size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); - ok(size == 64, "size should be 64 bytes, not %ld\n", size); + ok(size == 64, "size should be 64 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); @@ -200,11 +230,13 @@ static void test_marshal_LPSAFEARRAY(void) if (LPSAFEARRAY_UNMARSHAL_WORKS) { VARTYPE vt, vt2; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserUnmarshal(&umcb.Flags, buffer, &lpsa2); ok(lpsa2 != NULL, "LPSAFEARRAY didn't unmarshal\n"); SafeArrayGetVartype(lpsa, &vt); SafeArrayGetVartype(lpsa2, &vt2); ok(vt == vt2, "vts differ %x %x\n", vt, vt2); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -214,16 +246,20 @@ static void test_marshal_LPSAFEARRAY(void) /* test NULL safe array */ lpsa = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); - ok(size == 4, "size should be 4 bytes, not %ld\n", size); + ok(size == 4, "size should be 4 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); if (LPSAFEARRAY_UNMARSHAL_WORKS) { + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserUnmarshal(&umcb.Flags, buffer, &lpsa2); ok(lpsa2 == NULL, "NULL LPSAFEARRAY didn't unmarshal\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -235,11 +271,14 @@ static void test_marshal_LPSAFEARRAY(void) *(double *)lpsa->pvData = 3.1415; lpsa->cLocks = 7; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 1, &lpsa); - ok(size == 128, "size should be 128 bytes, not %ld\n", size); + ok(size == 128, "size should be 128 bytes, not %d\n", size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); - ok(size == 128, "size should be 128 bytes, not %ld\n", size); + ok(size == 128, "size should be 128 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); @@ -260,9 +299,11 @@ static void test_marshal_LPSAFEARRAY(void) hr = SafeArrayGetVartype(lpsa, &vt); ok(hr == E_INVALIDARG, "ret %08x\n", hr); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); - ok(size == 432, "size %ld\n", size); + ok(size == 432, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); HeapFree(GetProcessHeap(), 0, buffer); @@ -282,10 +323,12 @@ static void test_marshal_LPSAFEARRAY(void) hr = SafeArrayGetVartype(lpsa, &vt); ok(hr == E_INVALIDARG, "ret %08x\n", hr); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); todo_wine - ok(size == 1388, "size %ld\n", size); + ok(size == 1388, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa); check_safearray(buffer, lpsa); HeapFree(GetProcessHeap(), 0, buffer); @@ -316,30 +359,31 @@ static void check_bstr(void *buffer, BSTR b) static void test_marshal_BSTR(void) { - unsigned long size; - MIDL_STUB_MESSAGE stubMsg = { 0 }; - USER_MARSHAL_CB umcb = { 0 }; + ULONG size; + RPC_MESSAGE rpc_msg; + MIDL_STUB_MESSAGE stub_msg; + USER_MARSHAL_CB umcb; unsigned char *buffer, *next; BSTR b, b2; WCHAR str[] = {'m','a','r','s','h','a','l',' ','t','e','s','t','1',0}; DWORD len; - umcb.Flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); - umcb.pReserve = NULL; - umcb.pStubMsg = &stubMsg; - b = SysAllocString(str); len = SysStringLen(b); ok(len == 13, "get %d\n", len); /* BSTRs are DWORD aligned */ - size = BSTR_UserSize(&umcb.Flags, 1, &b); - ok(size == 42, "size %ld\n", size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); + size = BSTR_UserSize(&umcb.Flags, 1, &b); + ok(size == 42, "size %d\n", size); + + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = BSTR_UserSize(&umcb.Flags, 0, &b); - ok(size == 38, "size %ld\n", size); + ok(size == 38, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserMarshal(&umcb.Flags, buffer, &b); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); check_bstr(buffer, b); @@ -347,10 +391,12 @@ static void test_marshal_BSTR(void) if (BSTR_UNMARSHAL_WORKS) { b2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserUnmarshal(&umcb.Flags, buffer, &b2); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); ok(b2 != NULL, "BSTR didn't unmarshal\n"); ok(!memcmp(b, b2, (len + 1) * 2), "strings differ\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); BSTR_UserFree(&umcb.Flags, &b2); } @@ -358,10 +404,12 @@ static void test_marshal_BSTR(void) SysFreeString(b); b = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = BSTR_UserSize(&umcb.Flags, 0, &b); - ok(size == 12, "size %ld\n", size); + ok(size == 12, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserMarshal(&umcb.Flags, buffer, &b); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); @@ -369,9 +417,11 @@ static void test_marshal_BSTR(void) if (BSTR_UNMARSHAL_WORKS) { b2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserUnmarshal(&umcb.Flags, buffer, &b2); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); ok(b2 == NULL, "NULL BSTR didn't unmarshal\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); BSTR_UserFree(&umcb.Flags, &b2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -383,11 +433,13 @@ static void test_marshal_BSTR(void) len = SysStringByteLen(b); ok(len == 3, "get %d\n", len); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = BSTR_UserSize(&umcb.Flags, 0, &b); - ok(size == 16, "size %ld\n", size); + ok(size == 16, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); memset(buffer, 0xcc, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserMarshal(&umcb.Flags, buffer, &b); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); check_bstr(buffer, b); @@ -396,10 +448,12 @@ static void test_marshal_BSTR(void) if (BSTR_UNMARSHAL_WORKS) { b2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserUnmarshal(&umcb.Flags, buffer, &b2); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); ok(b2 != NULL, "BSTR didn't unmarshal\n"); ok(!memcmp(b, b2, len), "strings differ\n"); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); BSTR_UserFree(&umcb.Flags, &b2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -411,10 +465,12 @@ static void test_marshal_BSTR(void) len = SysStringByteLen(b); ok(len == 0, "get %d\n", len); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = BSTR_UserSize(&umcb.Flags, 0, &b); - ok(size == 12, "size %ld\n", size); + ok(size == 12, "size %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserMarshal(&umcb.Flags, buffer, &b); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); check_bstr(buffer, b); @@ -422,11 +478,13 @@ static void test_marshal_BSTR(void) if (BSTR_UNMARSHAL_WORKS) { b2 = NULL; + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); next = BSTR_UserUnmarshal(&umcb.Flags, buffer, &b2); ok(next == buffer + size, "got %p expect %p\n", next, buffer + size); ok(b2 != NULL, "NULL LPSAFEARRAY didn't unmarshal\n"); len = SysStringByteLen(b2); ok(len == 0, "byte len %d\n", len); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); BSTR_UserFree(&umcb.Flags, &b2); } HeapFree(GetProcessHeap(), 0, buffer); @@ -472,12 +530,12 @@ static const IUnknownVtbl HeapUnknown_Vtbl = HeapUnknown_Release }; -static void check_variant_header(DWORD *wirev, VARIANT *v, unsigned long size) +static void check_variant_header(DWORD *wirev, VARIANT *v, ULONG size) { WORD *wp; DWORD switch_is; - ok(*wirev == (size + 7) >> 3, "wv[0] %08x, expected %08lx\n", *wirev, (size + 7) >> 3); + ok(*wirev == (size + 7) >> 3, "wv[0] %08x, expected %08x\n", *wirev, (size + 7) >> 3); wirev++; ok(*wirev == 0, "wv[1] %08x\n", *wirev); wirev++; diff --git a/rostests/winetests/oleaut32/varformat.c b/rostests/winetests/oleaut32/varformat.c index b8de8e26c3a..b19efbdbd02 100644 --- a/rostests/winetests/oleaut32/varformat.c +++ b/rostests/winetests/oleaut32/varformat.c @@ -230,6 +230,7 @@ static const FMTDATERES VarFormat_date_results[] = static void test_VarFormat(void) { static const WCHAR szTesting[] = { 't','e','s','t','i','n','g','\0' }; + static const WCHAR szNum[] = { '3','9','6','9','7','.','1','1','\0' }; size_t i; WCHAR buffW[256]; char buff[256]; @@ -315,6 +316,10 @@ static void test_VarFormat(void) VARFMT(VT_BSTR,V_BSTR,bstrin,"<&&",S_OK,"testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,"<&>&",S_OK,"testing"); SysFreeString(bstrin); + bstrin = SysAllocString(szNum); + todo_wine VARFMT(VT_BSTR,V_BSTR,bstrin,"hh:mm",S_OK,"02:38"); + todo_wine VARFMT(VT_BSTR,V_BSTR,bstrin,"mm-dd-yy",S_OK,"09-06-08"); + SysFreeString(bstrin); /* Numeric values are converted to strings then output */ VARFMT(VT_I1,V_I1,1,"<&>&",S_OK,"1"); @@ -444,7 +449,7 @@ static void test_VarWeekdayName(void) GetLocaleInfoW(LOCALE_USER_DEFAULT, 0, NULL, 0); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("GetLocaleInfoW is not implemented\n"); + win_skip("GetLocaleInfoW is not implemented\n"); return; } diff --git a/rostests/winetests/oleaut32/vartest.c b/rostests/winetests/oleaut32/vartest.c index 648c959b691..f0a6deb7326 100644 --- a/rostests/winetests/oleaut32/vartest.c +++ b/rostests/winetests/oleaut32/vartest.c @@ -46,6 +46,11 @@ static INT (WINAPI *pVariantTimeToSystemTime)(double,LPSYSTEMTIME); static INT (WINAPI *pDosDateTimeToVariantTime)(USHORT,USHORT,double*); static INT (WINAPI *pVariantTimeToDosDateTime)(double,USHORT*,USHORT *); +static const WCHAR sz12[] = {'1','2','\0'}; +/* the strings are localized */ +static WCHAR sz12_false[32]; +static WCHAR sz12_true[32]; + /* Get a conversion function ptr, return if function not available */ #define CHECKPTR(func) p##func = (void*)GetProcAddress(hOleaut32, #func); \ if (!p##func) { trace("function " # func " not available, not testing it\n"); return; } @@ -95,7 +100,25 @@ static int IS_ANCIENT = 0; static void init(void) { - hOleaut32 = GetModuleHandle("oleaut32.dll"); + BSTR bstr; + HRESULT res; + + res = VarBstrFromBool(VARIANT_TRUE, LANG_USER_DEFAULT, VAR_LOCALBOOL, &bstr); + ok(SUCCEEDED(res) && (lstrlenW(bstr) > 0), + "Expected localized string for 'True'\n"); + /* lstrcpyW / lstrcatW do not work on win95 */ + memcpy(sz12_true, sz12, sizeof(sz12)); + if (bstr) memcpy(&sz12_true[2], bstr, SysStringByteLen(bstr) + sizeof(WCHAR)); + SysFreeString(bstr); + + res = VarBstrFromBool(VARIANT_FALSE, LANG_USER_DEFAULT, VAR_LOCALBOOL, &bstr); + ok(SUCCEEDED(res) && (lstrlenW(bstr) > 0), + "Expected localized string for 'False'\n"); + memcpy(sz12_false, sz12, sizeof(sz12)); + if (bstr) memcpy(&sz12_false[2], bstr, SysStringByteLen(bstr) + sizeof(WCHAR)); + SysFreeString(bstr); + + hOleaut32 = GetModuleHandle("oleaut32.dll"); /* Is a given function exported from oleaut32? */ #define HAVE_FUNC(func) ((void*)GetProcAddress(hOleaut32, #func) != NULL) @@ -2007,7 +2030,6 @@ static HRESULT (WINAPI *pVarSub)(LPVARIANT,LPVARIANT,LPVARIANT); static void test_VarSub(void) { - static const WCHAR sz12[] = {'1','2','\0'}; VARIANT left, right, exp, result, cy, dec; VARTYPE i; BSTR lbstr, rbstr; @@ -4856,7 +4878,6 @@ static HRESULT (WINAPI *pVarMul)(LPVARIANT,LPVARIANT,LPVARIANT); static void test_VarMul(void) { - static const WCHAR sz12[] = {'1','2','\0'}; VARIANT left, right, exp, result, cy, dec; VARTYPE i; BSTR lbstr, rbstr; @@ -5028,7 +5049,6 @@ static HRESULT (WINAPI *pVarAdd)(LPVARIANT,LPVARIANT,LPVARIANT); static void test_VarAdd(void) { - static const WCHAR sz12[] = {'1','2','\0'}; VARIANT left, right, exp, result, cy, dec; VARTYPE i; BSTR lbstr, rbstr; @@ -5215,14 +5235,11 @@ static void test_VarCat(void) { LCID lcid; VARIANT left, right, result, expected; - static const WCHAR sz12[] = {'1','2','\0'}; static const WCHAR sz34[] = {'3','4','\0'}; static const WCHAR sz1234[] = {'1','2','3','4','\0'}; static const WCHAR date_sz12[] = {'9','/','3','0','/','1','9','8','0','1','2','\0'}; static const WCHAR sz12_date[] = {'1','2','9','/','3','0','/','1','9','8','0','\0'}; static const WCHAR sz_empty[] = {'\0'}; - static const WCHAR sz12_true[] = {'1','2','T','r','u','e','\0'}; - static const WCHAR sz12_false[] = {'1','2','F','a','l','s','e','\0'}; TCHAR orig_date_format[128]; VARTYPE leftvt, rightvt, resultvt; HRESULT hres; @@ -5416,8 +5433,8 @@ static void test_VarCat(void) hres = VarCat(&left,&right,&result); ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres); hres = VarCmp(&result,&expected,lcid,0); - ok(hres == VARCMP_EQ || - broken(hres == VARCMP_GT), "Expected VARCMP_EQ, got %08x\n", hres); + ok(hres == VARCMP_EQ, "Expected VARCMP_EQ, got %08x for %s, %s\n", + hres, variantstr(&result), variantstr(&expected)); VariantClear(&left); VariantClear(&right); @@ -5433,8 +5450,8 @@ static void test_VarCat(void) hres = VarCat(&left,&right,&result); ok(hres == S_OK, "VarCat failed with error 0x%08x\n", hres); hres = VarCmp(&result,&expected,lcid,0); - ok(hres == VARCMP_EQ || - broken(hres == VARCMP_GT), "Expected VARCMP_EQ, got %08x\n", hres); + ok(hres == VARCMP_EQ, "Expected VARCMP_EQ, got %08x for %s, %s\n", + hres, variantstr(&result), variantstr(&expected)); VariantClear(&left); VariantClear(&right); diff --git a/rostests/winetests/oleaut32/vartype.c b/rostests/winetests/oleaut32/vartype.c index 4f282345ca3..7600946f53e 100644 --- a/rostests/winetests/oleaut32/vartype.c +++ b/rostests/winetests/oleaut32/vartype.c @@ -46,7 +46,7 @@ static HMODULE hOleaut32; /* Get a conversion function ptr, return if function not available */ #define CHECKPTR(func) p##func = (void*)GetProcAddress(hOleaut32, #func); \ if (!p##func) { \ - skip("function " # func " not available, not testing it\n"); return; } + win_skip("function " # func " not available, not testing it\n"); return; } /* Is a given function exported from oleaut32? */ #define HAVE_FUNC(func) ((void*)GetProcAddress(hOleaut32, #func) != NULL) @@ -2349,7 +2349,7 @@ static void test_VarI8Copy(void) if (!HAVE_OLEAUT32_I8) { - skip("I8 and UI8 data types are not available\n"); + win_skip("I8 and UI8 data types are not available\n"); return; } @@ -2379,7 +2379,7 @@ static void test_VarI8ChangeTypeEx(void) if (!HAVE_OLEAUT32_I8) { - skip("I8 and UI8 data types are not available\n"); + win_skip("I8 and UI8 data types are not available\n"); return; } @@ -2611,7 +2611,7 @@ static void test_VarUI8Copy(void) if (!HAVE_OLEAUT32_I8) { - skip("I8 and UI8 data types are not available\n"); + win_skip("I8 and UI8 data types are not available\n"); return; } @@ -2641,7 +2641,7 @@ static void test_VarUI8ChangeTypeEx(void) if (!HAVE_OLEAUT32_I8) { - skip("I8 and UI8 data types are not available\n"); + win_skip("I8 and UI8 data types are not available\n"); return; } @@ -4983,6 +4983,8 @@ static void test_VarBstrCmp(void) static const WCHAR s2[] = { 'a',0,'b' }; static const char sb1[] = {1,0,1}; static const char sb2[] = {1,0,2}; + static const char sbchr0[] = {0,0}; + static const char sbchr00[] = {0,0,0}; BSTR bstr, bstrempty, bstr2; CHECKPTR(VarBstrCmp); @@ -5021,6 +5023,15 @@ static void test_VarBstrCmp(void) SysFreeString(bstr); + bstr = SysAllocStringByteLen(sbchr0, sizeof(sbchr0)); + bstr2 = SysAllocStringByteLen(sbchr0, sizeof(sbchr00)); + VARBSTRCMP(bstr,bstrempty,0,VARCMP_GT); + VARBSTRCMP(bstrempty,bstr,0,VARCMP_LT); + VARBSTRCMP(bstr2,bstrempty,0,VARCMP_GT); + VARBSTRCMP(bstr2,bstr,0,VARCMP_EQ); + SysFreeString(bstr2); + SysFreeString(bstr); + /* When (LCID == 0) it should be a binary comparison * so these two strings could not match. */ @@ -5030,6 +5041,15 @@ static void test_VarBstrCmp(void) VARBSTRCMP(bstr,bstr2,0,VARCMP_LT); SysFreeString(bstr2); SysFreeString(bstr); + + bstr = SysAllocStringByteLen(sbchr0, sizeof(sbchr0)); + bstr2 = SysAllocStringByteLen(sbchr0, sizeof(sbchr00)); + VARBSTRCMP(bstr,bstrempty,0,VARCMP_GT); + VARBSTRCMP(bstrempty,bstr,0,VARCMP_LT); + VARBSTRCMP(bstr2,bstrempty,0,VARCMP_GT); + VARBSTRCMP(bstr2,bstr,0,VARCMP_GT); + SysFreeString(bstr2); + SysFreeString(bstr); } /* Get the internal representation of a BSTR */ @@ -5768,21 +5788,13 @@ static void test_UintChangeTypeEx(void) static void test_ClearCustData(void) { - WCHAR buff[sizeof(CUSTDATAITEM) * NUM_CUST_ITEMS / sizeof(WCHAR)]; CUSTDATA ci; unsigned i; CHECKPTR(ClearCustData); - memset(buff, 0, sizeof(buff)); - ci.cCustData = NUM_CUST_ITEMS; - /* This is a bit tricky. We use SysAllocStringByteLen to allocate the - * array, since native uses an internal IMalloc interface for allocating - * its memory, while Wine uses HeapAlloc(). Doing this ensures we allocate - * using the correct function whether with native or builtin. - */ - ci.prgCustData = (LPCUSTDATAITEM)Get(SysAllocStringByteLen((LPCSTR)buff, sizeof(buff))); + ci.prgCustData = CoTaskMemAlloc( sizeof(CUSTDATAITEM) * NUM_CUST_ITEMS ); for (i = 0; i < NUM_CUST_ITEMS; i++) VariantInit(&ci.prgCustData[i].varValue); pClearCustData(&ci); diff --git a/rostests/winetests/pdh/pdh.c b/rostests/winetests/pdh/pdh.c index 4b7c562c779..cd03bcb4fe3 100644 --- a/rostests/winetests/pdh/pdh.c +++ b/rostests/winetests/pdh/pdh.c @@ -837,6 +837,103 @@ static void test_PdhCollectQueryDataEx(void) ok(status == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", status); } +static void test_PdhMakeCounterPathA(void) +{ + PDH_STATUS ret; + PDH_COUNTER_PATH_ELEMENTS_A e; + char buffer[1024]; + DWORD buflen; + + ret = PdhMakeCounterPathA(NULL, NULL, NULL, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); + + buflen = 0; + ret = PdhMakeCounterPathA(NULL, NULL, &buflen, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); + + buflen = 0; + ret = PdhMakeCounterPathA(NULL, buffer, &buflen, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); + + buflen = sizeof(buffer); + memset(&e, 0, sizeof(e)); + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.szMachineName = (char *)"machine"; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); + ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.szObjectName = (char *)"object"; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); + ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.szInstanceName = (char *)"instance"; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); + ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.szParentInstance = (char *)"parent"; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); + ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.dwInstanceIndex = 1; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); + ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.szCounterName = (char *)"counter"; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == ERROR_SUCCESS, "PdhMakeCounterPathA failed 0x%08x\n", ret); + ok(!strcmp(buffer, "\\\\machine\\object(parent/instance#1)\\counter"), + "expected \"\\\\machine\\object(parent/instance#1)\\counter\" got %s\n", buffer); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.szParentInstance = NULL; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == ERROR_SUCCESS, "PdhMakeCounterPathA failed 0x%08x\n", ret); + ok(!strcmp(buffer, "\\\\machine\\object(instance#1)\\counter"), + "expected \"\\\\machine\\object(instance#1)\\counter\" got %s\n", buffer); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.szInstanceName = NULL; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == ERROR_SUCCESS, "PdhMakeCounterPathA failed 0x%08x\n", ret); + ok(!strcmp(buffer, "\\\\machine\\object\\counter"), + "expected \"\\\\machine\\object\\counter\" got %s\n", buffer); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.szMachineName = NULL; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == ERROR_SUCCESS, "PdhMakeCounterPathA failed 0x%08x\n", ret); + ok(!strcmp(buffer, "\\object\\counter"), + "expected \"\\object\\counter\" got %s\n", buffer); + + buffer[0] = 0; + buflen = sizeof(buffer); + e.szObjectName = NULL; + ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); + ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); +} + START_TEST(pdh) { if (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) != LANG_ENGLISH) @@ -877,4 +974,5 @@ START_TEST(pdh) if (pPdhValidatePathExW) test_PdhValidatePathExW(); test_PdhCollectQueryDataEx(); + test_PdhMakeCounterPathA(); } diff --git a/rostests/winetests/psapi/psapi_main.c b/rostests/winetests/psapi/psapi_main.c index 4cee7c62405..6ef5b04c189 100644 --- a/rostests/winetests/psapi/psapi_main.c +++ b/rostests/winetests/psapi/psapi_main.c @@ -21,10 +21,17 @@ #include #include -#include "wine/test.h" #include "windows.h" +#include "wine/test.h" #include "psapi.h" +#define expect_eq_d(expected, actual) \ + do { \ + int value = (actual); \ + ok((expected) == value, "Expected " #actual " to be %d (" #expected ") is %d\n", \ + (expected), value); \ + } while (0) + #define PSAPI_GET_PROC(func) \ p ## func = (void*)GetProcAddress(hpsapi, #func); \ if(!p ## func) { \ @@ -63,6 +70,7 @@ static DWORD (WINAPI *pGetModuleFileNameExA)(HANDLE, HMODULE, LPSTR, DWORD); static BOOL (WINAPI *pGetModuleInformation)(HANDLE, HMODULE, LPMODULEINFO, DWORD); static DWORD (WINAPI *pGetMappedFileNameA)(HANDLE, LPVOID, LPSTR, DWORD); static DWORD (WINAPI *pGetProcessImageFileNameA)(HANDLE, LPSTR, DWORD); +static DWORD (WINAPI *pGetProcessImageFileNameW)(HANDLE, LPWSTR, DWORD); static BOOL (WINAPI *pGetProcessMemoryInfo)(HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD); static BOOL (WINAPI *pGetWsChanges)(HANDLE, PPSAPI_WS_WATCH_INFORMATION, DWORD); static BOOL (WINAPI *pInitializeProcessForWsWatch)(HANDLE); @@ -84,6 +92,8 @@ static BOOL InitFunctionPtrs(HMODULE hpsapi) /* GetProcessImageFileName is not exported on NT4 */ pGetProcessImageFileNameA = (void *)GetProcAddress(hpsapi, "GetProcessImageFileNameA"); + pGetProcessImageFileNameW = + (void *)GetProcAddress(hpsapi, "GetProcessImageFileNameW"); return TRUE; } @@ -166,6 +176,7 @@ static void test_GetProcessImageFileName(void) { HMODULE hMod = GetModuleHandle(NULL); char szImgPath[MAX_PATH], szMapPath[MAX_PATH]; + WCHAR szImgPathW[MAX_PATH]; DWORD ret; if(pGetProcessImageFileNameA == NULL) @@ -175,26 +186,49 @@ static void test_GetProcessImageFileName(void) SetLastError(0xdeadbeef); if(!pGetProcessImageFileNameA(hpQI, szImgPath, sizeof(szImgPath))) { - if(GetLastError() == ERROR_INVALID_FUNCTION) + if(GetLastError() == ERROR_INVALID_FUNCTION) { win_skip("GetProcessImageFileName not implemented\n"); - else if(GetLastError() == 0xdeadbeef) - ok(0, "failed without error code\n"); - else - ok(0, "failed with %d\n", GetLastError()); + return; + } - return; + if(GetLastError() == 0xdeadbeef) + todo_wine ok(0, "failed without error code\n"); + else + todo_wine ok(0, "failed with %d\n", GetLastError()); } - - w32_err(pGetProcessImageFileNameA(NULL, szImgPath, sizeof(szImgPath)), ERROR_INVALID_HANDLE); - w32_err(pGetProcessImageFileNameA(hpSR, szImgPath, sizeof(szImgPath)), ERROR_ACCESS_DENIED); - w32_err(pGetProcessImageFileNameA(hpQI, szImgPath, 0), ERROR_INSUFFICIENT_BUFFER); - if(!w32_suc(ret = pGetProcessImageFileNameA(hpQI, szImgPath, sizeof(szImgPath))) || - !w32_suc(pGetMappedFileNameA(hpQV, hMod, szMapPath, sizeof(szMapPath)))) - return; - /* Windows returns 2*strlen-1 */ - ok(ret >= strlen(szImgPath), "szImgPath=\"%s\" ret=%d\n", szImgPath, ret); - ok(!strcmp(szImgPath, szMapPath), - "szImgPath=\"%s\" szMapPath=\"%s\"\n", szImgPath, szMapPath); + + todo_wine w32_err(pGetProcessImageFileNameA(NULL, szImgPath, sizeof(szImgPath)), ERROR_INVALID_HANDLE); + todo_wine w32_err(pGetProcessImageFileNameA(hpSR, szImgPath, sizeof(szImgPath)), ERROR_ACCESS_DENIED); + todo_wine w32_err(pGetProcessImageFileNameA(hpQI, szImgPath, 0), ERROR_INSUFFICIENT_BUFFER); + todo_wine + if(w32_suc(ret = pGetProcessImageFileNameA(hpQI, szImgPath, sizeof(szImgPath))) && + w32_suc(pGetMappedFileNameA(hpQV, hMod, szMapPath, sizeof(szMapPath)))) { + /* Windows returns 2*strlen-1 */ + ok(ret >= strlen(szImgPath), "szImgPath=\"%s\" ret=%d\n", szImgPath, ret); + ok(!strcmp(szImgPath, szMapPath), + "szImgPath=\"%s\" szMapPath=\"%s\"\n", szImgPath, szMapPath); + } + + w32_err(pGetProcessImageFileNameW(NULL, szImgPathW, sizeof(szImgPathW)), ERROR_INVALID_HANDLE); + /* no information about correct buffer size returned: */ + w32_err(pGetProcessImageFileNameW(hpQI, szImgPathW, 0), ERROR_INSUFFICIENT_BUFFER); + w32_err(pGetProcessImageFileNameW(hpQI, NULL, 0), ERROR_INSUFFICIENT_BUFFER); + + /* correct call */ + memset(szImgPathW, 0xff, sizeof(szImgPathW)); + ret = pGetProcessImageFileNameW(hpQI, szImgPathW, sizeof(szImgPathW)/sizeof(WCHAR)); + ok(ret > 0, "GetProcessImageFileNameW should have succeeded.\n"); + ok(szImgPathW[0] == '\\', "GetProcessImageFileNameW should have returned an NT path.\n"); + expect_eq_d(lstrlenW(szImgPathW), ret); + + /* boundary values of 'size' */ + w32_err(pGetProcessImageFileNameW(hpQI, szImgPathW, ret), ERROR_INSUFFICIENT_BUFFER); + + memset(szImgPathW, 0xff, sizeof(szImgPathW)); + ret = pGetProcessImageFileNameW(hpQI, szImgPathW, ret + 1); + ok(ret > 0, "GetProcessImageFileNameW should have succeeded.\n"); + ok(szImgPathW[0] == '\\', "GetProcessImageFileNameW should have returned an NT path.\n"); + expect_eq_d(lstrlenW(szImgPathW), ret); } static void test_GetModuleFileNameEx(void) @@ -309,7 +343,7 @@ START_TEST(psapi_main) test_GetModuleInformation(); test_GetProcessMemoryInfo(); todo_wine test_GetMappedFileName(); - todo_wine test_GetProcessImageFileName(); + test_GetProcessImageFileName(); test_GetModuleFileNameEx(); test_GetModuleBaseName(); test_ws_functions(); diff --git a/rostests/winetests/qmgr/job.c b/rostests/winetests/qmgr/job.c index 36201f8194f..d0e2306bfc0 100644 --- a/rostests/winetests/qmgr/job.c +++ b/rostests/winetests/qmgr/job.c @@ -24,6 +24,7 @@ #include "wine/test.h" #include "bits.h" +#include "initguid.h" /* Globals used by many tests */ static const WCHAR test_displayName[] = {'T', 'e', 's', 't', 0}; @@ -123,6 +124,49 @@ static void teardown(void) IBackgroundCopyManager_Release(test_manager); } +/* FIXME: Remove when Wine has implemented this */ +DEFINE_GUID(CLSID_BackgroundCopyManager2_0, 0x6d18ad12, 0xbde3, 0x4393, 0xb3,0x11, 0x09,0x9c,0x34,0x6e,0x6d,0xf9); + +static BOOL check_bits20(void) +{ + HRESULT hres; + IBackgroundCopyManager *manager; + BOOL ret = TRUE; + + hres = CoCreateInstance(&CLSID_BackgroundCopyManager2_0, NULL, + CLSCTX_LOCAL_SERVER, + &IID_IBackgroundCopyManager, + (void **) &manager); + + if (hres == REGDB_E_CLASSNOTREG) + { + ret = FALSE; + + /* FIXME: Wine implements 2.0 functionality but doesn't advertise 2.0 + * + * Remove when Wine is fixed + */ + if (setup()) + { + HRESULT hres2; + + hres2 = IBackgroundCopyJob_AddFile(test_job, test_remotePathA, + test_localPathA); + if (hres2 == S_OK) + { + trace("Running on Wine, claim 2.0 is present\n"); + ret = TRUE; + } + teardown(); + } + } + + if (manager) + IBackgroundCopyManager_Release(manager); + + return ret; +} + /* Test that the jobId is properly set */ static void test_GetId(void) { @@ -486,12 +530,15 @@ START_TEST(job) test_GetId, test_GetType, test_GetName, - test_AddFile, - test_AddFileSet, - test_EnumFiles, test_GetProgress_preTransfer, test_GetState, test_ResumeEmpty, + 0 + }; + static const test_t tests_bits20[] = { + test_AddFile, + test_AddFileSet, + test_EnumFiles, test_CompleteLocal, test_CompleteLocalURL, 0 @@ -502,6 +549,7 @@ START_TEST(job) return; CoInitialize(NULL); + for (test = tests; *test; ++test) { /* Keep state separate between tests. */ @@ -513,5 +561,25 @@ START_TEST(job) (*test)(); teardown(); } + + if (check_bits20()) + { + for (test = tests_bits20; *test; ++test) + { + /* Keep state separate between tests. */ + if (!setup()) + { + skip("Unable to setup test\n"); + break; + } + (*test)(); + teardown(); + } + } + else + { + win_skip("Tests need BITS 2.0 or higher\n"); + } + CoUninitialize(); } diff --git a/rostests/winetests/quartz/filtergraph.c b/rostests/winetests/quartz/filtergraph.c index 2e5fdc42f6b..26a72beef8d 100644 --- a/rostests/winetests/quartz/filtergraph.c +++ b/rostests/winetests/quartz/filtergraph.c @@ -1460,7 +1460,7 @@ static HRESULT get_connected_filter_name(TestFilterImpl *pFilter, char *FilterNa static void test_render_filter_priority(void) { /* Tests filter choice priorities in Render(). */ - DWORD cookie1, cookie2, cookie3; + DWORD cookie1 = 0, cookie2 = 0, cookie3 = 0; HRESULT hr; IFilterGraph2* pgraph2 = NULL; IFilterMapper2 *pMapper2 = NULL; @@ -1539,7 +1539,7 @@ static void test_render_filter_priority(void) no preference given to exact match. */ hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (LPVOID*)&pgraph2); ok(hr == S_OK, "CoCreateInstance failed with %08x\n", hr); - if (!pgraph2) goto out; + if (!pgraph2) return; hr = TestFilter_Create(&GUID_NULL, PinData1, (LPVOID)&ptestfilter); ok(hr == S_OK, "TestFilter_Create failed with %08x\n", hr); @@ -1758,12 +1758,15 @@ static void test_render_filter_priority(void) hr = CoRegisterClassObject(Filter1ClassFactory.clsid, (IUnknown *)&Filter1ClassFactory, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &cookie1); ok(hr == S_OK, "CoRegisterClassObject failed with %08x\n", hr); + if (FAILED(hr)) goto out; hr = CoRegisterClassObject(Filter2ClassFactory.clsid, (IUnknown *)&Filter2ClassFactory, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &cookie2); ok(hr == S_OK, "CoRegisterClassObject failed with %08x\n", hr); + if (FAILED(hr)) goto out; hr = CoRegisterClassObject(Filter3ClassFactory.clsid, (IUnknown *)&Filter3ClassFactory, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &cookie3); ok(hr == S_OK, "CoRegisterClassObject failed with %08x\n", hr); + if (FAILED(hr)) goto out; rgf2.dwVersion = 2; rgf2.dwMerit = MERIT_UNLIKELY; diff --git a/rostests/winetests/rasapi32/rasapi.c b/rostests/winetests/rasapi32/rasapi.c index bf1c853b11f..11fca0eb4ad 100644 --- a/rostests/winetests/rasapi32/rasapi.c +++ b/rostests/winetests/rasapi32/rasapi.c @@ -163,4 +163,6 @@ START_TEST(rasapi) InitFunctionPtrs(); test_rasenum(); + + FreeLibrary(hmodule); } diff --git a/rostests/winetests/riched20/editor.c b/rostests/winetests/riched20/editor.c index f8da3faf109..0383d1487bf 100644 --- a/rostests/winetests/riched20/editor.c +++ b/rostests/winetests/riched20/editor.c @@ -445,7 +445,7 @@ static int get_scroll_pos_y(HWND hwnd) return p.y; } -static void move_cursor(HWND hwnd, long charindex) +static void move_cursor(HWND hwnd, LONG charindex) { CHARRANGE cr; cr.cpMax = charindex; @@ -1420,6 +1420,46 @@ static void test_EM_GETTEXTRANGE(void) ok(result == 7, "EM_GETTEXTRANGE returned %ld\n", result); ok(!strcmp(expect, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); + /* cpMax of text length is used instead of -1 in this case */ + textRange.lpstrText = buffer; + textRange.chrg.cpMin = 0; + textRange.chrg.cpMax = -1; + result = SendMessage(hwndRichEdit, EM_GETTEXTRANGE, 0, (LPARAM)&textRange); + ok(result == strlen(text2), "EM_GETTEXTRANGE returned %ld\n", result); + ok(!strcmp(text2, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); + + /* cpMin < 0 causes no text to be copied, and 0 to be returned */ + textRange.lpstrText = buffer; + textRange.chrg.cpMin = -1; + textRange.chrg.cpMax = 1; + result = SendMessage(hwndRichEdit, EM_GETTEXTRANGE, 0, (LPARAM)&textRange); + ok(result == 0, "EM_GETTEXTRANGE returned %ld\n", result); + ok(!strcmp(text2, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); + + /* cpMax of -1 is not replaced with text length if cpMin != 0 */ + textRange.lpstrText = buffer; + textRange.chrg.cpMin = 1; + textRange.chrg.cpMax = -1; + result = SendMessage(hwndRichEdit, EM_GETTEXTRANGE, 0, (LPARAM)&textRange); + ok(result == 0, "EM_GETTEXTRANGE returned %ld\n", result); + ok(!strcmp(text2, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); + + /* no end character is copied if cpMax - cpMin < 0 */ + textRange.lpstrText = buffer; + textRange.chrg.cpMin = 5; + textRange.chrg.cpMax = 5; + result = SendMessage(hwndRichEdit, EM_GETTEXTRANGE, 0, (LPARAM)&textRange); + ok(result == 0, "EM_GETTEXTRANGE returned %ld\n", result); + ok(!strcmp(text2, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); + + /* cpMax of text length is used if cpMax > text length*/ + textRange.lpstrText = buffer; + textRange.chrg.cpMin = 0; + textRange.chrg.cpMax = 1000; + result = SendMessage(hwndRichEdit, EM_GETTEXTRANGE, 0, (LPARAM)&textRange); + ok(result == strlen(text2), "EM_GETTEXTRANGE returned %ld\n", result); + ok(!strcmp(text2, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); + DestroyWindow(hwndRichEdit); } @@ -3282,7 +3322,7 @@ static void test_WM_SETTEXT(void) memset(buf, 0, sizeof(buf)); SendMessage(hwndRichEdit, EM_STREAMOUT, (WPARAM)(SF_RTF), (LPARAM)&es); - trace("EM_STREAMOUT produced: \n%s\n", buf); + trace("EM_STREAMOUT produced:\n%s\n", buf); TEST_SETTEXT(buf, TestItem1) #undef TEST_SETTEXT @@ -3343,6 +3383,61 @@ static void test_EM_STREAMOUT(void) DestroyWindow(hwndRichEdit); } +static void test_EM_STREAMOUT_FONTTBL(void) +{ + HWND hwndRichEdit = new_richedit(NULL); + EDITSTREAM es; + char buf[1024] = {0}; + char * p; + char * fontTbl; + int brackCount; + + const char * TestItem = "TestSomeText"; + + /* fills in the richedit control with some text */ + SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) TestItem); + + /* streams out the text in rtf format */ + p = buf; + es.dwCookie = (DWORD_PTR)&p; + es.dwError = 0; + es.pfnCallback = test_WM_SETTEXT_esCallback; + memset(buf, 0, sizeof(buf)); + SendMessage(hwndRichEdit, EM_STREAMOUT, + (WPARAM)(SF_RTF), (LPARAM)&es); + + /* scans for \fonttbl, error if not found */ + fontTbl = strstr(buf, "\\fonttbl"); + ok(fontTbl != NULL, "missing \\fonttbl section\n"); + if(fontTbl) + { + /* scans for terminating closing bracket */ + brackCount = 1; + while(*fontTbl && brackCount) + { + if(*fontTbl == '{') + brackCount++; + else if(*fontTbl == '}') + brackCount--; + fontTbl++; + } + /* checks whether closing bracket is ok */ + ok(brackCount == 0, "missing closing bracket in \\fonttbl block\n"); + if(!brackCount) + { + /* char before closing fonttbl block should be a closed bracket */ + fontTbl -= 2; + ok(*fontTbl == '}', "spurious character '%02x' before \\fonttbl closing bracket\n", *fontTbl); + + /* char after fonttbl block should be a crlf */ + fontTbl += 2; + ok(*fontTbl == 0x0d && *(fontTbl+1) == 0x0a, "missing crlf after \\fonttbl block\n"); + } + } + DestroyWindow(hwndRichEdit); +} + + static void test_EM_SETTEXTEX(void) { HWND hwndRichEdit, parent; @@ -3618,7 +3713,7 @@ static void test_EM_SETTEXTEX(void) memset(buf, 0, sizeof(buf)); SendMessage(hwndRichEdit, EM_STREAMOUT, (WPARAM)(SF_RTF), (LPARAM)&es); - trace("EM_STREAMOUT produced: \n%s\n", (char *)buf); + trace("EM_STREAMOUT produced:\n%s\n", (char *)buf); /* !ST_SELECTION && !Unicode && \rtf */ setText.codepage = CP_ACP;/* EM_STREAMOUT saved as ANSI string */ @@ -3659,7 +3754,7 @@ static void test_EM_SETTEXTEX(void) memset(buf, 0, sizeof(buf)); SendMessage(hwndRichEdit, EM_STREAMOUT, (WPARAM)(SF_RTF), (LPARAM)&es); - trace("EM_STREAMOUT produced: \n%s\n", (char *)buf); + trace("EM_STREAMOUT produced:\n%s\n", (char *)buf); /* select some text */ cr.cpMax = 1; @@ -4171,37 +4266,36 @@ static void test_EM_GETMODIFY(void) } struct exsetsel_s { - long min; - long max; - long expected_retval; + LONG min; + LONG max; + LRESULT expected_retval; int expected_getsel_start; int expected_getsel_end; - int _exsetsel_todo_wine; int _getsel_todo_wine; }; const struct exsetsel_s exsetsel_tests[] = { /* sanity tests */ - {5, 10, 10, 5, 10, 0, 0}, - {15, 17, 17, 15, 17, 0, 0}, + {5, 10, 10, 5, 10, 0}, + {15, 17, 17, 15, 17, 0}, /* test cpMax > strlen() */ - {0, 100, 18, 0, 18, 0, 1}, + {0, 100, 18, 0, 18, 1}, /* test cpMin == cpMax */ - {5, 5, 5, 5, 5, 0, 0}, + {5, 5, 5, 5, 5, 0}, /* test cpMin < 0 && cpMax >= 0 (bug 4462) */ - {-1, 0, 5, 5, 5, 0, 0}, - {-1, 17, 5, 5, 5, 0, 0}, - {-1, 18, 5, 5, 5, 0, 0}, + {-1, 0, 5, 5, 5, 0}, + {-1, 17, 5, 5, 5, 0}, + {-1, 18, 5, 5, 5, 0}, /* test cpMin < 0 && cpMax < 0 */ - {-1, -1, 17, 17, 17, 0, 0}, - {-4, -5, 17, 17, 17, 0, 0}, + {-1, -1, 17, 17, 17, 0}, + {-4, -5, 17, 17, 17, 0}, /* test cMin >=0 && cpMax < 0 (bug 6814) */ - {0, -1, 18, 0, 18, 0, 1}, - {17, -5, 18, 17, 18, 0, 1}, - {18, -3, 17, 17, 17, 0, 0}, + {0, -1, 18, 0, 18, 1}, + {17, -5, 18, 17, 18, 1}, + {18, -3, 17, 17, 17, 0}, /* test if cpMin > cpMax */ - {15, 19, 18, 15, 18, 0, 1}, - {19, 15, 18, 15, 18, 0, 1} + {15, 19, 18, 15, 18, 1}, + {19, 15, 18, 15, 18, 1} }; static void check_EM_EXSETSEL(HWND hwnd, const struct exsetsel_s *setsel, int id) { @@ -4213,13 +4307,7 @@ static void check_EM_EXSETSEL(HWND hwnd, const struct exsetsel_s *setsel, int id cr.cpMax = setsel->max; result = SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM) &cr); - if (setsel->_exsetsel_todo_wine) { - todo_wine { - ok(result == setsel->expected_retval, "EM_EXSETSEL(%d): expected: %ld actual: %ld\n", id, setsel->expected_retval, result); - } - } else { - ok(result == setsel->expected_retval, "EM_EXSETSEL(%d): expected: %ld actual: %ld\n", id, setsel->expected_retval, result); - } + ok(result == setsel->expected_retval, "EM_EXSETSEL(%d): expected: %ld actual: %ld\n", id, setsel->expected_retval, result); SendMessage(hwnd, EM_GETSEL, (WPARAM) &start, (LPARAM) &end); @@ -4706,46 +4794,95 @@ static void test_WM_PASTE(void) static void test_EM_FORMATRANGE(void) { - int r; - FORMATRANGE fr; + int i, tpp_x, tpp_y; HDC hdc; HWND hwndRichEdit = new_richedit(NULL); - - SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) haystack); + static const struct { + const char *string; /* The string */ + int first; /* First 'pagebreak', 0 for don't care */ + int second; /* Second 'pagebreak', 0 for don't care */ + } fmtstrings[] = { + {"WINE wine", 0, 0}, + {"WINE wineWine", 0, 0}, + {"WINE\r\nwine\r\nwine", 5, 10}, + {"WINE\r\nWINEwine\r\nWINEwine", 5, 14}, + {"WINE\r\n\r\nwine\r\nwine", 5, 6} + }; hdc = GetDC(hwndRichEdit); ok(hdc != NULL, "Could not get HDC\n"); - fr.hdc = fr.hdcTarget = hdc; - fr.rc.top = fr.rcPage.top = fr.rc.left = fr.rcPage.left = 0; - fr.rc.right = fr.rcPage.right = GetDeviceCaps(hdc, HORZRES); - fr.rc.bottom = fr.rcPage.bottom = GetDeviceCaps(hdc, VERTRES); - fr.chrg.cpMin = 0; - fr.chrg.cpMax = 20; + /* Calculate the twips per pixel */ + tpp_x = 1440 / GetDeviceCaps(hdc, LOGPIXELSX); + tpp_y = 1440 / GetDeviceCaps(hdc, LOGPIXELSY); - r = SendMessage(hwndRichEdit, EM_FORMATRANGE, TRUE, 0); - todo_wine { - ok(r == 31, "EM_FORMATRANGE expect %d, got %d\n", 31, r); - } - - r = SendMessage(hwndRichEdit, EM_FORMATRANGE, TRUE, (LPARAM) &fr); - todo_wine { - ok(r == 20 || r == 9, "EM_FORMATRANGE expect 20 or 9, got %d\n", r); - } - - fr.chrg.cpMin = 0; - fr.chrg.cpMax = 10; - - r = SendMessage(hwndRichEdit, EM_FORMATRANGE, TRUE, (LPARAM) &fr); - todo_wine { - ok(r == 10, "EM_FORMATRANGE expect %d, got %d\n", 10, r); - } - - r = SendMessage(hwndRichEdit, EM_FORMATRANGE, TRUE, 0); - todo_wine { - ok(r == 31, "EM_FORMATRANGE expect %d, got %d\n", 31, r); + SendMessage(hwndRichEdit, EM_FORMATRANGE, FALSE, 0); + + for (i = 0; i < sizeof(fmtstrings)/sizeof(fmtstrings[0]); i++) + { + FORMATRANGE fr; + GETTEXTLENGTHEX gtl; + SIZE stringsize; + int r, len; + + SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) fmtstrings[i].string); + + gtl.flags = GTL_NUMCHARS | GTL_PRECISE; + gtl.codepage = CP_ACP; + len = SendMessageA(hwndRichEdit, EM_GETTEXTLENGTHEX, (WPARAM)>l, 0); + + /* Get some size information for the string */ + GetTextExtentPoint32(hdc, fmtstrings[i].string, strlen(fmtstrings[i].string), &stringsize); + + /* Define the box to be half the width needed and a bit larger than the height. + * Changes to the width means we have at least 2 pages. Changes to the height + * is done so we can check the changing of fr.rc.bottom. + */ + fr.hdc = fr.hdcTarget = hdc; + fr.rc.top = fr.rcPage.top = fr.rc.left = fr.rcPage.left = 0; + fr.rc.right = fr.rcPage.right = (stringsize.cx / 2) * tpp_x; + fr.rc.bottom = fr.rcPage.bottom = (stringsize.cy + 10) * tpp_y; + + r = SendMessage(hwndRichEdit, EM_FORMATRANGE, TRUE, 0); + todo_wine { + ok(r == len, "Expected %d, got %d\n", len, r); + } + + /* We know that the page can't hold the full string. See how many characters + * are on the first one + */ + fr.chrg.cpMin = 0; + fr.chrg.cpMax = -1; + r = SendMessage(hwndRichEdit, EM_FORMATRANGE, TRUE, (LPARAM) &fr); + todo_wine { + ok(fr.rc.bottom == (stringsize.cy * tpp_y), "Expected bottom to be %d, got %d\n", (stringsize.cy * tpp_y), fr.rc.bottom); + } + if (fmtstrings[i].first) + todo_wine { + ok(r == fmtstrings[i].first, "Expected %d, got %d\n", fmtstrings[i].first, r); + } + else + ok(r < len, "Expected < %d, got %d\n", len, r); + + /* Do another page */ + fr.chrg.cpMin = r; + r = SendMessage(hwndRichEdit, EM_FORMATRANGE, TRUE, (LPARAM) &fr); + if (fmtstrings[i].second) + todo_wine { + ok(r == fmtstrings[i].second, "Expected %d, got %d\n", fmtstrings[i].second, r); + } + else + ok (r < len, "Expected < %d, got %d\n", len, r); + + /* There is at least on more page, but we don't care */ + + r = SendMessage(hwndRichEdit, EM_FORMATRANGE, TRUE, 0); + todo_wine { + ok(r == len, "Expected %d, got %d\n", len, r); + } } + ReleaseDC(NULL, hdc); DestroyWindow(hwndRichEdit); } @@ -6549,6 +6686,7 @@ START_TEST( editor ) test_WM_PASTE(); test_EM_STREAMIN(); test_EM_STREAMOUT(); + test_EM_STREAMOUT_FONTTBL(); test_EM_StreamIn_Undo(); test_EM_FORMATRANGE(); test_unicode_conversions(); diff --git a/rostests/winetests/rsaenh/rsaenh.c b/rostests/winetests/rsaenh/rsaenh.c index 8e12b2a7d3e..8afa931b8e4 100644 --- a/rostests/winetests/rsaenh/rsaenh.c +++ b/rostests/winetests/rsaenh/rsaenh.c @@ -106,7 +106,7 @@ static void trace_hex(BYTE *pbData, DWORD dwLen) { trace(szTemp); } for (j=0; iConType == TWON_ONEVALUE) { - TW_ONEVALUE *onev = (TW_ONEVALUE *) p; + TW_ONEVALUE *onev = p; ok(onev->Item == orig_value || !(actual_support & TWQC_GETCURRENT), "MSG_GET of 0x%x returned 0x%x, expecting 0x%x\n", pCapability->Cap, onev->Item, orig_value); + trace("MSG_GET of 0x%x returned val 0x%x, type %d\n", pCapability->Cap, onev->Item, onev->ItemType); + if (suggested_set_value) + *suggested_set_value = onev->Item; } else if (pCapability->ConType == TWON_ENUMERATION) { @@ -116,7 +119,7 @@ static void check_get(TW_CAPABILITY *pCapability, TW_INT32 actual_support, TW_UINT8 *p8; TW_UINT16 *p16; TW_UINT32 *p32; - TW_ENUMERATION *enumv = (TW_ENUMERATION *) p; + TW_ENUMERATION *enumv = p; p8 = enumv->ItemList; p16 = (TW_UINT16 *) p8; p32 = (TW_UINT32 *) p8; @@ -326,6 +329,7 @@ static void test_resolution(TW_IDENTITY *appid, TW_IDENTITY *source, TW_UINT16 c "Error [rc %d|cc %d] doing MSG_GETDEFAULT for type 0x%x\n", rc, status.ConditionCode, captype); if (rc == TWRC_SUCCESS) { + get_onevalue(cap.hContainer, &val, &type); ok(type == TWTY_FIX32, "GETDEFAULT for RESOLUTION is not type FIX32, is type %d\n", type); memcpy(&default_value, &val, sizeof(default_value)); GlobalFree(cap.hContainer); @@ -388,6 +392,243 @@ static void test_resolution(TW_IDENTITY *appid, TW_IDENTITY *source, TW_UINT16 c } } +static void test_physical(TW_IDENTITY *appid, TW_IDENTITY *source, TW_UINT16 captype, TW_INT32 minimum_support) +{ + TW_UINT16 rc; + TW_STATUS status; + TW_CAPABILITY cap; + TW_UINT32 val; + TW_UINT16 type; + TW_INT32 actual_support; + + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_QUERYSUPPORT, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_QUERYSUPPORT for type 0x%x\n", rc, status.ConditionCode, captype); + if (rc != TWRC_SUCCESS) + return; + ok(get_onevalue(cap.hContainer, (TW_UINT32 *) &actual_support, NULL), "Returned cap.hContainer invalid for QuerySupport on type 0x%x\n", captype); + ok((actual_support & minimum_support) == minimum_support, + "Error: minimum support 0x%x for type 0x%x, got 0x%x\n", minimum_support, + captype, actual_support); + + + if (actual_support & TWQC_GETCURRENT) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GETCURRENT for type 0x%x\n", rc, status.ConditionCode, captype); + if (rc == TWRC_SUCCESS) + { + get_onevalue(cap.hContainer, &val, &type); + ok(type == TWTY_FIX32, "GETCURRENT for PHYSICALXXX is not type FIX32, is type %d\n", type); + GlobalFree(cap.hContainer); + } + } + + if (actual_support & TWQC_GETDEFAULT) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_GETDEFAULT, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GETDEFAULT for type 0x%x\n", rc, status.ConditionCode, captype); + if (rc == TWRC_SUCCESS) + { + get_onevalue(cap.hContainer, &val, &type); + ok(type == TWTY_FIX32, "GETDEFAULT for PHYSICALXXX is not type FIX32, is type %d\n", type); + GlobalFree(cap.hContainer); + } + } + + if (actual_support & TWQC_GET) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = captype; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_GET, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GET for type 0x%x\n", rc, status.ConditionCode, captype); + if (rc == TWRC_SUCCESS) + { + get_onevalue(cap.hContainer, &val, &type); + ok(type == TWTY_FIX32, "GET for PHYSICALXXX is not type FIX32, is type %d\n", type); + trace("GET for Physical type 0x%x returns 0x%x\n", captype, val); + GlobalFree(cap.hContainer); + } + } + +} + +static void test_supported_sizes(TW_IDENTITY *appid, TW_IDENTITY *source, TW_INT32 minimum_support) +{ + TW_UINT16 rc; + TW_STATUS status; + TW_CAPABILITY cap; + TW_UINT32 val; + TW_UINT16 type; + TW_INT32 actual_support; + TW_UINT32 orig_value = TWSS_NONE; + TW_UINT32 default_value = TWSS_NONE; + TW_UINT32 new_value = TWSS_NONE; + + + memset(&cap, 0, sizeof(cap)); + cap.Cap = ICAP_SUPPORTEDSIZES; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_QUERYSUPPORT, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_QUERYSUPPORT for ICAP_SUPPORTEDSIZES\n", rc, status.ConditionCode); + if (rc != TWRC_SUCCESS) + return; + ok(get_onevalue(cap.hContainer, (TW_UINT32 *) &actual_support, NULL), "Returned cap.hContainer invalid for QuerySupport on ICAP_SUPPORTEDSIZES\n"); + ok((actual_support & minimum_support) == minimum_support, + "Error: minimum support 0x%x for ICAP_SUPPORTEDSIZES, got 0x%x\n", minimum_support, actual_support); + + if (actual_support & TWQC_GETCURRENT) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = ICAP_SUPPORTEDSIZES; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GETCURRENT for ICAP_SUPPORTEDSIZES\n", rc, status.ConditionCode); + if (rc == TWRC_SUCCESS) + { + get_onevalue(cap.hContainer, &val, &type); + ok(type == TWTY_UINT16, "GETCURRENT for ICAP_SUPPORTEDSIZES is not type UINT16, is type %d\n", type); + trace("Current size is %d\n", val); + GlobalFree(cap.hContainer); + orig_value = val; + } + } + + if (actual_support & TWQC_GETDEFAULT) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = ICAP_SUPPORTEDSIZES; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_GETDEFAULT, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GETDEFAULT for ICAP_SUPPORTEDSIZES\n", rc, status.ConditionCode); + if (rc == TWRC_SUCCESS) + { + get_onevalue(cap.hContainer, &val, &type); + ok(type == TWTY_UINT16, "GETDEFAULT for PHYSICALXXX is not type TWTY_UINT16, is type %d\n", type); + trace("Default size is %d\n", val); + GlobalFree(cap.hContainer); + default_value = val; + } + } + + if (actual_support & TWQC_GET) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = ICAP_SUPPORTEDSIZES; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_GET, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GET for ICAP_SUPPORTEDSIZES\n", rc, status.ConditionCode); + check_get(&cap, actual_support, orig_value, default_value, &new_value); + } + + if (actual_support & TWQC_SET) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = ICAP_SUPPORTEDSIZES; + cap.ConType = TWON_ONEVALUE; + cap.hContainer = alloc_and_set_onevalue(new_value, TWTY_UINT16); + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_SET for ICAP_SUPPORTEDSIZES\n", rc, status.ConditionCode); + GlobalFree(cap.hContainer); + + } + + if (actual_support & TWQC_RESET) + { + memset(&cap, 0, sizeof(cap)); + cap.Cap = ICAP_SUPPORTEDSIZES; + cap.ConType = TWON_DONTCARE16; + + rc = pDSM_Entry(appid, source, DG_CONTROL, DAT_CAPABILITY, MSG_RESET, &cap); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_RESET for ICAP_SUPPORTEDSIZES\n", rc, status.ConditionCode); + if (rc == TWRC_SUCCESS) + GlobalFree(cap.hContainer); + } +} + +static void test_imagelayout(TW_IDENTITY *appid, TW_IDENTITY *source) +{ + TW_UINT16 rc; + TW_STATUS status; + TW_IMAGELAYOUT layout; + + rc = pDSM_Entry(appid, source, DG_IMAGE, DAT_IMAGELAYOUT, MSG_GET, &layout); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GET for DG_IMAGE/DAT_IMAGELAYOUT\n", rc, status.ConditionCode); + if (rc != TWRC_SUCCESS) + return; + trace("ImageLayout [Left %x.%x|Top %x.%x|Right %x.%x|Bottom %x.%x|Document %d|Page %d|Frame %d]\n", + layout.Frame.Left.Whole, layout.Frame.Left.Frac, + layout.Frame.Top.Whole, layout.Frame.Top.Frac, + layout.Frame.Right.Whole, layout.Frame.Right.Frac, + layout.Frame.Bottom.Whole, layout.Frame.Bottom.Frac, + layout.DocumentNumber, layout.PageNumber, layout.FrameNumber); + + memset(&layout, 0, sizeof(layout)); + layout.Frame.Left.Whole = 1; + layout.Frame.Right.Whole = 2; + layout.Frame.Top.Whole = 1; + layout.Frame.Bottom.Whole = 2; + rc = pDSM_Entry(appid, source, DG_IMAGE, DAT_IMAGELAYOUT, MSG_SET, &layout); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_SET for DG_IMAGE/DAT_IMAGELAYOUT\n", rc, status.ConditionCode); + if (rc != TWRC_SUCCESS) + return; + + rc = pDSM_Entry(appid, source, DG_IMAGE, DAT_IMAGELAYOUT, MSG_GET, &layout); + get_condition_code(appid, source, &status); + ok(rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS, + "Error [rc %d|cc %d] doing MSG_GET for DG_IMAGE/DAT_IMAGELAYOUT\n", rc, status.ConditionCode); + if (rc != TWRC_SUCCESS) + return; + trace("ImageLayout after set [Left %x.%x|Top %x.%x|Right %x.%x|Bottom %x.%x|Document %d|Page %d|Frame %d]\n", + layout.Frame.Left.Whole, layout.Frame.Left.Frac, + layout.Frame.Top.Whole, layout.Frame.Top.Frac, + layout.Frame.Right.Whole, layout.Frame.Right.Frac, + layout.Frame.Bottom.Whole, layout.Frame.Bottom.Frac, + layout.DocumentNumber, layout.PageNumber, layout.FrameNumber); +} + static void test_single_source(TW_IDENTITY *appid, TW_IDENTITY *source) { @@ -428,7 +669,7 @@ static void test_single_source(TW_IDENTITY *appid, TW_IDENTITY *source) } } - /* For Twain 1.6, all sources must support: */ + /* All sources must support: */ ok(capabilities[CAP_SUPPORTEDCAPS], "CAP_SUPPORTEDCAPS not supported\n"); ok(capabilities[CAP_XFERCOUNT], "CAP_XFERCOUNT not supported\n"); if (capabilities[CAP_XFERCOUNT]) @@ -440,7 +681,7 @@ static void test_single_source(TW_IDENTITY *appid, TW_IDENTITY *source) if (source->SupportedGroups & DG_IMAGE) { - /* For Twain 1.6: + /* Sources that supply image information must support DG_CONTROL / DAT_CAPABILITY / MSG_GET, MSG_GETCURRENT, MSG_GETDEFAULT on: */ @@ -450,29 +691,37 @@ static void test_single_source(TW_IDENTITY *appid, TW_IDENTITY *source) TWQC_GET | TWQC_GETDEFAULT | TWQC_GETCURRENT); todo_wine ok(capabilities[ICAP_PLANARCHUNKY], "ICAP_PLANARCHUNKY not supported\n"); - todo_wine ok(capabilities[ICAP_PHYSICALHEIGHT], "ICAP_PHYSICALHEIGHT not supported\n"); - todo_wine + if (capabilities[ICAP_PHYSICALHEIGHT]) + test_physical(appid, source, ICAP_PHYSICALHEIGHT, + TWQC_GET | TWQC_GETDEFAULT | TWQC_GETCURRENT); ok(capabilities[ICAP_PHYSICALWIDTH], "ICAP_PHYSICALWIDTH not supported\n"); + if (capabilities[ICAP_PHYSICALWIDTH]) + test_physical(appid, source, ICAP_PHYSICALWIDTH, + TWQC_GET | TWQC_GETDEFAULT | TWQC_GETCURRENT); ok(capabilities[ICAP_PIXELFLAVOR], "ICAP_PIXELFLAVOR not supported\n"); if (capabilities[ICAP_PIXELFLAVOR]) test_onevalue_cap(appid, source, ICAP_PIXELFLAVOR, TWTY_UINT16, - TWQC_GET | TWQC_SET | TWQC_GETDEFAULT | TWQC_GETCURRENT | TWQC_RESET); + TWQC_GET | TWQC_GETDEFAULT | TWQC_GETCURRENT); - /* For Twain 1.6: + /* Sources that supply image information must support DG_CONTROL / DAT_CAPABILITY / MSG_GET, MSG_GETCURRENT, MSG_GETDEFAULT, MSG_RESET and MSG_SET on: */ - todo_wine ok(capabilities[ICAP_BITDEPTH], "ICAP_BITDEPTH not supported\n"); + if (capabilities[ICAP_BITDEPTH]) + test_onevalue_cap(appid, source, ICAP_BITDEPTH, TWTY_UINT16, + TWQC_GET | TWQC_GETDEFAULT | TWQC_GETCURRENT ); todo_wine ok(capabilities[ICAP_BITORDER], "ICAP_BITORDER not supported\n"); ok(capabilities[ICAP_PIXELTYPE], "ICAP_PIXELTYPE not supported\n"); if (capabilities[ICAP_PIXELTYPE]) test_onevalue_cap(appid, source, ICAP_PIXELTYPE, TWTY_UINT16, TWQC_GET | TWQC_SET | TWQC_GETDEFAULT | TWQC_GETCURRENT | TWQC_RESET); - todo_wine ok(capabilities[ICAP_UNITS], "ICAP_UNITS not supported\n"); + if (capabilities[ICAP_UNITS]) + test_onevalue_cap(appid, source, ICAP_UNITS, TWTY_UINT16, + TWQC_GET | TWQC_SET | TWQC_GETDEFAULT | TWQC_GETCURRENT | TWQC_RESET); ok(capabilities[ICAP_XFERMECH], "ICAP_XFERMECH not supported\n"); if (capabilities[ICAP_XFERMECH]) test_onevalue_cap(appid, source, ICAP_XFERMECH, TWTY_UINT16, @@ -485,6 +734,21 @@ static void test_single_source(TW_IDENTITY *appid, TW_IDENTITY *source) if (capabilities[ICAP_YRESOLUTION]) test_resolution(appid, source, ICAP_YRESOLUTION, TWQC_GET | TWQC_SET | TWQC_GETDEFAULT | TWQC_GETCURRENT | TWQC_RESET); + + /* Optional capabilities */ + if (capabilities[CAP_AUTOFEED]) + test_onevalue_cap(appid, source, CAP_AUTOFEED, TWTY_BOOL, + TWQC_GET | TWQC_SET | TWQC_GETDEFAULT | TWQC_GETCURRENT | TWQC_RESET); + if (capabilities[CAP_FEEDERENABLED]) + test_onevalue_cap(appid, source, CAP_FEEDERENABLED, TWTY_BOOL, + TWQC_GET | TWQC_SET | TWQC_GETDEFAULT | TWQC_GETCURRENT | TWQC_RESET); + if (capabilities[ICAP_SUPPORTEDSIZES]) + test_supported_sizes(appid, source, + TWQC_GET | TWQC_SET | TWQC_GETDEFAULT | TWQC_GETCURRENT | TWQC_RESET); + + /* Additional tests */ + test_imagelayout(appid, source); + } } @@ -572,14 +836,14 @@ START_TEST(dsm) htwain = LoadLibraryA("twain_32.dll"); if (! htwain) { - skip("twain_32.dll not available, skipping tests\n"); + win_skip("twain_32.dll not available, skipping tests\n"); return; } pDSM_Entry = (void*)GetProcAddress(htwain, "DSM_Entry"); ok(pDSM_Entry != NULL, "Unable to GetProcAddress DSM_Entry\n"); if (! pDSM_Entry) { - skip("DSM_Entry not available, skipping tests\n"); + win_skip("DSM_Entry not available, skipping tests\n"); return; } diff --git a/rostests/winetests/urlmon/misc.c b/rostests/winetests/urlmon/misc.c index 2123392ebce..64ed9377675 100644 --- a/rostests/winetests/urlmon/misc.c +++ b/rostests/winetests/urlmon/misc.c @@ -851,7 +851,10 @@ static void test_url_action(IInternetSecurityManager *secmgr, IInternetZoneManag HKEY hkey; HRESULT hres; - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, + /* FIXME: HKEY_CURRENT_USER is most of the time the default but this can be changed on a system. + * The test should be changed to cope with that, if need be. + */ + res = RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\3", &hkey); if(res != ERROR_SUCCESS) { ok(0, "Could not open zone key\n"); @@ -943,22 +946,27 @@ static void test_ZoneManager(void) IInternetZoneManager *zonemgr = NULL; BYTE buf[32]; HRESULT hres; + DWORD action = URLACTION_CREDENTIALS_USE; /* Implemented on all IE versions */ hres = CoInternetCreateZoneManager(NULL, &zonemgr, 0); ok(hres == S_OK, "CoInternetCreateZoneManager failed: %08x\n", hres); if(FAILED(hres)) return; - hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, 0x1a10, buf, + hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, action, buf, sizeof(DWORD), URLZONEREG_DEFAULT); ok(hres == S_OK, "GetZoneActionPolicy failed: %08x\n", hres); - ok(*(DWORD*)buf == 1, "policy=%d, expected 1\n", *(DWORD*)buf); + ok(*(DWORD*)buf == URLPOLICY_CREDENTIALS_SILENT_LOGON_OK || + *(DWORD*)buf == URLPOLICY_CREDENTIALS_MUST_PROMPT_USER || + *(DWORD*)buf == URLPOLICY_CREDENTIALS_CONDITIONAL_PROMPT || + *(DWORD*)buf == URLPOLICY_CREDENTIALS_ANONYMOUS_ONLY, + "unexpected policy=%d\n", *(DWORD*)buf); - hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, 0x1a10, NULL, + hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, action, NULL, sizeof(DWORD), URLZONEREG_DEFAULT); ok(hres == E_INVALIDARG, "GetZoneActionPolicy failed: %08x, expected E_INVALIDARG\n", hres); - hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, 0x1a10, buf, + hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 3, action, buf, 2, URLZONEREG_DEFAULT); ok(hres == E_INVALIDARG, "GetZoneActionPolicy failed: %08x, expected E_INVALIDARG\n", hres); @@ -966,7 +974,7 @@ static void test_ZoneManager(void) sizeof(DWORD), URLZONEREG_DEFAULT); ok(hres == E_FAIL, "GetZoneActionPolicy failed: %08x, expected E_FAIL\n", hres); - hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 13, 0x1a10, buf, + hres = IInternetZoneManager_GetZoneActionPolicy(zonemgr, 13, action, buf, sizeof(DWORD), URLZONEREG_DEFAULT); ok(hres == E_INVALIDARG, "GetZoneActionPolicy failed: %08x, expected E_INVALIDARG\n", hres); diff --git a/rostests/winetests/urlmon/protocol.c b/rostests/winetests/urlmon/protocol.c index eb422828cdc..a9732117319 100644 --- a/rostests/winetests/urlmon/protocol.c +++ b/rostests/winetests/urlmon/protocol.c @@ -84,6 +84,7 @@ DEFINE_EXPECT(GetBindString_USER_AGENT); DEFINE_EXPECT(GetBindString_POST_COOKIE); DEFINE_EXPECT(QueryService_HttpNegotiate); DEFINE_EXPECT(QueryService_InternetProtocol); +DEFINE_EXPECT(QueryService_HttpSecurity); DEFINE_EXPECT(BeginningTransaction); DEFINE_EXPECT(GetRootSecurityId); DEFINE_EXPECT(OnResponse); @@ -110,7 +111,7 @@ static const WCHAR emptyW[] = {0}; static HRESULT expect_hrResult; static LPCWSTR file_name, http_url, expect_wsz; -static IInternetProtocol *http_protocol = NULL; +static IInternetProtocol *async_protocol = NULL; static BOOL first_data_notif = FALSE, http_is_first = FALSE, http_post_test = FALSE; static int state = 0, prot_state; @@ -123,11 +124,13 @@ static HANDLE event_complete, event_complete2; static BOOL binding_test; static PROTOCOLDATA protocoldata, *pdata; static DWORD prot_read; +static BOOL security_problem = FALSE; static enum { FILE_TEST, HTTP_TEST, HTTPS_TEST, + FTP_TEST, MK_TEST, BIND_TEST } tested_protocol; @@ -135,13 +138,20 @@ static enum { static const WCHAR protocol_names[][10] = { {'f','i','l','e',0}, {'h','t','t','p',0}, + {'h','t','t','p','s',0}, + {'f','t','p',0}, {'m','k',0}, {'t','e','s','t',0} }; -static const WCHAR binding_urls[][30] = { +static const WCHAR binding_urls[][130] = { {'f','i','l','e',':','t','e','s','t','.','h','t','m','l',0}, {'h','t','t','p',':','/','/','t','e','s','t','/','t','e','s','t','.','h','t','m','l',0}, + {'h','t','t','p','s',':','/','/','w','w','w','.','c','o','d','e','w','e','a','v','e','r','s', + '.','c','o','m','/','t','e','s','t','.','h','t','m','l',0}, + {'f','t','p',':','/','/','f','t','p','.','w','i','n','e','h','q','.','o','r','g', + '/','p','u','b','/','o','t','h','e','r', + '/','w','i','n','e','l','o','g','o','.','x','c','f','.','t','a','r','.','b','z','2',0}, {'m','k',':','t','e','s','t',0}, {'t','e','s','t',':','/','/','f','i','l','e','.','h','t','m','l',0} }; @@ -174,6 +184,60 @@ static int strcmp_wa(LPCWSTR strw, const char *stra) return lstrcmpW(strw, buf); } +static HRESULT WINAPI HttpSecurity_QueryInterface(IHttpSecurity *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(&IID_IUnknown, riid) + || IsEqualGUID(&IID_IHttpSecurity, riid)) { + *ppv = iface; + return S_OK; + } + + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI HttpSecurity_AddRef(IHttpSecurity *iface) +{ + return 2; +} + +static ULONG WINAPI HttpSecurity_Release(IHttpSecurity *iface) +{ + return 1; +} + +static HRESULT WINAPI HttpSecurity_GetWindow(IHttpSecurity* iface, REFGUID rguidReason, HWND *phwnd) +{ + trace("HttpSecurity_GetWindow\n"); + + return S_FALSE; +} + +static HRESULT WINAPI HttpSecurity_OnSecurityProblem(IHttpSecurity *iface, DWORD dwProblem) +{ + trace("Security problem: %u\n", dwProblem); + ok(dwProblem == ERROR_INTERNET_SEC_CERT_REV_FAILED, "Expected ERROR_INTERNET_SEC_CERT_REV_FAILED got %u\n", dwProblem); + + /* Only retry once */ + if (security_problem) + return E_ABORT; + + security_problem = TRUE; + SET_EXPECT(BeginningTransaction); + + return RPC_E_RETRY; +} + +static IHttpSecurityVtbl HttpSecurityVtbl = { + HttpSecurity_QueryInterface, + HttpSecurity_AddRef, + HttpSecurity_Release, + HttpSecurity_GetWindow, + HttpSecurity_OnSecurityProblem +}; + +static IHttpSecurity http_security = { &HttpSecurityVtbl }; + static HRESULT WINAPI HttpNegotiate_QueryInterface(IHttpNegotiate2 *iface, REFIID riid, void **ppv) { if(IsEqualGUID(&IID_IUnknown, riid) @@ -312,6 +376,12 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFG return E_NOINTERFACE; } + if(IsEqualGUID(&IID_IHttpSecurity, guidService)) { + ok(IsEqualGUID(&IID_IHttpSecurity, riid), "unexpected riid\n"); + CHECK_EXPECT(QueryService_HttpSecurity); + return IHttpSecurity_QueryInterface(&http_security, riid, ppv); + } + ok(0, "unexpected service %s\n", debugstr_guid(guidService)); return E_FAIL; } @@ -344,7 +414,10 @@ static HRESULT WINAPI ProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOL { HRESULT hres; - CHECK_EXPECT(Switch); + if(tested_protocol == FTP_TEST) + CHECK_EXPECT2(Switch); + else + CHECK_EXPECT(Switch); ok(pProtocolData != NULL, "pProtocolData == NULL\n"); pdata = pProtocolData; @@ -356,37 +429,57 @@ static HRESULT WINAPI ProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOL } if (!state) { - if (http_is_first) { - CLEAR_CALLED(ReportProgress_FINDINGRESOURCE); - CLEAR_CALLED(ReportProgress_CONNECTING); - CLEAR_CALLED(ReportProgress_PROXYDETECTING); - } else todo_wine { - CHECK_NOT_CALLED(ReportProgress_FINDINGRESOURCE); - /* IE7 does call this */ - CLEAR_CALLED(ReportProgress_CONNECTING); + if(tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST || tested_protocol == FTP_TEST) { + if (http_is_first) { + CLEAR_CALLED(ReportProgress_FINDINGRESOURCE); + CLEAR_CALLED(ReportProgress_CONNECTING); + CLEAR_CALLED(ReportProgress_PROXYDETECTING); + } else todo_wine { + CHECK_NOT_CALLED(ReportProgress_FINDINGRESOURCE); + /* IE7 does call this */ + CLEAR_CALLED(ReportProgress_CONNECTING); + } + } + if(tested_protocol == FTP_TEST) + todo_wine CHECK_CALLED(ReportProgress_SENDINGREQUEST); + else if (tested_protocol != HTTPS_TEST) + CHECK_CALLED(ReportProgress_SENDINGREQUEST); + if(tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST) { + SET_EXPECT(OnResponse); + if(tested_protocol == HTTPS_TEST) + SET_EXPECT(ReportProgress_ACCEPTRANGES); + SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); + if(bindf & BINDF_NEEDFILE) + SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); } - CHECK_CALLED(ReportProgress_SENDINGREQUEST); - SET_EXPECT(OnResponse); - if(tested_protocol == HTTPS_TEST) - SET_EXPECT(ReportProgress_ACCEPTRANGES); - SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); - if(bindf & BINDF_NEEDFILE) - SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); } SET_EXPECT(ReportData); - hres = IInternetProtocol_Continue(http_protocol, pProtocolData); + hres = IInternetProtocol_Continue(async_protocol, pProtocolData); ok(hres == S_OK, "Continue failed: %08x\n", hres); - CHECK_CALLED(ReportData); + if(tested_protocol == FTP_TEST) + CLEAR_CALLED(ReportData); + else if (! security_problem) + CHECK_CALLED(ReportData); if (!state) { - state = 1; - CHECK_CALLED(OnResponse); - if(tested_protocol == HTTPS_TEST) - CHECK_CALLED(ReportProgress_ACCEPTRANGES); - CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); - if(bindf & BINDF_NEEDFILE) - CHECK_CALLED(ReportProgress_CACHEFILENAMEAVAILABLE); + if (! security_problem) + { + state = 1; + if(tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST) { + CHECK_CALLED(OnResponse); + if(tested_protocol == HTTPS_TEST) + CHECK_CALLED(ReportProgress_ACCEPTRANGES); + CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); + if(bindf & BINDF_NEEDFILE) + CHECK_CALLED(ReportProgress_CACHEFILENAMEAVAILABLE); + } + } + else + { + security_problem = FALSE; + SET_EXPECT(ReportProgress_CONNECTING); + } } SetEvent(event_complete); @@ -443,15 +536,15 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, } break; case BINDSTATUS_FINDINGRESOURCE: - CHECK_EXPECT(ReportProgress_FINDINGRESOURCE); + CHECK_EXPECT2(ReportProgress_FINDINGRESOURCE); ok(szStatusText != NULL, "szStatusText == NULL\n"); break; case BINDSTATUS_CONNECTING: - CHECK_EXPECT(ReportProgress_CONNECTING); + CHECK_EXPECT2(ReportProgress_CONNECTING); ok(szStatusText != NULL, "szStatusText == NULL\n"); break; case BINDSTATUS_SENDINGREQUEST: - CHECK_EXPECT(ReportProgress_SENDINGREQUEST); + CHECK_EXPECT2(ReportProgress_SENDINGREQUEST); if(tested_protocol == FILE_TEST) { ok(szStatusText != NULL, "szStatusText == NULL\n"); if(szStatusText) @@ -506,9 +599,11 @@ static HRESULT WINAPI ProtocolSink_ReportData(IInternetProtocolSink *iface, DWOR ok(ulProgress == ulProgressMax, "ulProgress (%d) != ulProgressMax (%d)\n", ulProgress, ulProgressMax); ok(ulProgressMax == 13, "ulProgressMax=%d, expected 13\n", ulProgressMax); - ok(grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION), + /* BSCF_SKIPDRAINDATAFORFILEURLS added in IE8 */ + ok((grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION)) || + (grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION | BSCF_SKIPDRAINDATAFORFILEURLS)), "grcfBSCF = %08x\n", grfBSCF); - }else if(!binding_test && (tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST)) { + }else if(!binding_test && (tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST || tested_protocol == FTP_TEST)) { if(!(grfBSCF & BSCF_LASTDATANOTIFICATION) || (grfBSCF & BSCF_DATAFULLYAVAILABLE)) CHECK_EXPECT(ReportData); else if (http_post_test) @@ -570,12 +665,17 @@ static HRESULT WINAPI ProtocolSink_ReportResult(IInternetProtocolSink *iface, HR { CHECK_EXPECT(ReportResult); - ok(hrResult == expect_hrResult, "hrResult = %08x, expected: %08x\n", - hrResult, expect_hrResult); - if(SUCCEEDED(hrResult)) + if(tested_protocol == FTP_TEST) + ok(hrResult == E_PENDING || hrResult == S_OK, "hrResult = %08x, expected E_PENDING or S_OK\n", hrResult); + else + ok(hrResult == expect_hrResult, "hrResult = %08x, expected: %08x\n", + hrResult, expect_hrResult); + if(SUCCEEDED(hrResult) || tested_protocol == FTP_TEST) ok(dwError == ERROR_SUCCESS, "dwError = %d, expected ERROR_SUCCESS\n", dwError); else - ok(dwError != ERROR_SUCCESS, "dwError == ERROR_SUCCESS\n"); + ok(dwError != ERROR_SUCCESS || + broken(tested_protocol == MK_TEST), /* Win9x, WinME and NT4 */ + "dwError == ERROR_SUCCESS\n"); ok(!szResult, "szResult != NULL\n"); return S_OK; @@ -851,7 +951,7 @@ static DWORD WINAPI thread_proc(PVOID arg) static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, - DWORD grfPI, DWORD dwReserved) + DWORD grfPI, HANDLE_PTR dwReserved) { BINDINFO bindinfo, exp_bindinfo; DWORD cbindf = 0; @@ -864,7 +964,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, ok(pOIProtSink != &protocol_sink, "unexpected pOIProtSink\n"); ok(pOIBindInfo != &bind_info, "unexpected pOIBindInfo\n"); ok(!grfPI, "grfPI = %x\n", grfPI); - ok(!dwReserved, "dwReserved = %d\n", dwReserved); + ok(!dwReserved, "dwReserved = %lx\n", dwReserved); memset(&bindinfo, 0, sizeof(bindinfo)); bindinfo.cbSize = sizeof(bindinfo); @@ -1529,7 +1629,7 @@ static BOOL http_protocol_start(LPCWSTR url, BOOL is_first) if (http_post_test) SET_EXPECT(GetBindString_POST_COOKIE); - hres = IInternetProtocol_Start(http_protocol, url, &protocol_sink, &bind_info, 0, 0); + hres = IInternetProtocol_Start(async_protocol, url, &protocol_sink, &bind_info, 0, 0); ok(hres == S_OK, "Start failed: %08x\n", hres); if(FAILED(hres)) return FALSE; @@ -1558,6 +1658,48 @@ static BOOL http_protocol_start(LPCWSTR url, BOOL is_first) return TRUE; } +static void test_protocol_terminate(IInternetProtocol *protocol) +{ + BYTE buf[3600]; + DWORD cb; + HRESULT hres; + + hres = IInternetProtocol_LockRequest(protocol, 0); + ok(hres == S_OK, "LockRequest failed: %08x\n", hres); + + hres = IInternetProtocol_Read(protocol, buf, 1, &cb); + ok(hres == S_FALSE, "Read failed: %08x\n", hres); + + hres = IInternetProtocol_Terminate(protocol, 0); + ok(hres == S_OK, "Terminate failed: %08x\n", hres); + + /* This wait is to give the internet handles being freed in Terminate + * enough time to actually terminate in all cases. Internet handles + * terminate asynchronously and native reuses the main InternetOpen + * handle. The only case in which this seems to be necessary is on + * wine with native wininet and urlmon, resulting in the next time + * test_http_protocol_url being called the first data notification actually + * being an extra last data notification from the previous connection + * about once out of every ten times. */ + Sleep(100); + + hres = IInternetProtocol_UnlockRequest(protocol); + ok(hres == S_OK, "UnlockRequest failed: %08x\n", hres); +} + +static void test_http_info(IInternetProtocol *protocol) +{ + IWinInetHttpInfo *info; + HRESULT hres; + + hres = IInternetProtocol_QueryInterface(protocol, &IID_IWinInetHttpInfo, (void**)&info); + ok(hres == S_OK, "Could not get IWinInterHttpInfo iface: %08x\n", hres); + + /* TODO */ + + IWinInetHttpInfo_Release(info); +} + /* is_first refers to whether this is the first call to this function * _for this url_ */ static void test_http_protocol_url(LPCWSTR url, BOOL is_https, BOOL is_first) @@ -1588,13 +1730,15 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_https, BOOL is_first) return; hres = IClassFactory_CreateInstance(factory, NULL, &IID_IInternetProtocol, - (void**)&http_protocol); + (void**)&async_protocol); ok(hres == S_OK, "Could not get IInternetProtocol: %08x\n", hres); if(SUCCEEDED(hres)) { BYTE buf[3600]; DWORD cb; + ULONG ref; - test_priority(http_protocol); + test_priority(async_protocol); + test_http_info(async_protocol); SET_EXPECT(ReportProgress_FINDINGRESOURCE); SET_EXPECT(ReportProgress_CONNECTING); @@ -1602,6 +1746,8 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_https, BOOL is_first) SET_EXPECT(ReportProgress_PROXYDETECTING); if(! is_https) SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); + else + SET_EXPECT(QueryService_HttpSecurity); if(!(bindf & BINDF_FROMURLMON)) { SET_EXPECT(OnResponse); SET_EXPECT(ReportProgress_RAWMIMETYPE); @@ -1616,7 +1762,7 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_https, BOOL is_first) SET_EXPECT(ReportResult); expect_hrResult = S_OK; - hres = IInternetProtocol_Read(http_protocol, buf, 1, &cb); + hres = IInternetProtocol_Read(async_protocol, buf, 1, &cb); ok((hres == E_PENDING && cb==0) || (hres == S_OK && cb==1), "Read failed: %08x (%d bytes)\n", hres, cb); @@ -1625,15 +1771,17 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_https, BOOL is_first) CHECK_CALLED(Switch); else CHECK_CALLED(ReportData); + if (is_https) + CLEAR_CALLED(QueryService_HttpSecurity); while(1) { if(bindf & BINDF_FROMURLMON) SET_EXPECT(Switch); else SET_EXPECT(ReportData); - hres = IInternetProtocol_Read(http_protocol, buf, sizeof(buf), &cb); + hres = IInternetProtocol_Read(async_protocol, buf, sizeof(buf), &cb); if(hres == E_PENDING) { - hres = IInternetProtocol_Read(http_protocol, buf, 1, &cb); + hres = IInternetProtocol_Read(async_protocol, buf, 1, &cb); ok((hres == E_PENDING && cb==0) || (hres == S_OK && cb==1), "Read failed: %08x (%d bytes)\n", hres, cb); WaitForSingleObject(event_complete, INFINITE); @@ -1641,7 +1789,7 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_https, BOOL is_first) CHECK_CALLED(Switch); else CHECK_CALLED(ReportData); - } else { + }else { if(bindf & BINDF_FROMURLMON) CHECK_NOT_CALLED(Switch); else @@ -1651,30 +1799,12 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_https, BOOL is_first) } ok(hres == S_FALSE, "Read failed: %08x\n", hres); CHECK_CALLED(ReportResult); + if (is_https) + CLEAR_CALLED(ReportProgress_SENDINGREQUEST); - hres = IInternetProtocol_LockRequest(http_protocol, 0); - ok(hres == S_OK, "LockRequest failed: %08x\n", hres); - - hres = IInternetProtocol_Read(http_protocol, buf, 1, &cb); - ok(hres == S_FALSE, "Read failed: %08x\n", hres); - - hres = IInternetProtocol_Terminate(http_protocol, 0); - ok(hres == S_OK, "Terminate failed: %08x\n", hres); - - /* This wait is to give the internet handles being freed in Terminate - * enough time to actually terminate in all cases. Internet handles - * terminate asynchronously and native reuses the main InternetOpen - * handle. The only case in which this seems to be necessary is on - * wine with native wininet and urlmon, resulting in the next time - * test_http_protocol_url being called the first data notification actually - * being an extra last data notification from the previous connection - * about once out of every ten times. */ - Sleep(100); - - hres = IInternetProtocol_UnlockRequest(http_protocol); - ok(hres == S_OK, "UnlockRequest failed: %08x\n", hres); - - IInternetProtocol_Release(http_protocol); + test_protocol_terminate(async_protocol); + ref = IInternetProtocol_Release(async_protocol); + ok(!ref, "ref=%x\n", hres); } IClassFactory_Release(factory); @@ -1724,6 +1854,125 @@ static void test_https_protocol(void) test_http_protocol_url(codeweavers_url, TRUE, TRUE); } + +static void test_ftp_protocol(void) +{ + IInternetProtocolInfo *protocol_info; + IClassFactory *factory; + IUnknown *unk; + BYTE buf[4096]; + ULONG ref; + DWORD cb; + HRESULT hres; + + static const WCHAR ftp_urlW[] = {'f','t','p',':','/','/','f','t','p','.','w','i','n','e','h','q','.','o','r','g', + '/','p','u','b','/','o','t','h','e','r','/', + 'w','i','n','e','l','o','g','o','.','x','c','f','.','t','a','r','.','b','z','2',0}; + + trace("Testing ftp protocol...\n"); + + bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON | BINDF_NOWRITECACHE; + state = 0; + tested_protocol = FTP_TEST; + first_data_notif = TRUE; + expect_hrResult = E_PENDING; + + hres = CoGetClassObject(&CLSID_FtpProtocol, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)&unk); + ok(hres == S_OK, "CoGetClassObject failed: %08x\n", hres); + if(FAILED(hres)) + return; + + hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocolInfo, (void**)&protocol_info); + ok(hres == E_NOINTERFACE, "Could not get IInternetProtocolInfo interface: %08x, expected E_NOINTERFACE\n", hres); + + hres = IUnknown_QueryInterface(unk, &IID_IClassFactory, (void**)&factory); + ok(hres == S_OK, "Could not get IClassFactory interface\n"); + IUnknown_Release(unk); + if(FAILED(hres)) + return; + + hres = IClassFactory_CreateInstance(factory, NULL, &IID_IInternetProtocol, + (void**)&async_protocol); + IClassFactory_Release(factory); + ok(hres == S_OK, "Could not get IInternetProtocol: %08x\n", hres); + + test_priority(async_protocol); + test_http_info(async_protocol); + + SET_EXPECT(GetBindInfo); + SET_EXPECT(GetBindString_USER_AGENT); + SET_EXPECT(ReportProgress_FINDINGRESOURCE); + SET_EXPECT(ReportProgress_CONNECTING); + SET_EXPECT(ReportProgress_SENDINGREQUEST); + SET_EXPECT(Switch); + + hres = IInternetProtocol_Start(async_protocol, ftp_urlW, &protocol_sink, &bind_info, 0, 0); + ok(hres == S_OK, "Start failed: %08x\n", hres); + CHECK_CALLED(GetBindInfo); + todo_wine CHECK_NOT_CALLED(GetBindString_USER_AGENT); + + SET_EXPECT(ReportResult); + + hres = IInternetProtocol_Read(async_protocol, buf, 1, &cb); + ok((hres == E_PENDING && cb==0) || + (hres == S_OK && cb==1), "Read failed: %08x (%d bytes)\n", hres, cb); + + WaitForSingleObject(event_complete, INFINITE); + + while(1) { + + hres = IInternetProtocol_Read(async_protocol, buf, sizeof(buf), &cb); + if(hres == E_PENDING) + WaitForSingleObject(event_complete, INFINITE); + else + if(cb == 0) break; + } + + ok(hres == S_FALSE, "Read failed: %08x\n", hres); + CHECK_CALLED(ReportResult); + CHECK_CALLED(Switch); + + test_protocol_terminate(async_protocol); + + ref = IInternetProtocol_Release(async_protocol); + ok(!ref, "ref=%d\n", ref); +} + +static void test_gopher_protocol(void) +{ + IInternetProtocolInfo *protocol_info; + IClassFactory *factory; + IUnknown *unk; + HRESULT hres; + + trace("Testing gopher protocol...\n"); + + hres = CoGetClassObject(&CLSID_GopherProtocol, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)&unk); + ok(hres == S_OK || + hres == REGDB_E_CLASSNOTREG, /* Gopher protocol has been removed as of Vista */ + "CoGetClassObject failed: %08x\n", hres); + if(FAILED(hres)) + return; + + hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocolInfo, (void**)&protocol_info); + ok(hres == E_NOINTERFACE, "Could not get IInternetProtocolInfo interface: %08x, expected E_NOINTERFACE\n", hres); + + hres = IUnknown_QueryInterface(unk, &IID_IClassFactory, (void**)&factory); + ok(hres == S_OK, "Could not get IClassFactory interface\n"); + IUnknown_Release(unk); + if(FAILED(hres)) + return; + + hres = IClassFactory_CreateInstance(factory, NULL, &IID_IInternetProtocol, + (void**)&async_protocol); + IClassFactory_Release(factory); + ok(hres == S_OK, "Could not get IInternetProtocol: %08x\n", hres); + + test_priority(async_protocol); + + IInternetProtocol_Release(async_protocol); +} + static void test_mk_protocol(void) { IInternetProtocolInfo *protocol_info; @@ -2011,6 +2260,8 @@ START_TEST(protocol) test_file_protocol(); test_http_protocol(); test_https_protocol(); + test_ftp_protocol(); + test_gopher_protocol(); test_mk_protocol(); test_CreateBinding(); test_binding(FILE_TEST); diff --git a/rostests/winetests/urlmon/url.c b/rostests/winetests/urlmon/url.c index 094d21dd546..6d3832edf60 100644 --- a/rostests/winetests/urlmon/url.c +++ b/rostests/winetests/urlmon/url.c @@ -128,6 +128,7 @@ DEFINE_EXPECT(CreateInstance); DEFINE_EXPECT(Load); DEFINE_EXPECT(PutProperty_MIMETYPEPROP); DEFINE_EXPECT(PutProperty_CLASSIDPROP); +DEFINE_EXPECT(SetPriority); static const WCHAR TEST_URL_1[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','\0'}; static const WCHAR TEST_PART_URL_1[] = {'/','t','e','s','t','/','\0'}; @@ -147,6 +148,9 @@ static const WCHAR MK_URL[] = {'m','k',':','@','M','S','I','T','S','t','o','r',' static const WCHAR https_urlW[] = {'h','t','t','p','s',':','/','/','w','w','w','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m', '/','t','e','s','t','.','h','t','m','l',0}; +static const WCHAR ftp_urlW[] = {'f','t','p',':','/','/','f','t','p','.','w','i','n','e','h','q','.','o','r','g', + '/','p','u','b','/','o','t','h','e','r','/', + 'w','i','n','e','l','o','g','o','.','x','c','f','.','t','a','r','.','b','z','2',0}; static const WCHAR wszTextHtml[] = {'t','e','x','t','/','h','t','m','l',0}; @@ -169,6 +173,7 @@ static BOOL stopped_binding = FALSE, stopped_obj_binding = FALSE, emulate_protoc static DWORD read = 0, bindf = 0, prot_state = 0, thread_id, tymed; static CHAR mime_type[512]; static IInternetProtocolSink *protocol_sink = NULL; +static IBinding *current_binding; static HANDLE complete_event, complete_event2; static HRESULT binding_hres; static BOOL have_IHttpNegotiate2; @@ -179,7 +184,8 @@ static LPCWSTR urls[] = { INDEX_HTML, ITS_URL, MK_URL, - https_urlW + https_urlW, + ftp_urlW }; static WCHAR file_url[INTERNET_MAX_URL_LENGTH]; @@ -190,7 +196,8 @@ static enum { FILE_TEST, ITS_TEST, MK_TEST, - HTTPS_TEST + HTTPS_TEST, + FTP_TEST } test_protocol; static enum { @@ -218,6 +225,11 @@ static const char *debugstr_guid(REFIID riid) return buf; } +static BOOL is_urlmon_protocol(int prot) +{ + return prot == FILE_TEST || prot == HTTP_TEST || prot == HTTPS_TEST || prot == FTP_TEST || prot == MK_TEST; +} + static void test_CreateURLMoniker(LPCWSTR url1, LPCWSTR url2) { HRESULT hr; @@ -239,14 +251,66 @@ static void test_create(void) test_CreateURLMoniker(TEST_URL_1, TEST_PART_URL_1); } +static HRESULT WINAPI Priority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv) +{ + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI Priority_AddRef(IInternetPriority *iface) +{ + return 2; +} + +static ULONG WINAPI Priority_Release(IInternetPriority *iface) +{ + return 1; +} + +static HRESULT WINAPI Priority_SetPriority(IInternetPriority *iface, LONG nPriority) +{ + CHECK_EXPECT(SetPriority); + ok(!nPriority, "nPriority = %d\n", nPriority); + return S_OK; +} + +static HRESULT WINAPI Priority_GetPriority(IInternetPriority *iface, LONG *pnPriority) +{ + ok(0, "unexpected call\n"); + return S_OK; +} + +static const IInternetPriorityVtbl InternetPriorityVtbl = { + Priority_QueryInterface, + Priority_AddRef, + Priority_Release, + Priority_SetPriority, + Priority_GetPriority +}; + +static IInternetPriority InternetPriority = { &InternetPriorityVtbl }; + static HRESULT WINAPI Protocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { + *ppv = NULL; + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IInternetProtocol, riid)) { *ppv = iface; return S_OK; } - *ppv = NULL; + if(IsEqualGUID(&IID_IInternetPriority, riid)) { + if(!is_urlmon_protocol(test_protocol)) + return E_NOINTERFACE; + + *ppv = &InternetPriority; + return S_OK; + } + + if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) + return E_NOINTERFACE; /* TODO */ + + ok(0, "unexpected call %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } @@ -370,7 +434,7 @@ static DWORD WINAPI thread_proc(PVOID arg) static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, - DWORD grfPI, DWORD dwReserved) + DWORD grfPI, HANDLE_PTR dwReserved) { BINDINFO bindinfo; DWORD bindf, bscf = BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION; @@ -388,7 +452,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, ok(pOIProtSink != NULL, "pOIProtSink == NULL\n"); ok(pOIBindInfo != NULL, "pOIBindInfo == NULL\n"); ok(grfPI == 0, "grfPI=%d, expected 0\n", grfPI); - ok(dwReserved == 0, "dwReserved=%d, expected 0\n", dwReserved); + ok(dwReserved == 0, "dwReserved=%lx, expected 0\n", dwReserved); if(!filedwl_api && binding_hres != S_OK) { SET_EXPECT(OnStopBinding); @@ -408,9 +472,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, if(filedwl_api) { ok(bindf == (BINDF_PULLDATA|BINDF_FROMURLMON|BINDF_NEEDFILE), "bindf=%08x\n", bindf); - }else if(tymed == TYMED_ISTREAM - && (test_protocol == FILE_TEST || test_protocol == MK_TEST - || test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST)) { + }else if(tymed == TYMED_ISTREAM && is_urlmon_protocol(test_protocol)) { ok(bindf == (BINDF_ASYNCHRONOUS|BINDF_ASYNCSTORAGE|BINDF_PULLDATA |BINDF_FROMURLMON), "bindf=%08x\n", bindf); @@ -1118,6 +1180,8 @@ static HRESULT WINAPI statusclb_OnStartBinding(IBindStatusCallback *iface, DWORD if(pib == (void*)0xdeadbeef) return S_OK; + current_binding = pib; + hres = IBinding_QueryInterface(pib, &IID_IMoniker, (void**)&mon); ok(hres == E_NOINTERFACE, "IBinding should not have IMoniker interface\n"); if(SUCCEEDED(hres)) @@ -1150,6 +1214,8 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallback *iface, ULONG ulP case BINDSTATUS_FINDINGRESOURCE: if(iface == &objbsc) CHECK_EXPECT(Obj_OnProgress_FINDINGRESOURCE); + else if(test_protocol == FTP_TEST) + todo_wine CHECK_EXPECT(OnProgress_FINDINGRESOURCE); else CHECK_EXPECT(OnProgress_FINDINGRESOURCE); if((bindf & BINDF_ASYNCHRONOUS) && emulate_protocol) @@ -1158,6 +1224,8 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallback *iface, ULONG ulP case BINDSTATUS_CONNECTING: if(iface == &objbsc) CHECK_EXPECT(Obj_OnProgress_CONNECTING); + else if(test_protocol == FTP_TEST) + todo_wine CHECK_EXPECT(OnProgress_CONNECTING); else CHECK_EXPECT(OnProgress_CONNECTING); if((bindf & BINDF_ASYNCHRONOUS) && emulate_protocol) @@ -1166,6 +1234,8 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallback *iface, ULONG ulP case BINDSTATUS_SENDINGREQUEST: if(iface == &objbsc) CHECK_EXPECT(Obj_OnProgress_SENDINGREQUEST); + else if(test_protocol == FTP_TEST) + CHECK_EXPECT2(OnProgress_SENDINGREQUEST); else CHECK_EXPECT(OnProgress_SENDINGREQUEST); if((bindf & BINDF_ASYNCHRONOUS) && emulate_protocol) @@ -1201,8 +1271,7 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallback *iface, ULONG ulP break; case BINDSTATUS_DOWNLOADINGDATA: CHECK_EXPECT2(OnProgress_DOWNLOADINGDATA); - if(iface == &objbsc) - todo_wine ok(0, "unexpected call\n"); + ok(iface != &objbsc, "unexpected call\n"); ok(download_state == DOWNLOADING, "Download state was %d, expected DOWNLOADING\n", download_state); break; @@ -1269,9 +1338,27 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallback *iface, ULONG ulP case BINDSTATUS_PROXYDETECTING: trace("BINDSTATUS_PROXYDETECTING\n"); break; + case BINDSTATUS_COOKIE_SENT: + trace("BINDSTATUS_COOKIE_SENT\n"); + break; default: ok(0, "unexpected code %d\n", ulStatusCode); }; + + if(current_binding) { + IWinInetHttpInfo *http_info; + HRESULT hres; + + hres = IBinding_QueryInterface(current_binding, &IID_IWinInetHttpInfo, (void**)&http_info); + if(!emulate_protocol && test_protocol != FILE_TEST && is_urlmon_protocol(test_protocol)) + ok(hres == S_OK, "Could not get IWinInetHttpInfo iface: %08x\n", hres); + else + ok(hres == E_NOINTERFACE, + "QueryInterface(IID_IWinInetHttpInfo) returned: %08x, expected E_NOINTERFACE\n", hres); + if(SUCCEEDED(hres)) + IWinInetHttpInfo_Release(http_info); + } + return S_OK; } @@ -2062,6 +2149,8 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) SET_EXPECT(QueryService_IInternetProtocol); SET_EXPECT(OnStartBinding); if(emulate_protocol) { + if(is_urlmon_protocol(test_protocol)) + SET_EXPECT(SetPriority); SET_EXPECT(Start); if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(Terminate); @@ -2078,7 +2167,8 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) SET_EXPECT(OnProgress_FINDINGRESOURCE); SET_EXPECT(OnProgress_CONNECTING); } - if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FILE_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FTP_TEST + || test_protocol == FILE_TEST) SET_EXPECT(OnProgress_SENDINGREQUEST); if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(OnResponse); @@ -2086,7 +2176,7 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) SET_EXPECT(OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) SET_EXPECT(OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FTP_TEST) SET_EXPECT(OnProgress_DOWNLOADINGDATA); SET_EXPECT(OnProgress_ENDDOWNLOADDATA); if(tymed != TYMED_FILE || test_protocol != ABOUT_TEST) @@ -2132,6 +2222,8 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) CHECK_CALLED(QueryService_IInternetProtocol); CHECK_CALLED(OnStartBinding); if(emulate_protocol) { + if(is_urlmon_protocol(test_protocol)) + CHECK_CALLED(SetPriority); CHECK_CALLED(Start); if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { if(tymed == TYMED_FILE) @@ -2162,13 +2254,15 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) } if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FILE_TEST) CHECK_CALLED(OnProgress_SENDINGREQUEST); + else if(test_protocol == FTP_TEST) + todo_wine CHECK_CALLED(OnProgress_SENDINGREQUEST); if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CHECK_CALLED(OnResponse); CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE); CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) CHECK_CALLED(OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FTP_TEST) CLEAR_CALLED(OnProgress_DOWNLOADINGDATA); CHECK_CALLED(OnProgress_ENDDOWNLOADDATA); if(tymed != TYMED_FILE || test_protocol != ABOUT_TEST) @@ -2229,6 +2323,8 @@ static void test_BindToObject(int protocol, BOOL emul) SET_EXPECT(QueryService_IInternetProtocol); SET_EXPECT(Obj_OnStartBinding); if(emulate_protocol) { + if(is_urlmon_protocol(test_protocol)) + SET_EXPECT(SetPriority); SET_EXPECT(Start); if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(Terminate); @@ -2298,6 +2394,8 @@ static void test_BindToObject(int protocol, BOOL emul) CHECK_CALLED(QueryService_IInternetProtocol); CHECK_CALLED(Obj_OnStartBinding); if(emulate_protocol) { + if(is_urlmon_protocol(test_protocol)) + CHECK_CALLED(SetPriority); CHECK_CALLED(Start); if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CHECK_CALLED(Terminate); @@ -2378,6 +2476,8 @@ static void test_URLDownloadToFile(DWORD prot, BOOL emul) } SET_EXPECT(OnStartBinding); if(emulate_protocol) { + if(is_urlmon_protocol(test_protocol)) + SET_EXPECT(SetPriority); SET_EXPECT(Start); SET_EXPECT(UnlockRequest); }else { @@ -2412,6 +2512,8 @@ static void test_URLDownloadToFile(DWORD prot, BOOL emul) } CHECK_CALLED(OnStartBinding); if(emulate_protocol) { + if(is_urlmon_protocol(test_protocol)) + CHECK_CALLED(SetPriority); CHECK_CALLED(Start); CHECK_CALLED(UnlockRequest); }else { @@ -2511,6 +2613,8 @@ static void test_ReportResult(HRESULT exhres) SET_EXPECT(GetBindInfo); SET_EXPECT(QueryInterface_IInternetProtocol); SET_EXPECT(OnStartBinding); + if(is_urlmon_protocol(test_protocol)) + SET_EXPECT(SetPriority); SET_EXPECT(Start); hres = IMoniker_BindToStorage(mon, bctx, NULL, &IID_IStream, (void**)&unk); @@ -2523,6 +2627,8 @@ static void test_ReportResult(HRESULT exhres) CHECK_CALLED(GetBindInfo); CHECK_CALLED(QueryInterface_IInternetProtocol); CHECK_CALLED(OnStartBinding); + if(is_urlmon_protocol(test_protocol)) + CHECK_CALLED(SetPriority); CHECK_CALLED(Start); ok(unk == NULL, "unk=%p\n", unk); @@ -2558,6 +2664,29 @@ static void test_BindToStorage_fail(void) test_ReportResult(S_FALSE); } +static void test_StdURLMoniker(void) +{ + IMoniker *mon, *async_mon; + LPOLESTR display_name; + HRESULT hres; + + hres = CoCreateInstance(&IID_IInternet, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IMoniker, (void**)&mon); + ok(hres == S_OK, "Could not create IInternet instance: %08x\n", hres); + if(FAILED(hres)) + return; + + hres = IMoniker_QueryInterface(mon, &IID_IAsyncMoniker, (void**)&async_mon); + ok(hres == S_OK, "Could not get IAsyncMoniker iface: %08x\n", hres); + ok(mon == async_mon, "mon != async_mon\n"); + IMoniker_Release(async_mon); + + hres = IMoniker_GetDisplayName(mon, NULL, NULL, &display_name); + ok(hres == E_OUTOFMEMORY, "GetDisplayName failed: %08x, expected E_OUTOFMEMORY\n", hres); + + IMoniker_Release(mon); +} + static void gecko_installer_workaround(BOOL disable) { HKEY hkey; @@ -2609,6 +2738,9 @@ START_TEST(url) CoInitialize(NULL); + trace("test StdURLMoniker...\n"); + test_StdURLMoniker(); + trace("synchronous http test...\n"); test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); @@ -2709,6 +2841,11 @@ START_TEST(url) trace("test URLDownloadToFile for http protocol...\n"); test_URLDownloadToFile(HTTP_TEST, FALSE); + bindf |= BINDF_NOWRITECACHE; + + trace("ftp test...\n"); + test_BindToStorage(FTP_TEST, FALSE, TYMED_ISTREAM); + trace("test failures...\n"); test_BindToStorage_fail(); } diff --git a/rostests/winetests/user32/class.c b/rostests/winetests/user32/class.c index a1ae4bdc55d..f8a4cd822ae 100755 --- a/rostests/winetests/user32/class.c +++ b/rostests/winetests/user32/class.c @@ -43,11 +43,13 @@ static const WCHAR WC_EDITW[] = {'E','d','i','t',0}; static LRESULT WINAPI ClassTest_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { + if (msg == WM_NCCREATE) return 1; return DefWindowProcW (hWnd, msg, wParam, lParam); } static LRESULT WINAPI ClassTest_WndProc2 (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { + if (msg == WM_NCCREATE) return 1; return DefWindowProcA (hWnd, msg, wParam, lParam); } @@ -234,42 +236,48 @@ static void test_styles(void) check_style( "#32772", 1, 0, 0 ); /* icon title */ } -static void check_class(HINSTANCE inst, const char *name, const char *menu_name) +static void check_class_(int line, HINSTANCE inst, const char *name, const char *menu_name) { WNDCLASS wc; UINT atom = GetClassInfo(inst,name,&wc); - ok( atom, "Class %s %p not found\n", name, inst ); + ok_(__FILE__,line)( atom, "Class %s %p not found\n", name, inst ); if (atom) { if (wc.lpszMenuName && menu_name) - ok( !strcmp( menu_name, wc.lpszMenuName ), "Wrong name %s/%s for class %s %p\n", - wc.lpszMenuName, menu_name, name, inst ); + ok_(__FILE__,line)( !strcmp( menu_name, wc.lpszMenuName ), + "Wrong name %s/%s for class %s %p\n", + wc.lpszMenuName, menu_name, name, inst ); else - ok( !menu_name == !wc.lpszMenuName, "Wrong name %p/%p for class %s %p\n", - wc.lpszMenuName, menu_name, name, inst ); + ok_(__FILE__,line)( !menu_name == !wc.lpszMenuName, "Wrong name %p/%p for class %s %p\n", + wc.lpszMenuName, menu_name, name, inst ); } } +#define check_class(inst,name,menu) check_class_(__LINE__,inst,name,menu) -static void check_instance( const char *name, HINSTANCE inst, HINSTANCE info_inst, HINSTANCE gcl_inst ) +static void check_instance_( int line, const char *name, HINSTANCE inst, + HINSTANCE info_inst, HINSTANCE gcl_inst ) { WNDCLASSA wc; HWND hwnd; - ok( GetClassInfo( inst, name, &wc ), "Couldn't find class %s inst %p\n", name, inst ); - ok( wc.hInstance == info_inst, "Wrong info instance %p/%p for class %s\n", - wc.hInstance, info_inst, name ); + ok_(__FILE__,line)( GetClassInfo( inst, name, &wc ), "Couldn't find class %s inst %p\n", name, inst ); + ok_(__FILE__,line)( wc.hInstance == info_inst, "Wrong info instance %p/%p for class %s\n", + wc.hInstance, info_inst, name ); hwnd = CreateWindowExA( 0, name, "test_window", 0, 0, 0, 0, 0, 0, 0, inst, 0 ); - ok( hwnd != NULL, "Couldn't create window for class %s inst %p\n", name, inst ); - ok( (HINSTANCE)GetClassLongPtrA( hwnd, GCLP_HMODULE ) == gcl_inst, - "Wrong GCL instance %p/%p for class %s\n", + ok_(__FILE__,line)( hwnd != NULL, "Couldn't create window for class %s inst %p\n", name, inst ); + ok_(__FILE__,line)( (HINSTANCE)GetClassLongPtrA( hwnd, GCLP_HMODULE ) == gcl_inst, + "Wrong GCL instance %p/%p for class %s\n", (HINSTANCE)GetClassLongPtrA( hwnd, GCLP_HMODULE ), gcl_inst, name ); - ok( (HINSTANCE)GetWindowLongPtrA( hwnd, GWLP_HINSTANCE ) == inst, - "Wrong GWL instance %p/%p for window %s\n", + ok_(__FILE__,line)( (HINSTANCE)GetWindowLongPtrA( hwnd, GWLP_HINSTANCE ) == inst, + "Wrong GWL instance %p/%p for window %s\n", (HINSTANCE)GetWindowLongPtrA( hwnd, GWLP_HINSTANCE ), inst, name ); - ok(!UnregisterClassA(name, inst), "UnregisterClassA should fail while exists a class window\n"); - ok(GetLastError() == ERROR_CLASS_HAS_WINDOWS, "GetLastError() should be set to ERROR_CLASS_HAS_WINDOWS not %d\n", GetLastError()); + ok_(__FILE__,line)(!UnregisterClassA(name, inst), + "UnregisterClassA should fail while exists a class window\n"); + ok_(__FILE__,line)(GetLastError() == ERROR_CLASS_HAS_WINDOWS, + "GetLastError() should be set to ERROR_CLASS_HAS_WINDOWS not %d\n", GetLastError()); DestroyWindow(hwnd); } +#define check_instance(name,inst,info_inst,gcl_inst) check_instance_(__LINE__,name,inst,info_inst,gcl_inst) struct class_info { @@ -364,6 +372,7 @@ static void test_instances(void) /* setting global flag doesn't change status of class */ hwnd = CreateWindowExA( 0, name, "test", 0, 0, 0, 0, 0, 0, 0, main_module, 0 ); + ok( hwnd != 0, "CreateWindow failed error %u\n", GetLastError()); SetClassLongA( hwnd, GCL_STYLE, CS_GLOBALCLASS ); cls.lpszMenuName = "kernel32"; cls.hInstance = kernel32; diff --git a/rostests/winetests/user32/clipboard.c b/rostests/winetests/user32/clipboard.c index 30b170759a2..e2ba2f92e5e 100755 --- a/rostests/winetests/user32/clipboard.c +++ b/rostests/winetests/user32/clipboard.c @@ -21,6 +21,7 @@ #include "wine/test.h" #include "winbase.h" #include "winerror.h" +#include "wingdi.h" #include "winuser.h" static BOOL is_win9x = FALSE; @@ -190,6 +191,77 @@ todo_wine test_last_error(ERROR_CLIPBOARD_NOT_OPEN); } +static HGLOBAL create_text(void) +{ + HGLOBAL h = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE, 5); + char *p = GlobalLock(h); + strcpy(p, "test"); + GlobalUnlock(h); + return h; +} + +static HENHMETAFILE create_emf(void) +{ + const RECT rect = {0, 0, 100, 100}; + HDC hdc = CreateEnhMetaFileA(NULL, NULL, &rect, "HENHMETAFILE Ole Clipboard Test\0Test\0\0"); + ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rect, "Test String", strlen("Test String"), NULL); + return CloseEnhMetaFile(hdc); +} + +static void test_synthesized(void) +{ + HGLOBAL h, htext; + HENHMETAFILE emf; + BOOL r; + UINT cf; + + htext = create_text(); + emf = create_emf(); + + r = OpenClipboard(NULL); + ok(r, "gle %d\n", GetLastError()); + r = EmptyClipboard(); + ok(r, "gle %d\n", GetLastError()); + h = SetClipboardData(CF_TEXT, htext); + ok(h == htext, "got %p\n", h); + h = SetClipboardData(CF_ENHMETAFILE, emf); + ok(h == emf, "got %p\n", h); + r = CloseClipboard(); + ok(r, "gle %d\n", GetLastError()); + + r = OpenClipboard(NULL); + ok(r, "gle %d\n", GetLastError()); + cf = EnumClipboardFormats(0); + ok(cf == CF_TEXT, "cf %08x\n", cf); + + cf = EnumClipboardFormats(cf); + ok(cf == CF_ENHMETAFILE, "cf %08x\n", cf); + + cf = EnumClipboardFormats(cf); + todo_wine ok(cf == CF_LOCALE, "cf %08x\n", cf); + if(cf == CF_LOCALE) + cf = EnumClipboardFormats(cf); + ok(cf == CF_OEMTEXT, "cf %08x\n", cf); + + cf = EnumClipboardFormats(cf); + ok(cf == CF_UNICODETEXT || + broken(cf == CF_METAFILEPICT), /* win9x and winME has no CF_UNICODETEXT */ + "cf %08x\n", cf); + + if(cf == CF_UNICODETEXT) + cf = EnumClipboardFormats(cf); + ok(cf == CF_METAFILEPICT, "cf %08x\n", cf); + + cf = EnumClipboardFormats(cf); + ok(cf == 0, "cf %08x\n", cf); + + r = EmptyClipboard(); + ok(r, "gle %d\n", GetLastError()); + + r = CloseClipboard(); + ok(r, "gle %d\n", GetLastError()); +} + START_TEST(clipboard) { SetLastError(0xdeadbeef); @@ -198,4 +270,5 @@ START_TEST(clipboard) test_RegisterClipboardFormatA(); test_ClipboardOwner(); + test_synthesized(); } diff --git a/rostests/winetests/user32/combo.c b/rostests/winetests/user32/combo.c index cc5586429d9..f7450ea6f0a 100644 --- a/rostests/winetests/user32/combo.c +++ b/rostests/winetests/user32/combo.c @@ -355,6 +355,48 @@ static void test_WM_LBUTTONDOWN(void) DestroyWindow(hCombo); } +static void test_changesize( DWORD style) +{ + HWND hCombo = build_combo(style); + RECT rc; + INT ddheight, clheight, ddwidth, clwidth; + /* get initial measurements */ + GetClientRect( hCombo, &rc); + clheight = rc.bottom - rc.top; + clwidth = rc.right - rc.left; + SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&rc); + ddheight = rc.bottom - rc.top; + ddwidth = rc.right - rc.left; + /* use MoveWindow to move & resize the combo */ + /* first make it slightly smaller */ + MoveWindow( hCombo, 10, 10, clwidth - 2, clheight - 2, TRUE); + GetClientRect( hCombo, &rc); + ok( rc.right - rc.left == clwidth - 2, "clientrect witdh is %d vs %d\n", + rc.right - rc.left, clwidth - 2); + ok( rc.bottom - rc.top == clheight, "clientrect height is %d vs %d\n", + rc.bottom - rc.top, clheight); + SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&rc); + ok( rc.right - rc.left == clwidth - 2, "drop-down rect witdh is %d vs %d\n", + rc.right - rc.left, clwidth - 2); + ok( rc.bottom - rc.top == ddheight, "drop-down rect height is %d vs %d\n", + rc.bottom - rc.top, ddheight); + /* new cx, cy is slightly bigger than the initial values */ + MoveWindow( hCombo, 10, 10, clwidth + 2, clheight + 2, TRUE); + GetClientRect( hCombo, &rc); + ok( rc.right - rc.left == clwidth + 2, "clientrect witdh is %d vs %d\n", + rc.right - rc.left, clwidth + 2); + ok( rc.bottom - rc.top == clheight, "clientrect height is %d vs %d\n", + rc.bottom - rc.top, clheight); + SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&rc); + ok( rc.right - rc.left == clwidth + 2, "drop-down rect witdh is %d vs %d\n", + rc.right - rc.left, clwidth + 2); + todo_wine { + ok( rc.bottom - rc.top == clheight + 2, "drop-down rect height is %d vs %d\n", + rc.bottom - rc.top, clheight + 2); + } + DestroyWindow(hCombo); +} + START_TEST(combo) { hMainWnd = CreateWindow("static", "Test", WS_OVERLAPPEDWINDOW, 10, 10, 300, 300, NULL, NULL, NULL, 0); @@ -366,6 +408,8 @@ START_TEST(combo) test_setitemheight(CBS_DROPDOWNLIST); test_CBN_SELCHANGE(); test_WM_LBUTTONDOWN(); + test_changesize(CBS_DROPDOWN); + test_changesize(CBS_DROPDOWNLIST); DestroyWindow(hMainWnd); } diff --git a/rostests/winetests/user32/dde.c b/rostests/winetests/user32/dde.c index e7f09f1b20d..840406e0743 100755 --- a/rostests/winetests/user32/dde.c +++ b/rostests/winetests/user32/dde.c @@ -585,7 +585,7 @@ static HDDEDATA CALLBACK server_ddeml_callback(UINT uType, UINT uFmt, HCONV hcon size = DdeQueryStringA(server_pid, hsz2, str, MAX_PATH, CP_WINANSI); ok(!strncmp(str, "TestDDEServer(", 14), "Expected TestDDEServer(, got %s\n", str); ok(str[size - 1] == ')', "Expected ')', got %c\n", str[size - 1]); - ok(size == 25, "Expected 25, got %d\n", size); + ok(size == 17 + 2*sizeof(ULONG_PTR), "Got size %d for %s\n", size, str); return (HDDEDATA)TRUE; } @@ -1188,7 +1188,7 @@ static LRESULT WINAPI dde_server_wndprocW(HWND hwnd, UINT msg, WPARAM wparam, LP ok(!IsWindowUnicode((HWND)wparam), "client should be an ANSI window\n"); old_dde_client_wndproc = (WNDPROC)SetWindowLongPtrA((HWND)wparam, GWLP_WNDPROC, (ULONG_PTR)hook_dde_client_wndproc); trace("server: sending WM_DDE_ACK to %p\n", (HWND)wparam); - SendMessageW((HWND)wparam, WM_DDE_ACK, (WPARAM)hwnd, MAKELPARAM(aService, 0)); + SendMessageW((HWND)wparam, WM_DDE_ACK, (WPARAM)hwnd, PackDDElParam(WM_DDE_ACK, aService, 0)); } else GlobalDeleteAtom(aService); @@ -1802,10 +1802,6 @@ static void test_FreeDDElParam(void) hglobal = GlobalAlloc(GMEM_DDESHARE, 100); ret = FreeDDElParam(WM_DDE_ADVISE, (LPARAM)hglobal); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - val = GlobalFree(hglobal); - ok(val == hglobal, "Expected hglobal, got %p\n", val); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); hglobal = GlobalAlloc(GMEM_DDESHARE, 100); ret = FreeDDElParam(WM_DDE_UNADVISE, (LPARAM)hglobal); @@ -1816,18 +1812,10 @@ static void test_FreeDDElParam(void) hglobal = GlobalAlloc(GMEM_DDESHARE, 100); ret = FreeDDElParam(WM_DDE_ACK, (LPARAM)hglobal); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - val = GlobalFree(hglobal); - ok(val == hglobal, "Expected hglobal, got %p\n", val); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); hglobal = GlobalAlloc(GMEM_DDESHARE, 100); ret = FreeDDElParam(WM_DDE_DATA, (LPARAM)hglobal); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - val = GlobalFree(hglobal); - ok(val == hglobal, "Expected hglobal, got %p\n", val); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); hglobal = GlobalAlloc(GMEM_DDESHARE, 100); ret = FreeDDElParam(WM_DDE_REQUEST, (LPARAM)hglobal); @@ -1838,10 +1826,6 @@ static void test_FreeDDElParam(void) hglobal = GlobalAlloc(GMEM_DDESHARE, 100); ret = FreeDDElParam(WM_DDE_POKE, (LPARAM)hglobal); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - val = GlobalFree(hglobal); - ok(val == hglobal, "Expected hglobal, got %p\n", val); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); hglobal = GlobalAlloc(GMEM_DDESHARE, 100); ret = FreeDDElParam(WM_DDE_EXECUTE, (LPARAM)hglobal); @@ -1853,17 +1837,12 @@ static void test_FreeDDElParam(void) static void test_PackDDElParam(void) { UINT_PTR lo, hi, *ptr; - HGLOBAL hglobal; LPARAM lparam; BOOL ret; lparam = PackDDElParam(WM_DDE_INITIATE, 0xcafe, 0xbeef); /* value gets sign-extended despite being an LPARAM */ ok(lparam == (int)0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); - ok(GlobalLock((HGLOBAL)lparam) == NULL, - "Expected NULL, got %p\n", GlobalLock((HGLOBAL)lparam)); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); lo = hi = 0; ret = UnpackDDElParam(WM_DDE_INITIATE, lparam, &lo, &hi); @@ -1876,10 +1855,6 @@ static void test_PackDDElParam(void) lparam = PackDDElParam(WM_DDE_TERMINATE, 0xcafe, 0xbeef); ok(lparam == (int)0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); - ok(GlobalLock((HGLOBAL)lparam) == NULL, - "Expected NULL, got %p\n", GlobalLock((HGLOBAL)lparam)); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); lo = hi = 0; ret = UnpackDDElParam(WM_DDE_TERMINATE, lparam, &lo, &hi); @@ -1913,17 +1888,8 @@ static void test_PackDDElParam(void) ret = FreeDDElParam(WM_DDE_ADVISE, lparam); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - hglobal = GlobalFree((HGLOBAL)lparam); - ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); - lparam = PackDDElParam(WM_DDE_UNADVISE, 0xcafe, 0xbeef); ok(lparam == (int)0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); - ok(GlobalLock((HGLOBAL)lparam) == NULL, - "Expected NULL, got %p\n", GlobalLock((HGLOBAL)lparam)); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); lo = hi = 0; ret = UnpackDDElParam(WM_DDE_UNADVISE, lparam, &lo, &hi); @@ -1953,11 +1919,6 @@ static void test_PackDDElParam(void) ret = FreeDDElParam(WM_DDE_ACK, lparam); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - - hglobal = GlobalFree((HGLOBAL)lparam); - ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); } else win_skip("got lparam 0x%lx for WM_DDE_ACK\n", lparam); @@ -1985,17 +1946,8 @@ static void test_PackDDElParam(void) ret = FreeDDElParam(WM_DDE_DATA, lparam); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - hglobal = GlobalFree((HGLOBAL)lparam); - ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); - lparam = PackDDElParam(WM_DDE_REQUEST, 0xcafe, 0xbeef); ok(lparam == (int)0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); - ok(GlobalLock((HGLOBAL)lparam) == NULL, - "Expected NULL, got %p\n", GlobalLock((HGLOBAL)lparam)); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); lo = hi = 0; ret = UnpackDDElParam(WM_DDE_REQUEST, lparam, &lo, &hi); @@ -2029,17 +1981,8 @@ static void test_PackDDElParam(void) ret = FreeDDElParam(WM_DDE_POKE, lparam); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - hglobal = GlobalFree((HGLOBAL)lparam); - ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); - lparam = PackDDElParam(WM_DDE_EXECUTE, 0xcafe, 0xbeef); ok(lparam == 0xbeef, "Expected 0xbeef, got %08lx\n", lparam); - ok(GlobalLock((HGLOBAL)lparam) == NULL, - "Expected NULL, got %p\n", GlobalLock((HGLOBAL)lparam)); - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); lo = hi = 0; ret = UnpackDDElParam(WM_DDE_EXECUTE, lparam, &lo, &hi); @@ -2106,17 +2049,6 @@ static void test_UnpackDDElParam(void) broken(hi == 0xbeef), /* win2k */ "Expected 0, got %08lx\n", hi); - lo = 0xdead; - hi = 0xbeef; - ret = UnpackDDElParam(WM_DDE_ADVISE, 0xcafebabe, &lo, &hi); - ok(ret == FALSE, "Expected FALSE, got %d\n", ret); - ok(lo == 0 || - broken(lo == 0xdead), /* win2k */ - "Expected 0, got %08lx\n", lo); - ok(hi == 0 || - broken(hi == 0xbeef), /* win2k */ - "Expected 0, got %08lx\n", hi); - hglobal = GlobalAlloc(GMEM_DDESHARE, 2); ptr = GlobalLock(hglobal); ptr[0] = 0xcafebabe; @@ -2137,17 +2069,6 @@ static void test_UnpackDDElParam(void) ok(lo == 0xbabe, "Expected 0xbabe, got %08lx\n", lo); ok(hi == 0xcafe, "Expected 0xcafe, got %08lx\n", hi); - lo = 0xdead; - hi = 0xbeef; - ret = UnpackDDElParam(WM_DDE_ACK, 0xcafebabe, &lo, &hi); - ok(ret == FALSE, "Expected FALSE, got %d\n", ret); - ok(lo == 0 || - broken(lo == 0xdead), /* win2k */ - "Expected 0, got %08lx\n", lo); - ok(hi == 0 || - broken(hi == 0xbeef), /* win2k */ - "Expected 0, got %08lx\n", hi); - lo = 0xdead; hi = 0xbeef; ret = UnpackDDElParam(WM_DDE_ACK, (LPARAM)hglobal, &lo, &hi); @@ -2155,17 +2076,6 @@ static void test_UnpackDDElParam(void) ok(lo == 0xcafebabe, "Expected 0xcafebabe, got %08lx\n", lo); ok(hi == 0xdeadbeef, "Expected 0xdeadbeef, got %08lx\n", hi); - lo = 0xdead; - hi = 0xbeef; - ret = UnpackDDElParam(WM_DDE_DATA, 0xcafebabe, &lo, &hi); - ok(ret == FALSE, "Expected FALSE, got %d\n", ret); - ok(lo == 0 || - broken(lo == 0xdead), /* win2k */ - "Expected 0, got %08lx\n", lo); - ok(hi == 0 || - broken(hi == 0xbeef), /* win2k */ - "Expected 0, got %08lx\n", hi); - lo = 0xdead; hi = 0xbeef; ret = UnpackDDElParam(WM_DDE_DATA, (LPARAM)hglobal, &lo, &hi); @@ -2180,17 +2090,6 @@ static void test_UnpackDDElParam(void) ok(lo == 0xbabe, "Expected 0xbabe, got %08lx\n", lo); ok(hi == 0xcafe, "Expected 0xcafe, got %08lx\n", hi); - lo = 0xdead; - hi = 0xbeef; - ret = UnpackDDElParam(WM_DDE_POKE, 0xcafebabe, &lo, &hi); - ok(ret == FALSE, "Expected FALSE, got %d\n", ret); - ok(lo == 0 || - broken(lo == 0xdead), /* win2k */ - "Expected 0, got %08lx\n", lo); - ok(hi == 0 || - broken(hi == 0xbeef), /* win2k */ - "Expected 0, got %08lx\n", hi); - lo = 0xdead; hi = 0xbeef; ret = UnpackDDElParam(WM_DDE_POKE, (LPARAM)hglobal, &lo, &hi); diff --git a/rostests/winetests/user32/dialog.c b/rostests/winetests/user32/dialog.c index 84929e35c1c..060625c2162 100755 --- a/rostests/winetests/user32/dialog.c +++ b/rostests/winetests/user32/dialog.c @@ -36,6 +36,7 @@ #include "wine/test.h" #include "windef.h" #include "winbase.h" +#include "wingdi.h" #include "winuser.h" #define MAXHWNDS 1024 @@ -926,6 +927,99 @@ static void test_DisabledDialogTest(void) ok(FALSE == g_terminated, "dialog with disabled ok button has been terminated\n"); } +static INT_PTR CALLBACK messageBoxFontDlgWinProc (HWND hDlg, UINT uiMsg, WPARAM wParam, + LPARAM lParam) +{ + return (uiMsg == WM_INITDIALOG); +} + +static void test_MessageBoxFontTest(void) +{ + /* This dialog template defines a dialog template which got 0x7fff as its + * font size and omits the other font members. On WinNT, passing such a + * dialog template to CreateDialogIndirectParamW will result in a dialog + * being created which uses the message box font. We test that here. + */ + + static unsigned char dlgTemplate[] = + { + /* Dialog header */ + 0x01,0x00, /* Version */ + 0xff,0xff, /* Extended template marker */ + 0x00,0x00,0x00,0x00, /* Context Help ID */ + 0x00,0x00,0x00,0x00, /* Extended style */ + 0xc0,0x00,0xc8,0x80, /* Style (WS_SYSMENU|WS_CAPTION|WS_POPUP|DS_SETFONT|DS_MODALFRAME) */ + 0x01,0x00, /* Control count */ + 0x00,0x00, /* X */ + 0x00,0x00, /* Y */ + 0x80,0x00, /* Width */ + 0x80,0x00, /* Height */ + 0x00,0x00, /* Menu name */ + 0x00,0x00, /* Class name */ + 'T',0x00,'e',0x00, /* Caption (unicode) */ + 's',0x00,'t',0x00, + 0x00,0x00, + 0xff,0x7f, /* Font height (0x7fff = message box font) */ + + /* Control #1 */ + 0x00,0x00, /* Align to DWORD (header is 42 bytes) */ + 0x00,0x00,0x00,0x00, /* Context Help ID */ + 0x00,0x00,0x00,0x00, /* Extended style */ + 0x00,0x00,0x00,0x50, /* Style (WS_CHILD|WS_VISIBLE) */ + 0x00,0x00, /* X */ + 0x00,0x00, /* Y */ + 0x80,0x00, /* Width */ + 0x80,0x00, /* Height */ + 0x00,0x01,0x00,0x00, /* Control ID (256) */ + 0xff,0xff,0x82,0x00, /* Class (Static) */ + 'W',0x00,'I',0x00, /* Caption (unicode) */ + 'N',0x00,'E',0x00, + ' ',0x00,'d',0x00, + 'i',0x00,'a',0x00, + 'l',0x00,'o',0x00, + 'g',0x00,' ',0x00, + 't',0x00,'e',0x00, + 's',0x00,'t',0x00, + '.',0x00,0x00,0x00, + 0x00,0x00, /* Size of extended data */ + + 0x00,0x00 /* Align to DWORD */ + }; + + HWND hDlg; + HFONT hFont; + LOGFONTW lfStaticFont; + NONCLIENTMETRICSW ncMetrics; + + /* Check if the dialog can be created from the template. On Win9x, this should fail + * because we are calling the W function which is not implemented, but that's what + * we want, because passing such a template to CreateDialogIndirectParamA would crash + * anyway. + */ + hDlg = CreateDialogIndirectParamW(g_hinst, (LPCDLGTEMPLATE)dlgTemplate, NULL, messageBoxFontDlgWinProc, 0); + if (!hDlg) + { + win_skip("dialog wasn't created\n"); + return; + } + + hFont = (HFONT) SendDlgItemMessageW(hDlg, 256, WM_GETFONT, 0, 0); + if (!hFont) + { + skip("dialog uses system font\n"); + DestroyWindow(hDlg); + return; + } + GetObjectW(hFont, sizeof(LOGFONTW), &lfStaticFont); + + ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW); + SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, 0, &ncMetrics, 0); + ok( !memcmp(&lfStaticFont, &ncMetrics.lfMessageFont, FIELD_OFFSET(LOGFONTW, lfFaceName)) && + !lstrcmpW(lfStaticFont.lfFaceName, ncMetrics.lfMessageFont.lfFaceName), + "dialog doesn't use message box font\n"); + DestroyWindow(hDlg); +} + START_TEST(dialog) { g_hinst = GetModuleHandleA (0); @@ -939,4 +1033,5 @@ START_TEST(dialog) test_GetDlgItemText(); test_DialogBoxParamA(); test_DisabledDialogTest(); + test_MessageBoxFontTest(); } diff --git a/rostests/winetests/user32/edit.c b/rostests/winetests/user32/edit.c index b1a982079f2..399ec4c37c6 100755 --- a/rostests/winetests/user32/edit.c +++ b/rostests/winetests/user32/edit.c @@ -646,8 +646,8 @@ static void set_client_height(HWND Wnd, unsigned Height) GetClientRect(Wnd, &ClientRect); ok(ClientRect.bottom - ClientRect.top == Height, - "The client height should be %ld, but is %ld\n", - (long)Height, (long)(ClientRect.bottom - ClientRect.top)); + "The client height should be %d, but is %d\n", + Height, ClientRect.bottom - ClientRect.top); } static void test_edit_control_1(void) @@ -1177,9 +1177,13 @@ static void test_edit_control_4(void) static void test_edit_control_5(void) { static const char *str = "test\r\ntest"; + HWND parentWnd; HWND hWnd; int len; + RECT rc1 = { 10, 10, 11, 11}; + RECT rc; + /* first show that a non-child won't do for this test */ hWnd = CreateWindowEx(0, "EDIT", str, @@ -1187,19 +1191,48 @@ static void test_edit_control_5(void) 10, 10, 1, 1, NULL, NULL, NULL, NULL); assert(hWnd); - + /* size of non-child edit control is (much) bigger than requested */ + GetWindowRect( hWnd, &rc); + ok( rc.right - rc.left > 20, "size of the window (%d) is smaller than expected\n", + rc.right - rc.left); + DestroyWindow(hWnd); + /* so create a parent, and give it edit controls children to test with */ + parentWnd = CreateWindowEx(0, + szEditTextPositionClass, + "Edit Test", WS_VISIBLE | + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, + 250, 250, + NULL, NULL, hinst, NULL); + assert(parentWnd); + ShowWindow( parentWnd, SW_SHOW); + /* single line */ + hWnd = CreateWindowEx(0, + "EDIT", + str, WS_VISIBLE | WS_BORDER | + WS_CHILD, + rc1.left, rc1.top, rc1.right - rc1.left, rc1.bottom - rc1.top, + parentWnd, NULL, NULL, NULL); + assert(hWnd); + GetClientRect( hWnd, &rc); + ok( rc.right == rc1.right - rc1.left && rc.bottom == rc1.bottom - rc1.top, + "Client rectangle not the expected size (%d,%d,%d,%d)\n", + rc.left, rc.top, rc.right, rc.bottom); len = SendMessageA(hWnd, WM_GETTEXTLENGTH, 0, 0); ok(lstrlenA(str) == len, "text shouldn't have been truncated\n"); DestroyWindow(hWnd); - + /* multi line */ hWnd = CreateWindowEx(0, "EDIT", str, - ES_MULTILINE, - 10, 10, 1, 1, - NULL, NULL, NULL, NULL); + WS_CHILD | ES_MULTILINE, + rc1.left, rc1.top, rc1.right - rc1.left, rc1.bottom - rc1.top, + parentWnd, NULL, NULL, NULL); assert(hWnd); - + GetClientRect( hWnd, &rc); + ok( rc.right == rc1.right - rc1.left && rc.bottom == rc1.bottom - rc1.top, + "Client rectangle not the expected size (%d,%d,%d,%d)\n", + rc.left, rc.top, rc.right, rc.bottom); len = SendMessageA(hWnd, WM_GETTEXTLENGTH, 0, 0); ok(lstrlenA(str) == len, "text shouldn't have been truncated\n"); DestroyWindow(hWnd); diff --git a/rostests/winetests/user32/input.c b/rostests/winetests/user32/input.c index 889244f0e3a..2ad3eae7d10 100755 --- a/rostests/winetests/user32/input.c +++ b/rostests/winetests/user32/input.c @@ -58,7 +58,7 @@ /* globals */ static HWND hWndTest; -static long timetag = 0x10000000; +static LONG timetag = 0x10000000; static UINT (WINAPI *pSendInput) (UINT, INPUT*, size_t); static int (WINAPI *pGetMouseMovePointsEx) (UINT, LPMOUSEMOVEPOINT, LPMOUSEMOVEPOINT, int, DWORD); @@ -573,6 +573,7 @@ struct sendinput_test_s { {{VK_MENU, 0x00}, {VK_LMENU, 0x00}, {VK_CONTROL, 0x00, 1}, {VK_LCONTROL, 0x01, 1}, {0}}, {{WM_SYSKEYDOWN, hook|wparam|optional, VK_LCONTROL}, {WM_SYSKEYDOWN, hook|wparam, VK_RMENU}, + {WM_KEYDOWN, wparam|lparam|optional, VK_CONTROL, 0}, {WM_SYSKEYDOWN, wparam|lparam, VK_MENU, 0}, {0}}}, {VK_RMENU, KEYEVENTF_KEYUP, 1, {{VK_MENU, 0x80}, {VK_LMENU, 0x80}, {VK_CONTROL, 0x81, 1}, {VK_LCONTROL, 0x80, 1}, {0}}, @@ -580,7 +581,7 @@ struct sendinput_test_s { {WM_KEYUP, hook|wparam, VK_RMENU}, {WM_SYSKEYUP, wparam|lparam|optional, VK_CONTROL, KF_UP}, {WM_SYSKEYUP, wparam|lparam, VK_MENU, KF_UP}, - {WM_SYSCOMMAND}, {0}}}, + {WM_SYSCOMMAND, optional}, {0}}}, /* LMENU | KEYEVENTF_EXTENDEDKEY == RMENU */ /* 40 */ {VK_LMENU, KEYEVENTF_EXTENDEDKEY, 0, @@ -598,6 +599,7 @@ struct sendinput_test_s { {{VK_MENU, 0x00}, {VK_RMENU, 0x00}, {VK_CONTROL, 0x00, 1}, {VK_LCONTROL, 0x01, 1}, {0}}, {{WM_SYSKEYDOWN, hook|wparam|lparam|optional, VK_LCONTROL, 0}, {WM_SYSKEYDOWN, hook|wparam|lparam, VK_RMENU, LLKHF_EXTENDED}, + {WM_KEYDOWN, wparam|lparam|optional, VK_CONTROL, 0}, {WM_SYSKEYDOWN, wparam|lparam, VK_MENU, KF_EXTENDED}, {0}}}, {VK_RMENU, KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY, 1, {{VK_MENU, 0x80}, {VK_RMENU, 0x80}, {VK_CONTROL, 0x81, 1}, {VK_LCONTROL, 0x80, 1}, {0}}, @@ -605,7 +607,7 @@ struct sendinput_test_s { {WM_KEYUP, hook|wparam|lparam, VK_RMENU, LLKHF_UP|LLKHF_EXTENDED}, {WM_SYSKEYUP, wparam|lparam|optional, VK_CONTROL, KF_UP}, {WM_SYSKEYUP, wparam|lparam, VK_MENU, KF_UP|KF_EXTENDED}, - {WM_SYSCOMMAND}, {0}}}, + {WM_SYSCOMMAND, optional}, {0}}}, /* MENU == LMENU */ /* 44 */ {VK_MENU, 0, 0, @@ -747,6 +749,25 @@ static void compare_and_check(int id, BYTE *ks1, BYTE *ks2, struct sendinput_tes expected++; continue; } + /* NT4 doesn't send SYSKEYDOWN/UP to hooks, only KEYDOWN/UP */ + else if ((expected->flags & hook) && + (expected->message == WM_SYSKEYDOWN || expected->message == WM_SYSKEYUP) && + (actual->message == expected->message - 4)) + { + ok((expected->flags & hook) == (actual->flags & hook), + "%2d (%x/%x): the msg 0x%04x should have been sent by a hook\n", + id, test->wVk, test->dwFlags, expected->message); + } + /* For VK_RMENU, at least localized Win2k/XP sends KEYDOWN/UP + * instead of SYSKEYDOWN/UP to the WNDPROC */ + else if (test->wVk == VK_RMENU && !(expected->flags & hook) && + (expected->message == WM_SYSKEYDOWN || expected->message == WM_SYSKEYUP) && + (actual->message == expected->message - 4)) + { + ok(expected->wParam == actual->wParam && expected->lParam == actual->lParam, + "%2d (%x/%x): the msg 0x%04x was expected, but got msg 0x%04x instead\n", + id, test->wVk, test->dwFlags, expected->message, actual->message); + } else if (test->_todo_wine) { failcount++; @@ -885,9 +906,12 @@ static void test_Input_blackbox(void) pSendInput(1, (INPUT*)&i, sizeof(TEST_INPUT)); empty_message_queue(); GetKeyboardState(ks2); - if (!ii && !sent_messages_cnt && !memcmp( ks1, ks2, sizeof(ks1) )) + if (!ii && sent_messages_cnt <= 1 && !memcmp( ks1, ks2, sizeof(ks1) )) { win_skip( "window doesn't receive the queued input\n" ); + /* release the key */ + i.u.ki.dwFlags |= KEYEVENTF_KEYUP; + pSendInput(1, (INPUT*)&i, sizeof(TEST_INPUT)); break; } compare_and_check(ii, ks1, ks2, &sendinput_test[ii]); @@ -913,7 +937,7 @@ static void test_keynames(void) static POINT pt_old, pt_new; static BOOL clipped; -#define STEP 20 +#define STEP 3 static LRESULT CALLBACK hook_proc1( int code, WPARAM wparam, LPARAM lparam ) { @@ -973,7 +997,11 @@ static void test_mouse_ll_hook(void) 10, 10, 200, 200, NULL, NULL, NULL, NULL); SetCursorPos(100, 100); - hook2 = SetWindowsHookExA(WH_MOUSE_LL, hook_proc2, GetModuleHandleA(0), 0); + if (!(hook2 = SetWindowsHookExA(WH_MOUSE_LL, hook_proc2, GetModuleHandleA(0), 0))) + { + win_skip( "cannot set MOUSE_LL hook\n" ); + goto done; + } hook1 = SetWindowsHookExA(WH_MOUSE_LL, hook_proc1, GetModuleHandleA(0), 0); GetCursorPos(&pt_old); @@ -1030,6 +1058,7 @@ static void test_mouse_ll_hook(void) ok(pt.x == pt_new.x && pt.y == pt_new.y, "Position changed: (%d,%d)\n", pt.x, pt.y); UnhookWindowsHookEx(hook2); +done: DestroyWindow(hwnd); SetCursorPos(pt_org.x, pt_org.y); } @@ -1058,6 +1087,11 @@ static void test_GetMouseMovePointsEx(void) */ SetLastError(MYERROR); retval = pGetMouseMovePointsEx(0, &in, out, BUFLIM, GMMP_USE_DISPLAY_POINTS); + if (retval == ERROR_INVALID_PARAMETER) + { + win_skip( "GetMouseMovePointsEx broken on WinME\n" ); + return; + } ok(retval == -1, "expected GetMouseMovePointsEx to fail, got %d\n", retval); ok(GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == MYERROR, "expected error ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); @@ -1097,11 +1131,10 @@ static void test_GetMouseMovePointsEx(void) SetLastError(MYERROR); count = 0; retval = pGetMouseMovePointsEx(sizeof(MOUSEMOVEPOINT), &in, NULL, count, GMMP_USE_DISPLAY_POINTS); - todo_wine { - ok(retval == count, "expected GetMouseMovePointsEx to succeed, got %d\n", retval); - ok(MYERROR == GetLastError(), - "expected error %d, got %u\n", MYERROR, GetLastError()); - } + if (retval == -1) + ok(GetLastError() == ERROR_POINT_NOT_FOUND, "unexpected error %u\n", GetLastError()); + else + ok(retval == count, "expected GetMouseMovePointsEx to succeed, got %d\n", retval); /* test fourth parameter * a value higher than 64 is expected to fail with ERROR_INVALID_PARAMETER @@ -1116,20 +1149,18 @@ static void test_GetMouseMovePointsEx(void) SetLastError(MYERROR); count = 0; retval = pGetMouseMovePointsEx(sizeof(MOUSEMOVEPOINT), &in, out, count, GMMP_USE_DISPLAY_POINTS); - todo_wine { - ok(retval == count, "expected GetMouseMovePointsEx to succeed, got %d\n", retval); - ok(MYERROR == GetLastError(), - "expected error %d, got %u\n", MYERROR, GetLastError()); - } + if (retval == -1) + ok(GetLastError() == ERROR_POINT_NOT_FOUND, "unexpected error %u\n", GetLastError()); + else + ok(retval == count, "expected GetMouseMovePointsEx to succeed, got %d\n", retval); SetLastError(MYERROR); count = BUFLIM; retval = pGetMouseMovePointsEx(sizeof(MOUSEMOVEPOINT), &in, out, count, GMMP_USE_DISPLAY_POINTS); - todo_wine { - ok((0 <= retval) && (retval <= count), "expected GetMouseMovePointsEx to succeed, got %d\n", retval); - ok(MYERROR == GetLastError(), - "expected error %d, got %u\n", MYERROR, GetLastError()); - } + if (retval == -1) + ok(GetLastError() == ERROR_POINT_NOT_FOUND, "unexpected error %u\n", GetLastError()); + else + ok((0 <= retval) && (retval <= count), "expected GetMouseMovePointsEx to succeed, got %d\n", retval); SetLastError(MYERROR); retval = pGetMouseMovePointsEx(sizeof(MOUSEMOVEPOINT), &in, out, BUFLIM+1, GMMP_USE_DISPLAY_POINTS); @@ -1265,6 +1296,19 @@ static void test_get_async_key_state(void) ok(0 == GetAsyncKeyState(-1000000), "GetAsyncKeyState did not return 0\n"); } +static void test_keyboard_layout_name(void) +{ + BOOL ret; + char klid[KL_NAMELENGTH]; + + if (GetKeyboardLayout(0) != (HKL)(ULONG_PTR)0x04090409) return; + + klid[0] = 0; + ret = GetKeyboardLayoutNameA(klid); + ok(ret, "GetKeyboardLayoutNameA failed %u\n", GetLastError()); + ok(!strcmp(klid, "00000409"), "expected 00000409, got %s\n", klid); +} + START_TEST(input) { init_function_pointers(); @@ -1281,6 +1325,7 @@ START_TEST(input) test_key_map(); test_ToUnicode(); test_get_async_key_state(); + test_keyboard_layout_name(); if(pGetMouseMovePointsEx) test_GetMouseMovePointsEx(); diff --git a/rostests/winetests/user32/menu.c b/rostests/winetests/user32/menu.c index 4d0e7d4ad3f..75059ea9068 100755 --- a/rostests/winetests/user32/menu.c +++ b/rostests/winetests/user32/menu.c @@ -40,6 +40,7 @@ static ATOM atomMenuCheckClass; static BOOL (WINAPI *pGetMenuInfo)(HMENU,LPCMENUINFO); static UINT (WINAPI *pSendInput)(UINT, INPUT*, size_t); static BOOL (WINAPI *pSetMenuInfo)(HMENU,LPCMENUINFO); +static BOOL (WINAPI *pEndMenu) (void); static void init_function_pointers(void) { @@ -53,6 +54,7 @@ static void init_function_pointers(void) GET_PROC(GetMenuInfo) GET_PROC(SendInput) GET_PROC(SetMenuInfo) + GET_PROC(EndMenu) #undef GET_PROC } @@ -114,6 +116,7 @@ typedef struct /* globals to communicate between test and wndproc */ static BOOL bMenuVisible; +static BOOL got_input; static HMENU hMenus[4]; #define MOD_SIZE 10 @@ -139,12 +142,25 @@ static int MOD_odheight; static SIZE MODsizes[MOD_NRMENUS]= { {MOD_SIZE, MOD_SIZE},{MOD_SIZE, MOD_SIZE}, {MOD_SIZE, MOD_SIZE},{MOD_SIZE, MOD_SIZE}}; static int MOD_GotDrawItemMsg = FALSE; +static int gflag_initmenupopup, + gflag_entermenuloop, + gflag_initmenu; + /* wndproc used by test_menu_ownerdraw() */ static LRESULT WINAPI menu_ownerdraw_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) { + case WM_INITMENUPOPUP: + gflag_initmenupopup++; + break; + case WM_ENTERMENULOOP: + gflag_entermenuloop++; + break; + case WM_INITMENU: + gflag_initmenu++; + break; case WM_MEASUREITEM: { MEASUREITEMSTRUCT* pmis = (MEASUREITEMSTRUCT*)lparam; @@ -211,6 +227,8 @@ static LRESULT WINAPI menu_ownerdraw_wnd_proc(HWND hwnd, UINT msg, } case WM_ENTERIDLE: { + ok( lparam || broken(!lparam), /* win9x, nt4 */ + "Menu window handle is NULL!\n"); PostMessage(hwnd, WM_CANCELMODE, 0, 0); return TRUE; } @@ -262,7 +280,7 @@ static void test_menu_locked_by_window(void) ok(ret, "DrawMenuBar failed with error %d\n", GetLastError()); } ret = IsMenu(GetMenu(hwnd)); - ok(!ret, "Menu handle should have been destroyed\n"); + ok(!ret || broken(ret) /* nt4 */, "Menu handle should have been destroyed\n"); SendMessage(hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); /* did we process the WM_INITMENU message? */ @@ -274,6 +292,105 @@ static void test_menu_locked_by_window(void) DestroyWindow(hwnd); } +/* demonstrates that subpopup's are locked + * even after a client calls DestroyMenu on it */ +static LRESULT WINAPI subpopuplocked_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + HWND hwndmenu; + switch (msg) + { + case WM_ENTERIDLE: + hwndmenu = GetCapture(); + if( hwndmenu) { + PostMessage( hwndmenu, WM_KEYDOWN, VK_DOWN, 0); + PostMessage( hwndmenu, WM_KEYDOWN, VK_RIGHT, 0); + PostMessage( hwndmenu, WM_KEYDOWN, VK_RETURN, 0); + } + } + return DefWindowProc(hwnd, msg, wparam, lparam); +} + +static void test_subpopup_locked_by_menu(void) +{ + DWORD gle; + BOOL ret; + HMENU hmenu, hsubmenu; + MENUINFO mi = { sizeof( MENUINFO)}; + MENUITEMINFO mii = { sizeof( MENUITEMINFO)}; + HWND hwnd; + const int itemid = 0x1234567; + if( !pGetMenuInfo) + { + win_skip("GetMenuInfo is not available\n"); + return; + } + /* create window, popupmenu with one subpopup */ + hwnd = CreateWindowEx(0, MAKEINTATOM(atomMenuCheckClass), NULL, + WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, + NULL, NULL, NULL, NULL); + ok(hwnd != NULL, "CreateWindowEx failed with error %d\n", GetLastError()); + SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR) subpopuplocked_wnd_proc); + hmenu = CreatePopupMenu(); + ok(hmenu != NULL, "CreateMenu failed with error %d\n", GetLastError()); + hsubmenu = CreatePopupMenu(); + ok(hsubmenu != NULL, "CreateMenu failed with error %d\n", GetLastError()); + ret = InsertMenu(hmenu, 0, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR)hsubmenu, + TEXT("PopUpLockTest")); + ok(ret, "InsertMenu failed with error %d\n", GetLastError()); + ret = InsertMenu(hsubmenu, 0, MF_BYPOSITION | MF_STRING, itemid, TEXT("PopUpMenu")); + ok(ret, "InsertMenu failed with error %d\n", GetLastError()); + /* first some tests that all this functions properly */ + mii.fMask = MIIM_SUBMENU; + ret = GetMenuItemInfo( hmenu, 0, TRUE, &mii); + ok( ret, "GetMenuItemInfo failed error %d\n", GetLastError()); + ok( mii.hSubMenu == hsubmenu, "submenu is %p\n", mii.hSubMenu); + mi.fMask |= MIM_STYLE; + ret = pGetMenuInfo( hsubmenu, &mi); + ok( ret , "GetMenuInfo returned 0 with error %d\n", GetLastError()); + ret = IsMenu( hsubmenu); + ok( ret , "Menu handle is not valid\n"); + SetLastError( 0xdeadbeef); + ret = TrackPopupMenu( hmenu, 0x100, 100,100, 0, hwnd, NULL); + if( ret == (itemid & 0xffff)) { + win_skip("not on 16 bit menu subsystem\n"); + DestroyMenu( hsubmenu); + } else { + gle = GetLastError(); + ok( ret == itemid , "TrackPopupMenu returned %d error is %d\n", ret, gle); + ok( gle == 0 || + broken( gle == 0xdeadbeef), /* win2k0 */ + "Last error is %d\n", gle); + /* then destroy the sub-popup */ + ret = DestroyMenu( hsubmenu); + ok(ret, "DestroyMenu failed with error %d\n", GetLastError()); + /* and repeat the tests */ + mii.fMask = MIIM_SUBMENU; + ret = GetMenuItemInfo( hmenu, 0, TRUE, &mii); + ok( ret, "GetMenuItemInfo failed error %d\n", GetLastError()); + /* GetMenuInfo fails now */ + ok( mii.hSubMenu == hsubmenu, "submenu is %p\n", mii.hSubMenu); + mi.fMask |= MIM_STYLE; + ret = pGetMenuInfo( hsubmenu, &mi); + ok( !ret , "GetMenuInfo should have failed\n"); + /* IsMenu says it is not */ + ret = IsMenu( hsubmenu); + ok( !ret , "Menu handle should be invalid\n"); + /* but TrackPopupMenu still works! */ + SetLastError( 0xdeadbeef); + ret = TrackPopupMenu( hmenu, 0x100, 100,100, 0, hwnd, NULL); + gle = GetLastError(); + todo_wine { + ok( ret == itemid , "TrackPopupMenu returned %d error is %d\n", ret, gle); + } + ok( gle == 0 || + broken( gle == ERROR_INVALID_PARAMETER), /* win2k0 */ + "Last error is %d\n", gle); + } + /* clean up */ + DestroyMenu( hmenu); + DestroyWindow(hwnd); +} + static void test_menu_ownerdraw(void) { int i,j,k; @@ -433,7 +550,7 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt, sprintf( buf,"%d text \"%s\" mnuopt %d", count, text ? text: "(nil)", mnuopt); FillRect( hdc, &rc, (HBRUSH) COLOR_WINDOW); - TextOut( hdc, 100, 50, buf, strlen( buf)); + TextOut( hdc, 10, 50, buf, strlen( buf)); ReleaseDC( hwnd, hdc); } if(ispop) @@ -445,13 +562,17 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt, } ret = GetMenuItemRect( hwnd, hmenu, 0, &rc); if (0) /* comment out menu size checks, behavior is different in almost every Windows version */ + /* the tests should however succeed on win2000, XP and Wine (at least up to 1.1.15) */ + /* with a variety of dpis and desktop font sizes */ { /* check menu width */ if( ispop) expect = ( text || hbmp ? 4 + (mnuopt != 1 ? GetSystemMetrics(SM_CXMENUCHECK) : 0) : 0) + - arrowwidth + MOD_avec + (hbmp ? bmpsize.cx + 2 : 0) + + arrowwidth + MOD_avec + (hbmp ? + ((int)hbmp<0||(int)hbmp>12 ? bmpsize.cx + 2 : GetSystemMetrics( SM_CXMENUSIZE) + 2) + : 0) + (text && hastab ? /* TAB space */ MOD_avec + ( hastab==2 ? sc_size.cx : 0) : 0) + (text ? 2 + (text[0] ? size.cx :0): 0) ; @@ -466,7 +587,11 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt, if( ispop) expect = max( ( !(text || hbmp) ? GetSystemMetrics( SM_CYMENUSIZE)/2 : 0), max( (text ? max( 2 + size.cy, MOD_hic + 4) : 0), - (hbmp ? bmpsize.cy + 2 : 0))); + (hbmp ? + ((int)hbmp<0||(int)hbmp>12 ? + bmpsize.cy + 2 + : GetSystemMetrics( SM_CYMENUSIZE) + 2) + : 0))); else expect = ( !(text || hbmp) ? GetSystemMetrics( SM_CYMENUSIZE)/2 : max( GetSystemMetrics( SM_CYMENU) - 1, (hbmp ? bmpsize.cy : 0))); @@ -497,8 +622,8 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt, } /* if there was a failure, report details */ if( failed) { - trace("*** count %d text \"%s\" bitmap %p bmsize %d,%d textsize %d+%d,%d mnuopt %d hastab %d\n", - count, text ? text: "(nil)", hbmp, bmpsize.cx, bmpsize.cy, + trace("*** count %d %s text \"%s\" bitmap %p bmsize %d,%d textsize %d+%d,%d mnuopt %d hastab %d\n", + count, (ispop? "POPUP": "MENUBAR"),text ? text: "(nil)", hbmp, bmpsize.cx, bmpsize.cy, size.cx, size.cy, sc_size.cx, mnuopt, hastab); trace(" check %d,%d arrow %d avechar %d\n", GetSystemMetrics(SM_CXMENUCHECK ), @@ -523,6 +648,9 @@ static void test_menu_bmp_and_string(void) BITMAP bm; INT arrowwidth; HWND hwnd; + HMENU hsysmenu; + MENUINFO mi= {sizeof(MENUINFO)}; + MENUITEMINFOA mii= {sizeof(MENUITEMINFOA)}; int count, szidx, txtidx, bmpidx, hassub, mnuopt, ispop; if( !pGetMenuInfo) @@ -532,15 +660,28 @@ static void test_menu_bmp_and_string(void) } memset( bmfill, 0xcc, sizeof( bmfill)); - hwnd = CreateWindowEx(0, MAKEINTATOM(atomMenuCheckClass), NULL, + hwnd = CreateWindowEx(0, MAKEINTATOM(atomMenuCheckClass), NULL, WS_SYSMENU | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL, NULL, NULL); hbm_arrow=LoadBitmap( 0, (CHAR*)OBM_MNARROW); GetObject( hbm_arrow, sizeof(bm), &bm); arrowwidth = bm.bmWidth; - ok(hwnd != NULL, "CreateWindowEx failed with error %d\n", GetLastError()); if( !hwnd) return; + /* test system menu */ + hsysmenu = GetSystemMenu( hwnd, FALSE); + ok( hsysmenu != NULL, "GetSystemMenu failed with error %d\n", GetLastError()); + mi.fMask = MIM_STYLE; + mi.dwStyle = 0; + ok( pGetMenuInfo( hsysmenu, &mi), "GetMenuInfo failed gle=%d\n", GetLastError()); + ok( MNS_CHECKORBMP == mi.dwStyle, "System Menu Style is %08x, without the bit %08x\n", + mi.dwStyle, MNS_CHECKORBMP); + mii.fMask = MIIM_BITMAP; + mii.hbmpItem = NULL; + ok( GetMenuItemInfoA( hsysmenu, SC_CLOSE, FALSE, &mii), "GetMenuItemInfoA failed gle=%d\n", GetLastError()); + ok( HBMMENU_POPUP_CLOSE == mii.hbmpItem, "Item info did not get the right hbitmap: got %p expected %p\n", + mii.hbmpItem, HBMMENU_POPUP_CLOSE); + SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)menu_ownerdraw_wnd_proc); if( winetest_debug) @@ -554,7 +695,7 @@ static void test_menu_bmp_and_string(void) {10,10},{38,38},{1,30},{55,5}}; for( szidx=0; szidx < sizeof( bmsizes) / sizeof( SIZE); szidx++) { HBITMAP hbm = CreateBitmap( bmsizes[szidx].cx, bmsizes[szidx].cy,1,1,bmfill); - HBITMAP bitmaps[] = { HBMMENU_CALLBACK, hbm, NULL }; + HBITMAP bitmaps[] = { HBMMENU_CALLBACK, hbm, HBMMENU_POPUP_CLOSE, NULL }; ok( hbm != 0, "CreateBitmap failed err %d\n", GetLastError()); for( txtidx = 0; txtidx < sizeof(MOD_txtsizes)/sizeof(MOD_txtsizes[0]); txtidx++) { for( hassub = 0; hassub < 2 ; hassub++) { /* add submenu item */ @@ -562,6 +703,10 @@ static void test_menu_bmp_and_string(void) for( bmpidx = 0; bmpidx 0) continue; + /* the HBMMENU_POPUP not to test for menu bars */ + if( !ispop && + bitmaps[bmpidx] >= HBMMENU_POPUP_CLOSE && + bitmaps[bmpidx] <= HBMMENU_POPUP_MINIMIZE) continue; if( !ispop && hassub) continue; test_mbs_help( ispop, hassub, mnuopt, hwnd, arrowwidth, ++count, @@ -1719,23 +1864,23 @@ static struct menu_mouse_tests_s { BOOL _todo_wine; } menu_tests[] = { /* for each test, send keys or clicks and check for menu visibility */ - { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 0}, TRUE, FALSE }, /* test 0 */ + { INPUT_KEYBOARD, {{0}}, {VK_MENU, 0}, TRUE, FALSE }, /* test 0 */ { INPUT_KEYBOARD, {{0}}, {VK_ESCAPE, 0}, FALSE, FALSE }, - { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 0}, TRUE, FALSE }, + { INPUT_KEYBOARD, {{0}}, {VK_MENU, 0}, TRUE, FALSE }, { INPUT_KEYBOARD, {{0}}, {'D', 0}, FALSE, FALSE }, - { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 0}, TRUE, FALSE }, + { INPUT_KEYBOARD, {{0}}, {VK_MENU, 0}, TRUE, FALSE }, { INPUT_KEYBOARD, {{0}}, {'E', 0}, FALSE, FALSE }, - { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 'M', 0}, TRUE, FALSE }, + { INPUT_KEYBOARD, {{0}}, {VK_MENU, 'M', 0}, TRUE, FALSE }, { INPUT_KEYBOARD, {{0}}, {VK_ESCAPE, VK_ESCAPE, 0}, FALSE, FALSE }, - { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 'M', VK_ESCAPE, 0}, TRUE, FALSE }, + { INPUT_KEYBOARD, {{0}}, {VK_MENU, 'M', VK_ESCAPE, 0}, TRUE, FALSE }, { INPUT_KEYBOARD, {{0}}, {VK_ESCAPE, 0}, FALSE, FALSE }, - { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 'M', 0}, TRUE, FALSE }, + { INPUT_KEYBOARD, {{0}}, {VK_MENU, 'M', 0}, TRUE, FALSE }, { INPUT_KEYBOARD, {{0}}, {'D', 0}, FALSE, FALSE }, - { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 'M', 0}, TRUE, FALSE }, + { INPUT_KEYBOARD, {{0}}, {VK_MENU, 'M', 0}, TRUE, FALSE }, { INPUT_KEYBOARD, {{0}}, {'E', 0}, FALSE, FALSE }, - { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 'M', 'P', 0}, TRUE, FALSE }, + { INPUT_KEYBOARD, {{0}}, {VK_MENU, 'M', 'P', 0}, TRUE, FALSE }, { INPUT_KEYBOARD, {{0}}, {'D', 0}, FALSE, FALSE }, - { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 'M', 'P', 0}, TRUE, FALSE }, + { INPUT_KEYBOARD, {{0}}, {VK_MENU, 'M', 'P', 0}, TRUE, FALSE }, { INPUT_KEYBOARD, {{0}}, {'E', 0}, FALSE, FALSE }, { INPUT_MOUSE, {{1, 2}, {0}}, {0}, TRUE, TRUE }, /* test 18 */ @@ -1762,7 +1907,7 @@ static void send_key(WORD wVk) pSendInput(2, (INPUT *) i, sizeof(INPUT)); } -static void click_menu(HANDLE hWnd, struct menu_item_pair_s *mi) +static BOOL click_menu(HANDLE hWnd, struct menu_item_pair_s *mi) { HMENU hMenu = hMenus[mi->uMenu]; TEST_INPUT i[3]; @@ -1771,7 +1916,7 @@ static void click_menu(HANDLE hWnd, struct menu_item_pair_s *mi) int screen_w = GetSystemMetrics(SM_CXSCREEN); int screen_h = GetSystemMetrics(SM_CYSCREEN); BOOL ret = GetMenuItemRect(mi->uMenu > 2 ? NULL : hWnd, hMenu, mi->uItem, &r); - if(!ret) return; + if(!ret) return FALSE; memset(i, 0, sizeof(i)); i[0].type = i[1].type = i[2].type = INPUT_MOUSE; @@ -1784,10 +1929,11 @@ static void click_menu(HANDLE hWnd, struct menu_item_pair_s *mi) i[0].u.mi.dwFlags |= MOUSEEVENTF_MOVE; i[1].u.mi.dwFlags |= MOUSEEVENTF_LEFTDOWN; i[2].u.mi.dwFlags |= MOUSEEVENTF_LEFTUP; - pSendInput(3, (INPUT *) i, sizeof(INPUT)); + ret = pSendInput(3, (INPUT *) i, sizeof(INPUT)); /* hack to prevent mouse message buildup in Wine */ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + return ret; } static DWORD WINAPI test_menu_input_thread(LPVOID lpParameter) @@ -1799,15 +1945,23 @@ static DWORD WINAPI test_menu_input_thread(LPVOID lpParameter) /* mixed keyboard/mouse test */ for (i = 0; menu_tests[i].type != -1; i++) { - int elapsed = 0; + int ret = TRUE, elapsed = 0; + + got_input = i && menu_tests[i-1].bMenuVisible; if (menu_tests[i].type == INPUT_KEYBOARD) for (j = 0; menu_tests[i].wVk[j] != 0; j++) send_key(menu_tests[i].wVk[j]); else for (j = 0; menu_tests[i].menu_item_pairs[j].uMenu != 0; j++) - click_menu(hWnd, &menu_tests[i].menu_item_pairs[j]); + if (!(ret = click_menu(hWnd, &menu_tests[i].menu_item_pairs[j]))) break; + if (!ret) + { + skip( "test %u: failed to send input\n", i ); + PostMessage( hWnd, WM_CANCELMODE, 0, 0 ); + return 0; + } while (menu_tests[i].bMenuVisible != bMenuVisible) { if (elapsed > 200) @@ -1816,6 +1970,13 @@ static DWORD WINAPI test_menu_input_thread(LPVOID lpParameter) Sleep(20); } + if (!got_input) + { + skip( "test %u: didn't receive input\n", i ); + PostMessage( hWnd, WM_CANCELMODE, 0, 0 ); + return 0; + } + if (menu_tests[i]._todo_wine) { todo_wine { @@ -1838,6 +1999,16 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, case WM_EXITMENULOOP: bMenuVisible = FALSE; break; + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + case WM_MOUSEMOVE: + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_NCMOUSEMOVE: + case WM_NCLBUTTONDOWN: + case WM_NCLBUTTONUP: + got_input = TRUE; + /* fall through */ default: return( DefWindowProcA( hWnd, msg, wParam, lParam ) ); } @@ -2404,6 +2575,363 @@ static void test_InsertMenu(void) #undef compare_menu } +static void test_menu_getmenuinfo(void) +{ + HMENU hmenu; + MENUINFO mi = {0}; + BOOL ret; + DWORD gle; + + /* create a menu */ + hmenu = CreateMenu(); + assert( hmenu); + /* test some parameter errors */ + SetLastError(0xdeadbeef); + ret = pGetMenuInfo( hmenu, NULL); + gle= GetLastError(); + ok( !ret, "GetMenuInfo() should have failed\n"); + ok( gle == ERROR_INVALID_PARAMETER || + broken(gle == 0xdeadbeef), /* Win98, WinME */ + "GetMenuInfo() error got %u expected %u\n", gle, ERROR_INVALID_PARAMETER); + SetLastError(0xdeadbeef); + mi.cbSize = 0; + ret = pGetMenuInfo( hmenu, &mi); + gle= GetLastError(); + ok( !ret, "GetMenuInfo() should have failed\n"); + ok( gle == ERROR_INVALID_PARAMETER || + broken(gle == 0xdeadbeef), /* Win98, WinME */ + "GetMenuInfo() error got %u expected %u\n", gle, ERROR_INVALID_PARAMETER); + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + ret = pGetMenuInfo( hmenu, &mi); + gle= GetLastError(); + ok( ret, "GetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "GetMenuInfo() error got %u\n", gle); + SetLastError(0xdeadbeef); + mi.cbSize = 0; + ret = pGetMenuInfo( NULL, &mi); + gle= GetLastError(); + ok( !ret, "GetMenuInfo() should have failed\n"); + ok( gle == ERROR_INVALID_PARAMETER || + broken(gle == 0xdeadbeef), /* Win98, WinME */ + "GetMenuInfo() error got %u expected %u\n", gle, ERROR_INVALID_PARAMETER); + /* clean up */ + DestroyMenu( hmenu); + return; +} + +static void test_menu_setmenuinfo(void) +{ + HMENU hmenu, hsubmenu; + MENUINFO mi = {0}; + MENUITEMINFOA mii = {sizeof( MENUITEMINFOA)}; + BOOL ret; + DWORD gle; + + /* create a menu with a submenu */ + hmenu = CreateMenu(); + hsubmenu = CreateMenu(); + assert( hmenu && hsubmenu); + mii.fMask = MIIM_SUBMENU; + mii.hSubMenu = hsubmenu; + ret = InsertMenuItem( hmenu, 0, FALSE, &mii); + ok( ret, "InsertMenuItem failed with error %d\n", GetLastError()); + /* test some parameter errors */ + SetLastError(0xdeadbeef); + ret = pSetMenuInfo( hmenu, NULL); + gle= GetLastError(); + ok( !ret, "SetMenuInfo() should have failed\n"); + ok( gle == ERROR_INVALID_PARAMETER || + broken(gle == 0xdeadbeef), /* Win98, WinME */ + "SetMenuInfo() error got %u expected %u\n", gle, ERROR_INVALID_PARAMETER); + SetLastError(0xdeadbeef); + mi.cbSize = 0; + ret = pSetMenuInfo( hmenu, &mi); + gle= GetLastError(); + ok( !ret, "SetMenuInfo() should have failed\n"); + ok( gle == ERROR_INVALID_PARAMETER || + broken(gle == 0xdeadbeef), /* Win98, WinME */ + "SetMenuInfo() error got %u expected %u\n", gle, ERROR_INVALID_PARAMETER); + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + ret = pSetMenuInfo( hmenu, &mi); + gle= GetLastError(); + ok( ret, "SetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "SetMenuInfo() error got %u\n", gle); + SetLastError(0xdeadbeef); + mi.cbSize = 0; + ret = pSetMenuInfo( NULL, &mi); + gle= GetLastError(); + ok( !ret, "SetMenuInfo() should have failed\n"); + ok( gle == ERROR_INVALID_PARAMETER || + broken(gle == 0xdeadbeef), /* Win98, WinME */ + "SetMenuInfo() error got %u expected %u\n", gle, ERROR_INVALID_PARAMETER); + /* functional tests */ + /* menu and submenu should have the CHECKORBMP style bit cleared */ + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + mi.fMask = MIM_STYLE; + ret = pGetMenuInfo( hmenu, &mi); + gle= GetLastError(); + ok( ret, "GetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "GetMenuInfo() error got %u\n", gle); + ok( !(mi.dwStyle & MNS_CHECKORBMP), "menustyle was not expected to have the MNS_CHECKORBMP flag\n"); + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + mi.fMask = MIM_STYLE; + ret = pGetMenuInfo( hsubmenu, &mi); + gle= GetLastError(); + ok( ret, "GetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "GetMenuInfo() error got %u\n", gle); + ok( !(mi.dwStyle & MNS_CHECKORBMP), "menustyle was not expected to have the MNS_CHECKORBMP flag\n"); + /* SetMenuInfo() */ + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + mi.fMask = MIM_STYLE | MIM_APPLYTOSUBMENUS; + mi.dwStyle = MNS_CHECKORBMP; + ret = pSetMenuInfo( hmenu, &mi); + gle= GetLastError(); + ok( ret, "SetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "SetMenuInfo() error got %u\n", gle); + /* Now both menus should have the MNS_CHECKORBMP style bit set */ + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + mi.fMask = MIM_STYLE; + ret = pGetMenuInfo( hmenu, &mi); + gle= GetLastError(); + ok( ret, "GetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "GetMenuInfo() error got %u\n", gle); + ok( mi.dwStyle & MNS_CHECKORBMP, "menustyle was expected to have the MNS_CHECKORBMP flag\n"); + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + mi.fMask = MIM_STYLE; + ret = pGetMenuInfo( hsubmenu, &mi); + gle= GetLastError(); + ok( ret, "GetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "GetMenuInfo() error got %u\n", gle); + ok( mi.dwStyle & MNS_CHECKORBMP, "menustyle was expected to have the MNS_CHECKORBMP flag\n"); + /* now repeat that without the APPLYTOSUBMENUS flag and another style bit */ + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + mi.fMask = MIM_STYLE ; + mi.dwStyle = MNS_NOCHECK; + ret = pSetMenuInfo( hmenu, &mi); + gle= GetLastError(); + ok( ret, "SetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "SetMenuInfo() error got %u\n", gle); + /* Now only the top menu should have the MNS_NOCHECK style bit set */ + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + mi.fMask = MIM_STYLE; + ret = pGetMenuInfo( hmenu, &mi); + gle= GetLastError(); + ok( ret, "GetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "GetMenuInfo() error got %u\n", gle); + ok( mi.dwStyle & MNS_NOCHECK, "menustyle was expected to have the MNS_NOCHECK flag\n"); + SetLastError(0xdeadbeef); + mi.cbSize = sizeof( MENUINFO); + mi.fMask = MIM_STYLE; + ret = pGetMenuInfo( hsubmenu, &mi); + gle= GetLastError(); + ok( ret, "GetMenuInfo() should have succeeded\n"); + ok( gle == 0xdeadbeef, "GetMenuInfo() error got %u\n", gle); + ok( !(mi.dwStyle & MNS_NOCHECK), "menustyle was not expected to have the MNS_NOCHECK flag\n"); + /* clean up */ + DestroyMenu( hsubmenu); + DestroyMenu( hmenu); + return; +} + +/* little func to easy switch either TrackPopupMenu() or TrackPopupMenuEx() */ +static DWORD MyTrackPopupMenu( int ex, HMENU hmenu, UINT flags, INT x, INT y, HWND hwnd, LPTPMPARAMS ptpm) +{ + return ex + ? TrackPopupMenuEx( hmenu, flags, x, y, hwnd, ptpm) + : TrackPopupMenu( hmenu, flags, x, y, 0, hwnd, NULL); +} + +/* some TrackPopupMenu and TrackPopupMenuEx tests */ +/* the LastError values differ between NO_ERROR and invalid handle */ +/* between all windows versions tested. The first value is that valid on XP */ +/* Vista was the only that made returned different error values */ +/* between the TrackPopupMenu and TrackPopupMenuEx functions */ +static void test_menu_trackpopupmenu(void) +{ + BOOL ret; + HMENU hmenu; + DWORD gle; + int Ex; + HWND hwnd = CreateWindowEx(0, MAKEINTATOM(atomMenuCheckClass), NULL, + WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, + NULL, NULL, NULL, NULL); + ok(hwnd != NULL, "CreateWindowEx failed with error %d\n", GetLastError()); + if (!hwnd) return; + SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)menu_ownerdraw_wnd_proc); + for( Ex = 0; Ex < 2; Ex++) + { + hmenu = CreatePopupMenu(); + ok(hmenu != NULL, "CreateMenu failed with error %d\n", GetLastError()); + if (!hmenu) + { + DestroyWindow(hwnd); + return; + } + /* display the menu */ + /* start with an invalid menu handle */ + gle = 0xdeadbeef; + gflag_initmenupopup = gflag_entermenuloop = gflag_initmenu = 0; + ret = MyTrackPopupMenu( Ex, NULL, 0x100, 100,100, hwnd, NULL); + gle = GetLastError(); + ok( !ret, "TrackPopupMenu%s should have failed\n", Ex ? "Ex" : ""); + ok( gle == ERROR_INVALID_MENU_HANDLE + || broken (gle == 0xdeadbeef) /* win95 */ + || broken (gle == NO_ERROR) /* win98/ME */ + ,"TrackPopupMenu%s error got %u expected %u\n", + Ex ? "Ex" : "", gle, ERROR_INVALID_MENU_HANDLE); + ok( !(gflag_initmenupopup || gflag_entermenuloop || gflag_initmenu), + "got unexpected message(s)%s%s%s\n", + gflag_initmenupopup ? " WM_INITMENUPOPUP ": " ", + gflag_entermenuloop ? "WM_INITMENULOOP ": "", + gflag_initmenu ? "WM_INITMENU": ""); + /* another one but not NULL */ + gle = 0xdeadbeef; + gflag_initmenupopup = gflag_entermenuloop = gflag_initmenu = 0; + ret = MyTrackPopupMenu( Ex, (HMENU)hwnd, 0x100, 100,100, hwnd, NULL); + gle = GetLastError(); + ok( !ret, "TrackPopupMenu%s should have failed\n", Ex ? "Ex" : ""); + ok( gle == ERROR_INVALID_MENU_HANDLE + || broken (gle == 0xdeadbeef) /* win95 */ + || broken (gle == NO_ERROR) /* win98/ME */ + ,"TrackPopupMenu%s error got %u expected %u\n", + Ex ? "Ex" : "", gle, ERROR_INVALID_MENU_HANDLE); + ok( !(gflag_initmenupopup || gflag_entermenuloop || gflag_initmenu), + "got unexpected message(s)%s%s%s\n", + gflag_initmenupopup ? " WM_INITMENUPOPUP ": " ", + gflag_entermenuloop ? "WM_INITMENULOOP ": "", + gflag_initmenu ? "WM_INITMENU": ""); + /* now a somewhat successful call */ + gle = 0xdeadbeef; + gflag_initmenupopup = gflag_entermenuloop = gflag_initmenu = 0; + ret = MyTrackPopupMenu( Ex, hmenu, 0x100, 100,100, hwnd, NULL); + gle = GetLastError(); + ok( ret == 0, "TrackPopupMenu%s returned %d expected zero\n", Ex ? "Ex" : "", ret); + ok( gle == NO_ERROR + || gle == ERROR_INVALID_MENU_HANDLE /* NT4, win2k */ + || broken (gle == 0xdeadbeef) /* win95 */ + ,"TrackPopupMenu%s error got %u expected %u or %u\n", + Ex ? "Ex" : "", gle, NO_ERROR, ERROR_INVALID_MENU_HANDLE); + ok( gflag_initmenupopup && gflag_entermenuloop && gflag_initmenu, + "missed expected message(s)%s%s%s\n", + !gflag_initmenupopup ? " WM_INITMENUPOPUP ": " ", + !gflag_entermenuloop ? "WM_INITMENULOOP ": "", + !gflag_initmenu ? "WM_INITMENU": ""); + /* and another */ + ret = AppendMenuA( hmenu, MF_STRING, 1, "winetest"); + ok( ret, "AppendMenA has failed!\n"); + gle = 0xdeadbeef; + gflag_initmenupopup = gflag_entermenuloop = gflag_initmenu = 0; + ret = MyTrackPopupMenu( Ex, hmenu, 0x100, 100,100, hwnd, NULL); + gle = GetLastError(); + ok( ret == 0, "TrackPopupMenu%s returned %d expected zero\n", Ex ? "Ex" : "", ret); + ok( gle == NO_ERROR + || gle == ERROR_INVALID_MENU_HANDLE /* NT4, win2k and Vista in the TrackPopupMenuEx case */ + || broken (gle == 0xdeadbeef) /* win95 */ + ,"TrackPopupMenu%s error got %u expected %u or %u\n", + Ex ? "Ex" : "", gle, NO_ERROR, ERROR_INVALID_MENU_HANDLE); + ok( gflag_initmenupopup && gflag_entermenuloop && gflag_initmenu, + "missed expected message(s)%s%s%s\n", + !gflag_initmenupopup ? " WM_INITMENUPOPUP ": " ", + !gflag_entermenuloop ? "WM_INITMENULOOP ": "", + !gflag_initmenu ? "WM_INITMENU": ""); + DestroyMenu(hmenu); + } + /* clean up */ + DestroyWindow(hwnd); +} + +/* test handling of WM_CANCELMODE messages */ +static int g_got_enteridle; +static HWND g_hwndtosend; +static LRESULT WINAPI menu_cancelmode_wnd_proc(HWND hwnd, UINT msg, + WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_ENTERMENULOOP: + g_got_enteridle = 0; + return SendMessage( g_hwndtosend, WM_CANCELMODE, 0, 0); + case WM_ENTERIDLE: + { + if( g_got_enteridle++ == 0) { + /* little hack to get another WM_ENTERIDLE message */ + PostMessage( hwnd, WM_MOUSEMOVE, 0, 0); + return SendMessage( g_hwndtosend, WM_CANCELMODE, 0, 0); + } + pEndMenu(); + return TRUE; + } + } + return DefWindowProc( hwnd, msg, wparam, lparam); +} + +static void test_menu_cancelmode(void) +{ + DWORD ret; + HWND hwnd, hwndchild; + HMENU menu; + if( !pEndMenu) { /* win95 */ + win_skip( "EndMenu is not available\n"); + return; + } + hwnd = CreateWindowEx( 0, MAKEINTATOM(atomMenuCheckClass), NULL, + WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, + NULL, NULL, NULL, NULL); + hwndchild = CreateWindowEx( 0, MAKEINTATOM(atomMenuCheckClass), NULL, + WS_VISIBLE | WS_CHILD, 10, 10, 20, 20, + hwnd, NULL, NULL, NULL); + ok( hwnd != NULL && hwndchild != NULL, + "CreateWindowEx failed with error %d\n", GetLastError()); + g_hwndtosend = hwnd; + SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)menu_cancelmode_wnd_proc); + SetWindowLongPtr( hwndchild, GWLP_WNDPROC, (LONG_PTR)menu_cancelmode_wnd_proc); + menu = CreatePopupMenu(); + ok( menu != NULL, "CreatePopupMenu failed with error %d\n", GetLastError()); + ret = AppendMenuA( menu, MF_STRING, 1, "winetest"); + ok( ret, "Functie failed lasterror is %u\n", GetLastError()); + /* seems to be needed only on wine :( */ + {MSG msg; while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessage(&msg);} + /* test the effect of sending a WM_CANCELMODE message in the WM_INITMENULOOP + * handler of the menu owner */ + /* test results is exctracted from variable g_got_enteridle. Possible values: + * 0 : complete conformance. Sending WM_CANCELMODE cancels a menu initializing tracking + * 1 : Sending WM_CANCELMODE cancels a menu that is in tracking state + * 2 : Sending WM_CANCELMODE does not work + */ + /* menu owner is top level window */ + g_hwndtosend = hwnd; + ret = TrackPopupMenu( menu, 0x100, 100,100, 0, hwnd, NULL); + todo_wine { + ok( g_got_enteridle == 0, "received %d WM_ENTERIDLE messages, none expected\n", g_got_enteridle); + } + ok( g_got_enteridle < 2, "received %d WM_ENTERIDLE messages, should be less than 2\n", g_got_enteridle); + /* menu owner is child window */ + g_hwndtosend = hwndchild; + ret = TrackPopupMenu( menu, 0x100, 100,100, 0, hwndchild, NULL); + todo_wine { + ok(g_got_enteridle == 0, "received %d WM_ENTERIDLE messages, none expected\n", g_got_enteridle); + } + ok(g_got_enteridle < 2, "received %d WM_ENTERIDLE messages, should be less than 2\n", g_got_enteridle); + /* now send the WM_CANCELMODE messages to the WRONG window */ + /* those should fail ( to have any effect) */ + g_hwndtosend = hwnd; + ret = TrackPopupMenu( menu, 0x100, 100,100, 0, hwndchild, NULL); + ok( g_got_enteridle == 2, "received %d WM_ENTERIDLE messages, should be 2\n", g_got_enteridle); + /* cleanup */ + DestroyMenu( menu); + DestroyWindow( hwndchild); + DestroyWindow( hwnd); +} + START_TEST(menu) { init_function_pointers(); @@ -2424,9 +2952,15 @@ START_TEST(menu) register_menu_check_class(); test_menu_locked_by_window(); + test_subpopup_locked_by_menu(); test_menu_ownerdraw(); test_menu_bmp_and_string(); - + /* test Get/SetMenuInfo if available */ + if( pGetMenuInfo && pSetMenuInfo) { + test_menu_getmenuinfo(); + test_menu_setmenuinfo(); + } else + win_skip("Get/SetMenuInfo are not available\n"); if( !pSendInput) win_skip("SendInput is not available\n"); else @@ -2434,4 +2968,6 @@ START_TEST(menu) test_menu_flags(); test_menu_hilitemenuitem(); + test_menu_trackpopupmenu(); + test_menu_cancelmode(); } diff --git a/rostests/winetests/user32/msg.c b/rostests/winetests/user32/msg.c index 4a6778f900f..2445f82b5c7 100755 --- a/rostests/winetests/user32/msg.c +++ b/rostests/winetests/user32/msg.c @@ -180,6 +180,8 @@ static const struct message WmSWP_ShowOverlappedSeq[] = { { WM_NCPAINT, sent|wparam|optional, 1 }, { WM_ERASEBKGND, sent|optional }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, + { WM_SYNCPAINT, sent|optional }, + { WM_GETTITLEBARINFOEX, sent|optional }, { WM_PAINT, sent|optional }, { WM_NCPAINT, sent|beginpaint|optional }, { WM_GETTEXT, sent|defwinproc|optional }, @@ -192,6 +194,11 @@ static const struct message WmSWP_ShowOverlappedSeq[] = { static const struct message WmSWP_HideOverlappedSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam, SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE }, { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 }, + { HCBT_ACTIVATE, hook|optional }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, + { WM_ACTIVATEAPP, sent|wparam|optional, 1 }, + { WM_NCACTIVATE, sent|optional }, + { WM_ACTIVATE, sent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam, SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { 0 } }; @@ -202,12 +209,12 @@ static const struct message WmSWP_HideOverlappedSeq[] = { static const struct message WmSWP_ResizeSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOACTIVATE|SWP_NOMOVE }, { WM_GETMINMAXINFO, sent|defwinproc }, - { WM_NCCALCSIZE, sent|wparam, TRUE }, + { WM_NCCALCSIZE, sent|wparam|optional, TRUE }, { WM_NCPAINT, sent|optional }, { WM_GETTEXT, sent|defwinproc|optional }, { WM_ERASEBKGND, sent|optional }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOCLIENTMOVE }, - { WM_SIZE, sent|defwinproc|wparam, SIZE_RESTORED }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOCLIENTMOVE }, + { WM_SIZE, sent|defwinproc|optional }, { WM_NCCALCSIZE, sent|wparam|optional, TRUE }, { WM_NCPAINT, sent|optional }, { WM_GETTEXT, sent|defwinproc|optional }, @@ -223,12 +230,12 @@ static const struct message WmSWP_ResizeSeq[] = { static const struct message WmSWP_ResizePopupSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOACTIVATE|SWP_NOMOVE }, { WM_GETMINMAXINFO, sent|defwinproc|optional }, /* Win9x */ - { WM_NCCALCSIZE, sent|wparam, TRUE }, + { WM_NCCALCSIZE, sent|wparam|optional, TRUE }, { WM_NCPAINT, sent|optional }, { WM_GETTEXT, sent|defwinproc|optional }, { WM_ERASEBKGND, sent|optional }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOCLIENTMOVE }, - { WM_SIZE, sent|defwinproc|wparam, SIZE_RESTORED }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOCLIENTMOVE }, + { WM_SIZE, sent|defwinproc|wparam|optional, SIZE_RESTORED }, { WM_NCCALCSIZE, sent|wparam|optional, TRUE }, { WM_NCPAINT, sent|optional }, { WM_GETTEXT, sent|defwinproc|optional }, @@ -257,12 +264,14 @@ static const struct message WmSWP_MoveSeq[] = { static const struct message WmSWP_ResizeNoZOrder[] = { { WM_WINDOWPOSCHANGING, sent|wparam, /*SWP_NOZORDER|*/SWP_NOACTIVATE }, { WM_GETMINMAXINFO, sent|defwinproc }, - { WM_NCCALCSIZE, sent|wparam, 1 }, - { WM_NCPAINT, sent }, + { WM_NCCALCSIZE, sent|wparam|optional, 1 }, + { WM_NCPAINT, sent|optional }, { WM_GETTEXT, sent|defwinproc|optional }, - { WM_ERASEBKGND, sent|optional }, /* FIXME: remove optional once Wine is fixed */ - { WM_WINDOWPOSCHANGED, sent|wparam, /*SWP_NOZORDER|*/SWP_NOMOVE|SWP_NOCLIENTMOVE|SWP_NOACTIVATE }, - { WM_SIZE, sent|defwinproc|wparam, SIZE_RESTORED }, + { WM_ERASEBKGND, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam, /*SWP_NOZORDER|*/SWP_NOACTIVATE, 0, + SWP_NOMOVE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOCLIENTSIZE }, + { WM_MOVE, sent|defwinproc|optional }, + { WM_SIZE, sent|defwinproc|optional }, { WM_NCCALCSIZE, sent|wparam|optional, 1 }, /* Win9x doesn't send it */ { WM_NCPAINT, sent|optional }, /* Win9x doesn't send it */ { WM_GETTEXT, sent|defwinproc|optional }, /* Win9x doesn't send it */ @@ -363,7 +372,7 @@ static const struct message WmSwitchNotMaximizedChild[] = { static const struct message WmSWP_FrameChanged_clip[] = { { WM_WINDOWPOSCHANGING, sent|wparam|parent, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED }, { WM_NCCALCSIZE, sent|wparam|parent, 1 }, - { WM_NCPAINT, sent|parent }, /* wparam != 1 */ + { WM_NCPAINT, sent|parent|optional }, /* wparam != 1 */ { WM_GETTEXT, sent|parent|defwinproc|optional }, { WM_ERASEBKGND, sent|parent|optional }, /* FIXME: remove optional once Wine is fixed */ { WM_NCPAINT, sent }, /* wparam != 1 */ @@ -382,12 +391,12 @@ static const struct message WmSWP_FrameChangedDeferErase[] = { { WM_NCCALCSIZE, sent|wparam|parent, 1 }, { WM_WINDOWPOSCHANGED, sent|wparam|parent, SWP_NOSIZE|SWP_NOMOVE|SWP_DEFERERASE|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, - { WM_PAINT, sent|parent }, - { WM_NCPAINT, sent|beginpaint|parent }, /* wparam != 1 */ + { WM_PAINT, sent|parent|optional }, + { WM_NCPAINT, sent|beginpaint|parent|optional }, /* wparam != 1 */ { WM_GETTEXT, sent|beginpaint|parent|defwinproc|optional }, { WM_PAINT, sent }, { WM_NCPAINT, sent|beginpaint }, /* wparam != 1 */ - { WM_ERASEBKGND, sent|beginpaint }, + { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } }; @@ -398,14 +407,14 @@ static const struct message WmSWP_FrameChangedDeferErase[] = { static const struct message WmSWP_FrameChanged_noclip[] = { { WM_WINDOWPOSCHANGING, sent|wparam|parent, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED }, { WM_NCCALCSIZE, sent|wparam|parent, 1 }, - { WM_NCPAINT, sent|parent }, /* wparam != 1 */ + { WM_NCPAINT, sent|parent|optional }, /* wparam != 1 */ { WM_GETTEXT, sent|parent|defwinproc|optional }, - { WM_ERASEBKGND, sent|parent|optional }, /* FIXME: remove optional once Wine is fixed */ + { WM_ERASEBKGND, sent|parent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam|parent, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, { WM_PAINT, sent }, { WM_NCPAINT, sent|beginpaint }, /* wparam != 1 */ - { WM_ERASEBKGND, sent|beginpaint }, + { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } }; @@ -442,6 +451,7 @@ static const struct message WmShowOverlappedSeq[] = { { WM_GETTEXT, sent|optional }, { WM_NCPAINT, sent|optional }, { WM_ERASEBKGND, sent|optional }, + { WM_SYNCPAINT, sent|optional }, #if 0 /* CreateWindow/ShowWindow(SW_SHOW) also generates WM_SIZE/WM_MOVE * messages. Does that mean that CreateWindow doesn't set initial * window dimensions for overlapped windows? @@ -488,6 +498,8 @@ static const struct message WmShowMaxOverlappedSeq[] = { { WM_ERASEBKGND, sent|optional }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, + { WM_SYNCPAINT, sent|optional }, + { WM_GETTITLEBARINFOEX, sent|optional }, { WM_PAINT, sent|optional }, { WM_NCPAINT, sent|beginpaint|optional }, { WM_ERASEBKGND, sent|beginpaint|optional }, @@ -510,6 +522,7 @@ static const struct message WmShowRestoreMaxOverlappedSeq[] = { { WM_NCPAINT, sent|optional }, { WM_ERASEBKGND, sent|optional }, { WM_PAINT, sent|optional }, + { WM_GETTITLEBARINFOEX, sent|optional }, { WM_NCPAINT, sent|beginpaint|optional }, { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } @@ -546,6 +559,7 @@ static const struct message WmShowRestoreMinOverlappedSeq[] = { { WM_ACTIVATE, sent|wparam, 1 }, { WM_GETTEXT, sent|optional }, { WM_PAINT, sent|optional }, + { WM_GETTITLEBARINFOEX, sent|optional }, { WM_NCPAINT, sent|beginpaint|optional }, { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } @@ -576,10 +590,34 @@ static const struct message WmShowMinOverlappedSeq[] = { { WM_GETTEXT, sent|defwinproc|optional }, { WM_ACTIVATE, sent }, { WM_ACTIVATEAPP, sent|wparam, 0 }, + /* Vista sometimes restores the window right away... */ { WM_SYSCOMMAND, sent|optional|wparam, SC_RESTORE }, { HCBT_SYSCOMMAND, hook|optional|wparam, SC_RESTORE }, { HCBT_MINMAX, hook|optional|lparam, 0, SW_RESTORE }, + { WM_QUERYOPEN, sent|optional }, + { WM_WINDOWPOSCHANGING, sent|optional|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED }, + { WM_GETMINMAXINFO, sent|optional|defwinproc }, + { WM_NCCALCSIZE, sent|optional|wparam, TRUE }, + { HCBT_ACTIVATE, hook|optional }, + { WM_ACTIVATEAPP, sent|optional|wparam, 1 }, + { WM_NCACTIVATE, sent|optional }, + { WM_GETTEXT, sent|optional }, + { WM_ACTIVATE, sent|optional|wparam, 1 }, + { HCBT_SETFOCUS, hook|optional }, + { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, + { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 2 }, + { WM_SETFOCUS, sent|optional }, + { WM_NCPAINT, sent|optional }, + { WM_GETTEXT, sent|defwinproc|optional }, + { WM_ERASEBKGND, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|optional|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED }, + { WM_MOVE, sent|defwinproc|optional }, + { WM_SIZE, sent|defwinproc|optional|wparam, SIZE_RESTORED }, + { WM_ACTIVATE, sent|optional|wparam, 1 }, + { WM_SYSCOMMAND, sent|optional|wparam, SC_RESTORE }, + { HCBT_SYSCOMMAND, hook|optional|wparam, SC_RESTORE }, + { WM_PAINT, sent|optional }, { WM_NCPAINT, sent|beginpaint|optional }, { WM_ERASEBKGND, sent|beginpaint|optional }, @@ -610,7 +648,7 @@ static const struct message WmDestroyOverlappedSeq[] = { { 0x0090, sent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { WM_NCACTIVATE, sent|optional|wparam, 0 }, - { WM_ACTIVATE, sent|optional|wparam, 0 }, + { WM_ACTIVATE, sent|optional }, { WM_ACTIVATEAPP, sent|optional|wparam, 0 }, { WM_KILLFOCUS, sent|optional|wparam, 0 }, { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, @@ -648,7 +686,7 @@ static const struct message WmCreateMaxPopupSeq[] = { { WM_ERASEBKGND, sent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOCLIENTMOVE|SWP_NOCLIENTSIZE|SWP_NOMOVE|SWP_NOSIZE }, { WM_ACTIVATEAPP, sent|wparam, 1 }, - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_NCACTIVATE, sent }, { WM_ACTIVATE, sent|wparam, 1 }, { HCBT_SETFOCUS, hook }, { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, @@ -698,7 +736,7 @@ static const struct message WmShowMaxPopupResizedSeq[] = { { WM_ERASEBKGND, sent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { WM_ACTIVATEAPP, sent|wparam, 1 }, - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_NCACTIVATE, sent }, { WM_ACTIVATE, sent|wparam, 1 }, { HCBT_SETFOCUS, hook }, { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, @@ -727,7 +765,7 @@ static const struct message WmShowMaxPopupSeq[] = { { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, { WM_ACTIVATEAPP, sent|wparam, 1 }, - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_NCACTIVATE, sent }, { WM_ACTIVATE, sent|wparam, 1 }, { HCBT_SETFOCUS, hook }, { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, @@ -764,7 +802,7 @@ static const struct message WmCreatePopupSeq[] = { { WM_ERASEBKGND, sent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { WM_ACTIVATEAPP, sent|wparam, 1 }, - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_NCACTIVATE, sent }, { WM_ACTIVATE, sent|wparam, 1 }, { HCBT_SETFOCUS, hook }, { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, @@ -837,7 +875,7 @@ static const struct message WmShowVisiblePopupSeq_3[] = { { EVENT_SYSTEM_FOREGROUND, winevent_hook|wparam|lparam, 0, 0 }, { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_NCACTIVATE, sent }, { WM_ACTIVATE, sent|wparam, 1 }, { HCBT_SETFOCUS, hook }, { WM_KILLFOCUS, sent|parent }, @@ -1216,7 +1254,7 @@ static const struct message WmCreateCustomDialogSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_NCACTIVATE, sent }, { WM_GETTEXT, sent|optional|defwinproc }, { WM_GETTEXT, sent|optional|defwinproc }, { WM_GETTEXT, sent|optional|defwinproc }, @@ -1234,7 +1272,7 @@ static const struct message WmCreateCustomDialogSeq[] = { { WM_GETTEXT, sent|optional|defwinproc }, { WM_GETTEXT, sent|optional|defwinproc }, { WM_ERASEBKGND, sent }, - { WM_CTLCOLORDLG, sent|defwinproc }, + { WM_CTLCOLORDLG, sent|optional|defwinproc }, { WM_WINDOWPOSCHANGED, sent|wparam, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { WM_GETTEXT, sent|optional }, { WM_GETTEXT, sent|optional }, @@ -1262,6 +1300,9 @@ static const struct message WmEndCustomDialogSeq[] = { { WM_ACTIVATE, sent|wparam, 0 }, { EVENT_SYSTEM_FOREGROUND, winevent_hook|wparam|lparam, 0, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOACTIVATE|SWP_NOREDRAW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, + { WM_GETTEXT, sent|optional|defwinproc }, + { WM_GETTEXT, sent|optional|defwinproc }, { HCBT_SETFOCUS, hook }, { WM_KILLFOCUS, sent }, { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, @@ -1283,7 +1324,7 @@ static const struct message WmShowCustomDialogSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, { WM_ACTIVATEAPP, sent|wparam|optional, 1 }, - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_NCACTIVATE, sent }, { WM_ACTIVATE, sent|wparam, 1 }, { WM_GETTEXT, sent|optional }, @@ -1321,15 +1362,15 @@ static const struct message WmModalDialogSeq[] = { { EVENT_SYSTEM_FOREGROUND, winevent_hook|wparam|lparam, 0, 0 }, { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOSIZE|SWP_NOMOVE }, - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_NCACTIVATE, sent }, { WM_GETTEXT, sent|optional }, { WM_ACTIVATE, sent|wparam, 1 }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE }, { EVENT_OBJECT_SHOW, winevent_hook|wparam|lparam, 0, 0 }, - { WM_NCPAINT, sent }, + { WM_NCPAINT, sent|optional }, { WM_GETTEXT, sent|optional }, - { WM_ERASEBKGND, sent }, - { WM_CTLCOLORDLG, sent }, + { WM_ERASEBKGND, sent|optional }, + { WM_CTLCOLORDLG, sent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { WM_GETTEXT, sent|optional }, { WM_NCCALCSIZE, sent|optional }, @@ -1339,7 +1380,8 @@ static const struct message WmModalDialogSeq[] = { { WM_CTLCOLORDLG, sent|optional }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, { WM_PAINT, sent|optional }, - { WM_CTLCOLORBTN, sent }, + { WM_CTLCOLORBTN, sent|optional }, + { WM_GETTITLEBARINFOEX, sent|optional }, { WM_ENTERIDLE, sent|parent|optional }, { WM_ENTERIDLE, sent|parent|optional }, { WM_ENTERIDLE, sent|parent|optional }, @@ -1586,7 +1628,7 @@ static const struct message WmSetScrollRangeHV_NC_Seq[] = { WM_ERASEBKGND, sent|optional }, { WM_CTLCOLORDLG, sent|defwinproc|optional }, /* sent to a parent of the dialog */ { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|SWP_NOCLIENTMOVE, 0, SWP_NOCLIENTSIZE }, - { WM_SIZE, sent|defwinproc|wparam|optional, SIZE_RESTORED }, + { WM_SIZE, sent|defwinproc|optional }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, { EVENT_OBJECT_VALUECHANGE, winevent_hook|lparam|optional, 0/*OBJID_HSCROLL or OBJID_VSCROLL*/, 0 }, { WM_GETTEXT, sent|optional }, @@ -1637,7 +1679,7 @@ static const struct message WmSHOWNATopInvisible[] = { { WM_SHOWWINDOW, sent|wparam, 1 }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, { EVENT_OBJECT_SHOW, winevent_hook|wparam|lparam, 0, 0 }, - { WM_NCPAINT, sent|wparam, 1 }, + { WM_NCPAINT, sent|wparam|optional, 1 }, { WM_GETTEXT, sent|defwinproc|optional }, { WM_ERASEBKGND, sent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, @@ -1764,13 +1806,13 @@ static void add_message_(int line, const struct recvd_message *msg) }; const char *code_name = (msg->message <= HCBT_SETFOCUS) ? CBT_code_name[msg->message] : "Unknown"; - snprintf( seq->output, sizeof(seq->output), "%s: hook %d (%s) wp %08lx lp %08lx", - msg->descr, msg->message, code_name, msg->wParam, msg->lParam ); + sprintf( seq->output, "%s: hook %d (%s) wp %08lx lp %08lx", + msg->descr, msg->message, code_name, msg->wParam, msg->lParam ); } else if (msg->flags & winevent_hook) { - snprintf( seq->output, sizeof(seq->output), "%s: winevent %p %08x %08lx %08lx", - msg->descr, msg->hwnd, msg->message, msg->wParam, msg->lParam ); + sprintf( seq->output, "%s: winevent %p %08x %08lx %08lx", + msg->descr, msg->hwnd, msg->message, msg->wParam, msg->lParam ); } else { @@ -1781,8 +1823,7 @@ static void add_message_(int line, const struct recvd_message *msg) { WINDOWPOS *winpos = (WINDOWPOS *)msg->lParam; - snprintf( seq->output, sizeof(seq->output), - "%s: %p WM_WINDOWPOS%s wp %08lx lp %08lx after %p x %d y %d cx %d cy %d flags %s", + sprintf( seq->output, "%s: %p WM_WINDOWPOS%s wp %08lx lp %08lx after %p x %d y %d cx %d cy %d flags %s", msg->descr, msg->hwnd, (msg->message == WM_WINDOWPOSCHANGING) ? "CHANGING" : "CHANGED", msg->wParam, msg->lParam, winpos->hwndInsertAfter, @@ -1803,11 +1844,11 @@ static void add_message_(int line, const struct recvd_message *msg) DRAW_ITEM_STRUCT di; DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)msg->lParam; - snprintf( seq->output, sizeof(seq->output), - "%s: %p WM_DRAWITEM: type %x, ctl_id %x, item_id %x, action %x, state %x", - msg->descr, msg->hwnd, dis->CtlType, dis->CtlID, - dis->itemID, dis->itemAction, dis->itemState); + sprintf( seq->output, "%s: %p WM_DRAWITEM: type %x, ctl_id %x, item_id %x, action %x, state %x", + msg->descr, msg->hwnd, dis->CtlType, dis->CtlID, + dis->itemID, dis->itemAction, dis->itemState); + di.u.lp = 0; di.u.item.type = dis->CtlType; di.u.item.ctl_id = dis->CtlID; di.u.item.item_id = dis->itemID; @@ -1819,8 +1860,8 @@ static void add_message_(int line, const struct recvd_message *msg) } default: if (msg->message >= 0xc000) return; /* ignore registered messages */ - snprintf( seq->output, sizeof(seq->output), "%s: %p %04x wp %08lx lp %08lx", - msg->descr, msg->hwnd, msg->message, msg->wParam, msg->lParam ); + sprintf( seq->output, "%s: %p %04x wp %08lx lp %08lx", + msg->descr, msg->hwnd, msg->message, msg->wParam, msg->lParam ); } } } @@ -1988,10 +2029,10 @@ static void ok_sequence_(const struct message *expected_list, const char *contex if ((expected->lParam ^ actual->lParam) & ~expected->lp_mask) dump++; } } - if ((expected->flags & defwinproc) != (actual->flags & defwinproc) && - (expected->flags & optional)) + if ((expected->flags & optional) && + ((expected->flags ^ actual->flags) & (defwinproc|parent))) { - /* don't match messages if their defwinproc status differs */ + /* don't match optional messages if their defwinproc or parent status differs */ expected++; count++; continue; @@ -2428,7 +2469,7 @@ static const struct message WmCreateMDIchildVisibleMaxSeq1[] = { { WM_MDIREFRESHMENU, sent/*|wparam|lparam, 0, 0*/ }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE }, { WM_CHILDACTIVATE, sent|wparam|lparam, 0, 0 }, - { WM_WINDOWPOSCHANGING, sent|wparam|defwinproc|optional, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_WINDOWPOSCHANGING, sent|wparam|defwinproc|optional, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE, 0, SWP_FRAMECHANGED }, /* Win9x: message sequence terminates here. */ @@ -3179,7 +3220,7 @@ static LRESULT WINAPI mdi_client_hook_proc(HWND hwnd, UINT message, WPARAM wPara static LRESULT WINAPI mdi_child_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct recvd_message msg; @@ -3229,7 +3270,7 @@ static LRESULT WINAPI mdi_child_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, static LRESULT WINAPI mdi_frame_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct recvd_message msg; @@ -3658,7 +3699,7 @@ static void test_mdi_messages(void) */ active_child = (HWND)SendMessageA(mdi_client, WM_MDIGETACTIVE, 0, (LPARAM)&zoomed); ok(active_child == mdi_child || /* win2k */ - !active_child, /* win9x */ + !active_child || active_child == mdi_child2, /* win9x */ "wrong active MDI child %p\n", active_child); flush_sequence(); @@ -4086,7 +4127,7 @@ static void test_showwindow(void) /* ShowWindow( SW_SHOWNA) for invisible top level window */ trace("calling ShowWindow( SW_SHOWNA) for invisible top level window\n"); ok( ShowWindow(hwnd, SW_SHOWNA) == FALSE, "ShowWindow: window was visible\n" ); - ok_sequence(WmSHOWNATopInvisible, "ShowWindow(SW_SHOWNA) on invisible top level window", TRUE); + ok_sequence(WmSHOWNATopInvisible, "ShowWindow(SW_SHOWNA) on invisible top level window", FALSE); /* ShowWindow( SW_SHOWNA) for now visible top level window */ trace("calling ShowWindow( SW_SHOWNA) for now visible top level window\n"); @@ -4348,7 +4389,7 @@ static const struct message WmZOrder[] = { { WM_GETTEXT, sent|optional }, { WM_NCCALCSIZE, sent|wparam|optional, 1 }, { WM_ACTIVATEAPP, sent|wparam, 1, 0 }, - { WM_NCACTIVATE, sent|wparam|lparam, 1, 0 }, + { WM_NCACTIVATE, sent|lparam, 1, 0 }, { WM_GETTEXT, sent|defwinproc|optional }, { WM_GETTEXT, sent|defwinproc|optional }, { WM_ACTIVATE, sent|wparam|lparam, 1, 0 }, @@ -4477,8 +4518,6 @@ static void test_messages(void) flush_events(); ok_sequence(WmOptionalPaint, "ShowWindow(SW_SHOW):overlapped already visible", FALSE); - ok(GetActiveWindow() == hwnd, "window should be active\n"); - ok(GetFocus() == hwnd, "window should have input focus\n"); SetWindowPos(hwnd, 0,0,0,0,0, SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE); ok_sequence(WmSWP_HideOverlappedSeq, "SetWindowPos:SWP_HIDEWINDOW:overlapped", FALSE); ok(!IsWindowVisible(hwnd), "window should not be visible at this point\n"); @@ -5198,6 +5237,17 @@ static void test_button_messages(void) DWORD dlg_code; HFONT zfont; + /* selection with VK_SPACE should capture button window */ + hwnd = CreateWindowExA(0, "button", "test", BS_CHECKBOX | WS_VISIBLE | WS_POPUP, + 0, 0, 50, 14, 0, 0, 0, NULL); + ok(hwnd != 0, "Failed to create button window\n"); + ReleaseCapture(); + SetFocus(hwnd); + SendMessageA(hwnd, WM_KEYDOWN, VK_SPACE, 0); + ok(GetCapture() == hwnd, "Should be captured on VK_SPACE WM_KEYDOWN\n"); + SendMessageA(hwnd, WM_KEYUP, VK_SPACE, 0); + DestroyWindow(hwnd); + subclass_button(); for (i = 0; i < sizeof(button)/sizeof(button[0]); i++) @@ -5615,7 +5665,7 @@ static const struct message WmInvalidateErasePaint[] = { { WM_PAINT, sent }, { WM_NCPAINT, sent|wparam|beginpaint, 1 }, { WM_GETTEXT, sent|beginpaint|defwinproc|optional }, - { WM_ERASEBKGND, sent|beginpaint }, + { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } }; @@ -5686,7 +5736,7 @@ static const struct message WmChildPaintNc[] = { { WM_PAINT, sent }, { WM_NCPAINT, sent|beginpaint }, { WM_GETTEXT, sent|beginpaint|defwinproc|optional }, - { WM_ERASEBKGND, sent|beginpaint }, + { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } }; @@ -6824,12 +6874,17 @@ static void test_accelerators(void) GetCursorPos(&pt); if (pt.x == rc.left && pt.y == rc.top) { + int i; keybd_event(VK_SHIFT, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); pump_msg_loop(hwnd, 0); - ok_sequence(WmShiftMouseButton, "Shift+MouseButton press/release", FALSE); + for (i = 0; i < sequence_cnt; i++) if (sequence[i].message == WM_LBUTTONDOWN) break; + if (i < sequence_cnt) + ok_sequence(WmShiftMouseButton, "Shift+MouseButton press/release", FALSE); + else + skip( "Shift+MouseButton event didn't get to the window\n" ); } done: @@ -6842,8 +6897,8 @@ done: static LRESULT MsgCheckProc (BOOL unicode, HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; - static long beginpaint_counter = 0; + static LONG defwndproc_counter = 0; + static LONG beginpaint_counter = 0; LRESULT ret; struct recvd_message msg; @@ -6979,7 +7034,7 @@ static LRESULT WINAPI MsgCheckProcW(HWND hwnd, UINT message, WPARAM wParam, LPAR static LRESULT WINAPI PopupMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct recvd_message msg; @@ -7018,8 +7073,8 @@ static LRESULT WINAPI PopupMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; - static long beginpaint_counter = 0; + static LONG defwndproc_counter = 0; + static LONG beginpaint_counter = 0; LRESULT ret; struct recvd_message msg; @@ -7086,7 +7141,7 @@ static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam static LRESULT WINAPI TestDlgProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct recvd_message msg; @@ -7120,7 +7175,7 @@ static LRESULT WINAPI TestDlgProcA(HWND hwnd, UINT message, WPARAM wParam, LPARA static LRESULT WINAPI ShowWindowProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct recvd_message msg; @@ -8194,6 +8249,12 @@ static const struct message ScrollWindowPaint1[] = { { WM_PAINT, sent }, { WM_ERASEBKGND, sent|beginpaint }, { WM_GETTEXTLENGTH, sent|optional }, + { WM_PAINT, sent|optional }, + { WM_NCPAINT, sent|beginpaint|optional }, + { WM_GETTEXT, sent|beginpaint|optional }, + { WM_GETTEXT, sent|beginpaint|optional }, + { WM_GETTEXT, sent|beginpaint|optional }, + { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } }; @@ -8961,6 +9022,7 @@ static void test_PeekMessage(void) ok(GetLastError() == ERROR_INVALID_FLAGS, "wrong error %d\n", GetLastError()); qstatus = GetQueueStatus(qs_all_input); } + qstatus &= ~MAKELONG( 0x4000, 0x4000 ); /* sometimes set on Win95 */ ok(qstatus == MAKELONG(QS_SENDMESSAGE, QS_SENDMESSAGE), "wrong qstatus %08x\n", qstatus); @@ -9879,6 +9941,7 @@ static const struct message WmShowNoActivate_2[] = { { HCBT_SETFOCUS, hook|optional }, { HCBT_ACTIVATE, hook|optional }, /* win2003 doesn't send it */ { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, /* win2003 doesn't send it */ + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { HCBT_SETFOCUS, hook|optional }, /* win2003 doesn't send it */ { 0 } }; @@ -9937,13 +10000,13 @@ static const struct message WmRestore_4[] = { { 0 } }; static const struct message WmRestore_5[] = { - { HCBT_MINMAX, hook|lparam, 0, SW_SHOWNORMAL }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, + { HCBT_MINMAX, hook|lparam|optional, 0, SW_SHOWNORMAL }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, { HCBT_ACTIVATE, hook|optional }, { HCBT_SETFOCUS, hook|optional }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, { WM_MOVE, sent|defwinproc|optional }, - { WM_SIZE, sent|wparam|defwinproc, SIZE_RESTORED }, + { WM_SIZE, sent|wparam|defwinproc|optional, SIZE_RESTORED }, { 0 } }; static const struct message WmHide_1[] = { @@ -10008,8 +10071,10 @@ static const struct message WmMinimize_3[] = { }; static const struct message WmShowMinNoActivate[] = { { HCBT_MINMAX, hook|lparam, 0, SW_SHOWMINNOACTIVE }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, + { WM_WINDOWPOSCHANGING, sent }, + { WM_WINDOWPOSCHANGED, sent }, + { WM_MOVE, sent|defwinproc|optional }, + { WM_SIZE, sent|wparam|defwinproc|optional, SIZE_MINIMIZED }, { 0 } }; static const struct message WmMinMax_1[] = { @@ -10035,7 +10100,7 @@ static const struct message WmMinMax_3[] = { { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOCOPYBITS|SWP_STATECHANGED }, { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOCOPYBITS|SWP_STATECHANGED }, { WM_MOVE, sent|defwinproc|optional }, - { WM_SIZE, sent|wparam|defwinproc|optional, SIZE_RESTORED }, + { WM_SIZE, sent|wparam|defwinproc|optional, SIZE_MINIMIZED }, { 0 } }; static const struct message WmMinMax_4[] = { @@ -10146,7 +10211,7 @@ static void test_ShowWindow(void) /* 48 */ { SW_SHOWMAXIMIZED, TRUE, WS_VISIBLE|WS_MAXIMIZE, WmShowMaximized_3, FALSE }, /* 49 */ { SW_SHOW, TRUE, WS_VISIBLE|WS_MAXIMIZE, WmEmptySeq, FALSE }, /* 50 */ { SW_SHOWNORMAL, TRUE, WS_VISIBLE, WmRestore_5, FALSE }, -/* 51 */ { SW_SHOWNORMAL, TRUE, WS_VISIBLE, WmEmptySeq, FALSE }, +/* 51 */ { SW_SHOWNORMAL, TRUE, WS_VISIBLE, WmRestore_5, FALSE }, /* 52 */ { SW_HIDE, TRUE, 0, WmHide_1, FALSE }, /* 53 */ { SW_HIDE, FALSE, 0, WmEmptySeq, FALSE }, /* 54 */ { SW_MINIMIZE, FALSE, WS_VISIBLE|WS_MINIMIZE, WmMinimize_3, FALSE }, @@ -10418,16 +10483,18 @@ static const struct message SetActiveWindowSeq0[] = { WM_ACTIVATEAPP, sent|wparam|optional, 0 }, { WM_ACTIVATEAPP, sent|wparam|optional, 0 }, { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, + { WM_KILLFOCUS, sent|optional }, { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE }, { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, { WM_NCACTIVATE, sent|wparam|optional, 1 }, { WM_GETTEXT, sent|defwinproc|optional }, { WM_ACTIVATE, sent|wparam|optional, 1 }, { HCBT_SETFOCUS, hook|optional }, - { WM_KILLFOCUS, sent|defwinproc }, - { WM_IME_SETCONTEXT, sent|defwinproc|optional }, + { WM_KILLFOCUS, sent|defwinproc|optional }, { WM_IME_SETCONTEXT, sent|defwinproc|optional }, { WM_IME_SETCONTEXT, sent|defwinproc|optional }, + { WM_IME_SETCONTEXT, sent|optional }, + { WM_IME_SETCONTEXT, sent|optional }, { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 1 }, { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 2 }, { WM_SETFOCUS, sent|defwinproc|optional }, @@ -10532,7 +10599,7 @@ static void test_SetActiveWindow(void) trace("SetActiveWindow(0)\n"); ret = SetActiveWindow(0); ok( ret == popup, "Failed to SetActiveWindow(0)\n"); - ok_sequence(SetActiveWindowSeq0, "SetActiveWindow(0)", TRUE); + ok_sequence(SetActiveWindowSeq0, "SetActiveWindow(0)", FALSE); flush_sequence(); trace("SetActiveWindow(hwnd), hwnd visible\n"); @@ -10950,6 +11017,19 @@ static const struct message wm_lb_click_0[] = { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_LISTBOX, LBN_SELCHANGE) }, { 0 } }; +static const struct message wm_lb_deletestring[] = +{ + { LB_DELETESTRING, sent|wparam|lparam, 0, 0 }, + { WM_DELETEITEM, sent|wparam|parent, ID_LISTBOX, 0 }, + { 0 } +}; +static const struct message wm_lb_deletestring_reset[] = +{ + { LB_DELETESTRING, sent|wparam|lparam, 0, 0 }, + { LB_RESETCONTENT, sent|wparam|lparam|defwinproc, 0, 0 }, + { WM_DELETEITEM, sent|wparam|parent, ID_LISTBOX, 0 }, + { 0 } +}; #define check_lb_state(a1, a2, a3, a4, a5) check_lb_state_dbg(a1, a2, a3, a4, a5, __LINE__) @@ -10957,7 +11037,7 @@ static LRESULT (WINAPI *listbox_orig_proc)(HWND, UINT, WPARAM, LPARAM); static LRESULT WINAPI listbox_hook_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp) { - static long defwndproc_counter = 0; + static LONG defwndproc_counter = 0; LRESULT ret; struct recvd_message msg; @@ -11060,6 +11140,33 @@ static void test_listbox_messages(void) check_lb_state(listbox, 3, 0, 0, 0); flush_sequence(); + trace("deleting item 0\n"); + ret = SendMessage(listbox, LB_DELETESTRING, 0, 0); + ok(ret == 2, "expected 2, got %ld\n", ret); + ok_sequence(wm_lb_deletestring, "LB_DELETESTRING 0", FALSE ); + check_lb_state(listbox, 2, -1, 0, 0); + flush_sequence(); + + trace("deleting item 0\n"); + ret = SendMessage(listbox, LB_DELETESTRING, 0, 0); + ok(ret == 1, "expected 1, got %ld\n", ret); + ok_sequence(wm_lb_deletestring, "LB_DELETESTRING 0", FALSE ); + check_lb_state(listbox, 1, -1, 0, 0); + flush_sequence(); + + trace("deleting item 0\n"); + ret = SendMessage(listbox, LB_DELETESTRING, 0, 0); + ok(ret == 0, "expected 0, got %ld\n", ret); + ok_sequence(wm_lb_deletestring_reset, "LB_DELETESTRING 0", FALSE ); + check_lb_state(listbox, 0, -1, 0, 0); + flush_sequence(); + + trace("deleting item 0\n"); + ret = SendMessage(listbox, LB_DELETESTRING, 0, 0); + ok(ret == LB_ERR, "expected LB_ERR, got %ld\n", ret); + check_lb_state(listbox, 0, -1, 0, 0); + flush_sequence(); + log_all_parent_messages--; DestroyWindow(listbox); @@ -11298,6 +11405,12 @@ static void test_menu_messages(void) skip( "queuing key events not supported\n" ); goto done; } + /* win98 queues only a WM_KEYUP and doesn't start menu tracking */ + if (sequence[0].message == WM_KEYUP && sequence[0].wParam == VK_MENU) + { + win_skip( "menu tracking through VK_MENU not supported\n" ); + goto done; + } ok_sequence(wm_popup_menu_1, "popup menu command", FALSE); /* Alt+F, Right, Enter */ diff --git a/rostests/winetests/user32/scroll.c b/rostests/winetests/user32/scroll.c index 9547d543082..55fb6f64ac4 100644 --- a/rostests/winetests/user32/scroll.c +++ b/rostests/winetests/user32/scroll.c @@ -26,6 +26,7 @@ #include "wine/test.h" static HWND hScroll, hMainWnd; +static BOOL bThemeActive = FALSE; static LRESULT CALLBACK MyWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { @@ -54,15 +55,26 @@ static void scrollbar_test1(void) ret = EnableScrollBar( hScroll, SB_CTL, ESB_DISABLE_BOTH ); ok( ret, "The scrollbar should be disabled.\n" ); - todo_wine - { - ok( !IsWindowEnabled( hScroll ), "The scrollbar window should be disabled.\n" ); - } + ok( !IsWindowEnabled( hScroll ), "The scrollbar window should be disabled.\n" ); ret = EnableScrollBar( hScroll, SB_CTL, ESB_ENABLE_BOTH ); ok( ret, "The scrollbar should be enabled.\n" ); ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" ); + /* test buttons separately */ + ret = EnableScrollBar( hScroll, SB_CTL, ESB_DISABLE_LTUP ); + ok( ret, "The scrollbar LTUP button should be disabled.\n" ); + ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" ); + ret = EnableScrollBar( hScroll, SB_CTL, ESB_ENABLE_BOTH ); + ok( ret, "The scrollbar should be enabled.\n" ); + ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" ); + + ret = EnableScrollBar( hScroll, SB_CTL, ESB_DISABLE_RTDN ); + ok( ret, "The scrollbar RTDN button should be disabled.\n" ); + ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" ); + ret = EnableScrollBar( hScroll, SB_CTL, ESB_ENABLE_BOTH ); + ok( ret, "The scrollbar should be enabled.\n" ); + ok( IsWindowEnabled( hScroll ), "The scrollbar window should be enabled.\n" ); } static void scrollbar_test2(void) @@ -195,9 +207,185 @@ static void scrollbar_test4(void) sbi.rcScrollBar.bottom, sbi.rcScrollBar.right ); } +/* some tests designed to show that Horizontal and Vertical + * window scroll bar info are not created independently */ +static void scrollbar_test_default( DWORD style) +{ + INT min, max, ret; + DWORD winstyle; + HWND hwnd; + SCROLLINFO si = { sizeof( SCROLLINFO), SIF_TRACKPOS }; + + hwnd = CreateWindowExA( 0, "static", "", WS_POPUP | style, + 0, 0, 10, 10, 0, 0, 0, NULL); + assert( hwnd != 0); + + ret = GetScrollRange( hwnd, SB_VERT, &min, &max); + ok( ret || + broken( !ret) /* Win 98/ME */ , "GetScrollRange failed.\n"); + /* range is 0,0 if there are no H or V scroll bars. 0,100 otherwise */ + if( !( style & ( WS_VSCROLL | WS_HSCROLL))) + ok( min == 0 && max == 0, + "Scroll bar range is %d,%d. Expected 0,0. Style %08x\n", min, max, style); + else +todo_wine + ok( min == 0 && max == 100, + "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style); + ret = GetScrollRange( hwnd, SB_HORZ, &min, &max); + ok( ret || + broken( !ret) /* Win 98/ME */ , "GetScrollRange failed.\n"); + /* range is 0,0 if there are no H or V scroll bars. 0,100 otherwise */ + if( !( style & ( WS_VSCROLL | WS_HSCROLL))) + ok( min == 0 && max == 0, + "Scroll bar range is %d,%d. Expected 0,0. Style %08x\n", min, max, style); + else +todo_wine + ok( min == 0 && max == 100, + "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style); + /* test GetScrollInfo, vist for vertical SB */ + ret = GetScrollInfo( hwnd, SB_VERT, &si); + /* should fail if no H orV scroll bar styles are present. Succeed otherwise */ + if( !( style & ( WS_VSCROLL | WS_HSCROLL))) + ok( !ret, "GetScrollInfo succeeded unexpectedly. Style is %08x\n", style); + else +todo_wine + ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style); + /* Same for Horizontal SB */ + ret = GetScrollInfo( hwnd, SB_HORZ, &si); + /* should fail if no H orV scroll bar styles are present. Succeed otherwise */ + if( !( style & ( WS_VSCROLL | WS_HSCROLL))) + ok( !ret, "GetScrollInfo succeeded unexpectedly. Style is %08x\n", style); + else +todo_wine + ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style); + /* now set the Vertical Scroll range to something that could be the default value it + * already has */; + ret = SetScrollRange( hwnd, SB_VERT, 0, 100, FALSE); + ok( ret, "SetScrollRange failed.\n"); + /* and request the Horizontal range */ + ret = GetScrollRange( hwnd, SB_HORZ, &min, &max); + ok( ret, "GetScrollRange failed.\n"); + /* now the range should be 0,100 in ALL cases */ + ok( min == 0 && max == 100, + "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style); + /* See what is different now for GetScrollRange */ + ret = GetScrollInfo( hwnd, SB_HORZ, &si); + /* should succeed in ALL cases */ + ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style); + ret = GetScrollInfo( hwnd, SB_VERT, &si); + /* should succeed in ALL cases */ + ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style); + /* report the windows style */ + winstyle = GetWindowLongW( hwnd, GWL_STYLE ); + /* WS_VSCROLL added to the window style */ + if( !(style & WS_VSCROLL)) + { + if (bThemeActive || style != WS_HSCROLL) +todo_wine + ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == ( style | WS_VSCROLL), + "unexpected style change %8lx expected %8lx\n", + (winstyle & (WS_HSCROLL|WS_VSCROLL)), style | WS_VSCROLL); + else + ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == style, + "unexpected style change %8lx expected %8x\n", + (winstyle & (WS_HSCROLL|WS_VSCROLL)), style); + } + /* do the test again with H and V reversed. + * Start with a clean window */ + DestroyWindow( hwnd); + hwnd = CreateWindowExA( 0, "static", "", WS_POPUP | style, + 0, 0, 10, 10, 0, 0, 0, NULL); + assert( hwnd != 0); + /* Set Horizonta Scroll range to something that could be the default value it + * already has */; + ret = SetScrollRange( hwnd, SB_HORZ, 0, 100, FALSE); + ok( ret, "SetScrollRange failed.\n"); + /* and request the Vertical range */ + ret = GetScrollRange( hwnd, SB_VERT, &min, &max); + ok( ret, "GetScrollRange failed.\n"); + /* now the range should be 0,100 in ALL cases */ + ok( min == 0 && max == 100, + "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style); + /* See what is different now for GetScrollRange */ + ret = GetScrollInfo( hwnd, SB_HORZ, &si); + /* should succeed in ALL cases */ + ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style); + ret = GetScrollInfo( hwnd, SB_VERT, &si); + /* should succeed in ALL cases */ + ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style); + /* report the windows style */ + winstyle = GetWindowLongW( hwnd, GWL_STYLE ); + /* WS_HSCROLL added to the window style */ + if( !(style & WS_HSCROLL)) + { + if (bThemeActive || style != WS_VSCROLL) +todo_wine + ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == ( style | WS_HSCROLL), + "unexpected style change %8lx expected %8lx\n", + (winstyle & (WS_HSCROLL|WS_VSCROLL)), style | WS_HSCROLL); + else + ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == style, + "unexpected style change %8lx expected %8x\n", + (winstyle & (WS_HSCROLL|WS_VSCROLL)), style); + } + /* Slightly change the test to use SetScrollInfo + * Start with a clean window */ + DestroyWindow( hwnd); + hwnd = CreateWindowExA( 0, "static", "", WS_POPUP | style, + 0, 0, 10, 10, 0, 0, 0, NULL); + assert( hwnd != 0); + /* set Horizontal position with SetScrollInfo */ + si.nPos = 0; + si.nMin = 11; + si.nMax = 22; + si.fMask |= SIF_RANGE; + ret = SetScrollInfo( hwnd, SB_HORZ, &si, FALSE); + ok( ret, "SetScrollInfo failed. Style is %08x\n", style); + /* and request the Vertical range */ + ret = GetScrollRange( hwnd, SB_VERT, &min, &max); + ok( ret, "GetScrollRange failed.\n"); + /* now the range should be 0,100 in ALL cases */ + ok( min == 0 && max == 100, + "Scroll bar range is %d,%d. Expected 0,100. Style %08x\n", min, max, style); + /* See what is different now for GetScrollRange */ + ret = GetScrollInfo( hwnd, SB_HORZ, &si); + /* should succeed in ALL cases */ + ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style); + ret = GetScrollInfo( hwnd, SB_VERT, &si); + /* should succeed in ALL cases */ + ok( ret, "GetScrollInfo failed unexpectedly. Style is %08x\n", style); + /* also test if the window scroll bars are enabled */ + ret = EnableScrollBar( hwnd, SB_VERT, ESB_ENABLE_BOTH); + ok( !ret, "Vertical window scroll bar was not enabled\n"); + ret = EnableScrollBar( hwnd, SB_HORZ, ESB_ENABLE_BOTH); + ok( !ret, "Horizontal window scroll bar was not enabled\n"); + DestroyWindow( hwnd); + /* finally, check if adding a WS_[HV]SColl style of a window makes the scroll info + * available */ + if( style & (WS_HSCROLL | WS_VSCROLL)) return;/* only test if not yet set */ + /* Start with a clean window */ + DestroyWindow( hwnd); + hwnd = CreateWindowExA( 0, "static", "", WS_POPUP , + 0, 0, 10, 10, 0, 0, 0, NULL); + assert( hwnd != 0); + ret = GetScrollInfo( hwnd, SB_VERT, &si); + /* should fail */ + ok( !ret, "GetScrollInfo succeeded unexpectedly. Style is %08x\n", style); + /* add scroll styles */ + winstyle = GetWindowLongW( hwnd, GWL_STYLE ); + SetWindowLongW( hwnd, GWL_STYLE, winstyle | WS_VSCROLL | WS_HSCROLL); + ret = GetScrollInfo( hwnd, SB_VERT, &si); + /* should still fail */ + ok( !ret, "GetScrollInfo succeeded unexpectedly. Style is %08x\n", style); + /* clean up */ + DestroyWindow( hwnd); +} + START_TEST ( scroll ) { WNDCLASSA wc; + HMODULE hUxtheme; + BOOL (WINAPI * pIsThemeActive)(VOID); wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; @@ -225,6 +413,21 @@ START_TEST ( scroll ) scrollbar_test3(); scrollbar_test4(); + /* Some test results vary depending of theming being active or not */ + hUxtheme = LoadLibraryA("uxtheme.dll"); + if (hUxtheme) + { + pIsThemeActive = (void*)GetProcAddress(hUxtheme, "IsThemeActive"); + if (pIsThemeActive) + bThemeActive = pIsThemeActive(); + FreeLibrary(hUxtheme); + } + + scrollbar_test_default( 0); + scrollbar_test_default( WS_HSCROLL); + scrollbar_test_default( WS_VSCROLL); + scrollbar_test_default( WS_HSCROLL | WS_VSCROLL); + DestroyWindow(hScroll); DestroyWindow(hMainWnd); } diff --git a/rostests/winetests/user32/static.c b/rostests/winetests/user32/static.c index 6a474ff5903..d04f725138a 100644 --- a/rostests/winetests/user32/static.c +++ b/rostests/winetests/user32/static.c @@ -56,6 +56,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpara ok(GetClipRgn(hdc, hrgn) == 1, "Static controls during a WM_CTLCOLORSTATIC must have a clipping region\n"); DeleteObject(hrgn); g_nReceivedColorStatic++; + return (LRESULT) GetStockObject(BLACK_BRUSH); } break; } @@ -81,7 +82,11 @@ static void test_updates(int style, int flags) InvalidateRect(hStatic, NULL, FALSE); UpdateWindow(hStatic); - + if( (style & SS_TYPEMASK) == SS_BITMAP) { + HDC hdc = GetDC( hStatic); + COLORREF colour = GetPixel( hdc, 10, 10); + ok ( colour != 0, "pixel should NOT be painted black!\n"); + } if (style != SS_ETCHEDHORZ && style != SS_ETCHEDVERT) exp = 4; else @@ -89,7 +94,7 @@ static void test_updates(int style, int flags) if (flags & TODO_COUNT) todo_wine { expect_eq(g_nReceivedColorStatic, exp, int, "%d"); } - else if (style == SS_ICON || style == SS_BITMAP) + else if ((style & SS_TYPEMASK) == SS_ICON || (style & SS_TYPEMASK) == SS_BITMAP) ok( g_nReceivedColorStatic == exp || broken(g_nReceivedColorStatic == 0), /* win9x */ "expected %u got %u\n", exp, g_nReceivedColorStatic ); @@ -125,6 +130,7 @@ START_TEST(static) test_updates(SS_SIMPLE, 0); test_updates(SS_ICON, 0); test_updates(SS_BITMAP, 0); + test_updates(SS_BITMAP | SS_CENTERIMAGE, 0); test_updates(SS_BLACKRECT, TODO_COUNT); test_updates(SS_WHITERECT, TODO_COUNT); test_updates(SS_ETCHEDHORZ, TODO_COUNT); diff --git a/rostests/winetests/user32/sysparams.c b/rostests/winetests/user32/sysparams.c index 05f728d0b27..3c944414083 100755 --- a/rostests/winetests/user32/sysparams.c +++ b/rostests/winetests/user32/sysparams.c @@ -156,6 +156,7 @@ static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam ); static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); static int change_counter; +static int change_setworkarea_param, change_iconverticalspacing_param; static int change_last_param; static int last_bpp; static BOOL displaychange_ok = FALSE, displaychange_test_active = FALSE; @@ -176,21 +177,32 @@ static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam case WM_SETTINGCHANGE: if (change_counter>0) { /* ignore these messages caused by resizing of toolbars */ - if( wParam == SPI_SETWORKAREA || - wParam == SPI_ICONVERTICALSPACING || - displaychange_test_active) + if( wParam == SPI_SETWORKAREA){ + change_setworkarea_param = 1; break; - if( change_last_param == SPI_SETWORKAREA || - change_last_param == SPI_ICONVERTICALSPACING) - { + } else if( wParam == SPI_ICONVERTICALSPACING) { + change_iconverticalspacing_param = 1; + break; + } else if( displaychange_test_active) + break; + if( !change_last_param){ change_last_param = wParam; break; } ok(0,"too many changes counter=%d last change=%d\n", change_counter,change_last_param); + change_counter++; + change_last_param = wParam; + break; } change_counter++; - change_last_param = wParam; + change_last_param = change_setworkarea_param = change_iconverticalspacing_param =0; + if( wParam == SPI_SETWORKAREA) + change_setworkarea_param = 1; + else if( wParam == SPI_ICONVERTICALSPACING) + change_iconverticalspacing_param = 1; + else + change_last_param = wParam; break; case WM_DESTROY: @@ -218,7 +230,9 @@ static void test_change_message( int action, int optional ) ok( 1 == change_counter, "Missed a message: change_counter=%d\n", change_counter ); change_counter = 0; - ok( action == change_last_param, + ok( action == change_last_param || + ( change_setworkarea_param && action == SPI_SETWORKAREA) || + ( change_iconverticalspacing_param && action == SPI_ICONVERTICALSPACING), "Wrong action got %d expected %d\n", change_last_param, action ); change_last_param = 0; } @@ -709,11 +723,15 @@ static void test_SPI_SETBORDER( void ) /* 6 */ BOOL rc; UINT old_border; NONCLIENTMETRICSA ncmsave; - INT CaptionWidth; + INT CaptionWidth, + PaddedBorderWidth; ncmsave.cbSize = sizeof( ncmsave); rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncmsave, 0); - ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); + if( !rc) { + win_skip("SPI_GETNONCLIENTMETRICS is not available\n"); + return; + } /* CaptionWidth from the registry may have different value of iCaptionWidth * from the non client metrics (observed on WinXP). * Fix this so we can safely restore settings with the nonclientmetrics */ @@ -734,6 +752,13 @@ static void test_SPI_SETBORDER( void ) /* 6 */ rc=SystemParametersInfoA( SPI_GETBORDER, 0, &old_border, 0 ); if (!test_error_msg(rc,"SPI_{GET,SET}BORDER")) return; + /* FIXME: include new PaddedBorderWidth parameter */ + PaddedBorderWidth = ncmsave.iBorderWidth - old_border; + if( PaddedBorderWidth){ + win_skip( "Cannot reliably restore border width yet (PaddedBorderWidth = %d)\n", + PaddedBorderWidth); + return; + } /* This will restore sane values if the test hang previous run. */ if ( old_border == 7 || old_border == 20 ) old_border = 1; @@ -1054,7 +1079,7 @@ static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */ if( regval != vals[i]) regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi); - ok( regval == vals[i], + ok( regval == vals[i] || broken(regval == -1), /* win9x */ "wrong value in registry %d, expected %d\n", regval, vals[i] ); rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &v, 0 ); @@ -1346,7 +1371,7 @@ static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */ } #define TEST_NONCLIENTMETRICS_REG( ncm) \ -test_reg_metric2( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, (ncm).iBorderWidth);\ +/*FIXME: test_reg_metric2( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, (ncm).iBorderWidth);*/\ test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLWIDTH_VALNAME, (ncm).iScrollWidth);\ test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLHEIGHT_VALNAME, (ncm).iScrollHeight);\ /*FIXME: test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, (ncm).iCaptionWidth);*/\ @@ -1390,6 +1415,7 @@ static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */ Ncmstart.cbSize = sizeof(NONCLIENTMETRICSA); trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n"); + change_counter = 0; SetLastError(0xdeadbeef); rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &Ncmorig, FALSE ); if (!test_error_msg(rc,"SPI_{GET,SET}NONCLIENTMETRICS")) @@ -1443,7 +1469,7 @@ static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */ ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); /* test registry entries */ TEST_NONCLIENTMETRICS_REG( Ncmcur) - /* test the systemm metrics with these settings */ + /* test the system metrics with these settings */ test_GetSystemMetrics(); /* now for something invalid: increase the {menu|caption|smcaption} fonts by a large amount will increase the {menu|caption|smcaption} height*/ @@ -1478,19 +1504,22 @@ static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */ "SmCaptionHeight: %d expected %d\n", Ncmcur.iSmCaptionHeight, expect); ok( Ncmcur.iCaptionWidth == 8 || + Ncmcur.iCaptionWidth == 12 || /* Vista, W7b */ Ncmcur.iCaptionWidth == Ncmstart.iCaptionWidth, /* with windows XP theme, the value never changes */ - "CaptionWidth: %d expected 8\n", Ncmcur.iCaptionWidth); + "CaptionWidth: %d expected 8, 12 or %d\n", Ncmcur.iCaptionWidth, Ncmstart.iCaptionWidth); ok( Ncmcur.iScrollWidth == 8, "ScrollWidth: %d expected 8\n", Ncmcur.iScrollWidth); ok( Ncmcur.iScrollHeight == 8, "ScrollHeight: %d expected 8\n", Ncmcur.iScrollHeight); - /* test the systemm metrics with these settings */ + /* test the system metrics with these settings */ test_GetSystemMetrics(); /* restore */ rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &Ncmorig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); test_change_message( SPI_SETNONCLIENTMETRICS, 0 ); ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError()); + /* test the system metrics with these settings */ + test_GetSystemMetrics(); } static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */ @@ -1639,9 +1668,11 @@ static void test_SPI_SETICONMETRICS( void ) /* 46 */ return; /* check some registry values */ regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi); - ok( regval==im_orig.iHorzSpacing, "wrong value in registry %d, expected %d\n", regval, im_orig.iHorzSpacing); + ok( regval==im_orig.iHorzSpacing || broken(regval == -1), /* nt4 */ + "wrong value in registry %d, expected %d\n", regval, im_orig.iHorzSpacing); regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi); - ok( regval==im_orig.iVertSpacing, "wrong value in registry %d, expected %d\n", regval, im_orig.iVertSpacing); + ok( regval==im_orig.iVertSpacing || broken(regval == -1), /* nt4 */ + "wrong value in registry %d, expected %d\n", regval, im_orig.iVertSpacing); regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi); if( regval != im_orig.iTitleWrap) regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi); @@ -1763,24 +1794,32 @@ static void test_SPI_SETWORKAREA( void ) /* 47 */ SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); if (!test_error_msg(rc,"SPI_SETWORKAREA")) return; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); - test_change_message( SPI_SETWORKAREA, 0 ); rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 ); ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); + if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */ + test_change_message( SPI_SETWORKAREA, 0); eq( area.left, curr_val.left, "left", "%d" ); eq( area.top, curr_val.top, "top", "%d" ); - eq( area.right, curr_val.right, "right", "%d" ); - eq( area.bottom, curr_val.bottom, "bottom", "%d" ); - + /* size may be rounded up */ + ok( area.right >= curr_val.right && area.right < curr_val.right + 16, + "right: got %d instead of %d\n", area.right, curr_val.right ); + ok( area.bottom >= curr_val.bottom && area.bottom < curr_val.bottom + 16, + "bottom: got %d instead of %d\n", area.bottom, curr_val.bottom ); + curr_val = area; rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &old_area, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError()); - test_change_message( SPI_SETWORKAREA, 0 ); rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 ); ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); + if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */ + test_change_message( SPI_SETWORKAREA, 0 ); eq( area.left, old_area.left, "left", "%d" ); eq( area.top, old_area.top, "top", "%d" ); - eq( area.right, old_area.right, "right", "%d" ); - eq( area.bottom, old_area.bottom, "bottom", "%d" ); + /* size may be rounded up */ + ok( area.right >= old_area.right && area.right < old_area.right + 16, + "right: got %d instead of %d\n", area.right, old_area.right ); + ok( area.bottom >= old_area.bottom && area.bottom < old_area.bottom + 16, + "bottom: got %d instead of %d\n", area.bottom, old_area.bottom ); } static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */ @@ -2409,6 +2448,14 @@ static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam ) test_SPI_SETMOUSEBUTTONSWAP(); /* 33 */ test_SPI_SETFASTTASKSWITCH(); /* 36 */ test_SPI_SETDRAGFULLWINDOWS(); /* 37 */ + /* test_WM_DISPLAYCHANGE seems to be somewhat buggy on + * some versions of Windows (Vista, Win2k8, Win7B) in that + * not all metrics are properly restored. Problems are + * SM_CXMAXTRACK, SM_CYMAXTRACK + * Fortunately setting the Non-Client metrics like in + * test_SPI_SETNONCLIENTMETRICS will corect this. That is why + * we do the DISPLAY change now... */ + test_WM_DISPLAYCHANGE(); test_SPI_SETNONCLIENTMETRICS(); /* 42 */ test_SPI_SETMINIMIZEDMETRICS(); /* 44 */ test_SPI_SETICONMETRICS(); /* 46 */ @@ -2428,7 +2475,6 @@ static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam ) test_SPI_SETWHEELSCROLLCHARS(); /* 108 */ test_SPI_SETWALLPAPER(); /* 115 */ - test_WM_DISPLAYCHANGE(); SendMessageA( ghTestWnd, WM_DESTROY, 0, 0 ); return 0; @@ -2509,10 +2555,11 @@ static void test_GetSystemMetrics( void) { TEXTMETRICA tmMenuFont; UINT IconSpacing, IconVerticalSpacing; + BOOL rc; HDC hdc = CreateIC( "Display", 0, 0, 0); UINT avcwCaption; - INT CaptionWidth; + INT CaptionWidthfromreg; MINIMIZEDMETRICS minim; NONCLIENTMETRICS ncm; SIZE screen; @@ -2520,11 +2567,14 @@ static void test_GetSystemMetrics( void) minim.cbSize = sizeof( minim); ncm.cbSize = sizeof( ncm); SystemParametersInfo( SPI_GETMINIMIZEDMETRICS, 0, &minim, 0); - SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); - + rc = SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); + if( !rc) { + win_skip("SPI_GETNONCLIENTMETRICS is not available\n"); + return; + } /* CaptionWidth from the registry may have different value of iCaptionWidth * from the non client metrics (observed on WinXP) */ - CaptionWidth = metricfromreg( + CaptionWidthfromreg = metricfromreg( "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi); get_text_metr_size( hdc, &ncm.lfMenuFont, &tmMenuFont, NULL); get_text_metr_size( hdc, &ncm.lfCaptionFont, NULL, &avcwCaption); @@ -2568,8 +2618,8 @@ static void test_GetSystemMetrics( void) /* SM_RESERVED2 */ /* SM_RESERVED3 */ /* SM_RESERVED4 */ - ok_gsm( SM_CXMIN, 3 * max( CaptionWidth, 8) + GetSystemMetrics( SM_CYSIZE) + - 4 + 4 * avcwCaption + 2 * GetSystemMetrics( SM_CXFRAME)); + ok_gsm( SM_CXMIN, 3 * max( CaptionWidthfromreg >= 0 ? CaptionWidthfromreg : ncm.iCaptionWidth, 8) + + GetSystemMetrics( SM_CYSIZE) + 4 + 4 * avcwCaption + 2 * GetSystemMetrics( SM_CXFRAME)); ok_gsm( SM_CYMIN, GetSystemMetrics( SM_CYCAPTION) + 2 * GetSystemMetrics( SM_CYFRAME)); ok_gsm_2( SM_CXSIZE, @@ -2617,8 +2667,10 @@ static void test_GetSystemMetrics( void) screen.cx = GetSystemMetrics( SM_CXSCREEN ); screen.cy = GetSystemMetrics( SM_CYSCREEN ); } - ok_gsm( SM_CXMAXTRACK, screen.cx + 4 + 2 * GetSystemMetrics(SM_CXFRAME)); - ok_gsm( SM_CYMAXTRACK, screen.cy + 4 + 2 * GetSystemMetrics(SM_CYFRAME)); + ok_gsm_2( SM_CXMAXTRACK, screen.cx + 4 + 2 * GetSystemMetrics(SM_CXFRAME), + screen.cx - 4 + 2 * GetSystemMetrics(SM_CXFRAME)); /* Vista */ + ok_gsm_2( SM_CYMAXTRACK, screen.cy + 4 + 2 * GetSystemMetrics(SM_CYFRAME), + screen.cy - 4 + 2 * GetSystemMetrics(SM_CYFRAME)); /* Vista */ /* the next two cannot really be tested as they depend on (application) * toolbars */ /* SM_CXMAXIMIZED */ @@ -2656,8 +2708,8 @@ static void test_GetSystemMetrics( void) ncm.iBorderWidth, ncm.iCaptionWidth, ncm.iCaptionHeight, IconSpacing, IconVerticalSpacing); trace( "MenuHeight %d MenuWidth %d ScrollHeight %d ScrollWidth %d SmCaptionHeight %d SmCaptionWidth %d\n", ncm.iMenuHeight, ncm.iMenuWidth, ncm.iScrollHeight, ncm.iScrollWidth, ncm.iSmCaptionHeight, ncm.iSmCaptionWidth); - trace( "Captionfontchar width %d MenuFont %d,%d CaptionWidth from registry: %d\n", - avcwCaption, tmMenuFont.tmHeight, tmMenuFont.tmExternalLeading, CaptionWidth); + trace( "Captionfontchar width %d MenuFont %d,%d CaptionWidth from registry: %d screen %d,%d\n", + avcwCaption, tmMenuFont.tmHeight, tmMenuFont.tmExternalLeading, CaptionWidthfromreg, screen.cx, screen.cy); } ReleaseDC( 0, hdc); } diff --git a/rostests/winetests/user32/win.c b/rostests/winetests/user32/win.c index 33f140335fb..1f0420e1460 100644 --- a/rostests/winetests/user32/win.c +++ b/rostests/winetests/user32/win.c @@ -51,6 +51,7 @@ static BOOL (WINAPI *pGetLayeredWindowAttributes)(HWND,COLORREF*,BYTE*,DWORD*); static BOOL (WINAPI *pSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD); static BOOL (WINAPI *pGetMonitorInfoA)(HMONITOR,LPMONITORINFO); static HMONITOR (WINAPI *pMonitorFromPoint)(POINT,DWORD); +static int (WINAPI *pGetWindowRgnBox)(HWND,LPRECT); static BOOL test_lbuttondown_flag; static HWND hwndMessage; @@ -2430,9 +2431,9 @@ static void test_SetForegroundWindow(HWND hwnd) /*trace("testing SetForegroundWindow on an invisible window %p\n", hwnd);*/ ret = SetForegroundWindow(hwnd); - ok(ret, "SetForegroundWindow returned FALSE instead of TRUE\n"); + ok(ret || broken(!ret), /* win98 */ "SetForegroundWindow returned FALSE instead of TRUE\n"); check_wnd_state(hwnd, hwnd, hwnd, 0); - + ShowWindow(hwnd, SW_SHOW); check_wnd_state(hwnd, hwnd, hwnd, 0); @@ -2661,7 +2662,10 @@ static void test_keyboard_input(HWND hwnd) ok(GetFocus() == hwnd, "wrong focus window %p\n", GetFocus()); keybd_event(VK_SPACE, 0, 0, 0); - ret = PeekMessageA(&msg, 0, 0, 0, PM_REMOVE); + do + { + ret = PeekMessageA(&msg, 0, 0, 0, PM_REMOVE); + } while (ret && msg.message >= 0xc000); if (!ret) { skip( "keybd_event didn't work, skipping keyboard test\n" ); @@ -4929,7 +4933,10 @@ static void test_GetWindowModuleFileName(void) ok(IsWindow(hwnd), "got invalid desktop window %p\n", hwnd); SetLastError(0xdeadbeef); ret2 = pGetWindowModuleFileNameA(hwnd, buf2, sizeof(buf2)); - ok(!ret2 || ret1 == ret2 /* vista */, "expected 0 or %u, got %u %s\n", ret1, ret2, buf2); + ok(!ret2 || + ret1 == ret2 || /* vista */ + broken(ret2), /* some win98 return user.exe as file name */ + "expected 0 or %u, got %u %s\n", ret1, ret2, buf2); } } @@ -5529,6 +5536,48 @@ static void test_handles( HWND full_hwnd ) #endif } +static void test_winregion(void) +{ + HWND hwnd; + RECT r; + int ret; + HRGN hrgn; + + if (!pGetWindowRgnBox) + { + win_skip("GetWindowRgnBox not supported\n"); + return; + } + + hwnd = CreateWindowExA(0, "static", NULL, WS_VISIBLE, 10, 10, 10, 10, NULL, 0, 0, NULL); + /* NULL prect */ + SetLastError(0xdeadbeef); + ret = pGetWindowRgnBox(hwnd, NULL); + ok( ret == ERROR, "Expected ERROR, got %d\n", ret); + ok( GetLastError() == 0xdeadbeef, "Expected , got %d\n", GetLastError()); + + hrgn = CreateRectRgn(2, 3, 10, 15); + ok( hrgn != NULL, "Region creation failed\n"); + if (hrgn) + { + SetWindowRgn(hwnd, hrgn, FALSE); + + SetLastError(0xdeadbeef); + ret = pGetWindowRgnBox(hwnd, NULL); + ok( ret == ERROR, "Expected ERROR, got %d\n", ret); + ok( GetLastError() == 0xdeadbeef, "Expected , got %d\n", GetLastError()); + + r.left = r.top = r.right = r.bottom = 0; + ret = pGetWindowRgnBox(hwnd, &r); + ok( ret == SIMPLEREGION, "Expected SIMPLEREGION, got %d\n", ret); + ok( r.left == 2 && r.top == 3 && r.right == 10 && r.bottom == 15, + "Expected (2,3,10,15), got (%d,%d,%d,%d)\n", r.left, r.top, + r.right, r.bottom); + DeleteObject(hrgn); + } + DestroyWindow(hwnd); +} + START_TEST(win) { HMODULE user32 = GetModuleHandleA( "user32.dll" ); @@ -5539,6 +5588,7 @@ START_TEST(win) pSetLayeredWindowAttributes = (void *)GetProcAddress( user32, "SetLayeredWindowAttributes" ); pGetMonitorInfoA = (void *)GetProcAddress( user32, "GetMonitorInfoA" ); pMonitorFromPoint = (void *)GetProcAddress( user32, "MonitorFromPoint" ); + pGetWindowRgnBox = (void *)GetProcAddress( user32, "GetWindowRgnBox" ); if (!RegisterWindowClasses()) assert(0); @@ -5608,6 +5658,7 @@ START_TEST(win) test_SetForegroundWindow(hwndMain); test_shell_window(); test_handles( hwndMain ); + test_winregion(); /* add the tests above this line */ if (hhook) UnhookWindowsHookEx(hhook); diff --git a/rostests/winetests/usp10/usp10.c b/rostests/winetests/usp10/usp10.c index 1dba6829ac7..1eefee0509a 100644 --- a/rostests/winetests/usp10/usp10.c +++ b/rostests/winetests/usp10/usp10.c @@ -40,10 +40,12 @@ static void test_ScriptShape(HDC hdc) BOOL ret; HRESULT hr; SCRIPT_CACHE sc = NULL; - WORD glyphs[4]; + WORD glyphs[4], logclust[4]; SCRIPT_VISATTR attrs[4]; SCRIPT_ITEM items[2]; int nb, widths[4]; + GOFFSET offset[4]; + ABC abc[4]; hr = ScriptItemize(NULL, 4, 2, NULL, NULL, items, NULL); ok(hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG not %08x\n", hr); @@ -65,19 +67,35 @@ static void test_ScriptShape(HDC hdc) ok(hr == E_PENDING, "ScriptShape should return E_PENDING not %08x\n", hr); hr = ScriptShape(hdc, &sc, test1, 4, 4, &items[0].a, glyphs, NULL, attrs, &nb); + ok(!hr || + hr == E_INVALIDARG, /* Vista, W2K8 */ + "ScriptShape should return S_OK or E_INVALIDARG, not %08x\n", hr); + ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); + + hr = ScriptShape(hdc, &sc, test1, 4, 4, &items[0].a, glyphs, logclust, attrs, &nb); ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); - hr = ScriptShape(NULL, &sc, test1, 4, 4, &items[0].a, glyphs, NULL, attrs, &nb); + hr = ScriptShape(NULL, &sc, test1, 4, 4, &items[0].a, glyphs, logclust, attrs, &nb); ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); hr = ScriptPlace(hdc, &sc, glyphs, 4, NULL, &items[0].a, widths, NULL, NULL); ok(hr == E_INVALIDARG, "ScriptPlace should return E_INVALIDARG not %08x\n", hr); hr = ScriptPlace(NULL, &sc, glyphs, 4, attrs, &items[0].a, widths, NULL, NULL); + ok(hr == E_PENDING || + hr == E_INVALIDARG, /* Vista, W2K8 */ + "ScriptPlace should return E_PENDING or E_INVALIDARG, not %08x\n", hr); + + hr = ScriptPlace(NULL, &sc, glyphs, 4, attrs, &items[0].a, widths, offset, NULL); ok(hr == E_PENDING, "ScriptPlace should return E_PENDING not %08x\n", hr); - hr = ScriptPlace(hdc, &sc, glyphs, 4, attrs, &items[0].a, widths, NULL, NULL); + hr = ScriptPlace(NULL, &sc, glyphs, 4, attrs, &items[0].a, widths, NULL, abc); + ok(hr == E_PENDING || + hr == E_INVALIDARG, /* Vista, W2K8 */ + "ScriptPlace should return E_PENDING or E_INVALIDARG, not %08x\n", hr); + + hr = ScriptPlace(hdc, &sc, glyphs, 4, attrs, &items[0].a, widths, offset, NULL); ok(!hr, "ScriptPlace should return S_OK not %08x\n", hr); ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); @@ -1099,184 +1117,6 @@ static void test_ScriptLayout(void) } } -static const struct -{ - LGRPID group; - LCID lcid; - SCRIPT_DIGITSUBSTITUTE sds; - DWORD uDefaultLanguage; - DWORD fContextDigits; - WORD fDigitSubstitute; -} -subst_data[] = -{ - { 0x01, 0x00403, { 9, 3, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00406, { 9, 6, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00407, { 9, 7, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00409, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0040a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0040b, { 9, 11, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0040c, { 9, 12, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0040f, { 9, 15, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00410, { 9, 16, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00413, { 9, 19, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00414, { 9, 20, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00416, { 9, 22, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0041d, { 9, 29, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00421, { 9, 33, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0042d, { 9, 45, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00432, { 9, 50, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00434, { 9, 52, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00435, { 9, 53, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00436, { 9, 54, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00438, { 9, 56, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0043a, { 9, 58, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0043b, { 9, 59, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0043e, { 9, 62, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00441, { 9, 65, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00452, { 9, 82, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00456, { 9, 86, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0046b, { 9, 107, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0046c, { 9, 108, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00481, { 9, 129, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00807, { 9, 7, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00809, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0080a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0080c, { 9, 12, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00810, { 9, 16, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00813, { 9, 19, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00814, { 9, 20, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00816, { 9, 22, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0081d, { 9, 29, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0083b, { 9, 59, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0083e, { 9, 62, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0086b, { 9, 107, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00c07, { 9, 7, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00c09, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00c0a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00c0c, { 9, 12, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00c3b, { 9, 59, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x00c6b, { 9, 107, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x01007, { 9, 7, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x01009, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0100a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0100c, { 9, 12, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0103b, { 9, 59, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x01407, { 9, 7, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x01409, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0140a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0140c, { 9, 12, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0143b, { 9, 59, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x01809, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0180a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0180c, { 9, 12, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0183b, { 9, 59, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x01c09, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x01c0a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x01c3b, { 9, 59, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x02009, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0200a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0203b, { 9, 59, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x02409, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0240a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0243b, { 9, 59, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x02809, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0280a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x02c09, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x02c0a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x03009, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0300a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x03409, { 9, 9, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0340a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0380a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x03c0a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0400a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0440a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0480a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x04c0a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x0500a, { 9, 10, 1, 0 }, 9, 0, 0 }, - { 0x01, 0x10407, { 9, 7, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x00405, { 9, 5, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x0040e, { 9, 14, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x00415, { 9, 21, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x00418, { 9, 24, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x0041a, { 9, 26, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x0041b, { 9, 27, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x0041c, { 9, 28, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x00424, { 9, 36, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x0081a, { 9, 26, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x0101a, { 9, 26, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x0141a, { 9, 26, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x0181a, { 9, 26, 1, 0 }, 9, 0, 0 }, - { 0x02, 0x1040e, { 9, 14, 1, 0 }, 9, 0, 0 }, - { 0x03, 0x00425, { 9, 37, 1, 0 }, 9, 0, 0 }, - { 0x03, 0x00426, { 9, 38, 1, 0 }, 9, 0, 0 }, - { 0x03, 0x00427, { 9, 39, 1, 0 }, 9, 0, 0 }, - { 0x04, 0x00408, { 9, 8, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x00402, { 9, 2, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x00419, { 9, 25, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x00422, { 9, 34, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x00423, { 9, 35, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x0042f, { 9, 47, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x0043f, { 9, 63, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x00440, { 9, 64, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x00444, { 9, 68, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x00450, { 9, 80, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x0082c, { 9, 44, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x00843, { 9, 67, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x00c1a, { 9, 26, 1, 0 }, 9, 0, 0 }, - { 0x05, 0x01c1a, { 9, 26, 1, 0 }, 9, 0, 0 }, - { 0x06, 0x0041f, { 9, 31, 1, 0 }, 9, 0, 0 }, - { 0x06, 0x0042c, { 9, 44, 1, 0 }, 9, 0, 0 }, - { 0x06, 0x00443, { 9, 67, 1, 0 }, 9, 0, 0 }, - { 0x07, 0x00411, { 9, 17, 1, 0 }, 9, 0, 0 }, - { 0x08, 0x00412, { 9, 18, 1, 0 }, 9, 0, 0 }, - { 0x09, 0x00404, { 9, 4, 1, 0 }, 9, 0, 0 }, - { 0x09, 0x00c04, { 9, 4, 1, 0 }, 9, 0, 0 }, - { 0x09, 0x01404, { 9, 4, 1, 0 }, 9, 0, 0 }, - { 0x09, 0x21404, { 9, 4, 1, 0 }, 9, 0, 0 }, - { 0x09, 0x30404, { 9, 4, 1, 0 }, 9, 0, 0 }, - { 0x0a, 0x00804, { 9, 4, 1, 0 }, 9, 0, 0 }, - { 0x0a, 0x01004, { 9, 4, 1, 0 }, 9, 0, 0 }, - { 0x0a, 0x20804, { 9, 4, 1, 0 }, 9, 0, 0 }, - { 0x0a, 0x21004, { 9, 4, 1, 0 }, 9, 0, 0 }, - { 0x0b, 0x0041e, { 9, 30, 1, 0 }, 9, 0, 0 }, - { 0x0c, 0x0040d, { 9, 13, 1, 0 }, 9, 0, 0 }, - { 0x0d, 0x00401, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x00420, { 9, 32, 1, 0 }, 9, 0, 0 }, - { 0x0d, 0x00429, { 41, 41, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x0045a, { 9, 90, 1, 0 }, 9, 0, 0 }, - { 0x0d, 0x00465, { 9, 101, 1, 0 }, 9, 0, 0 }, - { 0x0d, 0x00801, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x00c01, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x01001, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x01401, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x01801, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x01c01, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x02001, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x02401, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x02801, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x02c01, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x03001, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x03401, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x03801, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x03c01, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0d, 0x04001, { 1, 1, 0, 0 }, 9, 0, 0 }, - { 0x0e, 0x0042a, { 9, 42, 1, 0 }, 9, 0, 0 }, - { 0x0f, 0x00439, { 9, 57, 1, 0 }, 9, 0, 0 }, - { 0x0f, 0x00446, { 9, 70, 1, 0 }, 9, 0, 0 }, - { 0x0f, 0x00447, { 9, 71, 1, 0 }, 9, 0, 0 }, - { 0x0f, 0x00449, { 9, 73, 1, 0 }, 9, 0, 0 }, - { 0x0f, 0x0044a, { 9, 74, 1, 0 }, 9, 0, 0 }, - { 0x0f, 0x0044b, { 9, 75, 1, 0 }, 9, 0, 0 }, - { 0x0f, 0x0044e, { 9, 78, 1, 0 }, 9, 0, 0 }, - { 0x0f, 0x0044f, { 9, 79, 1, 0 }, 9, 0, 0 }, - { 0x0f, 0x00457, { 9, 87, 1, 0 }, 9, 0, 0 }, - { 0x10, 0x00437, { 9, 55, 1, 0 }, 9, 0, 0 }, - { 0x10, 0x10437, { 9, 55, 1, 0 }, 9, 0, 0 }, - { 0x11, 0x0042b, { 9, 43, 1, 0 }, 9, 0, 0 } -}; - static BOOL CALLBACK enum_proc(LGRPID group, LCID lcid, LPSTR locale, LONG_PTR lparam) { HRESULT hr; @@ -1284,7 +1124,6 @@ static BOOL CALLBACK enum_proc(LGRPID group, LCID lcid, LPSTR locale, LONG_PTR l SCRIPT_CONTROL sc; SCRIPT_STATE ss; LCID lcid_old; - unsigned int i; if (!IsValidLocale(lcid, LCID_INSTALLED)) return TRUE; @@ -1301,21 +1140,6 @@ static BOOL CALLBACK enum_proc(LGRPID group, LCID lcid, LPSTR locale, LONG_PTR l hr = ScriptApplyDigitSubstitution(&sds, &sc, &ss); ok(hr == S_OK, "ScriptApplyDigitSubstitution failed: 0x%08x\n", hr); - for (i = 0; i < sizeof(subst_data)/sizeof(subst_data[0]); i++) - { - if (group == subst_data[i].group && lcid == subst_data[i].lcid) - { - ok(!memcmp(&sds, &subst_data[i].sds, sizeof(sds)), - "substitution data does not match\n"); - - ok(sc.uDefaultLanguage == subst_data[i].uDefaultLanguage, - "sc.uDefaultLanguage does not match\n"); - ok(sc.fContextDigits == subst_data[i].fContextDigits, - "sc.fContextDigits does not match\n"); - ok(ss.fDigitSubstitute == subst_data[i].fDigitSubstitute, - "ss.fDigitSubstitute does not match\n"); - } - } SetThreadLocale(lcid_old); return TRUE; } @@ -1359,6 +1183,12 @@ static void test_digit_substitution(void) for (i = 0; i < sizeof(groups)/sizeof(groups[0]); i++) { ret = pEnumLanguageGroupLocalesA(enum_proc, groups[i], 0, 0); + if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("EnumLanguageGroupLocalesA not implemented on this platform\n"); + break; + } + ok(ret, "EnumLanguageGroupLocalesA failed unexpectedly: %u\n", GetLastError()); } } diff --git a/rostests/winetests/wininet/ftp.c b/rostests/winetests/wininet/ftp.c index a785fa983f4..b4de4e184b6 100644 --- a/rostests/winetests/wininet/ftp.c +++ b/rostests/winetests/wininet/ftp.c @@ -707,7 +707,7 @@ static void test_command(HINTERNET hFtp, HINTERNET hConnect) if (!pFtpCommandA) { - skip("FtpCommandA() is not available. Skipping the Ftp command tests\n"); + win_skip("FtpCommandA() is not available. Skipping the Ftp command tests\n"); return; } @@ -813,7 +813,7 @@ static void test_get_current_dir(HINTERNET hFtp, HINTERNET hConnect) if (!pFtpCommandA) { - skip("FtpCommandA() is not available. Skipping the Ftp get_current_dir tests\n"); + win_skip("FtpCommandA() is not available. Skipping the Ftp get_current_dir tests\n"); return; } diff --git a/rostests/winetests/wininet/http.c b/rostests/winetests/wininet/http.c index 5fd45d5d069..e3c33bd8748 100644 --- a/rostests/winetests/wininet/http.c +++ b/rostests/winetests/wininet/http.c @@ -84,7 +84,8 @@ static BOOL first_connection_to_test_url = TRUE; #define CHECK_NOTIFIED2(status, num) \ do { \ - ok(notified[status] == (num), "expected status %d (%s) %d times, received %d times\n", \ + ok(notified[status] + optional[status] == (num), \ + "expected status %d (%s) %d times, received %d times\n", \ status, status < MAX_INTERNET_STATUS && status_string[status][0] != 0 ? \ status_string[status] : "unknown", (num), notified[status]); \ CLEAR_NOTIFIED(status); \ @@ -349,12 +350,12 @@ static void InternetReadFile_test(int flags) if (flags & INTERNET_FLAG_ASYNC) WaitForSingleObject(hCompleteEvent, INFINITE); - todo_wine if (first_connection_to_test_url) + if (first_connection_to_test_url) { CHECK_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); CHECK_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); } - else + else todo_wine { CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); @@ -446,8 +447,8 @@ static void InternetReadFile_test(int flags) if (length == 0) break; } - todo_wine CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); - todo_wine CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); abort: trace("aborting\n"); SET_EXPECT2(INTERNET_STATUS_HANDLE_CLOSING, (hor != 0x0) + (hic != 0x0)); @@ -567,8 +568,8 @@ static void InternetReadFileExA_test(int flags) SET_EXPECT2(INTERNET_STATUS_REQUEST_SENT, 2); SET_EXPECT2(INTERNET_STATUS_RECEIVING_RESPONSE, 2); SET_EXPECT2(INTERNET_STATUS_RESPONSE_RECEIVED, 2); - SET_EXPECT2(INTERNET_STATUS_CLOSING_CONNECTION, 2); - SET_EXPECT2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + SET_OPTIONAL2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + SET_OPTIONAL2(INTERNET_STATUS_CONNECTION_CLOSED, 2); SET_EXPECT(INTERNET_STATUS_REDIRECT); SET_OPTIONAL(INTERNET_STATUS_CONNECTING_TO_SERVER); SET_OPTIONAL(INTERNET_STATUS_CONNECTED_TO_SERVER); @@ -605,8 +606,8 @@ static void InternetReadFileExA_test(int flags) CHECK_NOTIFIED2(INTERNET_STATUS_REQUEST_SENT, 2); CHECK_NOTIFIED2(INTERNET_STATUS_RECEIVING_RESPONSE, 2); CHECK_NOTIFIED2(INTERNET_STATUS_RESPONSE_RECEIVED, 2); - todo_wine CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); - todo_wine CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); CHECK_NOTIFIED(INTERNET_STATUS_REDIRECT); if (flags & INTERNET_FLAG_ASYNC) CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); @@ -754,8 +755,12 @@ abort: Sleep(100); CHECK_NOTIFIED2(INTERNET_STATUS_HANDLE_CLOSING, (hor != 0x0) + (hic != 0x0)); } + /* to enable once Wine is fixed to never send it CHECK_NOT_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION); CHECK_NOT_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED); + */ + CLEAR_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION); + CLEAR_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED); CloseHandle(hCompleteEvent); first_connection_to_test_url = FALSE; } @@ -766,7 +771,7 @@ static void InternetOpenUrlA_test(void) char buffer[0x400]; DWORD size, readbytes, totalbytes=0; BOOL ret; - + myhinternet = InternetOpen("Winetest",0,NULL,NULL,INTERNET_FLAG_NO_CACHE_WRITE); ok((myhinternet != 0), "InternetOpen failed, error %u\n",GetLastError()); size = 0x400; @@ -1033,7 +1038,7 @@ static void HttpHeaders_test(void) strcpy(buffer,"Warning"); ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index)==0,"Warning hearder reported as Existing\n"); - + ok(HttpAddRequestHeaders(hRequest,"Warning:test1",-1,HTTP_ADDREQ_FLAG_ADD), "Failed to add new header\n"); @@ -1179,7 +1184,7 @@ static void HttpHeaders_test(void) strcpy(buffer,"Warning"); ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index)==0,"Third Header Should Not Exist\n"); - + ok(HttpAddRequestHeaders(hRequest,"Warning:test4",-1,HTTP_ADDREQ_FLAG_ADD_IF_NEW)==0, "HTTP_ADDREQ_FLAG_ADD_IF_NEW replaced existing header\n"); index = 0; @@ -1269,7 +1274,16 @@ static void HttpHeaders_test(void) strcpy(buffer,"Warning"); ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index)==0,"Third Header Should Not Exist\n"); - + /* Ensure that blank headers are ignored and don't cause a failure */ + ok(HttpAddRequestHeaders(hRequest,"\r\nBlankTest:value\r\n\r\n",-1, HTTP_ADDREQ_FLAG_ADD_IF_NEW), "Failed to add header with blank entries in list\n"); + + index = 0; + len = sizeof(buffer); + strcpy(buffer,"BlankTest"); + ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index),"Unable to query header\n"); + ok(index == 1, "Index was not incremented\n"); + ok(strcmp(buffer,"value")==0, "incorrect string was returned(%s)\n",buffer); + ok(InternetCloseHandle(hRequest), "Close request handle failed\n"); done: ok(InternetCloseHandle(hConnect), "Close connect handle failed\n"); @@ -1305,6 +1319,12 @@ static const char noauthmsg[] = "WWW-Authenticate: Basic realm=\"placebo\"\r\n" "\r\n"; +static const char noauthmsg2[] = +"HTTP/1.0 401 Anonymous requests or requests on unsecure channel are not allowed\r\n" +"HTTP/1.0 401 Anonymous requests or requests on unsecure channel are not allowed" +"\0d`0|6\n" +"Server: winetest\r\n"; + static const char proxymsg[] = "HTTP/1.1 407 Proxy Authentication Required\r\n" "Server: winetest\r\n" @@ -1488,6 +1508,10 @@ static DWORD CALLBACK server_thread(LPVOID param) { send(c, okmsg2, sizeof okmsg2-1, 0); } + if (strstr(buffer, "/testE")) + { + send(c, noauthmsg2, sizeof noauthmsg2-1, 0); + } if (strstr(buffer, "GET /quit")) { send(c, okmsg, sizeof okmsg-1, 0); @@ -1834,7 +1858,9 @@ static void test_HttpSendRequestW(int port) ret = HttpSendRequestW(req, header, ~0u, NULL, 0); error = GetLastError(); ok(!ret, "HttpSendRequestW succeeded\n"); - ok(error == ERROR_IO_PENDING || broken(error == ERROR_HTTP_HEADER_NOT_FOUND), /* IE6 */ + ok(error == ERROR_IO_PENDING || + broken(error == ERROR_HTTP_HEADER_NOT_FOUND) || /* IE6 */ + broken(error == ERROR_INVALID_PARAMETER), /* IE5 */ "got %u expected ERROR_IO_PENDING\n", error); InternetCloseHandle(req); @@ -1868,6 +1894,15 @@ static void test_cookie_header(int port) ok(!ret, "HttpQueryInfo succeeded\n"); ok(error == ERROR_HTTP_HEADER_NOT_FOUND, "got %u expected ERROR_HTTP_HEADER_NOT_FOUND\n", error); + ret = HttpAddRequestHeaders(req, "Cookie: cookie=not biscuit\r\n", ~0u, HTTP_ADDREQ_FLAG_ADD); + ok(ret, "HttpAddRequestHeaders failed: %u\n", GetLastError()); + + buffer[0] = 0; + size = sizeof(buffer); + ret = HttpQueryInfo(req, HTTP_QUERY_COOKIE | HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer, &size, NULL); + ok(ret, "HttpQueryInfo failed: %u\n", GetLastError()); + ok(!strcmp(buffer, "cookie=not biscuit"), "got '%s' expected \'cookie=not biscuit\'\n", buffer); + ret = HttpSendRequest(req, NULL, 0, NULL, 0); ok(ret, "HttpSendRequest failed: %u\n", GetLastError()); @@ -1917,6 +1952,49 @@ static void test_basic_authentication(int port) InternetCloseHandle(session); } +static void test_invalid_response_headers(int port) +{ + HINTERNET session, connect, request; + DWORD size, status; + BOOL ret; + char buffer[256]; + + session = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(session != NULL, "InternetOpen failed\n"); + + connect = InternetConnect(session, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(connect != NULL, "InternetConnect failed\n"); + + request = HttpOpenRequest(connect, NULL, "/testE", NULL, NULL, NULL, 0, 0); + ok(request != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(request, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed %u\n", GetLastError()); + + status = 0; + size = sizeof(status); + ret = HttpQueryInfo( request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL ); + ok(ret, "HttpQueryInfo failed\n"); + ok(status == 401, "unexpected status %u\n", status); + + buffer[0] = 0; + size = sizeof(buffer); + ret = HttpQueryInfo( request, HTTP_QUERY_RAW_HEADERS, buffer, &size, NULL); + ok(ret, "HttpQueryInfo failed\n"); + ok(!strcmp(buffer, "HTTP/1.0 401 Anonymous requests or requests on unsecure channel are not allowed"), + "headers wrong \"%s\"\n", buffer); + + buffer[0] = 0; + size = sizeof(buffer); + ret = HttpQueryInfo( request, HTTP_QUERY_SERVER, buffer, &size, NULL); + ok(ret, "HttpQueryInfo failed\n"); + ok(!strcmp(buffer, "winetest"), "server wrong \"%s\"\n", buffer); + + InternetCloseHandle(request); + InternetCloseHandle(connect); + InternetCloseHandle(session); +} + static void test_HttpQueryInfo(int port) { HINTERNET hi, hc, hr; @@ -2050,6 +2128,7 @@ static void test_http_connection(void) test_http1_1(si.port); test_cookie_header(si.port); test_basic_authentication(si.port); + test_invalid_response_headers(si.port); test_HttpQueryInfo(si.port); test_HttpSendRequestW(si.port); @@ -2226,6 +2305,197 @@ static void test_open_url_async(void) CloseHandle(ctx.event); } +enum api +{ + internet_connect = 1, + http_open_request, + http_send_request_ex, + internet_writefile, + http_end_request, + internet_close_handle +}; + +struct notification +{ + enum api function; /* api responsible for notification */ + unsigned int status; /* status received */ + int async; /* delivered from another thread? */ + int todo; +}; + +struct info +{ + enum api function; + const struct notification *test; + unsigned int count; + unsigned int index; + HANDLE wait; + DWORD thread; + unsigned int line; +}; + +static CRITICAL_SECTION notification_cs; + +static void CALLBACK check_notification( HINTERNET handle, DWORD_PTR context, DWORD status, LPVOID buffer, DWORD buflen ) +{ + BOOL status_ok, function_ok; + struct info *info = (struct info *)context; + unsigned int i; + + EnterCriticalSection( ¬ification_cs ); + + if (status == INTERNET_STATUS_HANDLE_CREATED) + { + DWORD size = sizeof(struct info *); + HttpQueryInfoA( handle, INTERNET_OPTION_CONTEXT_VALUE, &info, &size, 0 ); + } + i = info->index; + if (i >= info->count) + { + LeaveCriticalSection( ¬ification_cs ); + return; + } + + status_ok = (info->test[i].status == status); + function_ok = (info->test[i].function == info->function); + + if (!info->test[i].todo) + { + ok( status_ok, "%u: expected status %u got %u\n", info->line, info->test[i].status, status ); + ok( function_ok, "%u: expected function %u got %u\n", info->line, info->test[i].function, info->function ); + + if (info->test[i].async) + ok(info->thread != GetCurrentThreadId(), "%u: expected thread %u got %u\n", + info->line, info->thread, GetCurrentThreadId()); + } + else + { + todo_wine ok( status_ok, "%u: expected status %u got %u\n", info->line, info->test[i].status, status ); + if (status_ok) + todo_wine ok( function_ok, "%u: expected function %u got %u\n", info->line, info->test[i].function, info->function ); + } + if (i == info->count - 1 || info->test[i].function != info->test[i + 1].function) SetEvent( info->wait ); + info->index++; + + LeaveCriticalSection( ¬ification_cs ); +} + +static void setup_test( struct info *info, enum api function, unsigned int line ) +{ + info->function = function; + info->line = line; +} + +static const struct notification async_send_request_ex_test[] = +{ + { internet_connect, INTERNET_STATUS_HANDLE_CREATED, 0 }, + { http_open_request, INTERNET_STATUS_HANDLE_CREATED, 0 }, + { http_send_request_ex, INTERNET_STATUS_RESOLVING_NAME, 1 }, + { http_send_request_ex, INTERNET_STATUS_NAME_RESOLVED, 1 }, + { http_send_request_ex, INTERNET_STATUS_CONNECTING_TO_SERVER, 1 }, + { http_send_request_ex, INTERNET_STATUS_CONNECTED_TO_SERVER, 1 }, + { http_send_request_ex, INTERNET_STATUS_SENDING_REQUEST, 1 }, + { http_send_request_ex, INTERNET_STATUS_REQUEST_SENT, 1 }, + { http_send_request_ex, INTERNET_STATUS_REQUEST_COMPLETE, 1 }, + { internet_writefile, INTERNET_STATUS_SENDING_REQUEST, 0 }, + { internet_writefile, INTERNET_STATUS_REQUEST_SENT, 0 }, + { http_end_request, INTERNET_STATUS_RECEIVING_RESPONSE, 1 }, + { http_end_request, INTERNET_STATUS_RESPONSE_RECEIVED, 1 }, + { http_end_request, INTERNET_STATUS_REQUEST_COMPLETE, 1 }, + { internet_close_handle, INTERNET_STATUS_HANDLE_CLOSING, 0, 1 }, + { internet_close_handle, INTERNET_STATUS_HANDLE_CLOSING, 0, 1 } +}; + +static void test_async_HttpSendRequestEx(void) +{ + BOOL ret; + HINTERNET ses, req, con; + struct info info; + DWORD size, written, error; + INTERNET_BUFFERSA b; + static const char *accept[2] = {"*/*", NULL}; + static char data[] = "Public ID=codeweavers"; + char buffer[32]; + + InitializeCriticalSection( ¬ification_cs ); + + info.test = async_send_request_ex_test; + info.count = sizeof(async_send_request_ex_test)/sizeof(async_send_request_ex_test[0]); + info.index = 0; + info.wait = CreateEvent( NULL, FALSE, FALSE, NULL ); + info.thread = GetCurrentThreadId(); + + ses = InternetOpen( "winetest", 0, NULL, NULL, INTERNET_FLAG_ASYNC ); + ok( ses != NULL, "InternetOpen failed\n" ); + + pInternetSetStatusCallbackA( ses, check_notification ); + + setup_test( &info, internet_connect, __LINE__ ); + con = InternetConnect( ses, "crossover.codeweavers.com", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, (DWORD_PTR)&info ); + ok( con != NULL, "InternetConnect failed %u\n", GetLastError() ); + + WaitForSingleObject( info.wait, 10000 ); + + setup_test( &info, http_open_request, __LINE__ ); + req = HttpOpenRequest( con, "POST", "posttest.php", NULL, NULL, accept, 0, (DWORD_PTR)&info ); + ok( req != NULL, "HttpOpenRequest failed %u\n", GetLastError() ); + + WaitForSingleObject( info.wait, 10000 ); + + memset( &b, 0, sizeof(INTERNET_BUFFERSA) ); + b.dwStructSize = sizeof(INTERNET_BUFFERSA); + b.lpcszHeader = "Content-Type: application/x-www-form-urlencoded"; + b.dwHeadersLength = strlen( b.lpcszHeader ); + b.dwBufferTotal = strlen( data ); + + setup_test( &info, http_send_request_ex, __LINE__ ); + ret = HttpSendRequestExA( req, &b, NULL, 0x28, 0 ); + ok( !ret && GetLastError() == ERROR_IO_PENDING, "HttpSendRequestExA failed %d %u\n", ret, GetLastError() ); + + WaitForSingleObject( info.wait, 10000 ); + + size = sizeof(buffer); + SetLastError( 0xdeadbeef ); + ret = HttpQueryInfoA( req, HTTP_QUERY_CONTENT_ENCODING, buffer, &size, 0 ); + error = GetLastError(); + ok( !ret, "HttpQueryInfoA failed %u\n", GetLastError() ); + todo_wine + ok( error == ERROR_INTERNET_INCORRECT_HANDLE_STATE, + "expected ERROR_INTERNET_INCORRECT_HANDLE_STATE got %u\n", error ); + + written = 0; + size = strlen( data ); + setup_test( &info, internet_writefile, __LINE__ ); + ret = InternetWriteFile( req, data, size, &written ); + ok( ret, "InternetWriteFile failed %u\n", GetLastError() ); + ok( written == size, "expected %u got %u\n", written, size ); + + WaitForSingleObject( info.wait, 10000 ); + + SetLastError( 0xdeadbeef ); + ret = HttpEndRequestA( req, (void *)data, 0x28, 0 ); + error = GetLastError(); + ok( !ret, "HttpEndRequestA succeeded\n" ); + ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error ); + + SetLastError( 0xdeadbeef ); + setup_test( &info, http_end_request, __LINE__ ); + ret = HttpEndRequestA( req, NULL, 0x28, 0 ); + error = GetLastError(); + ok( !ret, "HttpEndRequestA succeeded\n" ); + ok( error == ERROR_IO_PENDING, "expected ERROR_IO_PENDING got %u\n", error ); + + WaitForSingleObject( info.wait, 10000 ); + + setup_test( &info, internet_close_handle, __LINE__ ); + InternetCloseHandle( req ); + InternetCloseHandle( con ); + InternetCloseHandle( ses ); + + WaitForSingleObject( info.wait, 10000 ); + CloseHandle( info.wait ); +} + #define STATUS_STRING(status) \ memcpy(status_string[status], #status, sizeof(CHAR) * \ (strlen(#status) < MAX_STATUS_NAME ? \ @@ -2282,6 +2552,7 @@ START_TEST(http) InternetReadFile_test(0); InternetReadFileExA_test(INTERNET_FLAG_ASYNC); test_open_url_async(); + test_async_HttpSendRequestEx(); } InternetOpenRequest_test(); test_http_cache(); diff --git a/rostests/winetests/wininet/internet.c b/rostests/winetests/wininet/internet.c index fe3f4778f3a..176f3d8f648 100644 --- a/rostests/winetests/wininet/internet.c +++ b/rostests/winetests/wininet/internet.c @@ -27,6 +27,10 @@ #include "wine/test.h" +static BOOL (WINAPI *pCreateUrlCacheContainerA)(DWORD, DWORD, DWORD, DWORD, + DWORD, DWORD, DWORD, DWORD); +static BOOL (WINAPI *pCreateUrlCacheContainerW)(DWORD, DWORD, DWORD, DWORD, + DWORD, DWORD, DWORD, DWORD); static BOOL (WINAPI *pInternetTimeFromSystemTimeA)(CONST SYSTEMTIME *,DWORD ,LPSTR ,DWORD); static BOOL (WINAPI *pInternetTimeFromSystemTimeW)(CONST SYSTEMTIME *,DWORD ,LPWSTR ,DWORD); static BOOL (WINAPI *pInternetTimeToSystemTimeA)(LPCSTR ,SYSTEMTIME *,DWORD); @@ -193,7 +197,7 @@ static void test_InternetQueryOptionA(void) ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code %d\n", err); HeapFree(GetProcessHeap(),0,buffer); - hurl = InternetConnectA(hinet,"www.winehq.com",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0); + hurl = InternetConnectA(hinet,"www.winehq.org",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0); SetLastError(0xdeadbeef); len=0; @@ -268,6 +272,8 @@ static void test_complicated_cookie(void) ok(ret == TRUE,"InternetSetCookie failed\n"); ret = InternetSetCookie("http://www.example.com/bar/",NULL,"M=N; domain=.example.com; path=/foo/"); ok(ret == TRUE,"InternetSetCookie failed\n"); + ret = InternetSetCookie("http://www.example.com/bar/",NULL,"O=P; secure; path=/bar"); + ok(ret == TRUE,"InternetSetCookie failed\n"); len = 1024; ret = InternetGetCookie("http://testing.example.com", NULL, buffer, &len); @@ -278,6 +284,7 @@ static void test_complicated_cookie(void) ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + ok(strstr(buffer,"O=P")==NULL,"O=P present\n"); len = 1024; ret = InternetGetCookie("http://testing.example.com/foobar", NULL, buffer, &len); @@ -288,6 +295,7 @@ static void test_complicated_cookie(void) ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + ok(strstr(buffer,"O=P")==NULL,"O=P present\n"); len = 1024; ret = InternetGetCookie("http://testing.example.com/foobar/", NULL, buffer, &len); @@ -298,6 +306,7 @@ static void test_complicated_cookie(void) ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + ok(strstr(buffer,"O=P")==NULL,"O=P present\n"); len = 1024; ret = InternetGetCookie("http://testing.example.com/foo/bar", NULL, buffer, &len); @@ -308,6 +317,7 @@ static void test_complicated_cookie(void) ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); ok(strstr(buffer,"M=N")!=NULL,"M=N missing\n"); + ok(strstr(buffer,"O=P")==NULL,"O=P present\n"); len = 1024; ret = InternetGetCookie("http://testing.example.com/barfoo", NULL, buffer, &len); @@ -318,6 +328,7 @@ static void test_complicated_cookie(void) ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + ok(strstr(buffer,"O=P")==NULL,"O=P present\n"); len = 1024; ret = InternetGetCookie("http://testing.example.com/barfoo/", NULL, buffer, &len); @@ -328,6 +339,7 @@ static void test_complicated_cookie(void) ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + ok(strstr(buffer,"O=P")==NULL,"O=P present\n"); len = 1024; ret = InternetGetCookie("http://testing.example.com/bar/foo", NULL, buffer, &len); @@ -338,6 +350,7 @@ static void test_complicated_cookie(void) ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); ok(strstr(buffer,"K=L")!=NULL,"K=L missing\n"); ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + ok(strstr(buffer,"O=P")==NULL,"O=P present\n"); } static void test_null(void) @@ -352,7 +365,13 @@ static void test_null(void) BOOL r; DWORD sz; + SetLastError(0xdeadbeef); hi = InternetOpenW(NULL, 0, NULL, NULL, 0); + if (hi == NULL && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("Internet*W functions are not implemented\n"); + return; + } ok(hi != NULL, "open failed\n"); hc = InternetConnectW(hi, NULL, 0, NULL, NULL, 0, 0, 0); @@ -642,8 +661,13 @@ static void test_IsDomainLegalCookieDomainW(void) SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(NULL, NULL); error = GetLastError(); + if (!ret && error == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("IsDomainLegalCookieDomainW is not implemented\n"); + return; + } ok(!ret || - broken(ret), /* Win98, NT4, W2K, XP (some) */ + broken(ret), /* IE6 */ "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error); @@ -664,7 +688,7 @@ static void test_IsDomainLegalCookieDomainW(void) error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_INVALID_NAME || - broken(error == ERROR_INVALID_PARAMETER), /* Win98, NT4, W2K, XP (some) */ + broken(error == ERROR_INVALID_PARAMETER), /* IE6 */ "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); @@ -672,7 +696,7 @@ static void test_IsDomainLegalCookieDomainW(void) error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_INVALID_NAME || - broken(error == ERROR_INVALID_PARAMETER), /* Win98, NT4, W2K, XP (some) */ + broken(error == ERROR_INVALID_PARAMETER), /* IE6 */ "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); @@ -680,7 +704,7 @@ static void test_IsDomainLegalCookieDomainW(void) error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_INVALID_NAME || - broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + broken(error == 0xdeadbeef), /* IE6 */ "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); @@ -688,7 +712,7 @@ static void test_IsDomainLegalCookieDomainW(void) error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_INVALID_NAME || - broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + broken(error == 0xdeadbeef), /* IE6 */ "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); @@ -702,7 +726,7 @@ static void test_IsDomainLegalCookieDomainW(void) error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_INVALID_NAME || - broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + broken(error == 0xdeadbeef), /* IE6 */ "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); @@ -710,14 +734,16 @@ static void test_IsDomainLegalCookieDomainW(void) error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_INVALID_NAME || - broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + broken(error == 0xdeadbeef), /* IE6 */ "got %u expected ERROR_INVALID_NAME\n", error); SetLastError(0xdeadbeef); ret = pIsDomainLegalCookieDomainW(com, gmail_com); error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); - ok(error == 0xdeadbeef, "got %u expected 0xdeadbeef\n", error); + ok(error == ERROR_SXS_KEY_NOT_FOUND || + error == 0xdeadbeef, /* up to IE7 */ + "got %u expected ERROR_SXS_KEY_NOT_FOUND or 0xdeadbeef\n", error); ret = pIsDomainLegalCookieDomainW(gmail_com, gmail_com); ok(ret, "IsDomainLegalCookieDomainW failed\n"); @@ -726,7 +752,11 @@ static void test_IsDomainLegalCookieDomainW(void) ret = pIsDomainLegalCookieDomainW(gmail_co_uk, co_uk); error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); - ok(error == 0xdeadbeef, "got %u expected 0xdeadbeef\n", error); + ok(error == ERROR_SXS_KEY_NOT_FOUND || /* IE8 on XP */ + error == ERROR_FILE_NOT_FOUND || /* IE8 on Vista */ + error == 0xdeadbeef, /* up to IE7 */ + "got %u expected ERROR_SXS_KEY_NOT_FOUND, ERROR_FILE_NOT_FOUND or " + "0xdeadbeef\n", error); ret = pIsDomainLegalCookieDomainW(uk, co_uk); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); @@ -745,7 +775,7 @@ static void test_IsDomainLegalCookieDomainW(void) error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_INVALID_NAME || - broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + broken(error == 0xdeadbeef), /* IE6 */ "got %u expected ERROR_INVALID_NAME\n", error); ret = pIsDomainLegalCookieDomainW(gmail_com, mail_gmail_com); @@ -770,6 +800,8 @@ START_TEST(internet) { HMODULE hdll; hdll = GetModuleHandleA("wininet.dll"); + pCreateUrlCacheContainerA = (void*)GetProcAddress(hdll, "CreateUrlCacheContainerA"); + pCreateUrlCacheContainerW = (void*)GetProcAddress(hdll, "CreateUrlCacheContainerW"); pInternetTimeFromSystemTimeA = (void*)GetProcAddress(hdll, "InternetTimeFromSystemTimeA"); pInternetTimeFromSystemTimeW = (void*)GetProcAddress(hdll, "InternetTimeFromSystemTimeW"); pInternetTimeToSystemTimeA = (void*)GetProcAddress(hdll, "InternetTimeToSystemTimeA"); @@ -784,7 +816,7 @@ START_TEST(internet) test_null(); if (!pInternetTimeFromSystemTimeA) - skip("skipping the InternetTime tests\n"); + win_skip("skipping the InternetTime tests\n"); else { InternetTimeFromSystemTimeA_test(); @@ -792,8 +824,12 @@ START_TEST(internet) InternetTimeToSystemTimeA_test(); InternetTimeToSystemTimeW_test(); } - if (!pIsDomainLegalCookieDomainW) - skip("skipping IsDomainLegalCookieDomainW tests\n"); + if (pIsDomainLegalCookieDomainW && + ((void*)pIsDomainLegalCookieDomainW == (void*)pCreateUrlCacheContainerA || + (void*)pIsDomainLegalCookieDomainW == (void*)pCreateUrlCacheContainerW)) + win_skip("IsDomainLegalCookieDomainW is not available on systems with IE5\n"); + else if (!pIsDomainLegalCookieDomainW) + win_skip("IsDomainLegalCookieDomainW (or ordinal 117) is not available\n"); else test_IsDomainLegalCookieDomainW(); } diff --git a/rostests/winetests/wininet/url.c b/rostests/winetests/wininet/url.c index c848f6bc90d..39c02863351 100644 --- a/rostests/winetests/wininet/url.c +++ b/rostests/winetests/wininet/url.c @@ -299,14 +299,25 @@ static void InternetCrackUrlW_test(void) SetLastError(0xdeadbeef); r = InternetCrackUrlW(NULL, 0, 0, &comp ); error = GetLastError(); + if (!r && error == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("InternetCrackUrlW is not implemented\n"); + return; + } ok( !r, "InternetCrackUrlW succeeded unexpectedly\n"); - ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error); + ok( error == ERROR_INVALID_PARAMETER || + broken(error == ERROR_INTERNET_UNRECOGNIZED_SCHEME), /* IE5 */ + "expected ERROR_INVALID_PARAMETER got %u\n", error); - SetLastError(0xdeadbeef); - r = InternetCrackUrlW(url, 0, 0, NULL ); - error = GetLastError(); - ok( !r, "InternetCrackUrlW succeeded unexpectedly\n"); - ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error); + if (error == ERROR_INVALID_PARAMETER) + { + /* Crashes on IE5 */ + SetLastError(0xdeadbeef); + r = InternetCrackUrlW(url, 0, 0, NULL ); + error = GetLastError(); + ok( !r, "InternetCrackUrlW succeeded unexpectedly\n"); + ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error); + } r = InternetCrackUrlW(url, 0, 0, &comp ); ok( r, "failed to crack url\n"); diff --git a/rostests/winetests/wintrust/asn.c b/rostests/winetests/wintrust/asn.c index d50d2492d2a..308fb8b997d 100644 --- a/rostests/winetests/wintrust/asn.c +++ b/rostests/winetests/wintrust/asn.c @@ -41,7 +41,7 @@ static void test_encodeSPCFinancialCriteria(void) if (!pCryptEncodeObjectEx) { - skip("CryptEncodeObjectEx() is not available. Skipping the encodeFinancialCriteria tests\n"); + win_skip("CryptEncodeObjectEx() is not available. Skipping the encodeFinancialCriteria tests\n"); return; } ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_FINANCIAL_CRITERIA_STRUCT, @@ -73,7 +73,7 @@ static void test_decodeSPCFinancialCriteria(void) if (!pCryptDecodeObjectEx) { - skip("CryptDecodeObjectEx() is not available. Skipping the decodeSPCFinancialCriteria tests\n"); + win_skip("CryptDecodeObjectEx() is not available. Skipping the decodeSPCFinancialCriteria tests\n"); return; } @@ -123,7 +123,7 @@ static void test_encodeSPCLink(void) if (!pCryptEncodeObjectEx) { - skip("CryptEncodeObjectEx() is not available. Skipping the encodeSPCLink tests\n"); + win_skip("CryptEncodeObjectEx() is not available. Skipping the encodeSPCLink tests\n"); return; } @@ -215,7 +215,7 @@ static void test_decodeSPCLink(void) if (!pCryptDecodeObjectEx) { - skip("CryptDecodeObjectEx() is not available. Skipping the decodeSPCLink tests\n"); + win_skip("CryptDecodeObjectEx() is not available. Skipping the decodeSPCLink tests\n"); return; } @@ -325,7 +325,7 @@ static void test_encodeSPCPEImage(void) if (!pCryptEncodeObjectEx) { - skip("CryptEncodeObjectEx() is not available. Skipping the encodeSPCPEImage tests\n"); + win_skip("CryptEncodeObjectEx() is not available. Skipping the encodeSPCPEImage tests\n"); return; } @@ -430,7 +430,7 @@ static void test_decodeSPCPEImage(void) if (!pCryptDecodeObjectEx) { - skip("CryptDecodeObjectEx() is not available. Skipping the decodeSPCPEImage tests\n"); + win_skip("CryptDecodeObjectEx() is not available. Skipping the decodeSPCPEImage tests\n"); return; } @@ -556,7 +556,7 @@ static void test_encodeCatMemberInfo(void) if (!pCryptEncodeObjectEx) { - skip("CryptEncodeObjectEx() is not available. Skipping the encodeCatMemberInfo tests\n"); + win_skip("CryptEncodeObjectEx() is not available. Skipping the encodeCatMemberInfo tests\n"); return; } @@ -605,7 +605,7 @@ static void test_decodeCatMemberInfo(void) if (!pCryptDecodeObjectEx) { - skip("CryptDecodeObjectEx() is not available. Skipping the decodeCatMemberInfo tests\n"); + win_skip("CryptDecodeObjectEx() is not available. Skipping the decodeCatMemberInfo tests\n"); return; } diff --git a/rostests/winetests/wintrust/crypt.c b/rostests/winetests/wintrust/crypt.c index 9129fa9da78..acadeadbe2d 100644 --- a/rostests/winetests/wintrust/crypt.c +++ b/rostests/winetests/wintrust/crypt.c @@ -206,9 +206,7 @@ static void test_context(void) /* Proper release */ SetLastError(0xdeadbeef); ret = pCryptCATAdminReleaseContext(hca, 0); - ok(ret, "Expected success\n"); - ok(GetLastError() == 0xdeadbeef, - "Expected no change in last error, got %d\n", GetLastError()); + ok(ret, "Expected success, got FALSE with %d\n", GetLastError()); /* Try to release a second time */ SetLastError(0xdeadbeef); @@ -854,7 +852,9 @@ static void test_cdf_parsing(void) catcdf = pCryptCATCDFOpen(cdffileW, cdf_callback); ok(catcdf == NULL, "CryptCATCDFOpen succeeded\n"); todo_wine - ok(GetLastError() == ERROR_SHARING_VIOLATION, "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); + ok(GetLastError() == ERROR_SHARING_VIOLATION || + broken(GetLastError() == ERROR_SUCCESS), /* win9x */ + "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); DeleteFileA(cdffileA); /* Header and member only */ @@ -868,7 +868,9 @@ static void test_cdf_parsing(void) catcdf = pCryptCATCDFOpen(cdffileW, cdf_callback); ok(catcdf == NULL, "CryptCATCDFOpen succeeded\n"); todo_wine - ok(GetLastError() == ERROR_SHARING_VIOLATION, "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); + ok(GetLastError() == ERROR_SHARING_VIOLATION || + broken(GetLastError() == ERROR_SUCCESS), /* win9x */ + "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); DeleteFileA(cdffileA); ok(!DeleteFileA(catfileA), "Didn't expect a catalog file to be created\n"); @@ -882,7 +884,9 @@ static void test_cdf_parsing(void) catcdf = pCryptCATCDFOpen(cdffileW, cdf_callback); ok(catcdf == NULL, "CryptCATCDFOpen succeeded\n"); todo_wine - ok(GetLastError() == ERROR_SHARING_VIOLATION, "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); + ok(GetLastError() == ERROR_SHARING_VIOLATION || + broken(GetLastError() == ERROR_SUCCESS), /* win9x */ + "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); DeleteFileA(cdffileA); ok(!DeleteFileA(catfileA), "Didn't expect a catalog file to be created\n"); diff --git a/rostests/winetests/wintrust/register.c b/rostests/winetests/wintrust/register.c index 8a6675cbdb4..dd266bd807d 100644 --- a/rostests/winetests/wintrust/register.c +++ b/rostests/winetests/wintrust/register.c @@ -66,7 +66,7 @@ static void test_AddRem_ActionID(void) if (!pWintrustAddActionID || !pWintrustRemoveActionID) { - skip("WintrustAddActionID and/or WintrustRemoveActionID are not available\n"); + win_skip("WintrustAddActionID and/or WintrustRemoveActionID are not available\n"); return; } @@ -176,7 +176,7 @@ static void test_AddDefaultForUsage(void) if (!pWintrustAddDefaultForUsage) { - skip("WintrustAddDefaultForUsage is not available\n"); + win_skip("WintrustAddDefaultForUsage is not available\n"); return; } @@ -229,7 +229,7 @@ static void test_LoadFunctionPointers(void) if (!pWintrustLoadFunctionPointers) { - skip("WintrustLoadFunctionPointers is not available\n"); + win_skip("WintrustLoadFunctionPointers is not available\n"); return; } SetLastError(0xdeadbeef); @@ -278,7 +278,7 @@ static void test_RegPolicyFlags(void) if (!pWintrustGetRegPolicyFlags || !pWintrustSetRegPolicyFlags) { - skip("Policy flags functions not present\n"); + win_skip("Policy flags functions not present\n"); return; }