Windows2003-3790/shell/cpls/inetcpl/init.cpp
2020-09-30 16:53:55 +02:00

271 lines
7.7 KiB
C++

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1995 **
//*********************************************************************
//
// INIT.C - Initialization code for Internet control panel
//
// HISTORY:
//
// 4/3/95 jeremys Created.
//
#include "inetcplp.h"
// external calls and defs
#include <inetcpl.h>
#define MLUI_INIT
#include <mluisupp.h>
//
// Downlevel delay load support (we forward to shlwapi)
//
#include <delayimp.h>
PfnDliHook __pfnDliFailureHook;
HINSTANCE ghInstance=NULL;
extern HMODULE hOLE32;
DWORD g_dwtlsSecInitFlags;
BOOL g_bMirroredOS = FALSE;
HMODULE g_hOleAcc;
BOOL g_fAttemptedOleAccLoad = FALSE;
STDAPI_(BOOL) LaunchInternetControlPanelAtPage(HWND hDlg, UINT nStartPage);
BOOL IsCompatModeProcess(void);
void SetupDelayloadErrorHandler()
{
__pfnDliFailureHook = (PfnDliHook)GetProcAddress(GetModuleHandleA("shlwapi.dll"), "DelayLoadFailureHook");
}
/*******************************************************************
NAME: DllEntryPoint
SYNOPSIS: Entry point for DLL.
********************************************************************/
STDAPI_(BOOL) DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpReserved)
{
if( fdwReason == DLL_PROCESS_ATTACH )
{
SHFusionInitializeFromModule(hInstDll);
SetupDelayloadErrorHandler();
if (IsCompatModeProcess())
// Fail loading in compat mode process
return 0;
ghInstance = hInstDll;
MLLoadResources(ghInstance, TEXT("inetcplc.dll"));
#ifndef REPLACE_PROPSHEET_TEMPLATE
InitMUILanguage(INETCPL_GetUILanguage());
#endif
#ifdef DEBUG
CcshellGetDebugFlags();
#endif
// Thread local storage used in security.cpp
g_dwtlsSecInitFlags = TlsAlloc();
g_bMirroredOS = IS_MIRRORING_ENABLED();
TlsSetValue(g_dwtlsSecInitFlags, (void *) new SECURITYINITFLAGS);
}
else if (fdwReason == DLL_PROCESS_DETACH)
{
MLFreeResources(ghInstance);
if (g_hwndUpdate)
{
// we've got this subclassed.
// if it's still valid as we leave, we need
// to destroy it so that it doesn't fault trying to access our info
DestroyWindow(g_hwndUpdate);
}
if(hOLE32)
{
FreeLibrary(hOLE32);
hOLE32 = NULL;
}
if (g_hOleAcc)
{
FreeLibrary(g_hOleAcc);
g_hOleAcc = NULL;
g_fAttemptedOleAccLoad = FALSE;
}
// free tls used in security.cpp
if(g_dwtlsSecInitFlags != (DWORD) -1)
{
SECURITYINITFLAGS * psif = NULL;
psif = (SECURITYINITFLAGS *) TlsGetValue(g_dwtlsSecInitFlags);
if(psif)
{
delete psif;
psif = NULL;
}
TlsFree(g_dwtlsSecInitFlags);
}
SHFusionUninitialize();
}
return TRUE;
}
BOOL RunningOnNT()
{
return !(::GetVersion() & 0x80000000);
}
/*******************************************************************
NAME: CPlApplet
SYNOPSIS: Entry point for control panel.
********************************************************************/
STDAPI_(LRESULT) CPlApplet // Control panel applet procedure
(
HWND hwndCpl, // Control panel parent window
UINT uMsg, // message
LPARAM lParam1, // value depends on message
LPARAM lParam2 // value depends on message
)
{
LPNEWCPLINFO lpNewCplInfo = (LPNEWCPLINFO) lParam2;
LPCPLINFO lpCplInfo = (LPCPLINFO) lParam2;
DWORD dwNIcons;
switch (uMsg)
{
case CPL_INIT:
// Initialization message from Control Panel
return TRUE;
case CPL_GETCOUNT:
/* We always have the main internet CPL icon; on Win95 platforms,
* we also have the Users icon if mslocusr.dll is present.
*/
dwNIcons = 1;
if (!RunningOnNT())
{
TCHAR szPath[MAX_PATH];
// check if mslocusr.dll is present in the system dir
if (GetSystemDirectory(szPath, ARRAYSIZE(szPath)))
{
PathAppend(szPath, TEXT("mslocusr.dll"));
if (PathFileExists(szPath))
dwNIcons++;
}
}
return dwNIcons;
case CPL_INQUIRE:
/* CPL #0 is the main Internet CPL, #1 (the only other one we'll ever
* be asked about) is the Users CPL.
*/
if (!lParam1) {
lpCplInfo->idIcon = IDI_INTERNET;
lpCplInfo->idName = IDS_INTERNET;
lpCplInfo->idInfo = IDS_DESCRIPTION;
lpCplInfo->lData = 0;
}
else {
lpCplInfo->idIcon = IDI_USERS;
lpCplInfo->idName = IDS_USERS;
lpCplInfo->idInfo = IDS_USERS_DESCRIPTION;
lpCplInfo->lData = 0;
}
return FALSE;
case CPL_NEWINQUIRE:
// Return new-style info structure for Control Panel
// By not responding to NEWINQUIRE, Win95 will not preload our
// .cpl file; by extension, since we are statically linked to MSHTML's
// import library, MSHTML will also not be loaded. If we respond to
// this, then our cpl and MSHTML (>600k) are both loaded when the
// control panel is just open. (IE, they will be loaded even if the
// user has not selected to invoke our specific cpl applet.
return TRUE; // TRUE == we are NOT responding to this
break;
case CPL_DBLCLK:
//
// This means the user did not specify a particular page
//
lParam2 = 0;
// fall through
case CPL_STARTWPARMSA:
case CPL_STARTWPARMSW:
/* CPL #0 is the main Internet CPL, #1 (the only other one we'll ever
* be asked about) is the Users CPL. The Users CPL is loaded from
* mslocusr.dll dynamically. The entrypoint is structured as a
* rundll32 entrypoint.
*/
if (!lParam1) {
//
// If lParam2!=NULL, then the user specified a page on the command line
//
if (lParam2)
{
UINT nPage;
if (CPL_STARTWPARMSA == uMsg)
nPage = StrToIntA((LPSTR)lParam2);
else
nPage = StrToIntW((LPWSTR)lParam2);
LaunchInternetControlPanelAtPage(hwndCpl, nPage);
}
//
// Otherwise request the default page
//
else
LaunchInternetControlPanelAtPage(hwndCpl,DEFAULT_CPL_PAGE);
}
else {
HINSTANCE hinstMSLU = LoadLibrary(TEXT("mslocusr.dll"));
if (hinstMSLU != NULL) {
typedef void (*PFNRUNDLL)(HWND hwndParent, HINSTANCE hinstEXE, LPSTR pszCmdLine, int nCmdShow);
PFNRUNDLL pfn = (PFNRUNDLL)GetProcAddress(hinstMSLU, "UserCPL");
if (pfn != NULL) {
(*pfn)(hwndCpl, NULL, "", SW_SHOW);
}
FreeLibrary(hinstMSLU);
}
}
return TRUE;
case CPL_EXIT:
// Control Panel is exiting
break;
default:
break;
}
return 0L;
}