Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

460 lines
17 KiB

//+-------------------------------------------------------------------------
//
// 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