289 lines
5.6 KiB
C
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
|
||
|
}
|