crypt32(4/4): Don't store the crypto provider when it isn't needed

Juan Lang juan.lang at gmail.com
Fri Aug 17 14:04:45 CDT 2007


--Juan
-------------- next part --------------
From 870b8dd9b97c27f1304d084692c5e0794a3944b5 Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Fri, 17 Aug 2007 11:59:28 -0700
Subject: [PATCH] Don't store the crypto provider when it isn't needed
---
 dlls/crypt32/collectionstore.c |    3 +--
 dlls/crypt32/crypt32_private.h |   10 ++++------
 dlls/crypt32/filestore.c       |    9 ++++++---
 dlls/crypt32/provstore.c       |   11 ++++-------
 dlls/crypt32/regstore.c        |    7 +++++--
 dlls/crypt32/store.c           |   33 +++++++++++++++++----------------
 6 files changed, 37 insertions(+), 36 deletions(-)

diff --git a/dlls/crypt32/collectionstore.c b/dlls/crypt32/collectionstore.c
index e412337..9bf6d1d 100644
--- a/dlls/crypt32/collectionstore.c
+++ b/dlls/crypt32/collectionstore.c
@@ -357,8 +357,7 @@ PWINECRYPT_CERTSTORE CRYPT_CollectionOpe
         if (store)
         {
             memset(store, 0, sizeof(WINE_COLLECTIONSTORE));
-            CRYPT_InitStore(&store->hdr, hCryptProv, dwFlags,
-             StoreTypeCollection);
+            CRYPT_InitStore(&store->hdr, dwFlags, StoreTypeCollection);
             store->hdr.closeStore          = CRYPT_CollectionCloseStore;
             store->hdr.certs.addContext    = CRYPT_CollectionAddCert;
             store->hdr.certs.enumContext   = CRYPT_CollectionEnumCert;
diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h
index d2a70a7..ffd5a87 100644
--- a/dlls/crypt32/crypt32_private.h
+++ b/dlls/crypt32/crypt32_private.h
@@ -222,7 +222,6 @@ typedef struct WINE_CRYPTCERTSTORE
     DWORD                       dwMagic;
     LONG                        ref;
     DWORD                       dwOpenFlags;
-    HCRYPTPROV                  cryptProv;
     CertStoreType               type;
     PFN_CERT_STORE_PROV_CLOSE   closeStore;
     CONTEXT_FUNCS               certs;
@@ -231,16 +230,15 @@ typedef struct WINE_CRYPTCERTSTORE
     PCONTEXT_PROPERTY_LIST      properties;
 } WINECRYPT_CERTSTORE, *PWINECRYPT_CERTSTORE;
 
-void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, HCRYPTPROV hCryptProv,
- DWORD dwFlags, CertStoreType type);
+void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, DWORD dwFlags,
+ CertStoreType type);
 void CRYPT_FreeStore(PWINECRYPT_CERTSTORE store);
 void CRYPT_EmptyStore(HCERTSTORE store);
 
 PWINECRYPT_CERTSTORE CRYPT_CollectionOpenStore(HCRYPTPROV hCryptProv,
  DWORD dwFlags, const void *pvPara);
-PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(HCRYPTPROV hCryptProv,
- DWORD dwFlags, PWINECRYPT_CERTSTORE memStore,
- const CERT_STORE_PROV_INFO *pProvInfo);
+PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags,
+ PWINECRYPT_CERTSTORE memStore, const CERT_STORE_PROV_INFO *pProvInfo);
 PWINECRYPT_CERTSTORE CRYPT_ProvOpenStore(LPCSTR lpszStoreProvider,
  DWORD dwEncodingType, HCRYPTPROV hCryptProv, DWORD dwFlags,
  const void *pvPara);
diff --git a/dlls/crypt32/filestore.c b/dlls/crypt32/filestore.c
index 45becca..afe4327 100644
--- a/dlls/crypt32/filestore.c
+++ b/dlls/crypt32/filestore.c
@@ -167,7 +167,7 @@ PWINECRYPT_CERTSTORE CRYPT_FileOpenStore
     {
         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);
         if (memStore)
         {
@@ -189,8 +189,11 @@ PWINECRYPT_CERTSTORE CRYPT_FileOpenStore
                      sizeof(fileProvFuncs[0]);
                     provInfo.rgpvStoreProvFunc = fileProvFuncs;
                     provInfo.hStoreProv = info;
-                    store = CRYPT_ProvCreateStore(hCryptProv, dwFlags, memStore,
-                     &provInfo);
+                    store = CRYPT_ProvCreateStore(dwFlags, memStore, &provInfo);
+                    /* File store doesn't need crypto provider, so close it */
+                    if (hCryptProv &&
+                     !(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG))
+                        CryptReleaseContext(hCryptProv, 0);
                 }
             }
         }
diff --git a/dlls/crypt32/provstore.c b/dlls/crypt32/provstore.c
index d58612a..b1053ae 100644
--- a/dlls/crypt32/provstore.c
+++ b/dlls/crypt32/provstore.c
@@ -193,16 +193,14 @@ static BOOL WINAPI CRYPT_ProvControl(HCE
     return ret;
 }
 
-PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(HCRYPTPROV hCryptProv,
- DWORD dwFlags, PWINECRYPT_CERTSTORE memStore,
- const CERT_STORE_PROV_INFO *pProvInfo)
+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, hCryptProv, dwFlags,
-         StoreTypeProvider);
+        CRYPT_InitStore(&ret->hdr, dwFlags, StoreTypeProvider);
         ret->dwStoreProvFlags = pProvInfo->dwStoreProvFlags;
         if (ret->dwStoreProvFlags & CERT_STORE_PROV_EXTERNAL_FLAG)
         {
@@ -289,8 +287,7 @@ PWINECRYPT_CERTSTORE CRYPT_ProvOpenStore
             {
                 if (provOpenFunc(lpszStoreProvider, dwEncodingType, hCryptProv,
                  dwFlags, pvPara, memStore, &provInfo))
-                    ret = CRYPT_ProvCreateStore(hCryptProv, dwFlags, memStore,
-                     &provInfo);
+                    ret = CRYPT_ProvCreateStore(dwFlags, memStore, &provInfo);
                 else
                     CertCloseStore(memStore, 0);
             }
diff --git a/dlls/crypt32/regstore.c b/dlls/crypt32/regstore.c
index 7bfb4df..e7de5fd 100644
--- a/dlls/crypt32/regstore.c
+++ b/dlls/crypt32/regstore.c
@@ -530,8 +530,11 @@ PWINECRYPT_CERTSTORE CRYPT_RegOpenStore(
                      sizeof(regProvFuncs[0]);
                     provInfo.rgpvStoreProvFunc = regProvFuncs;
                     provInfo.hStoreProv = regInfo;
-                    store = CRYPT_ProvCreateStore(hCryptProv, dwFlags, memStore,
-                     &provInfo);
+                    store = CRYPT_ProvCreateStore(dwFlags, memStore, &provInfo);
+                    /* Reg store doesn't need crypto provider, so close it */
+                    if (hCryptProv &&
+                     !(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG))
+                        CryptReleaseContext(hCryptProv, 0);
                 }
             }
         }
diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c
index 28c8433..fd7ec8a 100644
--- a/dlls/crypt32/store.c
+++ b/dlls/crypt32/store.c
@@ -100,18 +100,12 @@ typedef struct _WINE_MSGSTOREINFO
     HCRYPTMSG  msg;
 } WINE_MSGSTOREINFO, *PWINE_MSGSTOREINFO;
 
-void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, HCRYPTPROV hCryptProv,
- DWORD dwFlags, CertStoreType type)
+void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, DWORD dwFlags,
+ CertStoreType type)
 {
     store->ref = 1;
     store->dwMagic = WINE_CRYPTCERTSTORE_MAGIC;
     store->type = type;
-    if (!hCryptProv)
-    {
-        hCryptProv = CRYPT_GetDefaultProvider();
-        dwFlags |= CERT_STORE_NO_CRYPT_RELEASE_FLAG;
-    }
-    store->cryptProv = hCryptProv;
     store->dwOpenFlags = dwFlags;
     store->properties = NULL;
 }
@@ -253,7 +247,7 @@ static WINECRYPT_CERTSTORE *CRYPT_MemOpe
         if (store)
         {
             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.certs.addContext    = CRYPT_MemAddCert;
             store->hdr.certs.enumContext   = CRYPT_MemEnumCert;
@@ -266,6 +260,9 @@ static WINECRYPT_CERTSTORE *CRYPT_MemOpe
              sizeof(CERT_CONTEXT));
             store->crls = ContextList_Create(pCRLInterface,
              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;
@@ -446,7 +443,7 @@ static PWINECRYPT_CERTSTORE CRYPT_SysOpe
     if (ret)
     {
         HCERTSTORE regStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W,
-         0, hCryptProv, dwFlags, pvPara);
+         0, 0, dwFlags, pvPara);
 
         if (regStore)
         {
@@ -465,7 +462,7 @@ static PWINECRYPT_CERTSTORE CRYPT_SysOpe
                 dwFlags &= ~CERT_SYSTEM_STORE_CURRENT_USER;
                 dwFlags |= CERT_SYSTEM_STORE_LOCAL_MACHINE;
                 regStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_W, 0,
-                 hCryptProv, dwFlags, pvPara);
+                 0, dwFlags, pvPara);
                 if (regStore)
                 {
                     CertAddStoreToCollection(store, regStore,
@@ -474,6 +471,9 @@ static PWINECRYPT_CERTSTORE CRYPT_SysOpe
                     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;
@@ -544,7 +544,7 @@ static PWINECRYPT_CERTSTORE CRYPT_MsgOpe
 
     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);
     if (memStore)
     {
@@ -609,8 +609,11 @@ static PWINECRYPT_CERTSTORE CRYPT_MsgOpe
                  sizeof(msgProvFuncs[0]);
                 provInfo.rgpvStoreProvFunc = msgProvFuncs;
                 provInfo.hStoreProv = info;
-                store = CRYPT_ProvCreateStore(hCryptProv, dwFlags, memStore,
+                store = CRYPT_ProvCreateStore(dwFlags, memStore,
                  &provInfo);
+                /* Msg store doesn't need crypto provider, so close it */
+                if (hCryptProv && !(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG))
+                    CryptReleaseContext(hCryptProv, 0);
             }
             else
                 CertCloseStore(memStore, 0);
@@ -657,7 +660,7 @@ static PWINECRYPT_CERTSTORE CRYPT_PKCSOp
         }
     }
     if (ret)
-        store = CRYPT_MsgOpenStore(hCryptProv, dwFlags, msg);
+        store = CRYPT_MsgOpenStore(0, dwFlags, msg);
     CryptMsgClose(msg);
     TRACE("returning %p\n", store);
     return store;
@@ -1133,8 +1136,6 @@ BOOL WINAPI CertCloseStore(HCERTSTORE hC
     {
         TRACE("%p's ref count is 0, freeing\n", hcs);
         hcs->dwMagic = 0;
-        if (!(hcs->dwOpenFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG))
-            CryptReleaseContext(hcs->cryptProv, 0);
         hcs->closeStore(hcs, dwFlags);
     }
     else
-- 
1.4.1


More information about the wine-patches mailing list