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.

369 lines
11 KiB

  1. /*
  2. ** d e m a n d . c p p
  3. **
  4. ** Purpose: implement the loader functions for defer/demand -loaded libraries
  5. **
  6. ** Creators: jimsch, brimo, t-erikne
  7. ** Created: 5/15/97
  8. **
  9. ** Copyright (C) Microsoft Corp. 1997
  10. */
  11. #include <pch.hxx>
  12. // W4 stuff
  13. #pragma warning(disable: 4201) // nameless struct/union
  14. #pragma warning(disable: 4514) // unreferenced inline function removed
  15. #define IMPLEMENT_LOADER_FUNCTIONS
  16. #include "demand.h"
  17. #ifndef MAC
  18. ////////////////////////////////////////////////////////////////////////////
  19. //
  20. // Macros
  21. #define CRIT_GET_PROC_ADDR(h, fn, temp) \
  22. temp = (TYP_##fn) GetProcAddress(h, #fn); \
  23. if (temp) \
  24. VAR_##fn = temp; \
  25. else \
  26. { \
  27. AssertSz(VAR_##fn" failed to load"); \
  28. goto error; \
  29. }
  30. #define RESET(fn) \
  31. VAR_##fn = LOADER_##fn;
  32. #define GET_PROC_ADDR(h, fn) \
  33. VAR_##fn = (TYP_##fn) GetProcAddress(h, #fn); \
  34. if(NULL == VAR_##fn ) { \
  35. VAR_##fn = LOADER_##fn; \
  36. }
  37. #define GET_PROC_ADDR3(h, fn, varname) \
  38. VAR_##varname = (TYP_##varname) GetProcAddress(h, #fn); \
  39. // Assert(VAR_##varname != NULL);
  40. ////////////////////////////////////////////////////////////////////////////
  41. //
  42. // Variables
  43. static HMODULE s_hCrypt = 0;
  44. static HMODULE s_hAdvApi = 0;
  45. static HMODULE s_hShell32 = 0;
  46. static HMODULE s_hCryptUI = 0;
  47. #if 0 // JLS
  48. static HMODULE s_hShLWAPI = 0;
  49. static HMODULE s_hURLMon = 0;
  50. static HMODULE s_hVersion = 0;
  51. static HMODULE s_hWinINET = 0;
  52. static HMODULE s_hComctl32 = 0;
  53. static HMODULE s_hPstoreC = 0;
  54. static HMODULE s_hMAPI = 0;
  55. static HMODULE s_hWSOCK = 0;
  56. static HMODULE s_hOLEAUT = 0;
  57. static HMODULE s_hKernel = 0;
  58. #endif // 0 // JLS
  59. #ifdef USE_CRITSEC
  60. static CRITICAL_SECTION cs = {0};
  61. #endif
  62. #ifdef DEBUG
  63. static BOOL s_fInit = FALSE;
  64. #endif
  65. ////////////////////////////////////////////////////////////////////////////
  66. //
  67. // Management functions
  68. void InitDemandLoadedLibs()
  69. {
  70. #ifdef USE_CRITSEC
  71. InitializeCriticalSection(&cs);
  72. #endif
  73. #ifdef DEBUG
  74. s_fInit = TRUE;
  75. #endif
  76. }
  77. void FreeDemandLoadedLibs()
  78. {
  79. #ifdef USE_CRITSEC
  80. EnterCriticalSection(&cs);
  81. #endif
  82. if (s_hCrypt)
  83. FreeLibrary(s_hCrypt);
  84. if (s_hAdvApi)
  85. FreeLibrary(s_hAdvApi);
  86. if (s_hShell32)
  87. FreeLibrary(s_hShell32);
  88. if (s_hCryptUI)
  89. FreeLibrary(s_hCryptUI);
  90. #if 0 //JLS
  91. if (s_hShLWAPI)
  92. FreeLibrary(s_hShLWAPI);
  93. if (s_hURLMon)
  94. FreeLibrary(s_hURLMon);
  95. if (s_hOLEAUT)
  96. FreeLibrary(s_hOLEAUT);
  97. if (s_hMAPI)
  98. FreeLibrary(s_hMAPI);
  99. if (s_hWSOCK)
  100. FreeLibrary(s_hWSOCK);
  101. if (s_hPstoreC)
  102. FreeLibrary(s_hPstoreC);
  103. if (s_hKernel)
  104. FreeLibrary(s_hKernel);
  105. #endif // JLS
  106. #ifdef DEBUG
  107. s_fInit = FALSE;
  108. #endif
  109. #ifdef USE_CRITSEC
  110. LeaveCriticalSection(&cs);
  111. DeleteCriticalSection(&cs);
  112. #endif
  113. }
  114. #if 0 // JLS
  115. ////////////////////////////////////////////////////////////////////////////
  116. //
  117. // Loader functions
  118. /* sample loader with critical proc addrs
  119. ** but not thread-safe
  120. BOOL DemandLoadFoo()
  121. {
  122. FARPROC fp;
  123. if (0 == g_hFoo)
  124. {
  125. g_hFoo = LoadLibrary("FOO.DLL");
  126. if (0 == g_hFoo)
  127. return FALSE;
  128. CRIT_GET_PROC_ADDR(NeededFunction1, fp);
  129. CRIT_GET_PROC_ADDR(NeededFunction2, fp);
  130. GET_PROC_ADDR(OptionalFunction);
  131. }
  132. return TRUE;
  133. error:
  134. FreeLibrary(g_hFoo);
  135. g_hFoo = NULL;
  136. RESET(NeededFunction1)
  137. RESET(NeededFunction2)
  138. RESET(OptionalFunction)
  139. return FALSE;
  140. }
  141. */
  142. #endif // 0
  143. BOOL DemandLoadCrypt32()
  144. {
  145. BOOL fRet = TRUE;
  146. // Assert(s_fInit);
  147. #ifdef USE_CRITSEC
  148. EnterCriticalSection(&cs);
  149. #endif
  150. if (0 == s_hCrypt) {
  151. s_hCrypt = LoadLibraryA("CRYPT32.DLL");
  152. // AssertSz((BOOL)s_hCrypt, TEXT("LoadLibrary failed on CRYPT32.DLL"));
  153. if (0 == s_hCrypt)
  154. fRet = FALSE;
  155. else {
  156. GET_PROC_ADDR(s_hCrypt, CertFreeCertificateContext)
  157. GET_PROC_ADDR(s_hCrypt, CertDuplicateCertificateContext)
  158. GET_PROC_ADDR(s_hCrypt, CertFindCertificateInStore)
  159. GET_PROC_ADDR(s_hCrypt, CertCloseStore)
  160. GET_PROC_ADDR(s_hCrypt, CertGetCertificateContextProperty)
  161. GET_PROC_ADDR(s_hCrypt, CertOpenStore)
  162. GET_PROC_ADDR(s_hCrypt, CertGetCertificateContextProperty)
  163. GET_PROC_ADDR(s_hCrypt, CertCompareCertificate)
  164. GET_PROC_ADDR(s_hCrypt, CertEnumCertificatesInStore)
  165. GET_PROC_ADDR(s_hCrypt, CryptDecodeObject)
  166. GET_PROC_ADDR(s_hCrypt, CryptDecodeObjectEx)
  167. GET_PROC_ADDR(s_hCrypt, CertFindExtension)
  168. GET_PROC_ADDR(s_hCrypt, CryptFormatObject)
  169. GET_PROC_ADDR(s_hCrypt, CertNameToStrW)
  170. GET_PROC_ADDR(s_hCrypt, CertStrToNameA)
  171. GET_PROC_ADDR(s_hCrypt, CertRDNValueToStrW)
  172. GET_PROC_ADDR(s_hCrypt, CertFindRDNAttr)
  173. GET_PROC_ADDR(s_hCrypt, CryptRegisterOIDFunction)
  174. GET_PROC_ADDR(s_hCrypt, CryptUnregisterOIDFunction)
  175. GET_PROC_ADDR(s_hCrypt, CertSetCertificateContextProperty)
  176. GET_PROC_ADDR(s_hCrypt, CertVerifyCTLUsage)
  177. GET_PROC_ADDR(s_hCrypt, CertGetIssuerCertificateFromStore)
  178. GET_PROC_ADDR(s_hCrypt, CertFreeCTLContext)
  179. GET_PROC_ADDR(s_hCrypt, CertAddEncodedCTLToStore)
  180. GET_PROC_ADDR(s_hCrypt, CryptMsgEncodeAndSignCTL)
  181. GET_PROC_ADDR(s_hCrypt, CertFindCTLInStore)
  182. GET_PROC_ADDR(s_hCrypt, CryptSignAndEncodeCertificate)
  183. GET_PROC_ADDR(s_hCrypt, CryptEncodeObject)
  184. GET_PROC_ADDR(s_hCrypt, CryptEncodeObjectEx)
  185. GET_PROC_ADDR(s_hCrypt, CryptExportPublicKeyInfo)
  186. GET_PROC_ADDR(s_hCrypt, CertDuplicateStore)
  187. GET_PROC_ADDR(s_hCrypt, CertAddEncodedCertificateToStore);
  188. GET_PROC_ADDR(s_hCrypt, CertVerifyTimeValidity);
  189. GET_PROC_ADDR(s_hCrypt, CertFindSubjectInCTL);
  190. GET_PROC_ADDR(s_hCrypt, CertVerifySubjectCertificateContext);
  191. GET_PROC_ADDR(s_hCrypt, CertGetEnhancedKeyUsage);
  192. GET_PROC_ADDR(s_hCrypt, CryptInstallDefaultContext);
  193. GET_PROC_ADDR(s_hCrypt, CryptUninstallDefaultContext);
  194. GET_PROC_ADDR(s_hCrypt, CertDeleteCertificateFromStore);
  195. GET_PROC_ADDR(s_hCrypt, CertGetSubjectCertificateFromStore);
  196. GET_PROC_ADDR(s_hCrypt, CertGetCertificateChain);
  197. GET_PROC_ADDR(s_hCrypt, CertDuplicateCertificateChain);
  198. GET_PROC_ADDR(s_hCrypt, CertFreeCertificateChain);
  199. GET_PROC_ADDR(s_hCrypt, CertAddStoreToCollection);
  200. GET_PROC_ADDR(s_hCrypt, CertAddCertificateContextToStore);
  201. GET_PROC_ADDR(s_hCrypt, CertControlStore);
  202. }
  203. }
  204. #ifdef USE_CRITSEC
  205. LeaveCriticalSection(&cs);
  206. #endif
  207. return fRet;
  208. }
  209. BOOL DemandLoadCryptUI()
  210. {
  211. static BOOL fRet = FALSE;
  212. static BOOL fAttempt = FALSE;
  213. // Assert(s_fInit);
  214. #ifdef USE_CRITSEC
  215. EnterCriticalSection(&cs);
  216. #endif
  217. if (0 == s_hCryptUI && ! fAttempt) {
  218. s_hCryptUI = LoadLibraryA("CRYPTUI.DLL");
  219. // AssertSz((BOOL)s_hCryptUI, TEXT("LoadLibrary failed on CRYPTUI.DLL"));
  220. fAttempt = TRUE;
  221. if (s_hCryptUI) {
  222. fRet = TRUE;
  223. GET_PROC_ADDR(s_hCryptUI, CryptUIDlgViewCertificateW)
  224. GET_PROC_ADDR(s_hCryptUI, CryptUIDlgViewCertificateA)
  225. GET_PROC_ADDR(s_hCryptUI, CryptUIDlgViewCertificatePropertiesW)
  226. GET_PROC_ADDR(s_hCryptUI, CryptUIDlgViewCertificatePropertiesA)
  227. GET_PROC_ADDR(s_hCryptUI, CryptUIDlgSelectCertificateW)
  228. GET_PROC_ADDR(s_hCryptUI, CryptUIDlgSelectCertificateA)
  229. #ifdef OLD_STUFF
  230. GET_PROC_ADDR(s_hCryptUI, CryptUIDlgCertMgr)
  231. #endif // OLD_STUFF
  232. }
  233. }
  234. #ifdef USE_CRITSEC
  235. LeaveCriticalSection(&cs);
  236. #endif
  237. return fRet;
  238. }
  239. BOOL CryptUIAvailable(void) {
  240. return(DemandLoadCryptUI());
  241. }
  242. BOOL DemandLoadAdvApi32()
  243. {
  244. BOOL fRet = TRUE;
  245. // Assert(s_fInit);
  246. #ifdef USE_CRITSEC
  247. EnterCriticalSection(&cs);
  248. #endif
  249. if (0 == s_hAdvApi) {
  250. s_hAdvApi = LoadLibraryA("ADVAPI32.DLL");
  251. // AssertSz((BOOL)s_hAdvApi, TEXT("LoadLibrary failed on ADVAPI32.DLL"));
  252. if (0 == s_hAdvApi)
  253. fRet = FALSE;
  254. else {
  255. if (FIsWin95) {
  256. VAR_CryptAcquireContextW = MyCryptAcquireContextW;
  257. }
  258. else {
  259. GET_PROC_ADDR(s_hAdvApi, CryptAcquireContextW);
  260. }
  261. #if 0
  262. GET_PROC_ADDR(s_hAdvApi, CryptGetProvParam)
  263. GET_PROC_ADDR(s_hAdvApi, CryptReleaseContext)
  264. GET_PROC_ADDR(s_hAdvApi, CryptGenKey)
  265. GET_PROC_ADDR(s_hAdvApi, CryptDestroyKey)
  266. #endif // 0
  267. }
  268. }
  269. #ifdef USE_CRITSEC
  270. LeaveCriticalSection(&cs);
  271. #endif
  272. return fRet;
  273. }
  274. #ifndef WIN16
  275. BOOL DemandLoadUser32()
  276. {
  277. BOOL fRet = TRUE;
  278. // Assert(s_fInit);
  279. #ifdef USE_CRITSEC
  280. EnterCriticalSection(&cs);
  281. #endif
  282. #undef SendDlgitemMessageW
  283. #undef SetDlgItemTextW
  284. #undef GetDlgItemTextW
  285. #undef LoadStringW
  286. #undef FormatMessageW
  287. if (0 == s_hShell32) {
  288. if (FIsWin95) {
  289. VAR_SendDlgItemMessageW = MySendDlgItemMessageW;
  290. VAR_SetDlgItemTextW = MySetDlgItemTextW;
  291. VAR_GetDlgItemTextW = MyGetDlgItemTextW;
  292. VAR_LoadStringW = MyLoadStringW;
  293. VAR_FormatMessageW = MyFormatMessageW;
  294. VAR_WinHelpW = MyWinHelpW;
  295. }
  296. else {
  297. s_hShell32 = LoadLibraryA("kernel32.dll");
  298. GET_PROC_ADDR(s_hShell32, FormatMessageW);
  299. FreeLibrary(s_hShell32);
  300. s_hShell32 = LoadLibraryA("USER32.DLL");
  301. GET_PROC_ADDR(s_hShell32, SendDlgItemMessageW);
  302. GET_PROC_ADDR(s_hShell32, SetDlgItemTextW);
  303. GET_PROC_ADDR(s_hShell32, GetDlgItemTextW);
  304. GET_PROC_ADDR(s_hShell32, LoadStringW);
  305. GET_PROC_ADDR(s_hShell32, WinHelpW);
  306. }
  307. }
  308. #ifdef USE_CRITSEC
  309. LeaveCriticalSection(&cs);
  310. #endif
  311. return fRet;
  312. }
  313. #endif // !WIN16
  314. #endif // !MAC