|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: demand.h
//
//--------------------------------------------------------------------------
/*
** 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 _MSC_VER > 1000
#pragma once
#endif
#ifndef __DEMAND_H
#define __DEMAND_H
#ifndef MAC
//
// IF YOU #INCLUDE A FILE HERE YOU PROBABLY ARE MAKING A MISTAKE.
// THIS FILE IS INCLUDED BY LOTS OF PEOPLE. THINK THRICE
// BEFORE #INCLUDING *ANYTHING* HERE. MAKE GOOD USE
// OF FORWARD REFS INSTEAD.
//
#ifdef IMPLEMENT_LOADER_FUNCTIONS
#define USE_CRITSEC
#define LOADER_FUNCTION(ret, name, args1, args2, err, dll) \
typedef ret (WINAPI * TYP_##name) args1; \ extern TYP_##name VAR_##name; \ ret WINAPI LOADER_##name args1 \ { \ if (!DemandLoad##dll()) return err; \ return VAR_##name args2; \ } \ TYP_##name VAR_##name = LOADER_##name;
#define LOADER_FUNCTION_VOID(ret, name, args1, args2, dll) \
typedef ret (WINAPI * TYP_##name) args1; \ extern TYP_##name VAR_##name; \ ret WINAPI LOADER_##name args1 \ { \ if (!DemandLoad##dll()) return; \ VAR_##name args2; \ return; \ } \ TYP_##name VAR_##name = LOADER_##name; #if 0
// my 1st attempt
#define DemandLoadDLL_GENERATOR(fnsuffix, dllname, handle, procaddrlist) \
BOOL DemandLoad##fnsuffix() \ { \ BOOL fRet = TRUE; \ \ Assert(fInit); \ EnterCriticalSection(&cs); \ \ if (0 == handle) \ { \ handle = LoadLibrary(#dllname); \ \ if (0 == handle) \ fRet = FALSE; \ else \ { \ procaddrlist \ } \ } \ \ LeaveCriticalSection(&cs); \ return fRet; \ } #endif
#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;
#if 0
#define DemandLoadDLL_GENERATOR(fnsuffix, dllname, handle, procaddrlist) \
BOOL DemandLoad##fnsuffix(void); #endif
#endif // IMPLEMENT_LOADER_FUNCTIONS
void InitDemandLoadedLibs(); void FreeDemandLoadedLibs();
/////////////////////////////////////
// CRYPT32.DLL
BOOL DemandLoadCrypt32(void);
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( BOOL, CertCloseStore, (HCERTSTORE hCertStore, DWORD dwFlags), (hCertStore, dwFlags), FALSE, Crypt32) #define CertCloseStore VAR_CertCloseStore
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, CertGetCertificateContextProperty, (PCCERT_CONTEXT pCertContext, DWORD dwPropId, void *pvData, DWORD *pcbData), (pCertContext, dwPropId, pvData, pcbData), FALSE, Crypt32) #define CertGetCertificateContextProperty VAR_CertGetCertificateContextProperty
LOADER_FUNCTION( BOOL, CertCompareCertificate, (DWORD dwCertEncodingType, PCERT_INFO pCertId1, PCERT_INFO pCertId2), (dwCertEncodingType, pCertId1, pCertId2), FALSE, Crypt32) #define CertCompareCertificate VAR_CertCompareCertificate
LOADER_FUNCTION( PCCERT_CONTEXT, CertEnumCertificatesInStore, (HCERTSTORE hCertStore, PCCERT_CONTEXT pPrevCertContext), (hCertStore, pPrevCertContext), NULL, Crypt32) #define CertEnumCertificatesInStore VAR_CertEnumCertificatesInStore
LOADER_FUNCTION( BOOL, CryptDecodeObject, (DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE * pbEncoded, DWORD cbEncoded, DWORD dwFlags, void * pvStructInfo, DWORD * pcbStructInfo), (dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo), FALSE, Crypt32) #define CryptDecodeObject VAR_CryptDecodeObject
LOADER_FUNCTION( PCERT_EXTENSION, CertFindExtension, (LPCSTR pszObjId, DWORD cExtensions, CERT_EXTENSION rgExtensions[]), (pszObjId, cExtensions, rgExtensions), NULL, Crypt32) #define CertFindExtension VAR_CertFindExtension
LOADER_FUNCTION( BOOL, CryptFormatObject, (DWORD dwCertEncodingType, DWORD dwFormatType, DWORD dwFormatStrType, void * pFormatStruct, LPCSTR lpszStructType, const BYTE * pbEncoded, DWORD cbEncoded, void * pbFormat, DWORD * pcbFormat), (dwCertEncodingType, dwFormatType, dwFormatStrType, pFormatStruct, lpszStructType, pbEncoded, cbEncoded, pbFormat, pcbFormat), FALSE, Crypt32) #define CryptFormatObject VAR_CryptFormatObject
LOADER_FUNCTION( DWORD, CertNameToStrW, (DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, DWORD dwStrType, LPWSTR psz, DWORD csz), (dwCertEncodingType, pName, dwStrType, psz, csz), 0, Crypt32) #define CertNameToStrW VAR_CertNameToStrW
LOADER_FUNCTION( DWORD, CertNameToStrA, (DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, DWORD dwStrType, LPSTR psz, DWORD csz), (dwCertEncodingType, pName, dwStrType, psz, csz), 0, Crypt32) #define CertNameToStrA VAR_CertNameToStrA
LOADER_FUNCTION( BOOL, CertStrToNameA, (DWORD dwCertEncodingType, LPCSTR pszX500, DWORD dwStrType, void *pvReserved, BYTE *pbEncoded, DWORD *pcbEncoded, LPCSTR *ppszError), (dwCertEncodingType, pszX500, dwStrType, pvReserved, pbEncoded, pcbEncoded, ppszError), FALSE, Crypt32) #define CertStrToNameA VAR_CertStrToNameA
LOADER_FUNCTION( DWORD, CertRDNValueToStrW, (DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, LPWSTR psz, DWORD csz), (dwValueType, pValue, psz, csz), 0, Crypt32) #define CertRDNValueToStrW VAR_CertRDNValueToStrW
LOADER_FUNCTION( PCERT_RDN_ATTR, CertFindRDNAttr, (LPCSTR pszObjId, PCERT_NAME_INFO pName), (pszObjId, pName), NULL, Crypt32) #define CertFindRDNAttr VAR_CertFindRDNAttr
LOADER_FUNCTION( BOOL, CryptRegisterOIDFunction, (DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID, LPCWSTR pwszDll, LPCSTR pszOverrideFuncName), (dwEncodingType, pszFuncName, pszOID, pwszDll, pszOverrideFuncName), FALSE, Crypt32) #define CryptRegisterOIDFunction VAR_CryptRegisterOIDFunction
LOADER_FUNCTION( BOOL, CryptUnregisterOIDFunction, (DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID), (dwEncodingType, pszFuncName, pszOID), FALSE, Crypt32) #define CryptUnregisterOIDFunction VAR_CryptUnregisterOIDFunction
LOADER_FUNCTION( BOOL, CertSetCertificateContextProperty, (PCCERT_CONTEXT pCertContext, DWORD dwPropId, DWORD dwFlags, const void * pvData), (pCertContext, dwPropId, dwFlags, pvData), FALSE, Crypt32) #define CertSetCertificateContextProperty VAR_CertSetCertificateContextProperty
LOADER_FUNCTION( BOOL, CertVerifyCTLUsage, (DWORD dwEncodingType, DWORD dwSubjectType, void *pvSubject, PCTL_USAGE pSubjectUsage, DWORD dwFlags, PCTL_VERIFY_USAGE_PARA pVerifyUsagePara, PCTL_VERIFY_USAGE_STATUS pVerifyUsageStatus), (dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus), 0, Crypt32) #define CertVerifyCTLUsage VAR_CertVerifyCTLUsage
LOADER_FUNCTION( PCCERT_CONTEXT, CertGetIssuerCertificateFromStore, (HCERTSTORE hCertStore, PCCERT_CONTEXT pSubjectContext, PCCERT_CONTEXT pPrevIssuerContext, DWORD *pdwFlags), (hCertStore, pSubjectContext, pPrevIssuerContext, pdwFlags), NULL, Crypt32) #define CertGetIssuerCertificateFromStore VAR_CertGetIssuerCertificateFromStore
LOADER_FUNCTION( BOOL, CertFreeCTLContext, (PCCTL_CONTEXT pCtlContext), (pCtlContext), FALSE, Crypt32) #define CertFreeCTLContext VAR_CertFreeCTLContext
LOADER_FUNCTION( BOOL, CertAddEncodedCTLToStore, (HCERTSTORE hCertStore, DWORD dwMsgAndCertEncodingType, const BYTE *pbCtlEncoded, DWORD cbCtlEncoded, DWORD dwAddDisposition, PCCTL_CONTEXT *ppCtlContext), (hCertStore, dwMsgAndCertEncodingType, pbCtlEncoded, cbCtlEncoded, dwAddDisposition, ppCtlContext), FALSE, Crypt32) #define CertAddEncodedCTLToStore VAR_CertAddEncodedCTLToStore
LOADER_FUNCTION( BOOL, CryptMsgEncodeAndSignCTL, (DWORD dwMsgEncodingType, PCTL_INFO pCtlInfo, PCMSG_SIGNED_ENCODE_INFO pSignInfo, DWORD dwFlags, BYTE *pbEncoded, DWORD *pcbEncoded), (dwMsgEncodingType, pCtlInfo, pSignInfo, dwFlags, pbEncoded, pcbEncoded), FALSE, Crypt32) #define CryptMsgEncodeAndSignCTL VAR_CryptMsgEncodeAndSignCTL
LOADER_FUNCTION( PCCTL_CONTEXT, CertFindCTLInStore, (HCERTSTORE hCertStore, DWORD dwMsgAndCertEncodingType, DWORD dwFindFlags, DWORD dwFindType, const void *pvFindPara, PCCTL_CONTEXT pPrevCtlContext), (hCertStore, dwMsgAndCertEncodingType, dwFindFlags, dwFindType, pvFindPara, pPrevCtlContext), NULL, Crypt32) #define CertFindCTLInStore VAR_CertFindCTLInStore
LOADER_FUNCTION( PCCTL_CONTEXT, CryptSignAndEncodeCertificate, (HCRYPTPROV hCryptProv, DWORD dwKeySpec, DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, const void *pvHashAuxInfo, PBYTE pbEncoded, DWORD *pcbEncoded), (hCryptProv, dwKeySpec, dwCertEncodingType, lpszStructType, pvStructInfo, pSignatureAlgorithm, pvHashAuxInfo, pbEncoded, pcbEncoded), NULL, Crypt32) #define CryptSignAndEncodeCertificate VAR_CryptSignAndEncodeCertificate
LOADER_FUNCTION( BOOL, CryptEncodeObject, (DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, BYTE *pbEncoded, DWORD *pcbEncoded), (dwCertEncodingType, lpszStructType, pvStructInfo, pbEncoded,pcbEncoded), FALSE, Crypt32) #define CryptEncodeObject VAR_CryptEncodeObject
LOADER_FUNCTION( BOOL, CryptExportPublicKeyInfo, (HCRYPTPROV hCryptProv, DWORD dwKeySpec, DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo, DWORD *pcbInfo), (hCryptProv, dwKeySpec, dwCertEncodingType, pInfo, pcbInfo), FALSE, Crypt32) #define CryptExportPublicKeyInfo VAR_CryptExportPublicKeyInfo
LOADER_FUNCTION( HCERTSTORE, CertDuplicateStore, (HCERTSTORE hCertStore), (hCertStore), NULL, Crypt32) #define CertDuplicateStore VAR_CertDuplicateStore
LOADER_FUNCTION( BOOL, CertAddEncodedCertificateToStore, (HCERTSTORE hCertStore, DWORD dwCertEncodingType, const BYTE *pbCertEncoded, DWORD cbCertEncoded, DWORD dwAddDisposition, PCCERT_CONTEXT *ppCertContext), (hCertStore, dwCertEncodingType, pbCertEncoded, cbCertEncoded, dwAddDisposition, ppCertContext), FALSE, Crypt32) #define CertAddEncodedCertificateToStore VAR_CertAddEncodedCertificateToStore
LOADER_FUNCTION( LONG, CertVerifyTimeValidity, (LPFILETIME pTimeToVerify, PCERT_INFO pCertInfo), (pTimeToVerify, pCertInfo), +1, Crypt32) // Return AFTER by default
#define CertVerifyTimeValidity VAR_CertVerifyTimeValidity
LOADER_FUNCTION( PCTL_ENTRY, CertFindSubjectInCTL, (DWORD dwEncodingType, DWORD dwSubjectType, void *pvSubject, PCCTL_CONTEXT pCtlContext, DWORD dwFlags), (dwEncodingType, dwSubjectType, pvSubject, pCtlContext, dwFlags), NULL, Crypt32) #define CertFindSubjectInCTL VAR_CertFindSubjectInCTL
LOADER_FUNCTION( BOOL, CertVerifySubjectCertificateContext, (PCCERT_CONTEXT pSubject, PCCERT_CONTEXT pIssuer, DWORD *pdwFlags), (pSubject, pIssuer, pdwFlags), FALSE, Crypt32) #define CertVerifySubjectCertificateContext VAR_CertVerifySubjectCertificateContext
LOADER_FUNCTION( BOOL, CertGetEnhancedKeyUsage, (PCCERT_CONTEXT pCertContext, DWORD dwFlags, PCERT_ENHKEY_USAGE pUsage, DWORD *pcbUsage), (pCertContext, dwFlags, pUsage, pcbUsage), FALSE, Crypt32) #define CertGetEnhancedKeyUsage VAR_CertGetEnhancedKeyUsage
#if 0
LOADER_FUNCTION( BOOL, , (), (), FALSE, Crypt32) #define X VAR_
#endif // 0
/////////////////////////////////////
// ADVAPI32.DLL
#ifndef ALGIDDEF
#define ALGIDDEF
typedef unsigned int ALG_ID; #endif
BOOL DemandLoadAdvApi32(void);
LOADER_FUNCTION( BOOL, CryptAcquireContextW, (HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags), (phProv, pszContainer, pszProvider, dwProvType, dwFlags), FALSE, AdvApi32) #define CryptAcquireContextW VAR_CryptAcquireContextW
#if 0
LOADER_FUNCTION( BOOL, CryptGetProvParam, (HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags), (hProv, dwParam, pbData, pdwDataLen, dwFlags), FALSE, AdvApi32) #define CryptGetProvParam VAR_CryptGetProvParam
LOADER_FUNCTION( BOOL, CryptReleaseContext, (HCRYPTPROV hProv, DWORD dwFlags), (hProv, dwFlags), FALSE, AdvApi32) #define CryptReleaseContext VAR_CryptReleaseContext
LOADER_FUNCTION( BOOL, CryptGenKey, (HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey), (hProv, Algid, dwFlags, phKey), FALSE, AdvApi32) #define CryptGenKey VAR_CryptGenKey
LOADER_FUNCTION( BOOL, CryptDestroyKey, (HCRYPTKEY hKey), (hKey), FALSE, AdvApi32) #define CryptDestroyKey VAR_CryptDestroyKey
#endif // 0
#ifndef WIN16
/////////////////////////////////////
// USER32.DLL
BOOL DemandLoadUser32();
LOADER_FUNCTION( LRESULT, SendDlgItemMessageW, (HWND hwnd, int idCtl, UINT msg, WPARAM wparam, LPARAM lparam), (hwnd, idCtl, msg, wparam, lparam), -1, User32) #define SendDlgItemMessageW VAR_SendDlgItemMessageW
LOADER_FUNCTION( BOOL, SetDlgItemTextW, (HWND hwnd, int idCtl, LPCWSTR psz), (hwnd, idCtl, psz), FALSE, User32) #define SetDlgItemTextW VAR_SetDlgItemTextW
LOADER_FUNCTION( UINT, GetDlgItemTextW, (HWND hwnd, int idCtl, LPWSTR psz, int nMax), (hwnd, idCtl, psz, nMax), FALSE, User32) #define GetDlgItemTextW VAR_GetDlgItemTextW
LOADER_FUNCTION( int, LoadStringW, (HINSTANCE hinst, UINT idStr, LPWSTR rgwch, int cwch), (hinst, idStr, rgwch, cwch), 0, User32) #define LoadStringW VAR_LoadStringW
LOADER_FUNCTION( DWORD, FormatMessageW, (DWORD dwFlags, LPCVOID pbSource, DWORD dwMessageId, DWORD dwLangId, LPWSTR lpBuffer, DWORD nSize, va_list * args), (dwFlags, pbSource, dwMessageId, dwLangId, lpBuffer, nSize, args), 0, User32) #define FormatMessageW VAR_FormatMessageW
LOADER_FUNCTION( BOOL, WinHelpW, (HWND hWndMain, LPCWSTR szHelp, UINT uCommand, ULONG_PTR dwData), (hWndMain, szHelp, uCommand, dwData), FALSE, User32) #define WinHelpW VAR_WinHelpW
#endif // !WIN16
#else // MAC
#define SendDlgItemMessageW MySendDlgItemMessageW
#define SetDlgItemTextW MySetDlgItemTextW
#define GetDlgItemTextW MyGetDlgItemTextW
#define LoadStringW MyLoadStringW
#define FormatMessageW MyFormatMessageW
#define WinHelpW MyWinHelpW
#define SendMessageW SendMessageA
#undef CertOpenStore
EXTERN_C WINCRYPT32API HCERTSTORE WINAPI MacCertOpenStore(LPCSTR lpszStoreProvider, DWORD dwEncodingType, HCRYPTPROV hCryptProv, DWORD dwFlags, const void *pvPara); #define CertOpenStore MacCertOpenStore
#endif // !MAC
#endif // include once
|