Rob Shearman : wintrust: Implement WTHelperGetProvPrivateDataFromChain.

Alexandre Julliard julliard at winehq.org
Thu Apr 24 06:23:21 CDT 2008


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Wed Apr 23 20:09:19 2008 +0100

wintrust: Implement WTHelperGetProvPrivateDataFromChain.

Also fill in pfnAddPrivData2Chain in WintrustLoadFunctionPointers, which 
is the complement of WTHelperGetProvPrivateDataFromChain.

---

 dlls/wintrust/register.c      |    2 +-
 dlls/wintrust/wintrust.spec   |    2 +-
 dlls/wintrust/wintrust_main.c |   57 +++++++++++++++++++++++++++++++++++++++++
 dlls/wintrust/wintrust_priv.h |    2 +
 include/wintrust.h            |    1 +
 5 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/dlls/wintrust/register.c b/dlls/wintrust/register.c
index e039ab4..05e48ef 100644
--- a/dlls/wintrust/register.c
+++ b/dlls/wintrust/register.c
@@ -862,7 +862,7 @@ BOOL WINAPI WintrustLoadFunctionPointers( GUID* pgActionID,
     pPfns->pfnAddStore2Chain = WINTRUST_AddStore;
     pPfns->pfnAddSgnr2Chain = WINTRUST_AddSgnr;
     pPfns->pfnAddCert2Chain = WINTRUST_AddCert;
-    pPfns->pfnAddPrivData2Chain = NULL;
+    pPfns->pfnAddPrivData2Chain = WINTRUST_AddPrivData;
     pPfns->psUIpfns = NULL;
     pPfns->pfnInitialize = (PFN_PROVIDER_INIT_CALL)WINTRUST_ReadProviderFromReg(GuidString, Initialization);
     pPfns->pfnObjectTrust = (PFN_PROVIDER_OBJTRUST_CALL)WINTRUST_ReadProviderFromReg(GuidString, Message);
diff --git a/dlls/wintrust/wintrust.spec b/dlls/wintrust/wintrust.spec
index 552cfdd..191e3d1 100644
--- a/dlls/wintrust/wintrust.spec
+++ b/dlls/wintrust/wintrust.spec
@@ -81,7 +81,7 @@
 @ stdcall WTHelperGetFileName(ptr)
 @ stub WTHelperGetKnownUsages
 @ stdcall WTHelperGetProvCertFromChain(ptr long)
-@ stub WTHelperGetProvPrivateDataFromChain
+@ stdcall WTHelperGetProvPrivateDataFromChain(ptr ptr)
 @ stdcall WTHelperGetProvSignerFromChain(ptr long long long)
 @ stub WTHelperIsInRootStore
 @ stub WTHelperOpenKnownStores
diff --git a/dlls/wintrust/wintrust_main.c b/dlls/wintrust/wintrust_main.c
index c5b1612..47c0865 100644
--- a/dlls/wintrust/wintrust_main.c
+++ b/dlls/wintrust/wintrust_main.c
@@ -425,6 +425,25 @@ CRYPT_PROVIDER_CERT * WINAPI WTHelperGetProvCertFromChain(
     return cert;
 }
 
+CRYPT_PROVIDER_PRIVDATA *WINAPI WTHelperGetProvPrivateDataFromChain(
+ CRYPT_PROVIDER_DATA* pProvData,
+ GUID* pgProviderID)
+{
+    CRYPT_PROVIDER_PRIVDATA *privdata = NULL;
+    DWORD i;
+
+    TRACE("(%p, %s)\n", pProvData, debugstr_guid(pgProviderID));
+
+    for (i = 0; i < pProvData->csProvPrivData; i++)
+        if (IsEqualGUID(pgProviderID, &pProvData->pasProvPrivData[i].gProviderID))
+        {
+            privdata = &pProvData->pasProvPrivData[i];
+            break;
+        }
+
+    return privdata;
+}
+
 /***********************************************************************
  *		WTHelperProvDataFromStateData (WINTRUST.@)
  */
@@ -649,3 +668,41 @@ BOOL WINAPI WINTRUST_AddCert(CRYPT_PROVIDER_DATA *data, DWORD idxSigner,
         SetLastError(ERROR_OUTOFMEMORY);
     return ret;
 }
+
+BOOL WINAPI WINTRUST_AddPrivData(CRYPT_PROVIDER_DATA *data,
+ CRYPT_PROVIDER_PRIVDATA *pPrivData2Add)
+{
+    BOOL ret = FALSE;
+
+    TRACE("(%p, %p)\n", data, pPrivData2Add);
+
+    if (pPrivData2Add->cbStruct > sizeof(CRYPT_PROVIDER_PRIVDATA))
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        WARN("invalid struct size\n");
+        return FALSE;
+    }
+    if (data->csProvPrivData)
+        data->pasProvPrivData = WINTRUST_ReAlloc(data->pasProvPrivData,
+         (data->csProvPrivData + 1) * sizeof(CRYPT_PROVIDER_SGNR));
+    else
+    {
+        data->pasProvPrivData = WINTRUST_Alloc(sizeof(CRYPT_PROVIDER_SGNR));
+        data->csProvPrivData = 0;
+    }
+    if (data->pasProvPrivData)
+    {
+        DWORD i;
+
+        for (i = 0; i < data->csProvPrivData; i++)
+            if (IsEqualGUID(&pPrivData2Add->gProviderID, &data->pasProvPrivData[i]))
+                break;
+
+        data->pasProvPrivData[i] = *pPrivData2Add;
+        if (i == data->csProvPrivData)
+            data->csProvPrivData++;
+    }
+    else
+        SetLastError(ERROR_OUTOFMEMORY);
+    return ret;
+}
diff --git a/dlls/wintrust/wintrust_priv.h b/dlls/wintrust/wintrust_priv.h
index 4519bd9..c73f666 100644
--- a/dlls/wintrust/wintrust_priv.h
+++ b/dlls/wintrust/wintrust_priv.h
@@ -26,5 +26,7 @@ BOOL WINAPI WINTRUST_AddSgnr(CRYPT_PROVIDER_DATA *data,
  BOOL fCounterSigner, DWORD idxSigner, CRYPT_PROVIDER_SGNR *sgnr);
 BOOL WINAPI WINTRUST_AddCert(CRYPT_PROVIDER_DATA *data, DWORD idxSigner,
  BOOL fCounterSigner, DWORD idxCounterSigner, PCCERT_CONTEXT pCert2Add);
+BOOL WINAPI WINTRUST_AddPrivData(CRYPT_PROVIDER_DATA *data,
+ CRYPT_PROVIDER_PRIVDATA *pPrivData2Add);
 
 #endif /* ndef __WINTRUST_PRIV_H__ */
diff --git a/include/wintrust.h b/include/wintrust.h
index bc1c367..5408ad4 100644
--- a/include/wintrust.h
+++ b/include/wintrust.h
@@ -428,6 +428,7 @@ CRYPT_PROVIDER_SGNR * WINAPI WTHelperGetProvSignerFromChain(
  CRYPT_PROVIDER_DATA *pProvData, DWORD idxSigner, BOOL fCounterSigner,
  DWORD idxCounterSigner);
 CRYPT_PROVIDER_DATA * WINAPI WTHelperProvDataFromStateData(HANDLE hStateData);
+CRYPT_PROVIDER_PRIVDATA * WINAPI WTHelperGetProvPrivateDataFromChain(CRYPT_PROVIDER_DATA *,GUID *);
 
 #define SPC_INDIRECT_DATA_OBJID      "1.3.6.1.4.1.311.2.1.4"
 #define SPC_SP_AGENCY_INFO_OBJID     "1.3.6.1.4.1.311.2.1.10"




More information about the wine-cvs mailing list