212 lines
8.2 KiB
C++
212 lines
8.2 KiB
C++
|
// --------------------------------------------------------------------------------
|
||
|
// Demand.cpp
|
||
|
// Written By: jimsch, brimo, t-erikne (bastardized by sbailey)
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// W4 stuff
|
||
|
#ifdef SMIME_V3
|
||
|
#pragma warning(disable: 4201) // nameless struct/union
|
||
|
#pragma warning(disable: 4514) // unreferenced inline function removed
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// Includes
|
||
|
// --------------------------------------------------------------------------------
|
||
|
|
||
|
#include <windows.h>
|
||
|
//#include "myassert.h"
|
||
|
#define AssertSz(a, b)
|
||
|
#define Assert(a)
|
||
|
#define IMPLEMENT_LOADER_FUNCTIONS
|
||
|
#include "crypttls.h"
|
||
|
#include "ess.h"
|
||
|
#include "demand2.h"
|
||
|
|
||
|
#include "badstrfunctions.h"
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// CRIT_GET_PROC_ADDR
|
||
|
// --------------------------------------------------------------------------------
|
||
|
#define CRIT_GET_PROC_ADDR(h, fn, temp) \
|
||
|
temp = (TYP_##fn) GetProcAddress(h, #fn); \
|
||
|
if (temp) \
|
||
|
VAR_##fn = temp; \
|
||
|
else \
|
||
|
{ \
|
||
|
AssertSz(0, VAR_##fn" failed to load"); \
|
||
|
goto error; \
|
||
|
}
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// RESET
|
||
|
// --------------------------------------------------------------------------------
|
||
|
#define RESET(fn) VAR_##fn = LOADER_##fn;
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// GET_PROC_ADDR
|
||
|
// --------------------------------------------------------------------------------
|
||
|
#define GET_PROC_ADDR(h, fn) \
|
||
|
VAR_##fn = (TYP_##fn) GetProcAddress(h, #fn); \
|
||
|
Assert(VAR_##fn != NULL); \
|
||
|
if(NULL == VAR_##fn ) { \
|
||
|
VAR_##fn = LOADER_##fn; \
|
||
|
}
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// GET_PROC_ADDR_ORDINAL
|
||
|
// --------------------------------------------------------------------------------
|
||
|
#define GET_PROC_ADDR_ORDINAL(h, fn, ord) \
|
||
|
VAR_##fn = (TYP_##fn) GetProcAddress(h, MAKEINTRESOURCE(ord)); \
|
||
|
Assert(VAR_##fn != NULL);
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// GET_PROC_ADDR3
|
||
|
// --------------------------------------------------------------------------------
|
||
|
#define GET_PROC_ADDR3(h, fn, varname) \
|
||
|
VAR_##varname = (TYP_##varname) GetProcAddress(h, #fn); \
|
||
|
Assert(VAR_##varname != NULL);
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// Static Globals
|
||
|
// --------------------------------------------------------------------------------
|
||
|
static HMODULE s_hCrypt = 0;
|
||
|
static HMODULE s_hNmasn1 = 0;
|
||
|
|
||
|
static CRITICAL_SECTION g_csDefLoad = {0};
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// InitDemandLoadedLibs
|
||
|
// --------------------------------------------------------------------------------
|
||
|
void ESS_InitDemandLoadLibs(void)
|
||
|
{
|
||
|
InitializeCriticalSection(&g_csDefLoad);
|
||
|
}
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// FreeDemandLoadedLibs
|
||
|
// --------------------------------------------------------------------------------
|
||
|
void ESS_FreeDemandLoadLibs(void)
|
||
|
{
|
||
|
EnterCriticalSection(&g_csDefLoad);
|
||
|
if (s_hCrypt) FreeLibrary(s_hCrypt);
|
||
|
if (s_hNmasn1) FreeLibrary(s_hNmasn1);
|
||
|
|
||
|
LeaveCriticalSection(&g_csDefLoad);
|
||
|
DeleteCriticalSection(&g_csDefLoad);
|
||
|
}
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// DemandLoadCrypt32
|
||
|
// --------------------------------------------------------------------------------
|
||
|
BOOL ESS_DemandLoadCrypt32(void)
|
||
|
{
|
||
|
BOOL fRet = TRUE;
|
||
|
|
||
|
EnterCriticalSection(&g_csDefLoad);
|
||
|
|
||
|
if (0 == s_hCrypt)
|
||
|
{
|
||
|
s_hCrypt = LoadLibrary("CRYPT32.DLL");
|
||
|
AssertSz((BOOL)s_hCrypt, TEXT("LoadLibrary failed on CRYPT32.DLL"));
|
||
|
|
||
|
if (0 == s_hCrypt)
|
||
|
fRet = FALSE;
|
||
|
else
|
||
|
{
|
||
|
GET_PROC_ADDR(s_hCrypt, CryptRegisterOIDFunction);
|
||
|
GET_PROC_ADDR(s_hCrypt, I_CryptUninstallAsn1Module);
|
||
|
GET_PROC_ADDR(s_hCrypt, I_CryptInstallAsn1Module);
|
||
|
GET_PROC_ADDR(s_hCrypt, I_CryptGetAsn1Encoder);
|
||
|
GET_PROC_ADDR(s_hCrypt, I_CryptGetAsn1Decoder);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LeaveCriticalSection(&g_csDefLoad);
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
BOOL FIsMsasn1Loaded()
|
||
|
{
|
||
|
static int fTested = FALSE;
|
||
|
|
||
|
if (!fTested) {
|
||
|
ESS_DemandLoadNmasn1();
|
||
|
fTested = TRUE;
|
||
|
}
|
||
|
|
||
|
return s_hNmasn1 != 0;
|
||
|
}
|
||
|
|
||
|
// --------------------------------------------------------------------------------
|
||
|
// DemandLoadNmasn1
|
||
|
// --------------------------------------------------------------------------------
|
||
|
BOOL ESS_DemandLoadNmasn1(void)
|
||
|
{
|
||
|
BOOL fRet = TRUE;
|
||
|
|
||
|
EnterCriticalSection(&g_csDefLoad);
|
||
|
|
||
|
if (0 == s_hNmasn1) {
|
||
|
s_hNmasn1 = LoadLibrary("MSAsn1.DLL");
|
||
|
AssertSz((BOOL)s_hNmasn1, TEXT("LoadLibrary failed on MSAsn1.DLL"));
|
||
|
|
||
|
if (0 == s_hNmasn1)
|
||
|
fRet = FALSE;
|
||
|
else {
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1_CreateModule);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1_CloseModule);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncObjectIdentifier2);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecObjectIdentifier2);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncEndOfContents);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncS32);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncOpenType);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncExplicitTag);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecEndOfContents);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecS32Val);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecOpenType2);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecExplicitTag);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1CEREncOctetString);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecOctetString2);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecOctetString);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1octetstring_free);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncUTF8String);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecUTF8String);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecPeekTag);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1utf8string_free);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1DecRealloc);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecNotEndOfContents);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1Free);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1DecSetError);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncU32);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1CEREncCharString);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1CEREncBeginBlk);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1CEREncNewBlkElement);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1CEREncFlushBlkElement);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1CEREncEndBlk);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecU16Val);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecZeroCharString);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1ztcharstring_free);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1CEREncGeneralizedTime);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncNull);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecGeneralizedTime);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecNull);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1_Encode);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1_FreeEncoded);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1_Decode);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1_SetEncoderOption);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1_GetEncoderOption);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1_FreeDecoded);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncOctetString);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncCharString);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BEREncSX);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1BERDecSXVal);
|
||
|
GET_PROC_ADDR(s_hNmasn1, ASN1intx_free);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LeaveCriticalSection(&g_csDefLoad);
|
||
|
return fRet;
|
||
|
}
|
||
|
|
||
|
#endif // SMIME_V3
|