Juan Lang : crypt32: Simplify stores.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Mar 7 06:12:48 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 78872852fd988fc56474dc95870160905895fc85
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=78872852fd988fc56474dc95870160905895fc85

Author: Juan Lang <juan_lang at yahoo.com>
Date:   Mon Mar  6 12:46:38 2006 -0800

crypt32: Simplify stores.

Ref count cert context references, and eliminate the DupCert function
from stores.

---

 dlls/crypt32/store.c |  115 ++++++++++----------------------------------------
 1 files changed, 22 insertions(+), 93 deletions(-)

diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c
index 2ac2e10..fe37a56 100644
--- a/dlls/crypt32/store.c
+++ b/dlls/crypt32/store.c
@@ -144,8 +144,6 @@ typedef BOOL (*AddCertFunc)(struct WINE_
  */
 typedef void (*FreeCertFunc)(struct _WINE_CERT_CONTEXT_REF *ref);
 
-typedef PCCERT_CONTEXT (*DupCertFunc)(PCCERT_CONTEXT context);
-
 typedef enum _CertStoreType {
     StoreTypeMem,
     StoreTypeCollection,
@@ -170,7 +168,6 @@ typedef struct WINE_CRYPTCERTSTORE
     AddCertFunc                     addCert;
     EnumCertFunc                    enumCert;
     PFN_CERT_STORE_PROV_DELETE_CERT deleteCert;
-    DupCertFunc                     dupCert;
     FreeCertFunc                    freeCert;   /* optional */
     PFN_CERT_STORE_PROV_CONTROL     control;    /* optional */
 } WINECRYPT_CERTSTORE, *PWINECRYPT_CERTSTORE;
@@ -193,7 +190,8 @@ typedef struct _WINE_CERT_CONTEXT
 
 typedef struct _WINE_CERT_CONTEXT_REF
 {
-    CERT_CONTEXT cert;
+    CERT_CONTEXT       cert;
+    LONG               ref;
     WINE_CERT_CONTEXT *context;
 } WINE_CERT_CONTEXT_REF, *PWINE_CERT_CONTEXT_REF;
 
@@ -326,6 +324,7 @@ static void CRYPT_InitCertRef(PWINE_CERT
 {
     TRACE("(%p, %p)\n", ref, context);
     memcpy(&ref->cert, context, sizeof(ref->cert));
+    ref->ref = 1;
     ref->context = context;
     InterlockedIncrement(&context->ref);
     TRACE("%p's ref count is %ld\n", context, context->ref);
@@ -532,21 +531,6 @@ static void WINAPI CRYPT_MemCloseStore(H
     CryptMemFree(store);
 }
 
-static PCCERT_CONTEXT CRYPT_MemDupCert(PCCERT_CONTEXT pCertContext)
-{
-    const WINE_CERT_LIST_ENTRY *context =
-     (const WINE_CERT_LIST_ENTRY *)pCertContext;
-    PWINE_CERT_LIST_ENTRY ret;
-
-    ret = CryptMemAlloc(sizeof(WINE_CERT_LIST_ENTRY));
-    if (ret)
-    {
-        memcpy(ret, context, sizeof(WINE_CERT_LIST_ENTRY));
-        InterlockedIncrement(&ret->cert.context->ref);
-    }
-    return (PCCERT_CONTEXT)ret;
-}
-
 static WINECRYPT_CERTSTORE *CRYPT_MemOpenStore(HCRYPTPROV hCryptProv,
  DWORD dwFlags, const void *pvPara)
 {
@@ -571,7 +555,6 @@ static WINECRYPT_CERTSTORE *CRYPT_MemOpe
             store->hdr.enumCert      = CRYPT_MemEnumCert;
             store->hdr.deleteCert    = CRYPT_MemDeleteCert;
             store->hdr.freeCert      = NULL;
-            store->hdr.dupCert       = CRYPT_MemDupCert;
             store->hdr.control       = NULL;
             InitializeCriticalSection(&store->cs);
             list_init(&store->certs);
@@ -749,21 +732,6 @@ static BOOL WINAPI CRYPT_CollectionDelet
     return ret;
 }
 
-static PCCERT_CONTEXT CRYPT_CollectionDupCert(PCCERT_CONTEXT pCertContext)
-{
-    const WINE_COLLECTION_CERT_CONTEXT *context =
-     (const WINE_COLLECTION_CERT_CONTEXT *)pCertContext;
-    PWINE_COLLECTION_CERT_CONTEXT ret;
-
-    ret = CryptMemAlloc(sizeof(WINE_COLLECTION_CERT_CONTEXT));
-    if (ret)
-    {
-        memcpy(ret, context, sizeof(WINE_COLLECTION_CERT_CONTEXT));
-        InterlockedIncrement(&ret->cert.context->ref);
-    }
-    return (PCCERT_CONTEXT)ret;
-}
-
 static void CRYPT_CollectionFreeCert(PWINE_CERT_CONTEXT_REF ref)
 {
     PWINE_COLLECTION_CERT_CONTEXT context = (PWINE_COLLECTION_CERT_CONTEXT)ref;
@@ -796,7 +764,6 @@ static WINECRYPT_CERTSTORE *CRYPT_Collec
             store->hdr.addCert       = CRYPT_CollectionAddCert;
             store->hdr.enumCert      = CRYPT_CollectionEnumCert;
             store->hdr.deleteCert    = CRYPT_CollectionDeleteCert;
-            store->hdr.dupCert       = CRYPT_CollectionDupCert;
             store->hdr.freeCert      = CRYPT_CollectionFreeCert;
             InitializeCriticalSection(&store->cs);
             list_init(&store->stores);
@@ -887,21 +854,6 @@ static PWINE_CERT_CONTEXT_REF CRYPT_Prov
     return (PWINE_CERT_CONTEXT_REF)ret;
 }
 
-static PCCERT_CONTEXT CRYPT_ProvDupCert(PCCERT_CONTEXT pCertContext)
-{
-    const WINE_PROV_CERT_CONTEXT *context =
-     (const WINE_PROV_CERT_CONTEXT *)pCertContext;
-    PWINE_PROV_CERT_CONTEXT ret;
-
-    ret = CryptMemAlloc(sizeof(WINE_PROV_CERT_CONTEXT));
-    if (ret)
-    {
-        memcpy(ret, context, sizeof(WINE_PROV_CERT_CONTEXT));
-        InterlockedIncrement(&ret->cert.context->ref);
-    }
-    return (PCCERT_CONTEXT)ret;
-}
-
 static BOOL WINAPI CRYPT_ProvDeleteCert(HCERTSTORE hCertStore,
  PCCERT_CONTEXT cert, DWORD dwFlags)
 {
@@ -965,7 +917,6 @@ static PWINECRYPT_CERTSTORE CRYPT_ProvCr
         ret->hdr.addCert = CRYPT_ProvAddCert;
         ret->hdr.enumCert = CRYPT_ProvEnumCert;
         ret->hdr.deleteCert = CRYPT_ProvDeleteCert;
-        ret->hdr.dupCert = CRYPT_ProvDupCert;
         ret->hdr.freeCert = CRYPT_ProvFreeCert;
         ret->hdr.control = CRYPT_ProvControl;
         if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CLOSE_FUNC)
@@ -2337,33 +2288,11 @@ BOOL WINAPI CertSetCertificateContextPro
 PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext(
  PCCERT_CONTEXT pCertContext)
 {
-    PCCERT_CONTEXT ret;
+    PWINE_CERT_CONTEXT_REF context = (PWINE_CERT_CONTEXT_REF)pCertContext;
 
     TRACE("(%p)\n", pCertContext);
-    if (pCertContext->hCertStore)
-    {
-        PWINECRYPT_CERTSTORE store =
-         (PWINECRYPT_CERTSTORE)pCertContext->hCertStore;
-
-        ret = store->dupCert(pCertContext);
-    }
-    else
-    {
-        PWINE_CERT_CONTEXT_REF context = (PWINE_CERT_CONTEXT_REF)pCertContext,
-         ref;
-
-        ref = CryptMemAlloc(sizeof(WINE_CERT_CONTEXT_REF));
-        if (ref)
-        {
-            memcpy(ref, context, sizeof(*ret));
-            ref->cert.hCertStore = 0;
-            InterlockedIncrement(&ref->context->ref);
-            ret = (PCCERT_CONTEXT)ref;
-        }
-        else
-            ret = NULL;
-    }
-    return (PCCERT_CONTEXT)ret;
+    InterlockedIncrement(&context->ref);
+    return pCertContext;
 }
 
 BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
@@ -2694,31 +2623,31 @@ BOOL WINAPI CertSetCTLContextProperty(PC
 
 static void CRYPT_UnrefCertificateContext(PWINE_CERT_CONTEXT_REF ref)
 {
-    if (InterlockedDecrement(&ref->context->ref) == 0)
-    {
-        TRACE("%p's ref count is 0, freeing\n", ref->context);
-        CRYPT_FreeCert(ref->context);
-    }
-    else
-        TRACE("%p's ref count is %ld\n", ref->context, ref->context->ref);
-}
-
-BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
-{
-    TRACE("(%p)\n", pCertContext);
-
-    if (pCertContext)
+    if (InterlockedDecrement(&ref->ref) == 0)
     {
-        PWINE_CERT_CONTEXT_REF ref = (PWINE_CERT_CONTEXT_REF)pCertContext;
         PWINECRYPT_CERTSTORE store = (PWINECRYPT_CERTSTORE)ref->cert.hCertStore;
 
-        CRYPT_UnrefCertificateContext(ref);
+        if (InterlockedDecrement(&ref->context->ref) == 0)
+        {
+            TRACE("%p's ref count is 0, freeing\n", ref->context);
+            CRYPT_FreeCert(ref->context);
+        }
+        else
+            TRACE("%p's ref count is %ld\n", ref->context, ref->context->ref);
         if (store && store->dwMagic == WINE_CRYPTCERTSTORE_MAGIC &&
          store->freeCert)
             store->freeCert(ref);
         TRACE("freeing %p\n", ref);
         CryptMemFree(ref);
     }
+}
+
+BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
+{
+    TRACE("(%p)\n", pCertContext);
+
+    if (pCertContext)
+        CRYPT_UnrefCertificateContext((PWINE_CERT_CONTEXT_REF)pCertContext);
     return TRUE;
 }
 




More information about the wine-cvs mailing list