crypt32: Don't store the crypto provider when it isn't needed.

This commit is contained in:
Juan Lang 2007-08-17 11:59:28 -07:00 committed by Alexandre Julliard
parent 9be5007669
commit 1d53424470
6 changed files with 37 additions and 36 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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);
} }
} }
} }

View File

@ -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);
} }

View File

@ -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);
} }
} }
} }

View File

@ -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