//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1996 - 1999 // // File: storprov.cpp // // Contents: Microsoft Internet Security Trust Provider // // Functions: StoreProviderGetStore // StoreProviderUnload // // *** local functions *** // _RefreshStores // _OpenStore // // History: 15-Oct-1997 pberkman created // //-------------------------------------------------------------------------- #include "global.hxx" void _RefreshStores(HCRYPTPROV hProv); HCERTSTORE _OpenStore(HCRYPTPROV hProv, DWORD dwFlags, WCHAR *pszStoreName); static STORE_REF KnownStores[] = { CERT_SYSTEM_STORE_CURRENT_USER, L"ROOT", NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"TRUST", NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"CA", NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"MY", NULL, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"SPC", NULL, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY", NULL, 0, NULL, NULL }; HCERTSTORE StoreProviderGetStore(HCRYPTPROV hProv, DWORD dwStoreId) { #if (!(USE_IEv4CRYPT32)) if (!(FIsWinNT())) { #endif return(_OpenStore(hProv, KnownStores[dwStoreId].dwFlags, KnownStores[dwStoreId].pwszStoreName)); #if (!(USE_IEv4CRYPT32)) } HCERTSTORE hStore; if (WaitForSingleObject(hStoreEvent, 0) == WAIT_OBJECT_0) { ResetListEvent(hStoreEvent); _RefreshStores(hProv); } AcquireReadLock(sStoreLock); if (KnownStores[dwStoreId].hStore) { hStore = CertDuplicateStore(KnownStores[dwStoreId].hStore); } else { hStore = NULL; } ReleaseReadLock(sStoreLock); return(hStore); #endif // ! USE_IEv4CRYPT32 } BOOL StoreProviderUnload(void) { #if (!(USE_IEv4CRYPT32)) AcquireWriteLock(sStoreLock); STORE_REF *pRef; pRef = &KnownStores[0]; while (pRef->pwszStoreName) { if (pRef->hStore) { CertCloseStore(pRef->hStore, 0); pRef->hStore = NULL; } pRef++; } ReleaseWriteLock(sStoreLock); #endif // ! USE_IEv4CRYPT32 return(TRUE); } void _RefreshStores(HCRYPTPROV hProv) { #if (!(USE_IEv4CRYPT32)) AcquireWriteLock(sStoreLock); STORE_REF *pRef; pRef = &KnownStores[0]; while (pRef->pwszStoreName) { if (pRef->hStore) { CertControlStore(pRef->hStore, 0, CERT_STORE_CTRL_RESYNC, &hStoreEvent); } else { pRef->hStore = _OpenStore(hProv, pRef->dwFlags, pRef->pwszStoreName); // // tell crypt32 to notify use if a cert is added or deleted. // if (pRef->hStore) { CertControlStore(pRef->hStore, 0, CERT_STORE_CTRL_NOTIFY_CHANGE, &hStoreEvent); } } pRef++; } ReleaseWriteLock(sStoreLock); #endif // ! USE_IEv4CRYPT32 } HCERTSTORE _OpenStore(HCRYPTPROV hProv, DWORD dwFlags, WCHAR *pwszStoreName) { HCERTSTORE hStore; // // first try read/write... just in case the user goes into cryptui and changes something. // hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, hProv, CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG | dwFlags, pwszStoreName); if (!(hStore)) { hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, hProv, CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_READONLY_FLAG | dwFlags, pwszStoreName); } return(hStore); }