crypt32: Don't store the crypto provider when it isn't needed.
This commit is contained in:
parent
9be5007669
commit
1d53424470
|
@ -357,8 +357,7 @@ PWINECRYPT_CERTSTORE CRYPT_CollectionOpenStore(HCRYPTPROV hCryptProv,
|
||||||
if (store)
|
if (store)
|
||||||
{
|
{
|
||||||
memset(store, 0, sizeof(WINE_COLLECTIONSTORE));
|
memset(store, 0, sizeof(WINE_COLLECTIONSTORE));
|
||||||
CRYPT_InitStore(&store->hdr, hCryptProv, dwFlags,
|
CRYPT_InitStore(&store->hdr, dwFlags, StoreTypeCollection);
|
||||||
StoreTypeCollection);
|
|
||||||
store->hdr.closeStore = CRYPT_CollectionCloseStore;
|
store->hdr.closeStore = CRYPT_CollectionCloseStore;
|
||||||
store->hdr.certs.addContext = CRYPT_CollectionAddCert;
|
store->hdr.certs.addContext = CRYPT_CollectionAddCert;
|
||||||
store->hdr.certs.enumContext = CRYPT_CollectionEnumCert;
|
store->hdr.certs.enumContext = CRYPT_CollectionEnumCert;
|
||||||
|
|
|
@ -222,7 +222,6 @@ typedef struct WINE_CRYPTCERTSTORE
|
||||||
DWORD dwMagic;
|
DWORD dwMagic;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
DWORD dwOpenFlags;
|
DWORD dwOpenFlags;
|
||||||
HCRYPTPROV cryptProv;
|
|
||||||
CertStoreType type;
|
CertStoreType type;
|
||||||
PFN_CERT_STORE_PROV_CLOSE closeStore;
|
PFN_CERT_STORE_PROV_CLOSE closeStore;
|
||||||
CONTEXT_FUNCS certs;
|
CONTEXT_FUNCS certs;
|
||||||
|
@ -231,16 +230,15 @@ typedef struct WINE_CRYPTCERTSTORE
|
||||||
PCONTEXT_PROPERTY_LIST properties;
|
PCONTEXT_PROPERTY_LIST properties;
|
||||||
} WINECRYPT_CERTSTORE, *PWINECRYPT_CERTSTORE;
|
} WINECRYPT_CERTSTORE, *PWINECRYPT_CERTSTORE;
|
||||||
|
|
||||||
void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, HCRYPTPROV hCryptProv,
|
void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, DWORD dwFlags,
|
||||||
DWORD dwFlags, CertStoreType type);
|
CertStoreType type);
|
||||||
void CRYPT_FreeStore(PWINECRYPT_CERTSTORE store);
|
void CRYPT_FreeStore(PWINECRYPT_CERTSTORE store);
|
||||||
void CRYPT_EmptyStore(HCERTSTORE store);
|
void CRYPT_EmptyStore(HCERTSTORE store);
|
||||||
|
|
||||||
PWINECRYPT_CERTSTORE CRYPT_CollectionOpenStore(HCRYPTPROV hCryptProv,
|
PWINECRYPT_CERTSTORE CRYPT_CollectionOpenStore(HCRYPTPROV hCryptProv,
|
||||||
DWORD dwFlags, const void *pvPara);
|
DWORD dwFlags, const void *pvPara);
|
||||||
PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(HCRYPTPROV hCryptProv,
|
PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags,
|
||||||
DWORD dwFlags, PWINECRYPT_CERTSTORE memStore,
|
PWINECRYPT_CERTSTORE memStore, const CERT_STORE_PROV_INFO *pProvInfo);
|
||||||
const CERT_STORE_PROV_INFO *pProvInfo);
|
|
||||||
PWINECRYPT_CERTSTORE CRYPT_ProvOpenStore(LPCSTR lpszStoreProvider,
|
PWINECRYPT_CERTSTORE CRYPT_ProvOpenStore(LPCSTR lpszStoreProvider,
|
||||||
DWORD dwEncodingType, HCRYPTPROV hCryptProv, DWORD dwFlags,
|
DWORD dwEncodingType, HCRYPTPROV hCryptProv, DWORD dwFlags,
|
||||||
const void *pvPara);
|
const void *pvPara);
|
||||||
|
|
|
@ -167,7 +167,7 @@ PWINECRYPT_CERTSTORE CRYPT_FileOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags,
|
||||||
{
|
{
|
||||||
PWINECRYPT_CERTSTORE memStore;
|
PWINECRYPT_CERTSTORE memStore;
|
||||||
|
|
||||||
memStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, hCryptProv,
|
memStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
|
||||||
CERT_STORE_CREATE_NEW_FLAG, NULL);
|
CERT_STORE_CREATE_NEW_FLAG, NULL);
|
||||||
if (memStore)
|
if (memStore)
|
||||||
{
|
{
|
||||||
|
@ -189,8 +189,11 @@ PWINECRYPT_CERTSTORE CRYPT_FileOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags,
|
||||||
sizeof(fileProvFuncs[0]);
|
sizeof(fileProvFuncs[0]);
|
||||||
provInfo.rgpvStoreProvFunc = fileProvFuncs;
|
provInfo.rgpvStoreProvFunc = fileProvFuncs;
|
||||||
provInfo.hStoreProv = info;
|
provInfo.hStoreProv = info;
|
||||||
store = CRYPT_ProvCreateStore(hCryptProv, dwFlags, memStore,
|
store = CRYPT_ProvCreateStore(dwFlags, memStore, &provInfo);
|
||||||
&provInfo);
|
/* File store doesn't need crypto provider, so close it */
|
||||||
|
if (hCryptProv &&
|
||||||
|
!(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG))
|
||||||
|
CryptReleaseContext(hCryptProv, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,16 +193,14 @@ static BOOL WINAPI CRYPT_ProvControl(HCERTSTORE hCertStore, DWORD dwFlags,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(HCRYPTPROV hCryptProv,
|
PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags,
|
||||||
DWORD dwFlags, PWINECRYPT_CERTSTORE memStore,
|
PWINECRYPT_CERTSTORE memStore, const CERT_STORE_PROV_INFO *pProvInfo)
|
||||||
const CERT_STORE_PROV_INFO *pProvInfo)
|
|
||||||
{
|
{
|
||||||
PWINE_PROVIDERSTORE ret = CryptMemAlloc(sizeof(WINE_PROVIDERSTORE));
|
PWINE_PROVIDERSTORE ret = CryptMemAlloc(sizeof(WINE_PROVIDERSTORE));
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
CRYPT_InitStore(&ret->hdr, hCryptProv, dwFlags,
|
CRYPT_InitStore(&ret->hdr, dwFlags, StoreTypeProvider);
|
||||||
StoreTypeProvider);
|
|
||||||
ret->dwStoreProvFlags = pProvInfo->dwStoreProvFlags;
|
ret->dwStoreProvFlags = pProvInfo->dwStoreProvFlags;
|
||||||
if (ret->dwStoreProvFlags & CERT_STORE_PROV_EXTERNAL_FLAG)
|
if (ret->dwStoreProvFlags & CERT_STORE_PROV_EXTERNAL_FLAG)
|
||||||
{
|
{
|
||||||
|
@ -289,8 +287,7 @@ PWINECRYPT_CERTSTORE CRYPT_ProvOpenStore(LPCSTR lpszStoreProvider,
|
||||||
{
|
{
|
||||||
if (provOpenFunc(lpszStoreProvider, dwEncodingType, hCryptProv,
|
if (provOpenFunc(lpszStoreProvider, dwEncodingType, hCryptProv,
|
||||||
dwFlags, pvPara, memStore, &provInfo))
|
dwFlags, pvPara, memStore, &provInfo))
|
||||||
ret = CRYPT_ProvCreateStore(hCryptProv, dwFlags, memStore,
|
ret = CRYPT_ProvCreateStore(dwFlags, memStore, &provInfo);
|
||||||
&provInfo);
|
|
||||||
else
|
else
|
||||||
CertCloseStore(memStore, 0);
|
CertCloseStore(memStore, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -530,8 +530,11 @@ PWINECRYPT_CERTSTORE CRYPT_RegOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags,
|
||||||
sizeof(regProvFuncs[0]);
|
sizeof(regProvFuncs[0]);
|
||||||
provInfo.rgpvStoreProvFunc = regProvFuncs;
|
provInfo.rgpvStoreProvFunc = regProvFuncs;
|
||||||
provInfo.hStoreProv = regInfo;
|
provInfo.hStoreProv = regInfo;
|
||||||
store = CRYPT_ProvCreateStore(hCryptProv, dwFlags, memStore,
|
store = CRYPT_ProvCreateStore(dwFlags, memStore, &provInfo);
|
||||||
&provInfo);
|
/* Reg store doesn't need crypto provider, so close it */
|
||||||
|
if (hCryptProv &&
|
||||||
|
!(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG))
|
||||||
|
CryptReleaseContext(hCryptProv, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,18 +100,12 @@ typedef struct _WINE_MSGSTOREINFO
|
||||||
HCRYPTMSG msg;
|
HCRYPTMSG msg;
|
||||||
} WINE_MSGSTOREINFO, *PWINE_MSGSTOREINFO;
|
} WINE_MSGSTOREINFO, *PWINE_MSGSTOREINFO;
|
||||||
|
|
||||||
void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, HCRYPTPROV hCryptProv,
|
void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, DWORD dwFlags,
|
||||||
DWORD dwFlags, CertStoreType type)
|
CertStoreType type)
|
||||||
{
|
{
|
||||||
store->ref = 1;
|
store->ref = 1;
|
||||||
store->dwMagic = WINE_CRYPTCERTSTORE_MAGIC;
|
store->dwMagic = WINE_CRYPTCERTSTORE_MAGIC;
|
||||||
store->type = type;
|
store->type = type;
|
||||||
if (!hCryptProv)
|
|
||||||
{
|
|
||||||
hCryptProv = CRYPT_GetDefaultProvider();
|
|
||||||
dwFlags |= CERT_STORE_NO_CRYPT_RELEASE_FLAG;
|
|
||||||
}
|
|
||||||
store->cryptProv = hCryptProv;
|
|
||||||
store->dwOpenFlags = dwFlags;
|
store->dwOpenFlags = dwFlags;
|
||||||
store->properties = NULL;
|
store->properties = NULL;
|
||||||
}
|
}
|
||||||
|
@ -253,7 +247,7 @@ static WINECRYPT_CERTSTORE *CRYPT_MemOpenStore(HCRYPTPROV hCryptProv,
|
||||||
if (store)
|
if (store)
|
||||||
{
|
{
|
||||||
memset(store, 0, sizeof(WINE_MEMSTORE));
|
memset(store, 0, sizeof(WINE_MEMSTORE));
|
||||||
CRYPT_InitStore(&store->hdr, hCryptProv, dwFlags, StoreTypeMem);
|
CRYPT_InitStore(&store->hdr, dwFlags, StoreTypeMem);
|
||||||
store->hdr.closeStore = CRYPT_MemCloseStore;
|
store->hdr.closeStore = CRYPT_MemCloseStore;
|
||||||
store->hdr.certs.addContext = CRYPT_MemAddCert;
|
store->hdr.certs.addContext = CRYPT_MemAddCert;
|
||||||
store->hdr.certs.enumContext = CRYPT_MemEnumCert;
|
store->hdr.certs.enumContext = CRYPT_MemEnumCert;
|
||||||
|
@ -266,6 +260,9 @@ static WINECRYPT_CERTSTORE *CRYPT_MemOpenStore(HCRYPTPROV hCryptProv,
|
||||||
sizeof(CERT_CONTEXT));
|
sizeof(CERT_CONTEXT));
|
||||||
store->crls = ContextList_Create(pCRLInterface,
|
store->crls = ContextList_Create(pCRLInterface,
|
||||||
sizeof(CRL_CONTEXT));
|
sizeof(CRL_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;
|
return (PWINECRYPT_CERTSTORE)store;
|
||||||
|
@ -446,7 +443,7 @@ static PWINECRYPT_CERTSTORE CRYPT_SysOpenStoreW(HCRYPTPROV hCryptProv,
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
HCERTSTORE regStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,
|
HCERTSTORE regStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,
|
||||||
0, hCryptProv, dwFlags, pvPara);
|
0, 0, dwFlags, pvPara);
|
||||||
|
|
||||||
if (regStore)
|
if (regStore)
|
||||||
{
|
{
|
||||||
|
@ -465,7 +462,7 @@ static PWINECRYPT_CERTSTORE CRYPT_SysOpenStoreW(HCRYPTPROV hCryptProv,
|
||||||
dwFlags &= ~CERT_SYSTEM_STORE_CURRENT_USER;
|
dwFlags &= ~CERT_SYSTEM_STORE_CURRENT_USER;
|
||||||
dwFlags |= CERT_SYSTEM_STORE_LOCAL_MACHINE;
|
dwFlags |= CERT_SYSTEM_STORE_LOCAL_MACHINE;
|
||||||
regStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W, 0,
|
regStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W, 0,
|
||||||
hCryptProv, dwFlags, pvPara);
|
0, dwFlags, pvPara);
|
||||||
if (regStore)
|
if (regStore)
|
||||||
{
|
{
|
||||||
CertAddStoreToCollection(store, regStore,
|
CertAddStoreToCollection(store, regStore,
|
||||||
|
@ -474,6 +471,9 @@ static PWINECRYPT_CERTSTORE CRYPT_SysOpenStoreW(HCRYPTPROV hCryptProv,
|
||||||
CertCloseStore(regStore, 0);
|
CertCloseStore(regStore, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* System 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;
|
return (PWINECRYPT_CERTSTORE)store;
|
||||||
|
@ -544,7 +544,7 @@ static PWINECRYPT_CERTSTORE CRYPT_MsgOpenStore(HCRYPTPROV hCryptProv,
|
||||||
|
|
||||||
TRACE("(%ld, %08x, %p)\n", hCryptProv, dwFlags, pvPara);
|
TRACE("(%ld, %08x, %p)\n", hCryptProv, dwFlags, pvPara);
|
||||||
|
|
||||||
memStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, hCryptProv,
|
memStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
|
||||||
CERT_STORE_CREATE_NEW_FLAG, NULL);
|
CERT_STORE_CREATE_NEW_FLAG, NULL);
|
||||||
if (memStore)
|
if (memStore)
|
||||||
{
|
{
|
||||||
|
@ -609,8 +609,11 @@ static PWINECRYPT_CERTSTORE CRYPT_MsgOpenStore(HCRYPTPROV hCryptProv,
|
||||||
sizeof(msgProvFuncs[0]);
|
sizeof(msgProvFuncs[0]);
|
||||||
provInfo.rgpvStoreProvFunc = msgProvFuncs;
|
provInfo.rgpvStoreProvFunc = msgProvFuncs;
|
||||||
provInfo.hStoreProv = info;
|
provInfo.hStoreProv = info;
|
||||||
store = CRYPT_ProvCreateStore(hCryptProv, dwFlags, memStore,
|
store = CRYPT_ProvCreateStore(dwFlags, memStore,
|
||||||
&provInfo);
|
&provInfo);
|
||||||
|
/* Msg store doesn't need crypto provider, so close it */
|
||||||
|
if (hCryptProv && !(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG))
|
||||||
|
CryptReleaseContext(hCryptProv, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
CertCloseStore(memStore, 0);
|
CertCloseStore(memStore, 0);
|
||||||
|
@ -657,7 +660,7 @@ static PWINECRYPT_CERTSTORE CRYPT_PKCSOpenStore(HCRYPTPROV hCryptProv,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ret)
|
if (ret)
|
||||||
store = CRYPT_MsgOpenStore(hCryptProv, dwFlags, msg);
|
store = CRYPT_MsgOpenStore(0, dwFlags, msg);
|
||||||
CryptMsgClose(msg);
|
CryptMsgClose(msg);
|
||||||
TRACE("returning %p\n", store);
|
TRACE("returning %p\n", store);
|
||||||
return store;
|
return store;
|
||||||
|
@ -1133,8 +1136,6 @@ BOOL WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
|
||||||
{
|
{
|
||||||
TRACE("%p's ref count is 0, freeing\n", hcs);
|
TRACE("%p's ref count is 0, freeing\n", hcs);
|
||||||
hcs->dwMagic = 0;
|
hcs->dwMagic = 0;
|
||||||
if (!(hcs->dwOpenFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG))
|
|
||||||
CryptReleaseContext(hcs->cryptProv, 0);
|
|
||||||
hcs->closeStore(hcs, dwFlags);
|
hcs->closeStore(hcs, dwFlags);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue