Module: wine Branch: master Commit: 8e0f125f458fc935d0c6f1b88f46d5ab7eaf306a URL: http://source.winehq.org/git/wine.git/?a=commit;h=8e0f125f458fc935d0c6f1b88f...
Author: Rob Shearman rob@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"