Jacek Caban : crypt32: Pass context as BASE_CONTEXT to Context_AddRef and added structs describing memory layout behind context structs .
Alexandre Julliard
julliard at winehq.org
Mon Oct 14 12:39:29 CDT 2013
Module: wine
Branch: master
Commit: 802a6bc1bb93b4c6397a7c4100a1c86dd893b485
URL: http://source.winehq.org/git/wine.git/?a=commit;h=802a6bc1bb93b4c6397a7c4100a1c86dd893b485
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Oct 14 14:47:07 2013 +0200
crypt32: Pass context as BASE_CONTEXT to Context_AddRef and added structs describing memory layout behind context structs.
---
dlls/crypt32/cert.c | 5 +--
dlls/crypt32/context.c | 17 +++-----------
dlls/crypt32/crl.c | 2 +-
dlls/crypt32/crypt32_private.h | 47 +++++++++++++++++++++++++++++++++++++--
dlls/crypt32/ctl.c | 2 +-
dlls/crypt32/store.c | 2 +-
6 files changed, 53 insertions(+), 22 deletions(-)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index 561fd59..9e47847 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -176,15 +176,14 @@ end:
return cert;
}
-PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext(
- PCCERT_CONTEXT pCertContext)
+PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext(PCCERT_CONTEXT pCertContext)
{
TRACE("(%p)\n", pCertContext);
if (!pCertContext)
return NULL;
- Context_AddRef((void *)pCertContext);
+ Context_AddRef(&cert_from_ptr(pCertContext)->base);
return pCertContext;
}
diff --git a/dlls/crypt32/context.c b/dlls/crypt32/context.c
index cdc8c01..a91b63b 100644
--- a/dlls/crypt32/context.c
+++ b/dlls/crypt32/context.c
@@ -26,13 +26,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(context);
-typedef struct _BASE_CONTEXT
-{
- LONG ref;
- struct _BASE_CONTEXT *linked;
- CONTEXT_PROPERTY_LIST *properties;
-} BASE_CONTEXT;
-
#define CONTEXT_FROM_BASE_CONTEXT(p) (void*)(p+1)
#define BASE_CONTEXT_FROM_CONTEXT(p) ((BASE_CONTEXT*)(p)-1)
@@ -72,18 +65,16 @@ void *Context_CreateLinkContext(unsigned int contextSize, void *linked, unsigned
context->ref = 1;
context->linked = BASE_CONTEXT_FROM_CONTEXT(linked);
if (addRef)
- Context_AddRef(linked);
+ Context_AddRef(BASE_CONTEXT_FROM_CONTEXT(linked));
TRACE("returning %p\n", context);
return CONTEXT_FROM_BASE_CONTEXT(context);
}
-void Context_AddRef(void *context)
+void Context_AddRef(context_t *context)
{
- BASE_CONTEXT *baseContext = BASE_CONTEXT_FROM_CONTEXT(context);
-
- InterlockedIncrement(&baseContext->ref);
- TRACE("%p's ref count is %d\n", context, baseContext->ref);
+ InterlockedIncrement(&context->ref);
+ TRACE("(%p) ref=%d\n", context, context->ref);
}
void *Context_GetExtra(const void *context, size_t contextSize)
diff --git a/dlls/crypt32/crl.c b/dlls/crypt32/crl.c
index 6ed27f7..5f127cb 100644
--- a/dlls/crypt32/crl.c
+++ b/dlls/crypt32/crl.c
@@ -327,7 +327,7 @@ PCCRL_CONTEXT WINAPI CertDuplicateCRLContext(PCCRL_CONTEXT pCrlContext)
{
TRACE("(%p)\n", pCrlContext);
if (pCrlContext)
- Context_AddRef((void *)pCrlContext);
+ Context_AddRef(&crl_from_ptr(pCrlContext)->base);
return pCrlContext;
}
diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h
index cc1477c..18a3523 100644
--- a/dlls/crypt32/crypt32_private.h
+++ b/dlls/crypt32/crypt32_private.h
@@ -157,6 +157,49 @@ void crypt_sip_free(void) DECLSPEC_HIDDEN;
void root_store_free(void) DECLSPEC_HIDDEN;
void default_chain_engine_free(void) DECLSPEC_HIDDEN;
+typedef struct _CONTEXT_PROPERTY_LIST CONTEXT_PROPERTY_LIST;
+
+typedef struct _context_t {
+ LONG ref;
+ struct _context_t *linked;
+ CONTEXT_PROPERTY_LIST *properties;
+} BASE_CONTEXT, context_t;
+
+static inline context_t *context_from_ptr(const void *ptr)
+{
+ return (context_t*)ptr-1;
+}
+
+typedef struct {
+ context_t base;
+ CERT_CONTEXT ctx;
+} cert_t;
+
+static inline cert_t *cert_from_ptr(const CERT_CONTEXT *ptr)
+{
+ return CONTAINING_RECORD(ptr, cert_t, ctx);
+}
+
+typedef struct {
+ context_t base;
+ CRL_CONTEXT ctx;
+} crl_t;
+
+static inline crl_t *crl_from_ptr(const CRL_CONTEXT *ptr)
+{
+ return CONTAINING_RECORD(ptr, crl_t, ctx);
+}
+
+typedef struct {
+ context_t base;
+ CTL_CONTEXT ctx;
+} ctl_t;
+
+static inline ctl_t *ctl_from_ptr(const CTL_CONTEXT *ptr)
+{
+ return CONTAINING_RECORD(ptr, ctl_t, ctx);
+}
+
/* Some typedefs that make it easier to abstract which type of context we're
* working with.
*/
@@ -234,8 +277,6 @@ typedef enum _CertStoreType {
StoreTypeEmpty
} CertStoreType;
-typedef struct _CONTEXT_PROPERTY_LIST CONTEXT_PROPERTY_LIST;
-
#define WINE_CRYPTCERTSTORE_MAGIC 0x74726563
/* A cert store is polymorphic through the use of function pointers. A type
@@ -365,7 +406,7 @@ void Context_CopyProperties(const void *to, const void *from) DECLSPEC_HIDDEN;
*/
CONTEXT_PROPERTY_LIST *Context_GetProperties(const void *context) DECLSPEC_HIDDEN;
-void Context_AddRef(void *context) DECLSPEC_HIDDEN;
+void Context_AddRef(context_t*) DECLSPEC_HIDDEN;
typedef void (*ContextFreeFunc)(void *context);
diff --git a/dlls/crypt32/ctl.c b/dlls/crypt32/ctl.c
index a484f85..2ee94ab 100644
--- a/dlls/crypt32/ctl.c
+++ b/dlls/crypt32/ctl.c
@@ -457,7 +457,7 @@ PCCTL_CONTEXT WINAPI CertDuplicateCTLContext(PCCTL_CONTEXT pCtlContext)
{
TRACE("(%p)\n", pCtlContext);
if (pCtlContext)
- Context_AddRef((void *)pCtlContext);
+ Context_AddRef(&ctl_from_ptr(pCtlContext)->base);
return pCtlContext;
}
diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c
index 521fd4f..506a33c 100644
--- a/dlls/crypt32/store.c
+++ b/dlls/crypt32/store.c
@@ -1507,7 +1507,7 @@ static BOOL EmptyStore_add(WINECRYPT_CERTSTORE *store, void *context,
/* FIXME: We should clone the context */
if(ret_context) {
- Context_AddRef(context);
+ Context_AddRef(context_from_ptr(context));
*ret_context = context;
}
More information about the wine-cvs
mailing list