crypt32: Add support for CERT_STORE_PROV_SERIALIZED to CertOpenStore.
diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c
index dc18786..df12e3e 100644
--- a/dlls/crypt32/store.c
+++ b/dlls/crypt32/store.c
@@ -724,6 +724,34 @@
return store;
}
+static PWINECRYPT_CERTSTORE CRYPT_SerializedOpenStore(HCRYPTPROV hCryptProv,
+ DWORD dwFlags, const void *pvPara)
+{
+ HCERTSTORE store;
+ const CRYPT_DATA_BLOB *data = pvPara;
+
+ TRACE("(%ld, %08x, %p)\n", hCryptProv, dwFlags, pvPara);
+
+ if (dwFlags & CERT_STORE_DELETE_FLAG)
+ {
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return NULL;
+ }
+
+ store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
+ CERT_STORE_CREATE_NEW_FLAG, NULL);
+ if (store)
+ {
+ if (!CRYPT_ReadSerializedStoreFromBlob(data, store))
+ {
+ CertCloseStore(store, 0);
+ store = NULL;
+ }
+ }
+ TRACE("returning %p\n", store);
+ return (PWINECRYPT_CERTSTORE)store;
+}
+
static PWINECRYPT_CERTSTORE CRYPT_PhysOpenStoreW(HCRYPTPROV hCryptProv,
DWORD dwFlags, const void *pvPara)
{
@@ -761,6 +789,9 @@
case LOWORD(CERT_STORE_PROV_PKCS7):
openFunc = CRYPT_PKCSOpenStore;
break;
+ case LOWORD(CERT_STORE_PROV_SERIALIZED):
+ openFunc = CRYPT_SerializedOpenStore;
+ break;
case LOWORD(CERT_STORE_PROV_REG):
openFunc = CRYPT_RegOpenStore;
break;
@@ -801,6 +832,8 @@
openFunc = CRYPT_SysOpenStoreW;
else if (!strcasecmp(lpszStoreProvider, sz_CERT_STORE_PROV_PKCS7))
openFunc = CRYPT_PKCSOpenStore;
+ else if (!strcasecmp(lpszStoreProvider, sz_CERT_STORE_PROV_SERIALIZED))
+ openFunc = CRYPT_SerializedOpenStore;
else if (!strcasecmp(lpszStoreProvider, sz_CERT_STORE_PROV_COLLECTION))
openFunc = CRYPT_CollectionOpenStore;
else if (!strcasecmp(lpszStoreProvider, sz_CERT_STORE_PROV_SYSTEM_REGISTRY))
diff --git a/dlls/crypt32/tests/store.c b/dlls/crypt32/tests/store.c
index 652eac9..3d55935 100644
--- a/dlls/crypt32/tests/store.c
+++ b/dlls/crypt32/tests/store.c
@@ -1780,11 +1780,9 @@
blob.pbData = (BYTE *)serializedStoreWithCert;
store = CertOpenStore(CERT_STORE_PROV_SERIALIZED, 0, 0,
CERT_STORE_DELETE_FLAG, &blob);
- todo_wine
ok(!store && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED,
"Expected ERROR_CALL_NOT_IMPLEMENTED, got %08x\n", GetLastError());
store = CertOpenStore(CERT_STORE_PROV_SERIALIZED, 0, 0, 0, &blob);
- todo_wine
ok(store != NULL, "CertOpenStore failed: %08x\n", GetLastError());
if (store)
{
@@ -1806,7 +1804,6 @@
blob.cbData = sizeof(serializedStoreWithCertAndCRL);
blob.pbData = (BYTE *)serializedStoreWithCertAndCRL;
store = CertOpenStore(CERT_STORE_PROV_SERIALIZED, 0, 0, 0, &blob);
- todo_wine
ok(store != NULL, "CertOpenStore failed: %08x\n", GetLastError());
if (store)
{