Leaked source code of windows server 2003
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

//+-------------------------------------------------------------------------
//
// 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);
}