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