Juan Lang : crypt32: Add CTLs to the provider store.

Alexandre Julliard julliard at winehq.org
Tue Sep 2 08:32:50 CDT 2008


Module: wine
Branch: master
Commit: 02784fb0dc1c7ab97461d7845976a3181d5ea589
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=02784fb0dc1c7ab97461d7845976a3181d5ea589

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Aug 29 07:32:39 2008 -0700

crypt32: Add CTLs to the provider store.

---

 dlls/crypt32/provstore.c |   84 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 84 insertions(+), 0 deletions(-)

diff --git a/dlls/crypt32/provstore.c b/dlls/crypt32/provstore.c
index 33f765d..fba11eb 100644
--- a/dlls/crypt32/provstore.c
+++ b/dlls/crypt32/provstore.c
@@ -36,6 +36,8 @@ typedef struct _WINE_PROVIDERSTORE
     PFN_CERT_STORE_PROV_DELETE_CERT provDeleteCert;
     PFN_CERT_STORE_PROV_WRITE_CRL   provWriteCrl;
     PFN_CERT_STORE_PROV_DELETE_CRL  provDeleteCrl;
+    PFN_CERT_STORE_PROV_WRITE_CTL   provWriteCtl;
+    PFN_CERT_STORE_PROV_DELETE_CTL  provDeleteCtl;
     PFN_CERT_STORE_PROV_CONTROL     provControl;
 } WINE_PROVIDERSTORE, *PWINE_PROVIDERSTORE;
 
@@ -178,6 +180,73 @@ static BOOL CRYPT_ProvDeleteCRL(PWINECRYPT_CERTSTORE store, void *crl)
     return ret;
 }
 
+static BOOL CRYPT_ProvAddCTL(PWINECRYPT_CERTSTORE store, void *ctl,
+ void *toReplace, const void **ppStoreContext)
+{
+    PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
+    BOOL ret;
+
+    TRACE("(%p, %p, %p, %p)\n", store, ctl, toReplace, ppStoreContext);
+
+    if (toReplace)
+        ret = ps->memStore->ctls.addContext(ps->memStore, ctl, toReplace,
+         ppStoreContext);
+    else
+    {
+        if (ps->hdr.dwOpenFlags & CERT_STORE_READONLY_FLAG)
+        {
+            SetLastError(ERROR_ACCESS_DENIED);
+            ret = FALSE;
+        }
+        else
+        {
+            ret = TRUE;
+            if (ps->provWriteCtl)
+                ret = ps->provWriteCtl(ps->hStoreProv, (PCCTL_CONTEXT)ctl,
+                 CERT_STORE_PROV_WRITE_ADD_FLAG);
+            if (ret)
+                ret = ps->memStore->ctls.addContext(ps->memStore, ctl, NULL,
+                 ppStoreContext);
+        }
+    }
+    /* dirty trick: replace the returned context's hCertStore with
+     * store.
+     */
+    if (ppStoreContext)
+        (*(PCTL_CONTEXT *)ppStoreContext)->hCertStore = store;
+    return ret;
+}
+
+static void *CRYPT_ProvEnumCTL(PWINECRYPT_CERTSTORE store, void *pPrev)
+{
+    PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
+    void *ret;
+
+    ret = ps->memStore->ctls.enumContext(ps->memStore, pPrev);
+    if (ret)
+    {
+        /* same dirty trick: replace the returned context's hCertStore with
+         * store.
+         */
+        ((PCTL_CONTEXT)ret)->hCertStore = store;
+    }
+    return ret;
+}
+
+static BOOL CRYPT_ProvDeleteCTL(PWINECRYPT_CERTSTORE store, void *ctl)
+{
+    PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
+    BOOL ret = TRUE;
+
+    TRACE("(%p, %p)\n", store, ctl);
+
+    if (ps->provDeleteCtl)
+        ret = ps->provDeleteCtl(ps->hStoreProv, ctl, 0);
+    if (ret)
+        ret = ps->memStore->ctls.deleteContext(ps->memStore, ctl);
+    return ret;
+}
+
 static BOOL WINAPI CRYPT_ProvControl(HCERTSTORE hCertStore, DWORD dwFlags,
  DWORD dwCtrlType, void const *pvCtrlPara)
 {
@@ -217,6 +286,9 @@ PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags,
         ret->hdr.crls.addContext = CRYPT_ProvAddCRL;
         ret->hdr.crls.enumContext = CRYPT_ProvEnumCRL;
         ret->hdr.crls.deleteContext = CRYPT_ProvDeleteCRL;
+        ret->hdr.ctls.addContext = CRYPT_ProvAddCTL;
+        ret->hdr.ctls.enumContext = CRYPT_ProvEnumCTL;
+        ret->hdr.ctls.deleteContext = CRYPT_ProvDeleteCTL;
         ret->hdr.control = CRYPT_ProvControl;
         if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CLOSE_FUNC)
             ret->provCloseStore =
@@ -248,6 +320,18 @@ PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags,
         else
             ret->provDeleteCrl = NULL;
         if (pProvInfo->cStoreProvFunc >
+         CERT_STORE_PROV_WRITE_CTL_FUNC)
+            ret->provWriteCtl = pProvInfo->rgpvStoreProvFunc[
+             CERT_STORE_PROV_WRITE_CTL_FUNC];
+        else
+            ret->provWriteCtl = NULL;
+        if (pProvInfo->cStoreProvFunc >
+         CERT_STORE_PROV_DELETE_CTL_FUNC)
+            ret->provDeleteCtl = pProvInfo->rgpvStoreProvFunc[
+             CERT_STORE_PROV_DELETE_CTL_FUNC];
+        else
+            ret->provDeleteCtl = NULL;
+        if (pProvInfo->cStoreProvFunc >
          CERT_STORE_PROV_CONTROL_FUNC)
             ret->provControl = pProvInfo->rgpvStoreProvFunc[
              CERT_STORE_PROV_CONTROL_FUNC];




More information about the wine-cvs mailing list