|
|
/*++
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
}
|