Author: akhaldi Date: Tue Nov 22 17:09:34 2016 New Revision: 73347
URL: http://svn.reactos.org/svn/reactos?rev=73347&view=rev Log: [CRYPT32_WINETEST] Sync with Wine Staging 1.9.23. CORE-12409
Modified: trunk/rostests/winetests/crypt32/CMakeLists.txt trunk/rostests/winetests/crypt32/base64.c trunk/rostests/winetests/crypt32/store.c
Modified: trunk/rostests/winetests/crypt32/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/crypt32/CMakeLis... ============================================================================== --- trunk/rostests/winetests/crypt32/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/winetests/crypt32/CMakeLists.txt [iso-8859-1] Tue Nov 22 17:09:34 2016 @@ -21,5 +21,5 @@
add_executable(crypt32_winetest ${SOURCE}) set_module_type(crypt32_winetest win32cui) -add_importlibs(crypt32_winetest crypt32 advapi32 msvcrt kernel32) +add_importlibs(crypt32_winetest crypt32 advapi32 user32 shlwapi shell32 msvcrt kernel32) add_cd_file(TARGET crypt32_winetest DESTINATION reactos/bin FOR all)
Modified: trunk/rostests/winetests/crypt32/base64.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/crypt32/base64.c... ============================================================================== --- trunk/rostests/winetests/crypt32/base64.c [iso-8859-1] (original) +++ trunk/rostests/winetests/crypt32/base64.c [iso-8859-1] Tue Nov 22 17:09:34 2016 @@ -306,9 +306,6 @@ };
static const struct BadString badStrings[] = { - { "A\r\nA\r\n=\r\n=\r\n", CRYPT_STRING_BASE64 }, - { "AA\r\n=\r\n=\r\n", CRYPT_STRING_BASE64 }, - { "AA=\r\n=\r\n", CRYPT_STRING_BASE64 }, { "-----BEGIN X509 CRL-----\r\nAA==\r\n", CRYPT_STRING_BASE64X509CRLHEADER }, };
@@ -340,7 +337,7 @@ ret = pCryptStringToBinaryA(badStrings[i].str, 0, badStrings[i].format, NULL, &bufLen, NULL, NULL); ok(!ret && GetLastError() == ERROR_INVALID_DATA, - "Expected ERROR_INVALID_DATA, got ret=%d le=%u\n", ret, GetLastError()); + "%d: Expected ERROR_INVALID_DATA, got ret=%d le=%u\n", i, ret, GetLastError()); } /* Good strings */ for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
Modified: trunk/rostests/winetests/crypt32/store.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/crypt32/store.c?... ============================================================================== --- trunk/rostests/winetests/crypt32/store.c [iso-8859-1] (original) +++ trunk/rostests/winetests/crypt32/store.c [iso-8859-1] Tue Nov 22 17:09:34 2016 @@ -23,6 +23,8 @@
#include <windef.h> #include <winbase.h> +#include <shlobj.h> +#include <shlwapi.h> #include <winreg.h> //#include <winerror.h> #include <wincrypt.h> @@ -123,6 +125,8 @@ static void (WINAPI *pCertRemoveStoreFromCollection)(HCERTSTORE,HCERTSTORE); static BOOL (WINAPI *pCertSetStoreProperty)(HCERTSTORE,DWORD,DWORD,const void*); static BOOL (WINAPI *pCertAddCertificateLinkToStore)(HCERTSTORE,PCCERT_CONTEXT,DWORD,PCCERT_CONTEXT*); +static BOOL (WINAPI *pCertRegisterSystemStore)(const void*,DWORD,void*,void*); +static BOOL (WINAPI *pCertUnregisterSystemStore)(const void*,DWORD);
#define test_store_is_empty(store) _test_store_is_empty(__LINE__,store) static void _test_store_is_empty(unsigned line, HCERTSTORE store) @@ -344,6 +348,284 @@ 0xa3,0x16,0x30,0x14,0x30,0x12,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04, 0x08,0x30,0x06,0x01,0x01,0xff,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00 }; + +static const struct +{ + HKEY key; + DWORD cert_store; + BOOL appdata_file; + WCHAR store_name[16]; + const WCHAR *base_reg_path; +} reg_store_saved_certs[] = { + { HKEY_LOCAL_MACHINE, CERT_SYSTEM_STORE_LOCAL_MACHINE, FALSE, + {'R','O','O','T',0}, CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH }, + { HKEY_LOCAL_MACHINE, CERT_SYSTEM_STORE_LOCAL_MACHINE, FALSE, + {'M','Y',0}, CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH }, + { HKEY_LOCAL_MACHINE, CERT_SYSTEM_STORE_LOCAL_MACHINE, FALSE, + {'C','A',0}, CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH }, + /* Adding to HKCU\Root triggers safety warning. */ + { HKEY_CURRENT_USER, CERT_SYSTEM_STORE_CURRENT_USER, TRUE, + {'M','Y',0}, CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH }, + { HKEY_CURRENT_USER, CERT_SYSTEM_STORE_CURRENT_USER, FALSE, + {'C','A',0}, CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH } +}; + +/* Testing whether system stores are available for adding new certs + * and checking directly in the registry whether they are actually saved or deleted. + * Windows treats HKCU\My (at least) as a special case and uses AppData directory + * for storing certs, not registry. + */ +static void testRegStoreSavedCerts(void) +{ + static const WCHAR fmt[] = + { '%','s','\','%','s','\','%','s','\','%','s',0}, + ms_certs[] = + { 'M','i','c','r','o','s','o','f','t','\','S','y','s','t','e','m','C','e','r','t','i','f','i','c','a','t','e','s',0}, + certs[] = + {'C','e','r','t','i','f','i','c','a','t','e','s',0}, + bigCert_hash[] = { + '6','E','3','0','9','0','7','1','5','F','D','9','2','3', + '5','6','E','B','A','E','2','5','4','0','E','6','2','2', + 'D','A','1','9','2','6','0','2','A','6','0','8',0}; + PCCERT_CONTEXT cert1, cert2; + HCERTSTORE store; + HANDLE cert_file; + HRESULT pathres; + WCHAR key_name[MAX_PATH], appdata_path[MAX_PATH]; + HKEY key; + BOOL ret; + DWORD res,i; + + for (i = 0; i < sizeof(reg_store_saved_certs) / sizeof(reg_store_saved_certs[0]); i++) + { + DWORD err; + + store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,0,0, + reg_store_saved_certs[i].cert_store, reg_store_saved_certs[i].store_name); + + err = GetLastError(); + if (!store) + { + ok (err == ERROR_ACCESS_DENIED, "Failed to create store at %d (%08x)\n", i, err); + skip("Insufficient privileges for the test %d\n", i); + continue; + } + ok (store!=NULL, "Failed to open the store at %d, %x", i, GetLastError()); + cert1 = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert)); + ok (cert1 != NULL, "Create cert context failed at %d, %x\n", i, GetLastError()); + ret = CertAddCertificateContextToStore(store, cert1, CERT_STORE_ADD_REPLACE_EXISTING, NULL); + ok (ret, "Adding to the store failed at %d, %x\n", i, GetLastError()); + CertFreeCertificateContext(cert1); + CertCloseStore(store, 0); + + wsprintfW(key_name, fmt, reg_store_saved_certs[i].base_reg_path, + reg_store_saved_certs[i].store_name, certs, bigCert_hash); + + if (!reg_store_saved_certs[i].appdata_file) + { + res = RegOpenKeyExW(reg_store_saved_certs[i].key, key_name, 0, KEY_ALL_ACCESS, &key); + ok (!res, "The cert hasn't been saved at %d, %x\n", i, GetLastError()); + if (!res) RegCloseKey(key); + } else + { + pathres = SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, 0, appdata_path); + ok (pathres == S_OK, + "Failed to get app data path at %d (%x)\n", pathres, GetLastError()); + if (pathres == S_OK) + { + PathAppendW(appdata_path, ms_certs); + PathAppendW(appdata_path, reg_store_saved_certs[i].store_name); + PathAppendW(appdata_path, certs); + PathAppendW(appdata_path, bigCert_hash); + + cert_file = CreateFileW(appdata_path, GENERIC_READ, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + todo_wine ok (cert_file != INVALID_HANDLE_VALUE, + "Cert was not saved in AppData at %d (%x)\n", i, GetLastError()); + CloseHandle(cert_file); + } + } + + /* deleting cert from store */ + store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,0,0, + reg_store_saved_certs[i].cert_store, reg_store_saved_certs[i].store_name); + ok (store!=NULL, "Failed to open the store at %d, %x", i, GetLastError()); + + cert1 = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert)); + ok (cert1 != NULL, "Create cert context failed at %d, %x\n", i, GetLastError()); + + cert2 = CertFindCertificateInStore(store, X509_ASN_ENCODING, 0, + CERT_FIND_EXISTING, cert1, NULL); + ok (cert2 != NULL, "Failed to find cert in the store at %d, %x\n", i, GetLastError()); + + ret = CertDeleteCertificateFromStore(cert2); + ok (ret, "Failed to delete certificate from store at %d, %x\n", i, GetLastError()); + + CertFreeCertificateContext(cert1); + CertFreeCertificateContext(cert2); + CertCloseStore(store, 0); + + res = RegOpenKeyExW(reg_store_saved_certs[i].key, key_name, 0, KEY_ALL_ACCESS, &key); + ok (res, "The cert's registry entry should be absent at %i, %x\n", i, GetLastError()); + if (!res) RegCloseKey(key); + + if (reg_store_saved_certs[i].appdata_file) + { + cert_file = CreateFileW(appdata_path, GENERIC_READ, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + ok (cert_file == INVALID_HANDLE_VALUE, + "Cert should have been absent in AppData %d\n", i); + + CloseHandle(cert_file); + } + } +} + +/** + * This test checks that certificate falls into correct store of a collection + * depending on the access flags and priorities. + */ +static void testStoresInCollection(void) +{ + PCCERT_CONTEXT cert1, cert2, tcert1; + HCERTSTORE collection, ro_store, rw_store, rw_store_2, tstore; + static const WCHAR WineTestRO_W[] = { 'W','i','n','e','T','e','s','t','_','R','O',0 }, + WineTestRW_W[] = { 'W','i','n','e','T','e','s','t','_','R','W',0 }, + WineTestRW2_W[]= { 'W','i','n','e','T','e','s','t','_','R','W','2',0 }; + BOOL ret; + + if (!pCertAddStoreToCollection) + { + win_skip("CertAddStoreToCollection() is not available\n"); + return; + } + collection = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + ok(collection != NULL, "Failed to init collection store, last error %x\n", GetLastError()); + /* Add read-only store to collection with very high priority*/ + ro_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W, 0, 0, + CERT_SYSTEM_STORE_CURRENT_USER, WineTestRO_W); + ok(ro_store != NULL, "Failed to init ro store %x\n", GetLastError()); + + ret = CertAddStoreToCollection(collection, ro_store, 0, 1000); + ok (ret, "Failed to add read-only store to collection %x\n", GetLastError()); + + cert1 = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert)); + ok (cert1 != NULL, "Create cert context failed %x\n", GetLastError()); + ret = CertAddCertificateContextToStore(collection, cert1, CERT_STORE_ADD_ALWAYS, NULL); + ok (!ret, "Added cert to collection with single read-only store %x\n", GetLastError()); + + /* Add read-write store to collection with the lowest priority*/ + rw_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W, 0, 0, + CERT_SYSTEM_STORE_CURRENT_USER, WineTestRW_W); + ok (rw_store != NULL, "Failed to open rw store %x\n", GetLastError()); + ret = CertAddStoreToCollection(collection, rw_store, CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG, 0); + ok (ret, "Failed to add rw store to collection %x\n", GetLastError()); + /** Adding certificate to collection should fall into rw store, + * even though prioirty of the ro_store is higher */ + ret = CertAddCertificateContextToStore(collection, cert1, CERT_STORE_ADD_REPLACE_EXISTING, NULL); + ok (ret, "Failed to add cert to the collection %x\n", GetLastError()); + + tcert1 = CertEnumCertificatesInStore(ro_store, NULL); + ok (!tcert1, "Read-only ro_store contains cert\n"); + + tcert1 = CertEnumCertificatesInStore(rw_store, NULL); + ok (cert1 && tcert1->cbCertEncoded == cert1->cbCertEncoded, + "Unexpected cert in the rw store\n"); + CertFreeCertificateContext(tcert1); + + tcert1 = CertEnumCertificatesInStore(collection, NULL); + ok (tcert1 && tcert1->cbCertEncoded == cert1->cbCertEncoded, + "Unexpected cert in the collection\n"); + CertFreeCertificateContext(tcert1); + + /** adding one more rw store with higher priority*/ + rw_store_2 = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W, 0, 0, + CERT_SYSTEM_STORE_CURRENT_USER, WineTestRW2_W); + ok (rw_store_2 != NULL, "Failed to init second rw store %x\n", GetLastError()); + ret = CertAddStoreToCollection(collection, rw_store_2, CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG, 50); + ok (ret, "Failed to add rw_store_2 to collection %x\n",GetLastError()); + + cert2 = CertCreateCertificateContext(X509_ASN_ENCODING, signedBigCert, sizeof(signedBigCert)); + ok (cert2 != NULL, "Failed to create cert context %x \n", GetLastError()); + ret = CertAddCertificateContextToStore(collection, cert2, CERT_STORE_ADD_REPLACE_EXISTING, NULL); + ok (ret, "Failed to add cert3 to the store %x\n",GetLastError()); + + /** checking certificates in the stores */ + tcert1 = CertEnumCertificatesInStore(ro_store, 0); + ok (tcert1 == NULL, "Read-only store not empty\n"); + + tcert1 = CertEnumCertificatesInStore(rw_store, NULL); + ok (tcert1 && tcert1->cbCertEncoded == cert1->cbCertEncoded, + "Unexpected cert in the rw_store\n"); + CertFreeCertificateContext(tcert1); + + tcert1 = CertEnumCertificatesInStore(rw_store_2, NULL); + ok (tcert1 && tcert1->cbCertEncoded == cert2->cbCertEncoded, + "Unexpected cert in the rw_store_2\n"); + CertFreeCertificateContext(tcert1); + + /** checking certificates in the collection */ + tcert1 = CertEnumCertificatesInStore(collection, NULL); + ok (tcert1 && tcert1->cbCertEncoded == cert2->cbCertEncoded, + "cert2 expected in the collection got %p, %x\n",tcert1, GetLastError()); + tcert1 = CertEnumCertificatesInStore(collection, tcert1); + ok (tcert1 && tcert1->cbCertEncoded == cert1->cbCertEncoded, + "cert1 expected in the collection got %p, %x\n",tcert1, GetLastError()); + tcert1 = CertEnumCertificatesInStore(collection, tcert1); + ok (tcert1==NULL,"Unexpected cert in the collection %p %x\n",tcert1, GetLastError()); + + /* checking whether certs had been saved */ + tstore = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,0,0, + CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG, WineTestRW_W); + ok (tstore!=NULL, "Failed to open existing rw store\n"); + tcert1 = CertEnumCertificatesInStore(tstore, NULL); + todo_wine + ok(tcert1 && tcert1->cbCertEncoded == cert1->cbCertEncoded, "cert1 wasn't saved\n"); + CertFreeCertificateContext(tcert1); + CertCloseStore(tstore,0); + + tstore = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,0,0, + CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG, WineTestRW2_W); + ok (tstore!=NULL, "Failed to open existing rw2 store\n"); + tcert1 = CertEnumCertificatesInStore(tstore, NULL); + todo_wine + ok (tcert1 && tcert1->cbCertEncoded == cert2->cbCertEncoded, "cert2 wasn't saved\n"); + CertFreeCertificateContext(tcert1); + CertCloseStore(tstore,0); + + CertCloseStore(collection,0); + CertCloseStore(ro_store,0); + CertCloseStore(rw_store,0); + CertCloseStore(rw_store_2,0); + + /* reopening registry stores to check whether certs had been saved */ + rw_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,0,0, + CERT_SYSTEM_STORE_CURRENT_USER, WineTestRW_W); + tcert1 = CertEnumCertificatesInStore(rw_store, NULL); + ok (tcert1 && tcert1->cbCertEncoded == cert1->cbCertEncoded, + "Unexpected cert in store %p\n", tcert1); + CertFreeCertificateContext(tcert1); + CertCloseStore(rw_store,0); + + rw_store_2 = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,0,0, + CERT_SYSTEM_STORE_CURRENT_USER, WineTestRW2_W); + tcert1 = CertEnumCertificatesInStore(rw_store_2, NULL); + ok (tcert1 && tcert1->cbCertEncoded == cert2->cbCertEncoded, + "Unexpected cert in store %p\n", tcert1); + CertFreeCertificateContext(tcert1); + CertCloseStore(rw_store_2,0); + + CertFreeCertificateContext(cert1); + CertFreeCertificateContext(cert2); + CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,0,0, + CERT_STORE_DELETE_FLAG|CERT_SYSTEM_STORE_CURRENT_USER,WineTestRO_W); + CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,0,0, + CERT_STORE_DELETE_FLAG|CERT_SYSTEM_STORE_CURRENT_USER,WineTestRW_W); + CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,0,0, + CERT_STORE_DELETE_FLAG|CERT_SYSTEM_STORE_CURRENT_USER,WineTestRW2_W); + +}
static void testCollectionStore(void) { @@ -1866,6 +2148,88 @@ CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_DELETE_FLAG, BogusW); RegDeleteKeyW(HKEY_CURRENT_USER, BogusPathW); +} + +static const struct +{ + DWORD cert_store; + BOOL expected; + BOOL todo; +} reg_system_store_test_data[] = { + { CERT_SYSTEM_STORE_CURRENT_USER, TRUE, 0}, + /* Following tests could require administrator privileges and thus could be skipped */ + { CERT_SYSTEM_STORE_CURRENT_SERVICE, TRUE, 1}, + { CERT_SYSTEM_STORE_LOCAL_MACHINE, TRUE, 0}, + { CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY, TRUE, 0}, + { CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY, TRUE, 0}, + { CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE, TRUE, 1} +}; + +static void testCertRegisterSystemStore(void) +{ + BOOL ret, cur_flag; + DWORD err = 0; + HCERTSTORE hstore; + static const WCHAR WineTestW[] = {'W','i','n','e','T','e','s','t',0}; + const CERT_CONTEXT *cert, *cert2; + unsigned int i; + + if (!pCertRegisterSystemStore || !pCertUnregisterSystemStore) + { + win_skip("CertRegisterSystemStore() or CertUnregisterSystemStore() is not available\n"); + return; + } + + for (i = 0; i < sizeof(reg_system_store_test_data) / sizeof(reg_system_store_test_data[0]); i++) { + cur_flag = reg_system_store_test_data[i].cert_store; + ret = pCertRegisterSystemStore(WineTestW, cur_flag, NULL, NULL); + if (!ret) + { + err = GetLastError(); + if (err == ERROR_ACCESS_DENIED) + { + win_skip("Insufficient privileges for the flag %08x test\n", cur_flag); + continue; + } + } + todo_wine_if (reg_system_store_test_data[i].todo) + ok (ret == reg_system_store_test_data[i].expected, + "Store registration (dwFlags=%08x) failed, last error %x\n", cur_flag, err); + if (!ret) + { + skip("Nothing to test without registered store at %08x\n", cur_flag); + continue; + } + + hstore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG | cur_flag, WineTestW); + ok (hstore != NULL, "Opening just registered store at %08x failed, last error %x\n", cur_flag, GetLastError()); + + cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert)); + ok (cert != NULL, "Failed creating cert at %08x, last error: %x\n", cur_flag, GetLastError()); + if (cert) + { + ret = CertAddCertificateContextToStore(hstore, cert, CERT_STORE_ADD_NEW, NULL); + ok (ret, "Failed to add cert at %08x, last error: %x\n", cur_flag, GetLastError()); + + cert2 = CertEnumCertificatesInStore(hstore, NULL); + ok (cert2 != NULL && cert2->cbCertEncoded == cert->cbCertEncoded, + "Unexpected cert encoded size at %08x, last error: %x\n", cur_flag, GetLastError()); + + ret = CertDeleteCertificateFromStore(cert2); + ok (ret, "Failed to delete certificate from the new store at %08x, last error: %x\n", cur_flag, GetLastError()); + + CertFreeCertificateContext(cert); + } + + ret = CertCloseStore(hstore, 0); + ok (ret, "CertCloseStore failed at %08x, last error %x", cur_flag, GetLastError()); + + ret = pCertUnregisterSystemStore(WineTestW, cur_flag ); + todo_wine_if (reg_system_store_test_data[i].todo) + ok( ret == reg_system_store_test_data[i].expected, + "Unregistering failed at %08x, last error %d\n", cur_flag, GetLastError()); + } + }
struct EnumSystemStoreInfo @@ -2587,8 +2951,6 @@ ok(res, "CertDeleteCertificateContextFromStore failed\n"); ok(cert3->hCertStore == cert->hCertStore, "Unexpected hCertStore\n");
- CertFreeCertificateContext(cert3); - store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); ok(store != NULL, "CertOpenStore failed\n");
@@ -2600,8 +2962,6 @@ res = CertDeleteCertificateFromStore(cert3); ok(res, "CertDeleteCertificateContextFromStore failed\n"); ok(cert3->hCertStore == store, "Unexpected hCertStore\n"); - - CertFreeCertificateContext(cert3);
CertCloseStore(store, 0);
@@ -2808,11 +3168,17 @@ pCertRemoveStoreFromCollection = (void*)GetProcAddress(hdll, "CertRemoveStoreFromCollection"); pCertSetStoreProperty = (void*)GetProcAddress(hdll, "CertSetStoreProperty"); pCertAddCertificateLinkToStore = (void*)GetProcAddress(hdll, "CertAddCertificateLinkToStore"); + pCertRegisterSystemStore = (void*)GetProcAddress(hdll, "CertRegisterSystemStore"); + pCertUnregisterSystemStore = (void*)GetProcAddress(hdll, "CertUnregisterSystemStore");
/* various combinations of CertOpenStore */ testMemStore(); testCollectionStore(); + testStoresInCollection(); + testRegStore(); + testRegStoreSavedCerts(); + testSystemRegStore(); testSystemStore(); testFileStore(); @@ -2821,6 +3187,8 @@ testSerializedStore(); testCloseStore();
+ testCertRegisterSystemStore(); + testCertOpenSystemStore(); testCertEnumSystemStore(); testStoreProperty();