316 lines
8.7 KiB
C++
316 lines
8.7 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
||
|
//
|
||
|
// File: demand.cpp
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
/*
|
||
|
** d e m a n d . c p p
|
||
|
**
|
||
|
** Purpose: implement the loader functions for defer/demand -loaded libraries
|
||
|
**
|
||
|
** Creators: jimsch, brimo, t-erikne
|
||
|
** Created: 5/15/97
|
||
|
**
|
||
|
** Copyright (C) Microsoft Corp. 1997
|
||
|
*/
|
||
|
|
||
|
#include "global.hxx"
|
||
|
#include <dbgdef.h>
|
||
|
|
||
|
// W4 stuff
|
||
|
#pragma warning(disable: 4201) // nameless struct/union
|
||
|
#pragma warning(disable: 4514) // unreferenced inline function removed
|
||
|
|
||
|
#define IMPLEMENT_LOADER_FUNCTIONS
|
||
|
#include "demand.h"
|
||
|
|
||
|
#ifndef MAC
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Macros
|
||
|
|
||
|
#define CRIT_GET_PROC_ADDR(h, fn, temp) \
|
||
|
temp = (TYP_##fn) GetProcAddress(h, #fn); \
|
||
|
if (temp) \
|
||
|
VAR_##fn = temp; \
|
||
|
else \
|
||
|
{ \
|
||
|
AssertSz(VAR_##fn" failed to load"); \
|
||
|
goto error; \
|
||
|
}
|
||
|
|
||
|
#define RESET(fn) \
|
||
|
VAR_##fn = LOADER_##fn;
|
||
|
|
||
|
#define GET_PROC_ADDR(h, fn) \
|
||
|
VAR_##fn = (TYP_##fn) GetProcAddress(h, #fn); \
|
||
|
// Assert(VAR_##fn != NULL);
|
||
|
|
||
|
#define GET_PROC_ADDR3(h, fn, varname) \
|
||
|
VAR_##varname = (TYP_##varname) GetProcAddress(h, #fn); \
|
||
|
// Assert(VAR_##varname != NULL);
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Variables
|
||
|
|
||
|
static HMODULE s_hCrypt = 0;
|
||
|
static HMODULE s_hAdvApi = 0;
|
||
|
static HMODULE s_hShell32 = 0;
|
||
|
#if 0 // JLS
|
||
|
static HMODULE s_hShLWAPI = 0;
|
||
|
static HMODULE s_hURLMon = 0;
|
||
|
static HMODULE s_hVersion = 0;
|
||
|
static HMODULE s_hWinINET = 0;
|
||
|
static HMODULE s_hComctl32 = 0;
|
||
|
static HMODULE s_hPstoreC = 0;
|
||
|
static HMODULE s_hMAPI = 0;
|
||
|
static HMODULE s_hWSOCK = 0;
|
||
|
static HMODULE s_hOLEAUT = 0;
|
||
|
static HMODULE s_hKernel = 0;
|
||
|
#endif // 0 // JLS
|
||
|
|
||
|
#ifdef USE_CRITSEC
|
||
|
static CRITICAL_SECTION cs = {0};
|
||
|
#endif
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
static BOOL s_fInit = FALSE;
|
||
|
#endif
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Management functions
|
||
|
|
||
|
void InitDemandLoadedLibs()
|
||
|
{
|
||
|
#ifdef USE_CRITSEC
|
||
|
InitializeCriticalSection(&cs);
|
||
|
#endif
|
||
|
#ifdef DEBUG
|
||
|
s_fInit = TRUE;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void FreeDemandLoadedLibs()
|
||
|
{
|
||
|
#ifdef USE_CRITSEC
|
||
|
EnterCriticalSection(&cs);
|
||
|
#endif
|
||
|
if (s_hCrypt)
|
||
|
FreeLibrary(s_hCrypt);
|
||
|
if (s_hAdvApi)
|
||
|
FreeLibrary(s_hAdvApi);
|
||
|
if (s_hShell32)
|
||
|
FreeLibrary(s_hShell32);
|
||
|
#if 0 //JLS
|
||
|
if (s_hShLWAPI)
|
||
|
FreeLibrary(s_hShLWAPI);
|
||
|
if (s_hURLMon)
|
||
|
FreeLibrary(s_hURLMon);
|
||
|
if (s_hOLEAUT)
|
||
|
FreeLibrary(s_hOLEAUT);
|
||
|
if (s_hMAPI)
|
||
|
FreeLibrary(s_hMAPI);
|
||
|
if (s_hWSOCK)
|
||
|
FreeLibrary(s_hWSOCK);
|
||
|
if (s_hPstoreC)
|
||
|
FreeLibrary(s_hPstoreC);
|
||
|
if (s_hKernel)
|
||
|
FreeLibrary(s_hKernel);
|
||
|
#endif // JLS
|
||
|
#ifdef DEBUG
|
||
|
s_fInit = FALSE;
|
||
|
#endif
|
||
|
#ifdef USE_CRITSEC
|
||
|
LeaveCriticalSection(&cs);
|
||
|
DeleteCriticalSection(&cs);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#if 0 // JLS
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Loader functions
|
||
|
|
||
|
/* sample loader with critical proc addrs
|
||
|
** but not thread-safe
|
||
|
BOOL DemandLoadFoo()
|
||
|
{
|
||
|
FARPROC fp;
|
||
|
|
||
|
if (0 == g_hFoo)
|
||
|
{
|
||
|
g_hFoo = LoadLibrary("FOO.DLL");
|
||
|
|
||
|
if (0 == g_hFoo)
|
||
|
return FALSE;
|
||
|
|
||
|
CRIT_GET_PROC_ADDR(NeededFunction1, fp);
|
||
|
CRIT_GET_PROC_ADDR(NeededFunction2, fp);
|
||
|
GET_PROC_ADDR(OptionalFunction);
|
||
|
}
|
||
|
return TRUE;
|
||
|
|
||
|
error:
|
||
|
FreeLibrary(g_hFoo);
|
||
|
g_hFoo = NULL;
|
||
|
RESET(NeededFunction1)
|
||
|
RESET(NeededFunction2)
|
||
|
RESET(OptionalFunction)
|
||
|
return FALSE;
|
||
|
}
|
||
|
*/
|
||
|
#endif // 0
|
||
|
|
||
|
BOOL DemandLoadCrypt32()
|
||
|
{
|
||
|
BOOL fRet = TRUE;
|
||
|
|
||
|
// Assert(s_fInit);
|
||
|
#ifdef USE_CRITSEC
|
||
|
EnterCriticalSection(&cs);
|
||
|
#endif
|
||
|
|
||
|
if (0 == s_hCrypt) {
|
||
|
s_hCrypt = LoadLibraryA("CRYPT32.DLL");
|
||
|
// AssertSz((BOOL)s_hCrypt, TEXT("LoadLibrary failed on CRYPT32.DLL"));
|
||
|
|
||
|
if (0 == s_hCrypt)
|
||
|
fRet = FALSE;
|
||
|
else {
|
||
|
GET_PROC_ADDR(s_hCrypt, CertFreeCertificateContext)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertDuplicateCertificateContext)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertFindCertificateInStore)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertCloseStore)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertGetCertificateContextProperty)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertOpenStore)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertGetCertificateContextProperty)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertCompareCertificate)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertEnumCertificatesInStore)
|
||
|
GET_PROC_ADDR(s_hCrypt, CryptDecodeObject)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertFindExtension)
|
||
|
GET_PROC_ADDR(s_hCrypt, CryptFormatObject)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertNameToStrW)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertNameToStrA)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertStrToNameA)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertRDNValueToStrW)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertFindRDNAttr)
|
||
|
GET_PROC_ADDR(s_hCrypt, CryptRegisterOIDFunction)
|
||
|
GET_PROC_ADDR(s_hCrypt, CryptUnregisterOIDFunction)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertSetCertificateContextProperty)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertVerifyCTLUsage)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertGetIssuerCertificateFromStore)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertFreeCTLContext)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertAddEncodedCTLToStore)
|
||
|
GET_PROC_ADDR(s_hCrypt, CryptMsgEncodeAndSignCTL)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertFindCTLInStore)
|
||
|
GET_PROC_ADDR(s_hCrypt, CryptSignAndEncodeCertificate)
|
||
|
GET_PROC_ADDR(s_hCrypt, CryptEncodeObject)
|
||
|
GET_PROC_ADDR(s_hCrypt, CryptExportPublicKeyInfo)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertDuplicateStore)
|
||
|
GET_PROC_ADDR(s_hCrypt, CertAddEncodedCertificateToStore);
|
||
|
GET_PROC_ADDR(s_hCrypt, CertVerifyTimeValidity);
|
||
|
GET_PROC_ADDR(s_hCrypt, CertFindSubjectInCTL);
|
||
|
GET_PROC_ADDR(s_hCrypt, CertVerifySubjectCertificateContext);
|
||
|
GET_PROC_ADDR(s_hCrypt, CertGetEnhancedKeyUsage);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#ifdef USE_CRITSEC
|
||
|
LeaveCriticalSection(&cs);
|
||
|
#endif
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
BOOL DemandLoadAdvApi32()
|
||
|
{
|
||
|
BOOL fRet = TRUE;
|
||
|
|
||
|
// Assert(s_fInit);
|
||
|
#ifdef USE_CRITSEC
|
||
|
EnterCriticalSection(&cs);
|
||
|
#endif
|
||
|
|
||
|
if (0 == s_hAdvApi) {
|
||
|
s_hAdvApi = LoadLibraryA("ADVAPI32.DLL");
|
||
|
// AssertSz((BOOL)s_hAdvApi, TEXT("LoadLibrary failed on ADVAPI32.DLL"));
|
||
|
|
||
|
if (0 == s_hAdvApi)
|
||
|
fRet = FALSE;
|
||
|
else {
|
||
|
if (FIsWin95) {
|
||
|
VAR_CryptAcquireContextW = MyCryptAcquireContextW;
|
||
|
}
|
||
|
else {
|
||
|
GET_PROC_ADDR(s_hAdvApi, CryptAcquireContextW);
|
||
|
}
|
||
|
#if 0
|
||
|
GET_PROC_ADDR(s_hAdvApi, CryptGetProvParam)
|
||
|
GET_PROC_ADDR(s_hAdvApi, CryptReleaseContext)
|
||
|
GET_PROC_ADDR(s_hAdvApi, CryptGenKey)
|
||
|
GET_PROC_ADDR(s_hAdvApi, CryptDestroyKey)
|
||
|
#endif // 0
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#ifdef USE_CRITSEC
|
||
|
LeaveCriticalSection(&cs);
|
||
|
#endif
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
#ifndef WIN16
|
||
|
|
||
|
BOOL DemandLoadUser32()
|
||
|
{
|
||
|
BOOL fRet = TRUE;
|
||
|
|
||
|
// Assert(s_fInit);
|
||
|
#ifdef USE_CRITSEC
|
||
|
EnterCriticalSection(&cs);
|
||
|
#endif
|
||
|
#undef SendDlgitemMessageW
|
||
|
#undef SetDlgItemTextW
|
||
|
#undef GetDlgItemTextW
|
||
|
#undef LoadStringW
|
||
|
#undef FormatMessageW
|
||
|
|
||
|
if (0 == s_hShell32) {
|
||
|
if (FIsWin95) {
|
||
|
VAR_SendDlgItemMessageW = MySendDlgItemMessageW;
|
||
|
VAR_SetDlgItemTextW = MySetDlgItemTextW;
|
||
|
VAR_GetDlgItemTextW = MyGetDlgItemTextW;
|
||
|
VAR_LoadStringW = MyLoadStringW;
|
||
|
VAR_FormatMessageW = MyFormatMessageW;
|
||
|
VAR_WinHelpW = MyWinHelpW;
|
||
|
}
|
||
|
else {
|
||
|
s_hShell32 = LoadLibraryA("kernel32.dll");
|
||
|
GET_PROC_ADDR(s_hShell32, FormatMessageW);
|
||
|
FreeLibrary(s_hShell32);
|
||
|
|
||
|
s_hShell32 = LoadLibraryA("USER32.DLL");
|
||
|
GET_PROC_ADDR(s_hShell32, SendDlgItemMessageW);
|
||
|
GET_PROC_ADDR(s_hShell32, SetDlgItemTextW);
|
||
|
GET_PROC_ADDR(s_hShell32, GetDlgItemTextW);
|
||
|
GET_PROC_ADDR(s_hShell32, LoadStringW);
|
||
|
GET_PROC_ADDR(s_hShell32, WinHelpW);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#ifdef USE_CRITSEC
|
||
|
LeaveCriticalSection(&cs);
|
||
|
#endif
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
#endif // !WIN16
|
||
|
|
||
|
#endif // !MAC
|