You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
3.9 KiB
165 lines
3.9 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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);
|
|
}
|
|
|