windows-nt/Source/XPSP1/NT/shell/osshell/cpls/main/drvaplet.c
2020-09-26 16:20:57 +08:00

289 lines
5.6 KiB
C

/*++
Copyright (c) 1994-1998, Microsoft Corporation All rights reserved.
Module Name:
drvaplet.c
Abstract:
This module contains the driver routines for the project.
Revision History:
--*/
//
// Include Files.
//
#include "main.h"
#include "drvaplet.h"
//
// Defines for Win16 builds.
//
#ifndef WIN32
#define LoadLibrary16 LoadLibrary
#define FreeLibrary16 FreeLibrary
#define GetProcAddress16 GetProcAddress
#endif
//
// Global Variables.
//
//
// CplApplet.
//
const TCHAR *c_szCplApplet = TEXT("CPlApplet");
const char *c_szCplAppletA = "CPlApplet";
//
// Typedef Declarations.
//
//
// DRIVER_APPLET_INFO: the info we keep around about a driver applet.
//
typedef struct
{
HMODULE module;
APPLET_PROC applet;
HICON icon;
} DRIVER_APPLET_INFO, *PDAI;
//
// GetDriverModule: gets the module.
//
////////////////////////////////////////////////////////////////////////////
//
// GetDriverModule
//
// Gets the module.
//
////////////////////////////////////////////////////////////////////////////
HMODULE GetDriverModule(
LPCTSTR name)
{
#ifdef WIN32
#ifdef WINNT
return (LoadLibrary(name));
#else
return (LoadLibrary16(name));
#endif
#else
return (GetModuleHandle(name));
#endif
}
////////////////////////////////////////////////////////////////////////////
//
// ReleaseDriverModule
//
////////////////////////////////////////////////////////////////////////////
void ReleaseDriverModule(
HMODULE module)
{
#ifdef WIN32
#ifdef WINNT
FreeLibrary(module);
#else
FreeLibrary16(module);
#endif
#else
//
// do nothing (got it with GetModuleHandle)
//
#endif
}
////////////////////////////////////////////////////////////////////////////
//
// OpenDriverApplet
//
// Opens a handle to the named driver applet.
//
////////////////////////////////////////////////////////////////////////////
HDAP OpenDriverApplet(
LPCTSTR name)
{
PDAI driver = (PDAI)LocalAlloc(LPTR, sizeof(DRIVER_APPLET_INFO));
if (driver)
{
if ((driver->module = GetDriverModule(name)) != NULL)
{
if ((driver->applet = (APPLET_PROC)
#ifdef WINNT
GetProcAddress(driver->module, c_szCplAppletA)) != NULL)
#else
GetProcAddress16(driver->module, c_szCplApplet)) != NULL)
#endif
{
union
{
NEWCPLINFO newform;
CPLINFO oldform;
} info = { 0 };
CallDriverApplet( (HDAP) driver,
NULL,
CPL_NEWINQUIRE,
0,
(LPARAM)&info.newform );
if (info.newform.dwSize == sizeof(info.newform))
{
driver->icon = info.newform.hIcon;
return ((HDAP)driver);
}
//
// NOTE: If the driver doesn't handle CPL_NEWIQUIRE, we must use CPL_INQUIRE
// and LoadIcon the icon ourselves. Win32 doesn't provide a LoadIcon16, so
// in Win32 the 16 bit side of the thunk for CPL_NEWINQUIRE does this. In
// Win16, we do it right here.
//
#ifndef WIN32
info.oldform.idIcon = 0;
CallDriverApplet( (HDAP)driver,
NULL,
CPL_INQUIRE,
0,
(LPARAM)&info.oldform );
if (info.oldform.idIcon)
{
driver->icon =
LoadIcon( driver->module,
MAKEINTRESOURCE(info.oldform.idIcon) );
return ((HDAP)driver);
}
#endif
}
ReleaseDriverModule(driver->module);
}
LocalFree(driver);
}
return ((HDAP)0);
}
////////////////////////////////////////////////////////////////////////////
//
// CloseDriverApplet
//
// Closes a handle to a driver applet.
//
////////////////////////////////////////////////////////////////////////////
void CloseDriverApplet(
HDAP HDAP)
{
#define driver ((PDAI)HDAP)
if (driver)
{
if (driver->icon)
{
DestroyIcon(driver->icon);
}
ReleaseDriverModule(driver->module);
LocalFree(driver);
}
#undef driver
}
////////////////////////////////////////////////////////////////////////////
//
// GetDriverAppletIcon
//
// Gets a driver applet's icon (if any).
//
////////////////////////////////////////////////////////////////////////////
HICON GetDriverAppletIcon(
HDAP HDAP)
{
#define driver ((PDAI)HDAP)
//
// Must return a copy for the current process/task to own.
//
return ((driver && driver->icon) ? CopyIcon(driver->icon) : NULL);
#undef driver
}
////////////////////////////////////////////////////////////////////////////
//
// CallDriverApplet
//
// Calls the driver applet (same syntax as CplApplet).
//
////////////////////////////////////////////////////////////////////////////
LRESULT CallDriverApplet(
HDAP HDAP,
HWND wnd,
UINT msg,
LPARAM p1,
LPARAM p2)
{
#define driver ((PDAI)HDAP)
if (driver)
{
#ifdef WIN32
return ( CallCPLEntry16( driver->module,
(FARPROC16)driver->applet,
wnd,
msg,
p1,
p2 ) );
#else
return (driver->applet(wnd, msg, p1, p2));
#endif
}
return (0L);
#undef driver
}