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

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1996 - 1999
  6. //
  7. // File: storprov.cpp
  8. //
  9. // Contents: Microsoft Internet Security Trust Provider
  10. //
  11. // Functions: StoreProviderGetStore
  12. // StoreProviderUnload
  13. //
  14. // *** local functions ***
  15. // _RefreshStores
  16. // _OpenStore
  17. //
  18. // History: 15-Oct-1997 pberkman created
  19. //
  20. //--------------------------------------------------------------------------
  21. #include "global.hxx"
  22. void _RefreshStores(HCRYPTPROV hProv);
  23. HCERTSTORE _OpenStore(HCRYPTPROV hProv, DWORD dwFlags, WCHAR *pszStoreName);
  24. static STORE_REF KnownStores[] =
  25. {
  26. CERT_SYSTEM_STORE_CURRENT_USER, L"ROOT", NULL,
  27. CERT_SYSTEM_STORE_CURRENT_USER, L"TRUST", NULL,
  28. CERT_SYSTEM_STORE_CURRENT_USER, L"CA", NULL,
  29. CERT_SYSTEM_STORE_CURRENT_USER, L"MY", NULL,
  30. CERT_SYSTEM_STORE_LOCAL_MACHINE, L"SPC", NULL,
  31. CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY", NULL,
  32. 0, NULL, NULL
  33. };
  34. HCERTSTORE StoreProviderGetStore(HCRYPTPROV hProv, DWORD dwStoreId)
  35. {
  36. #if (!(USE_IEv4CRYPT32))
  37. if (!(FIsWinNT()))
  38. {
  39. #endif
  40. return(_OpenStore(hProv, KnownStores[dwStoreId].dwFlags, KnownStores[dwStoreId].pwszStoreName));
  41. #if (!(USE_IEv4CRYPT32))
  42. }
  43. HCERTSTORE hStore;
  44. if (WaitForSingleObject(hStoreEvent, 0) == WAIT_OBJECT_0)
  45. {
  46. ResetListEvent(hStoreEvent);
  47. _RefreshStores(hProv);
  48. }
  49. AcquireReadLock(sStoreLock);
  50. if (KnownStores[dwStoreId].hStore)
  51. {
  52. hStore = CertDuplicateStore(KnownStores[dwStoreId].hStore);
  53. }
  54. else
  55. {
  56. hStore = NULL;
  57. }
  58. ReleaseReadLock(sStoreLock);
  59. return(hStore);
  60. #endif // ! USE_IEv4CRYPT32
  61. }
  62. BOOL StoreProviderUnload(void)
  63. {
  64. #if (!(USE_IEv4CRYPT32))
  65. AcquireWriteLock(sStoreLock);
  66. STORE_REF *pRef;
  67. pRef = &KnownStores[0];
  68. while (pRef->pwszStoreName)
  69. {
  70. if (pRef->hStore)
  71. {
  72. CertCloseStore(pRef->hStore, 0);
  73. pRef->hStore = NULL;
  74. }
  75. pRef++;
  76. }
  77. ReleaseWriteLock(sStoreLock);
  78. #endif // ! USE_IEv4CRYPT32
  79. return(TRUE);
  80. }
  81. void _RefreshStores(HCRYPTPROV hProv)
  82. {
  83. #if (!(USE_IEv4CRYPT32))
  84. AcquireWriteLock(sStoreLock);
  85. STORE_REF *pRef;
  86. pRef = &KnownStores[0];
  87. while (pRef->pwszStoreName)
  88. {
  89. if (pRef->hStore)
  90. {
  91. CertControlStore(pRef->hStore, 0, CERT_STORE_CTRL_RESYNC, &hStoreEvent);
  92. }
  93. else
  94. {
  95. pRef->hStore = _OpenStore(hProv, pRef->dwFlags, pRef->pwszStoreName);
  96. //
  97. // tell crypt32 to notify use if a cert is added or deleted.
  98. //
  99. if (pRef->hStore)
  100. {
  101. CertControlStore(pRef->hStore, 0, CERT_STORE_CTRL_NOTIFY_CHANGE, &hStoreEvent);
  102. }
  103. }
  104. pRef++;
  105. }
  106. ReleaseWriteLock(sStoreLock);
  107. #endif // ! USE_IEv4CRYPT32
  108. }
  109. HCERTSTORE _OpenStore(HCRYPTPROV hProv, DWORD dwFlags, WCHAR *pwszStoreName)
  110. {
  111. HCERTSTORE hStore;
  112. //
  113. // first try read/write... just in case the user goes into cryptui and changes something.
  114. //
  115. hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, hProv,
  116. CERT_STORE_NO_CRYPT_RELEASE_FLAG |
  117. CERT_STORE_OPEN_EXISTING_FLAG | dwFlags,
  118. pwszStoreName);
  119. if (!(hStore))
  120. {
  121. hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, hProv,
  122. CERT_STORE_NO_CRYPT_RELEASE_FLAG |
  123. CERT_STORE_READONLY_FLAG | dwFlags,
  124. pwszStoreName);
  125. }
  126. return(hStore);
  127. }