static WINECRYPT_CERTSTORE *CRYPT_MemOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags, const void *pvPara) { PWINE_MEMSTORE store; TRACE("(%ld, %08x, %p)\n", hCryptProv, dwFlags, pvPara); if (dwFlags & CERT_STORE_DELETE_FLAG) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); store = NULL; } else { store = CryptMemAlloc(sizeof(WINE_MEMSTORE)); if (store) { memset(store, 0, sizeof(WINE_MEMSTORE)); CRYPT_InitStore(&store->hdr, dwFlags, StoreTypeMem); store->hdr.closeStore = CRYPT_MemCloseStore; store->hdr.certs.addContext = CRYPT_MemAddCert; store->hdr.certs.enumContext = CRYPT_MemEnumCert; store->hdr.certs.deleteContext = CRYPT_MemDeleteCert; store->hdr.crls.addContext = CRYPT_MemAddCrl; store->hdr.crls.enumContext = CRYPT_MemEnumCrl; store->hdr.crls.deleteContext = CRYPT_MemDeleteCrl; store->hdr.ctls.addContext = CRYPT_MemAddCtl; store->hdr.ctls.enumContext = CRYPT_MemEnumCtl; store->hdr.ctls.deleteContext = CRYPT_MemDeleteCtl; store->hdr.control = CRYPT_MemControl; store->certs = ContextList_Create(pCertInterface, sizeof(CERT_CONTEXT)); store->crls = ContextList_Create(pCRLInterface, sizeof(CRL_CONTEXT)); store->ctls = ContextList_Create(pCTLInterface, sizeof(CTL_CONTEXT)); /* Mem store doesn't need crypto provider, so close it */ if (hCryptProv && !(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG)) CryptReleaseContext(hCryptProv, 0); } } return (PWINECRYPT_CERTSTORE)store; }
WINECRYPT_CERTSTORE *CRYPT_ProvCreateStore(DWORD dwFlags, WINECRYPT_CERTSTORE *memStore, const CERT_STORE_PROV_INFO *pProvInfo) { WINE_PROVIDERSTORE *ret = CryptMemAlloc(sizeof(WINE_PROVIDERSTORE)); if (ret) { CRYPT_InitStore(&ret->hdr, dwFlags, StoreTypeProvider, &ProvStoreVtbl); ret->dwStoreProvFlags = pProvInfo->dwStoreProvFlags; if (ret->dwStoreProvFlags & CERT_STORE_PROV_EXTERNAL_FLAG) { CertCloseStore(memStore, 0); ret->memStore = NULL; } else ret->memStore = memStore; ret->hStoreProv = pProvInfo->hStoreProv; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CLOSE_FUNC) ret->provCloseStore = pProvInfo->rgpvStoreProvFunc[CERT_STORE_PROV_CLOSE_FUNC]; else ret->provCloseStore = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_WRITE_CERT_FUNC) ret->provWriteCert = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_WRITE_CERT_FUNC]; else ret->provWriteCert = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_DELETE_CERT_FUNC) ret->provDeleteCert = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_DELETE_CERT_FUNC]; else ret->provDeleteCert = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_WRITE_CRL_FUNC) ret->provWriteCrl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_WRITE_CRL_FUNC]; else ret->provWriteCrl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_DELETE_CRL_FUNC) ret->provDeleteCrl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_DELETE_CRL_FUNC]; else ret->provDeleteCrl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_WRITE_CTL_FUNC) ret->provWriteCtl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_WRITE_CTL_FUNC]; else ret->provWriteCtl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_DELETE_CTL_FUNC) ret->provDeleteCtl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_DELETE_CTL_FUNC]; else ret->provDeleteCtl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CONTROL_FUNC) ret->provControl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_CONTROL_FUNC]; else ret->provControl = NULL; } return (WINECRYPT_CERTSTORE*)ret; }
PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags, PWINECRYPT_CERTSTORE memStore, const CERT_STORE_PROV_INFO *pProvInfo) { PWINE_PROVIDERSTORE ret = CryptMemAlloc(sizeof(WINE_PROVIDERSTORE)); if (ret) { CRYPT_InitStore(&ret->hdr, dwFlags, StoreTypeProvider); ret->dwStoreProvFlags = pProvInfo->dwStoreProvFlags; if (ret->dwStoreProvFlags & CERT_STORE_PROV_EXTERNAL_FLAG) { CertCloseStore(memStore, 0); ret->memStore = NULL; } else ret->memStore = memStore; ret->hStoreProv = pProvInfo->hStoreProv; ret->hdr.closeStore = CRYPT_ProvCloseStore; ret->hdr.certs.addContext = CRYPT_ProvAddCert; ret->hdr.certs.enumContext = CRYPT_ProvEnumCert; ret->hdr.certs.deleteContext = CRYPT_ProvDeleteCert; ret->hdr.crls.addContext = CRYPT_ProvAddCRL; ret->hdr.crls.enumContext = CRYPT_ProvEnumCRL; ret->hdr.crls.deleteContext = CRYPT_ProvDeleteCRL; ret->hdr.ctls.addContext = CRYPT_ProvAddCTL; ret->hdr.ctls.enumContext = CRYPT_ProvEnumCTL; ret->hdr.ctls.deleteContext = CRYPT_ProvDeleteCTL; ret->hdr.control = CRYPT_ProvControl; ret->hdr.dwFlags = 0; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CLOSE_FUNC) ret->provCloseStore = pProvInfo->rgpvStoreProvFunc[CERT_STORE_PROV_CLOSE_FUNC]; else ret->provCloseStore = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_WRITE_CERT_FUNC) ret->provWriteCert = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_WRITE_CERT_FUNC]; else ret->provWriteCert = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_DELETE_CERT_FUNC) ret->provDeleteCert = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_DELETE_CERT_FUNC]; else ret->provDeleteCert = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_WRITE_CRL_FUNC) ret->provWriteCrl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_WRITE_CRL_FUNC]; else ret->provWriteCrl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_DELETE_CRL_FUNC) ret->provDeleteCrl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_DELETE_CRL_FUNC]; else ret->provDeleteCrl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_WRITE_CTL_FUNC) ret->provWriteCtl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_WRITE_CTL_FUNC]; else ret->provWriteCtl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_DELETE_CTL_FUNC) ret->provDeleteCtl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_DELETE_CTL_FUNC]; else ret->provDeleteCtl = NULL; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CONTROL_FUNC) ret->provControl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_CONTROL_FUNC]; else ret->provControl = NULL; } return (PWINECRYPT_CERTSTORE)ret; }