windows-nt/Source/XPSP1/NT/shell/ext/url/inetcpl.c
2020-09-26 16:20:57 +08:00

240 lines
5.2 KiB
C

/*
* inetcpl.c - Indirect calls to inetcpl.cpl.
*/
/* Headers
**********/
#include "project.h"
#pragma hdrstop
#include "inetcpl.h"
/* Types
********/
/* Internet CPL vtable */
typedef struct internetcplvtbl
{
HRESULT (WINAPI *AddInternetPropertySheets)(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lparam, PUINT pucRefCount, LPFNPSPCALLBACK pfnCallback);
}
INTERNETCPLVTBL;
DECLARE_STANDARD_TYPES(INTERNETCPLVTBL);
/* Module Constants
*******************/
#pragma data_seg(DATA_SEG_READ_ONLY)
PRIVATE_DATA CCHAR s_cszInternetCPL[] = "inetcpl.cpl";
PRIVATE_DATA CCHAR s_cszAddInternetPropertySheets[] = "AddInternetPropertySheets";
#pragma data_seg()
/* Module Variables
*******************/
/* Internet CPL reference count */
PRIVATE_DATA UINT s_ucRef = 0;
PRIVATE_DATA HINSTANCE s_hinstInternetCPL = NULL;
/* Internet CPL vtable */
PRIVATE_DATA PINTERNETCPLVTBL s_pinetcplvtbl = NULL;
/***************************** Private Functions *****************************/
#ifdef DEBUG
PRIVATE_CODE BOOL IsValidPCINTERNETCPLVTBL(PCINTERNETCPLVTBL pcinetcplctbl)
{
return(IS_VALID_READ_PTR(pcinetcplctbl, CINTERNETCPLVTBL) &&
IS_VALID_CODE_PTR(pcinetcplctbl->AddInternetPropertySheets, AddInternetPropertySheets));
}
PRIVATE_CODE BOOL InternetCPLNotLoadedStateOK(void)
{
return(! s_hinstInternetCPL &&
! s_pinetcplvtbl);
}
PRIVATE_CODE BOOL InternetCPLLoadedStateOK(void)
{
return(IS_VALID_HANDLE(s_hinstInternetCPL, INSTANCE) &&
IS_VALID_STRUCT_PTR(s_pinetcplvtbl, CINTERNETCPLVTBL));
}
PRIVATE_CODE BOOL InternetCPLStateOK(void)
{
return(InternetCPLNotLoadedStateOK() ||
InternetCPLLoadedStateOK());
}
#endif /* DEBUG */
PRIVATE_CODE BOOL IsInternetCPLLoaded(void)
{
ASSERT(InternetCPLStateOK());
return(s_hinstInternetCPL != NULL);
}
PRIVATE_CODE BOOL GetInternetCPLProc(PCSTR pcszProc, FARPROC *pfp)
{
ASSERT(IS_VALID_STRING_PTR(pcszProc, CSTR));
ASSERT(IS_VALID_WRITE_PTR(pfp, FARPROC));
ASSERT(IS_VALID_HANDLE(s_hinstInternetCPL, INSTANCE));
*pfp = GetProcAddress(s_hinstInternetCPL, pcszProc);
if (*pfp)
TRACE_OUT(("GetInternetCPLProc(): Got address of %s!%s.",
s_cszInternetCPL,
pcszProc));
else
WARNING_OUT(("GetOLEProc(): Failed to get address of %s!%s.",
s_cszInternetCPL,
pcszProc));
ASSERT(! *pfp ||
IS_VALID_CODE_PTR(*pfp, FARPROC));
return(*pfp != NULL);
}
PRIVATE_CODE BOOL FillInternetCPLVTable(void)
{
BOOL bResult;
ASSERT(IS_VALID_HANDLE(s_hinstInternetCPL, INSTANCE));
if (AllocateMemory(sizeof(*s_pinetcplvtbl), &s_pinetcplvtbl))
{
bResult = GetInternetCPLProc(s_cszAddInternetPropertySheets,
&(FARPROC)(s_pinetcplvtbl->AddInternetPropertySheets));
if (bResult)
TRACE_OUT(("FillInternetCPLVTable(): Internet CPL vtable filled successfully."));
else
{
FreeMemory(s_pinetcplvtbl);
s_pinetcplvtbl = NULL;
}
}
else
bResult = FALSE;
ASSERT(! bResult ||
InternetCPLLoadedStateOK());
return(bResult);
}
PRIVATE_CODE BOOL LoadInternetCPL(void)
{
BOOL bResult;
bResult = IsInternetCPLLoaded();
if (! bResult)
{
s_hinstInternetCPL = LoadLibrary(s_cszInternetCPL);
if (s_hinstInternetCPL)
{
bResult = FillInternetCPLVTable();
if (bResult)
TRACE_OUT(("LoadInternetCPL(): %s loaded.",
s_cszInternetCPL));
}
else
WARNING_OUT(("LoadInternetCPL(): LoadLibrary(%s) failed.",
s_cszInternetCPL));
if (! bResult)
UnloadInternetCPL();
}
ASSERT(InternetCPLStateOK());
return(bResult);
}
/****************************** Public Functions *****************************/
PUBLIC_CODE void UnloadInternetCPL(void)
{
if (s_pinetcplvtbl)
{
FreeMemory(s_pinetcplvtbl);
s_pinetcplvtbl = NULL;
TRACE_OUT(("UnloadInternetCPL(): Freed %s vtable.",
s_cszInternetCPL));
}
if (s_hinstInternetCPL)
{
FreeLibrary(s_hinstInternetCPL);
s_hinstInternetCPL = NULL;
TRACE_OUT(("UnloadInternetCPL(): Freed %s.",
s_cszInternetCPL));
}
return;
}
HRESULT InternetCPLCanUnloadNow(void)
{
return ((s_ucRef > 0) ? S_FALSE : S_OK);
}
#pragma warning(disable:4100) /* "unreferenced formal parameter" warning */
PUBLIC_CODE HRESULT WINAPI AddInternetPropertySheets(
LPFNADDPROPSHEETPAGE pfnAddPage,
LPARAM lparam, PUINT pucRefCount,
LPFNPSPCALLBACK pfnCallback)
{
HRESULT hr;
/*
* Increment the Internet CPL's reference count around this call it so that
* it is not unloaded during the call.
*/
if (LoadInternetCPL())
hr = s_pinetcplvtbl->AddInternetPropertySheets(pfnAddPage, lparam,
&s_ucRef,
pfnCallback);
else
hr = E_FAIL;
return(hr);
}
#pragma warning(default:4100) /* "unreferenced formal parameter" warning */