/* ** d e m a n d . h ** ** Purpose: create an intelligent method of defer loading functions ** ** Creators: jimsch, brimo, t-erikne ** Created: 5/15/97 ** ** Copyright (C) Microsoft Corp. 1997 */ #if !defined(__DEMAND_H) || defined(IMPLEMENT_LOADER_FUNCTIONS) #ifndef __DEMAND_H #define __DEMAND_H #endif #ifdef IMPLEMENT_LOADER_FUNCTIONS #define USE_CRITSEC #undef LOADER_FUNCTION #define LOADER_FUNCTION(ret, name, args1, args2, err, dll) \ typedef ret (WINAPI * TYP_##name) args1; \ extern TYP_##name VAR_##name; \ ret LOADER_##name args1 \ { \ DemandLoad##dll(); \ if (VAR_##name == LOADER_##name) return err; \ return VAR_##name args2; \ } \ TYP_##name VAR_##name = LOADER_##name; #undef LOADER_FUNCTION_VOID #define LOADER_FUNCTION_VOID(ret, name, args1, args2, dll) \ typedef ret (WINAPI * TYP_##name) args1; \ extern TYP_##name VAR_##name; \ ret LOADER_##name args1 \ { \ DemandLoad##dll(); \ if (VAR_##name == LOADER_##name) return; \ VAR_##name args2; \ return; \ } \ TYP_##name VAR_##name = LOADER_##name; #else // !IMPLEMENT_LOADER_FUNCTIONS #define LOADER_FUNCTION(ret, name, args1, args2, err, dll) \ typedef ret (WINAPI * TYP_##name) args1; \ extern TYP_##name VAR_##name; #define LOADER_FUNCTION_VOID(ret, name, args1, args2, dll) \ typedef ret (WINAPI * TYP_##name) args1; \ extern TYP_##name VAR_##name; #endif // IMPLEMENT_LOADER_FUNCTIONS void InitDemandLoadedLibs(); void FreeDemandLoadedLibs(); ///////////////////////////////////// // CRYPT32.DLL BOOL DemandLoadCrypt32(void); typedef void *HCERTSTORE; typedef const struct _CERT_CONTEXT *PCCERT_CONTEXT; typedef ULONG_PTR HCRYPTPROV; typedef struct _CERT_INFO *PCERT_INFO; LOADER_FUNCTION( BOOL, CertFreeCertificateContext, (PCCERT_CONTEXT pCertContext), (pCertContext), FALSE, Crypt32) #define CertFreeCertificateContext VAR_CertFreeCertificateContext LOADER_FUNCTION( PCCERT_CONTEXT, CertDuplicateCertificateContext, (PCCERT_CONTEXT pCertContext), (pCertContext), NULL, Crypt32) #define CertDuplicateCertificateContext VAR_CertDuplicateCertificateContext LOADER_FUNCTION( PCCERT_CONTEXT, CertFindCertificateInStore, (HCERTSTORE hCertStore, DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType, const void *pvFindPara, PCCERT_CONTEXT pPrevCertContext), (hCertStore, dwCertEncodingType, dwFindFlags, dwFindType, pvFindPara, pPrevCertContext), NULL, Crypt32) #define CertFindCertificateInStore VAR_CertFindCertificateInStore LOADER_FUNCTION( LONG, CertVerifyTimeValidity, (LPFILETIME pTimeToVerify, PCERT_INFO pCertInfo), (pTimeToVerify, pCertInfo), 1, Crypt32) #define CertVerifyTimeValidity VAR_CertVerifyTimeValidity LOADER_FUNCTION( BOOL, CertCloseStore, (HCERTSTORE hCertStore, DWORD dwFlags), (hCertStore, dwFlags), FALSE, Crypt32) #define CertOpenSystemStoreA VAR_CertOpenSystemStoreA LOADER_FUNCTION( HCERTSTORE, CertOpenSystemStoreA, (HCRYPTPROV hProv, LPCSTR szSubsystemProtocol), (hProv, szSubsystemProtocol), NULL, Crypt32) #define CertCloseStore VAR_CertCloseStore LOADER_FUNCTION( BOOL, CertGetCertificateContextProperty, (PCCERT_CONTEXT pCertContext, DWORD dwPropId, void *pvData, DWORD *pcbData), (pCertContext, dwPropId, pvData, pcbData), FALSE, Crypt32) #define CertGetCertificateContextProperty VAR_CertGetCertificateContextProperty LOADER_FUNCTION( HCERTSTORE, CertOpenStore, (LPCSTR lpszStoreProvider, DWORD dwEncodingType, HCRYPTPROV hCryptProv, DWORD dwFlags, const void *pvPara), (lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara), NULL, Crypt32) #define CertOpenStore VAR_CertOpenStore LOADER_FUNCTION( BOOL, CertCompareCertificate, (DWORD dwCertEncodingType, PCERT_INFO pCertId1, PCERT_INFO pCertId2), (dwCertEncodingType, pCertId1, pCertId2), FALSE, Crypt32) #define CertCompareCertificate VAR_CertCompareCertificate ///////////////////////////////////// // ADVAPI32.DLL #ifndef ALGIDDEF #define ALGIDDEF typedef unsigned int ALG_ID; #endif typedef ULONG_PTR HCRYPTKEY; BOOL DemandLoadAdvApi32(void); LOADER_FUNCTION( BOOL, CryptAcquireContextA, (HCRYPTPROV *phProv, LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags), (phProv, pszContainer, pszProvider, dwProvType, dwFlags), FALSE, AdvApi32) #define CryptAcquireContextA VAR_CryptAcquireContextA LOADER_FUNCTION( BOOL, CryptAcquireContextW, (HCRYPTPROV *phProv, LPCTSTR pszContainer, LPCTSTR pszProvider, DWORD dwProvType, DWORD dwFlags), (phProv, pszContainer, pszProvider, dwProvType, dwFlags), FALSE, AdvApi32) #define CryptAcquireContextW VAR_CryptAcquireContextW LOADER_FUNCTION( BOOL, CryptReleaseContext, (HCRYPTPROV hProv, DWORD dwFlags), (hProv, dwFlags), FALSE, AdvApi32) #define CryptReleaseContext VAR_CryptReleaseContext LOADER_FUNCTION( BOOL, CryptMsgClose, (HCRYPTMSG hCryptMsg), (hCryptMsg), FALSE, Crypt32) #define CryptMsgClose VAR_CryptMsgClose LOADER_FUNCTION( BOOL, CryptDecodeObjectEx, (DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE * pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, void * pvStructInfo, DWORD * pcbStructInfo), (dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo), FALSE, Crypt32) #define CryptDecodeObjectEx VAR_CryptDecodeObjectEx LOADER_FUNCTION( BOOL, CryptMsgGetParam, (HCRYPTMSG hCryptMsg, DWORD dwParamType, DWORD dwIndex, void *pvData, DWORD *pcbData), (hCryptMsg, dwParamType, dwIndex, pvData, pcbData), FALSE, Crypt32) #define CryptMsgGetParam VAR_CryptMsgGetParam LOADER_FUNCTION( BOOL, CryptMsgUpdate, (HCRYPTMSG hCryptMsg, const BYTE *pbData, DWORD cbData, BOOL fFinal), (hCryptMsg, pbData, cbData, fFinal), FALSE, Crypt32) #define CryptMsgUpdate VAR_CryptMsgUpdate LOADER_FUNCTION( HCRYPTMSG, CryptMsgOpenToDecode, (DWORD dwMsgEncodingType, DWORD dwFlags, DWORD dwMsgType, HCRYPTPROV hCryptProv, PCERT_INFO pRecipientInfo, PCMSG_STREAM_INFO pStreamInfo), (dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo), NULL, Crypt32) #define CryptMsgOpenToDecode VAR_CryptMsgOpenToDecode LOADER_FUNCTION( BOOL, CertAddCertificateContextToStore, (HCERTSTORE hCertStore, PCCERT_CONTEXT pCertContext, DWORD dwAddDisposition, PCCERT_CONTEXT *ppStoreContext), (hCertStore, pCertContext, dwAddDisposition, ppStoreContext), FALSE, Crypt32) #define CertAddCertificateContextToStore VAR_CertAddCertificateContextToStore ///////////////////////////////////// // PSTOREC.DLL #ifndef __IEnumPStoreProviders_FWD_DEFINED__ #define __IEnumPStoreProviders_FWD_DEFINED__ typedef interface IEnumPStoreProviders IEnumPStoreProviders; #endif /* __IEnumPStoreProviders_FWD_DEFINED__ */ #ifndef __IPStore_FWD_DEFINED__ #define __IPStore_FWD_DEFINED__ typedef interface IPStore IPStore; #endif /* __IPStore_FWD_DEFINED__ */ typedef GUID PST_PROVIDERID; BOOL DemandLoadPStoreC(); LOADER_FUNCTION( HRESULT, PStoreCreateInstance, (IPStore __RPC_FAR *__RPC_FAR *ppProvider, PST_PROVIDERID __RPC_FAR *pProviderID, void __RPC_FAR *pReserved, DWORD dwFlags), (ppProvider, pProviderID, pReserved, dwFlags), E_FAIL, PStoreC) #define PStoreCreateInstance VAR_PStoreCreateInstance LOADER_FUNCTION( HRESULT, PStoreEnumProviders, (DWORD dwFlags, IEnumPStoreProviders __RPC_FAR *__RPC_FAR *ppenum), (dwFlags, ppenum), E_FAIL, PStoreC) #define PStoreEnumProviders VAR_PStoreEnumProviders ///////////////////////////////////// // CRYPTDLG.DLL BOOL DemandLoadCryptDlg(); LOADER_FUNCTION( DWORD, GetFriendlyNameOfCertA, (PCCERT_CONTEXT pccert, LPSTR pchBuffer, DWORD cchBuffer), (pccert, pchBuffer, cchBuffer), 0, CryptDlg) #define GetFriendlyNameOfCertA VAR_GetFriendlyNameOfCertA LOADER_FUNCTION( BOOL, CertViewPropertiesA, (PCERT_VIEWPROPERTIES_STRUCT_A pCertViewInfo), (pCertViewInfo), FALSE, CryptDlg) #define CertViewPropertiesA VAR_CertViewPropertiesA ///////////////////////////////////// // WINTRUST.DLL BOOL DemandLoadWinTrust(); LOADER_FUNCTION( LONG, WinVerifyTrust, (HWND hwnd, GUID *ActionID, LPVOID ActionData), (hwnd, ActionID, ActionData), 0, WinTrust) #define WinVerifyTrust VAR_WinVerifyTrust ///////////////////////////////////// // VERSION.DLL BOOL DemandLoadVersion(void); LOADER_FUNCTION( DWORD, GetFileVersionInfoSizeA, (LPSTR lptstrFileName, LPDWORD lpdwHandle), (lptstrFileName, lpdwHandle), 0, Version) #define GetFileVersionInfoSizeA VAR_GetFileVersionInfoSizeA LOADER_FUNCTION( BOOL, GetFileVersionInfoA, (LPSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData), (lptstrFilename, dwHandle, dwLen, lpData), FALSE, Version) #define GetFileVersionInfoA VAR_GetFileVersionInfoA LOADER_FUNCTION( BOOL, VerQueryValueA, (const LPVOID pBlock, LPSTR lpSubBlock, LPVOID * lplpBuffer, PUINT puLen), (pBlock, lpSubBlock, lplpBuffer, puLen), FALSE, Version) #define VerQueryValueA VAR_VerQueryValueA LOADER_FUNCTION( DWORD, GetFileVersionInfoSizeW, (LPTSTR lptstrFileName, LPDWORD lpdwHandle), (lptstrFileName, lpdwHandle), 0, Version) #define GetFileVersionInfoSizeW VAR_GetFileVersionInfoSizeW LOADER_FUNCTION( BOOL, GetFileVersionInfoW, (LPTSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData), (lptstrFilename, dwHandle, dwLen, lpData), FALSE, Version) #define GetFileVersionInfoW VAR_GetFileVersionInfoW LOADER_FUNCTION( BOOL, VerQueryValueW, (const LPVOID pBlock, LPTSTR lpSubBlock, LPVOID * lplpBuffer, PUINT puLen), (pBlock, lpSubBlock, lplpBuffer, puLen), FALSE, Version) #define VerQueryValueW VAR_VerQueryValueW ///////////////////////////////////// // URLMON.DLL BOOL DemandLoadURLMON(); LOADER_FUNCTION( HRESULT, ObtainUserAgentString, (DWORD dwOption, LPSTR pszUAOut, DWORD* cbSize), (dwOption, pszUAOut, cbSize), E_FAIL, URLMON) #define ObtainUserAgentString VAR_ObtainUserAgentString // IMM32.DLL BOOL DemandLoadImm32(void); LOADER_FUNCTION(HIMC, ImmAssociateContext, (HWND hWnd, HIMC hIMC), (hWnd, hIMC), 0, Imm32) #define ImmAssociateContext VAR_ImmAssociateContext LOADER_FUNCTION(HIMC, ImmGetContext, (HWND hWnd), (hWnd), 0, Imm32) #define ImmGetContext VAR_ImmGetContext LOADER_FUNCTION(LONG, ImmGetCompositionStringW, (HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen), (hIMC, dwIndex, lpBuf, dwBufLen), 0, Imm32) #define ImmGetCompositionStringW VAR_ImmGetCompositionStringW LOADER_FUNCTION(BOOL, ImmReleaseContext, (HWND hWnd, HIMC hIMC), (hWnd, hIMC), 0, Imm32) #define ImmReleaseContext VAR_ImmReleaseContext // Wininet.DLL BOOL DemandLoadWininet(void); LOADER_FUNCTION(BOOL, InternetCanonicalizeUrlW, (LPCWSTR lpszUrl, LPWSTR lpszBuffer, LPDWORD lpdwBufferLength, DWORD dwFlags), (lpszUrl, lpszBuffer, lpdwBufferLength, dwFlags), FALSE, Wininet) #define InternetCanonicalizeUrlW VAR_InternetCanonicalizeUrlW LOADER_FUNCTION(BOOL, InternetGetConnectedState, (LPDWORD lpdwFlags, DWORD dwReserved), (lpdwFlags, dwReserved), FALSE, Wininet) #define InternetGetConnectedState VAR_InternetGetConnectedState /////////////////////////////////////////////////////////////////////////////// // SHLWAPI.DLL HINSTANCE DemandLoadShlwapi(); /////////////////////////////////////////////////////////////////////////////// // Plus UI wrapper functions for WinHelp and HtmlHelp functions. If 5.0 (IE5) // version of Shlwapi.dll is available then its version of the functions are // used. Default is to system versions. If runnint WinNT5.0 or greater then // cross codepage is used. // // Implementation of these functions are in the entry.c file /////////////////////////////////////////////////////////////////////////////// BOOL WinHelpWrap(HWND hWndCaller, LPCTSTR pwszHelpFile, UINT uCommand, DWORD_PTR dwData); #define WABWinHelp WinHelpWrap HWND HtmlHelpWrap(HWND hWndCaller, LPCTSTR pwszHelpFile, UINT uCommand, DWORD_PTR dwData); #define WABHtmlHelp HtmlHelpWrap #endif // include once