windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/admin/mmc/inetmgr.h

2429 lines
59 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1994-1998 Microsoft Corporation
Module Name :
inetmgr.h
Abstract:
Main program object and class definitions
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
#ifndef _INETMGR_H_
#define _INETMGR_H_
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include <lmcons.h>
#include <wtypes.h>
#include <iis64.h>
extern "C"
{
typedef unsigned hyper ULONGLONG;
#include "svcloc.h"
}
#include "comprop.h"
#include "svrinfo.h"
#include "resource.h" // main symbols
LPOLESTR
CoTaskDupString(
IN LPCOLESTR szString
);
#define CoTaskStringFree(szString)\
if (szString) CoTaskMemFree(szString);
HRESULT
BuildResURL(
OUT CString & str,
IN HINSTANCE hSourceInstance = (HINSTANCE)-1
);
struct INTERNAL
/*++
Routine Description:
Internal information structure. This is used to get the private information
from the data object.
Public Interface:
INTERNAL : Constructor
~INTERNAL : Destructor
--*/
{
INTERNAL()
: m_type(CCT_UNINITIALIZED),
m_cookie(-1)
{
::ZeroMemory(&m_clsid, sizeof(CLSID));
};
~INTERNAL() {}
DATA_OBJECT_TYPES m_type; // What context is the data object.
MMC_COOKIE m_cookie; // What object the cookie represents
CString m_string; //
CLSID m_clsid; // Class ID of who created this data object
INTERNAL & operator=(const INTERNAL& rhs)
{
if (&rhs == this)
{
return *this;
}
//
// Deep copy the information
//
m_type = rhs.m_type;
m_cookie = rhs.m_cookie;
m_string = rhs.m_string;
CopyMemory(&m_clsid, &rhs.m_clsid, sizeof(CLSID));
return *this;
}
BOOL operator==(const INTERNAL& rhs) { return rhs.m_string == m_string; }
};
//
// Menu Commands, listed in toolbar order.
//
// IMPORTANT! -- this must be kept in sync with MenuItemDefs
// in iisobj.cpp
//
enum
{
IDM_INVALID, /* invalid command ID */
IDM_CONNECT,
IDM_DISCOVER,
IDM_START,
IDM_STOP,
IDM_PAUSE,
/**/
IDM_TOOLBAR /* Toolbar commands start here */
};
//
// Additional menu commands that do not show up in the toolbar
//
enum
{
IDM_EXPLORE = IDM_TOOLBAR,
IDM_OPEN,
IDM_BROWSE,
IDM_CONFIGURE,
IDM_DISCONNECT,
IDM_METABACKREST,
IDM_SHUTDOWN,
IDM_NEW_VROOT,
IDM_NEW_INSTANCE,
IDM_VIEW_TASKPAD,
IDM_TASK_SECURITY_WIZARD,
//
// Don't move this last one -- it will be used
// as an offset for service specific new instance
// commands
//
IDM_NEW_EX_INSTANCE
};
//
// Background colour mask of our own toolbar bitmaps.
//
#define TB_COLORMASK RGB(192,192,192) // Lt. Gray
//
// Default discovery wait time
//
#define DEFAULT_WAIT_TIME (30000L) // 30 seconds
class CServiceInfo : public CObjectPlus
/*++
Class Description:
Service info descriptor class. This is used for downlevel ISM objects.
Public Interface:
CServiceInfo : Constructor
~CServiceInfo : Destructor
QueryInstanceHandle : Get the instance handle of the config dll
for this service
QueryISMVersion : Get the ISM version the config DLL was written
for.
QueryDiscoveryMask : Get the inetsloc discovery mask
QueryButtonBkMask : Get the background mask for the toolbar button
QueryButtonBitmapID : Get the toolbar button resource ID
QueryServiceBkMask : Get the background mask for the view
QueryServiceBitmapID : Get the view bitmap resource ID
QueryServiceID : Get the service ID assigned to this service
GetShortName : Get the short name of the service
GetLongName : Get the full name of the service
UseInetSlocDiscover : TRUE if the service uses inetsloc discovery
CanControlService : TRUE if the service is controllable
CanPauseService : TRUE if the service is pausable
UseNormalColorMapping : TRUE if normal colour mapping should be used
SupportsInstances : TRUE if the service has instances
SupportsChildren : TRUE if the service has children
UnderstandsInstanceCodes : TRUE if instance ID codes are understood.
HasWebProtocol : TRYE if the service supports a web protocol name
IsSelected : TRUE if the service type is selected in the
toolbar.
SelectService : Set the selection state of the service
QueryReturnCode : Get the error return code of the service
InitializedOK : TRUE if the service config DLL was initialized
OK.
ISMQueryServiceInfo : Call the query service info API
ISMDiscoverServers : Call the discover servers API
ISMQueryServerInfo : Call the query server info API
ISMChangeServiceState : Call the change service state API
ISMConfigureServers : Call the configure server API
ISMEnumerateInstances : Call the enumerate instances API
ISMConfigureChild : Call the configure child API
--*/
{
protected:
//
// ISM Method prototype
//
typedef HRESULT (APIENTRY * pfnISMMethod)(...);
//
// ISM Method Definition
//
typedef struct tagISM_METHOD_DEF
{
int iID;
BOOL fMustHave;
LPCSTR lpszMethodName;
} ISM_METHOD_DEF;
//
// VTable entry IDs
//
enum
{
ISM_QUERY_SERVICE_INFO,
ISM_DISCOVER_SERVERS,
ISM_QUERY_SERVER_INFO,
ISM_CHANGE_SERVICE_STATE,
ISM_CONFIGURE,
ISM_BIND,
ISM_UNBIND,
ISM_CONFIGURE_CHILD,
ISM_ENUMERATE_INSTANCES,
ISM_ENUMERATE_CHILDREN,
ISM_ADD_INSTANCE,
ISM_DELETE_INSTANCE,
ISM_ADD_CHILD,
ISM_DELETE_CHILD,
ISM_RENAME_CHILD,
ISM_QUERY_INSTANCE_INFO,
ISM_QUERY_CHILD_INFO,
ISM_MMC_CONFIGURE,
ISM_MMC_CONFIGURE_CHILD,
ISM_SECURITY_WIZARD,
/* Don't move this one */
ISM_NUM_METHODS
};
//
// ISM Method VTable Definition
//
static ISM_METHOD_DEF s_imdMethods[ISM_NUM_METHODS];
//
// Construction/Destruction
//
public:
//
// Construct with DLL Name and a sequential unique
// ID Number.
//
CServiceInfo(
IN int nID,
IN LPCTSTR lpDLLName
);
~CServiceInfo();
//
// Access Functions
//
public:
//
// Get the instance handle
//
HINSTANCE QueryInstanceHandle() const { return m_hModule; }
//
// Get the ISM version number
//
DWORD QueryISMVersion() const { return m_si.dwVersion; }
//
// Get the discovery mask
//
ULONGLONG QueryDiscoveryMask() const { return m_si.ullDiscoveryMask; }
//
// Get toolbar background button mask for this service
//
COLORREF QueryButtonBkMask() const { return m_si.rgbButtonBkMask; }
//
// Get toolbar button bitmap id for this service
//
UINT QueryButtonBitmapID() const { return m_si.nButtonBitmapID; }
//
// Get the colour background mask for this service
//
COLORREF QueryServiceBkMask() const { return m_si.rgbServiceBkMask; }
//
// Get the resource ID for the service bitmap for this service
//
UINT QueryServiceBitmapID() const { return m_si.nServiceBitmapID; }
//
// Return TRUE if the service has 32x32 bitmap id
//
BOOL HasLargeServiceBitmapID() const { return m_si.nLargeServiceBitmapID != 0; }
//
// Get the large service bitmap background colour mask
//
COLORREF QueryLargeServiceBkMask() const { return m_si.rgbLargeServiceBkMask; }
//
// Get the resource ID of the large service bitmap
//
UINT QueryLargeServiceBitmapID() const { return m_si.nLargeServiceBitmapID; }
//
// Get the colour background mask for the child bitmap
//
COLORREF QueryChildBkMask() const { return m_si.rgbChildBkMask; }
//
// Get the bitmap ID for a child node
//
UINT QueryChildBitmapID() const { return m_si.nChildBitmapID; }
//
// Get the background colour mask for the large child bitmap
//
COLORREF QueryLargeChildBkMask() const { return m_si.rgbLargeChildBkMask; }
//
// Get the resource ID for the large child bitmap
//
UINT QueryLargeChildBitmapID() const { return m_si.nLargeChildBitmapID; }
//
// Get the ID assigned to this service
//
int QueryServiceID() const { return m_nID; }
//
// Get the short name for this service
//
LPCTSTR GetShortName() const { return m_si.atchShortName; }
//
// Get the longer name for this service
//
LPCTSTR GetLongName() const { return m_si.atchLongName; }
//
// Get the protocol for this service (if any)
//
LPCTSTR GetProtocol() const { return m_si.atchProtocol; }
//
// Get the metabase service name (if any)
//
LPCTSTR GetMetabaseName() const { return m_si.atchMetaBaseName; }
//
// Access Service Type Functions
//
public:
//
// TRUE if the service is a downlevel replacement service
//
BOOL RequiresSuperDll() const { return !m_strSupDLLName.IsEmpty(); }
BOOL IsSuperDllFor(CServiceInfo * pTarget) const;
BOOL HasSuperDll() const { return m_psiMaster != NULL; }
void AssignSuperDll(CServiceInfo * pTarget);
CServiceInfo * GetSuperDll();
LPCTSTR QueryDllName() const { return m_strDLLName; }
BOOL UseInetSlocDiscover() const;
//
// Return TRUE if the service is controllable
//
BOOL CanControlService() const;
//
// Return TRUE if the service is pausable
//
BOOL CanPauseService() const;
//
// Return TRUE if the service and toolbar bitmaps use default
// background colour mapping (the background colour masks
// will be ignored)
//
BOOL UseNormalColorMapping() const;
//
// True if the service supports file and directory properties
//
BOOL SupportsFileSystem() const;
//
// Does the service support Instances
//
BOOL SupportsInstances() const;
//
// Does the service support children
//
BOOL SupportsChildren() const;
//
// TRUE if the service supports the security wizard
//
BOOL SupportsSecurityWizard() const;
//
// Does the service understance instance ID codes
// -- eventhough it may not actually support
// instances
//
BOOL UnderstandsInstanceCodes() const;
//
// TRUE if the service supports prot://address browsing
//
BOOL HasWebProtocol() const;
//
// Use MMC property pages to show the property sheet for this
// service?
//
BOOL SupportsMMC() const;
//
// Does the service support the extended K2 services?
//
BOOL IsK2Service() const;
//
// Is this service currently selected to be in
// the service view?
//
BOOL IsSelected() const { return m_fIsSelected; }
//
// Select/Deselect this service
//
void SelectService(
IN BOOL fSelected = TRUE
);
//
// Get error return code
//
HRESULT QueryReturnCode() const { return m_hrReturnCode; }
//
// Was the module loaded, and all function ptrs initialised?
//
BOOL InitializedOK() const { return SUCCEEDED(m_hrReturnCode); }
//
// The bitmap indices refer to the index in inetmgr's
// master image list where they are stored, and have nothing
// to do with the resource IDs
//
public:
//
// Get the inetmgr assigned index for the service bitmap
//
int QueryBitmapIndex() const { return m_iBmpID; }
//
// Get the inetmgr assigned index for the child
//
int QueryChildBitmapIndex() const { return m_iBmpChildID; }
//
// Assign the service bitmap index
//
void SetBitmapIndex(IN int iID);
//
// Assign the child bitmap index
//
void SetChildBitmapIndex(IN int iID);
//
// ISM API Functions
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
public:
//
// Return service-specific information back to
// to the application. This function is called
// by the service manager immediately after
// LoadLibary();
//
DWORD ISMQueryServiceInfo(
OUT ISMSERVICEINFO * psi // Service information returned.
);
//
// Perform a discovery (if not using inetsloc discovery)
// The application will call this API the first time with
// a BufferSize of 0, which should return the required buffer
// size. Next it will attempt to allocate a buffer of that
// size, and then pass a pointer to that buffer to the api.
//
DWORD ISMDiscoverServers(
OUT ISMSERVERINFO * psi, // Server info buffer.
IN OUT DWORD * pdwBufferSize, // Size required/available.
OUT int * cServers // Number of servers in buffer.
);
//
// Get information on a single server with regards to
// this service.
//
DWORD ISMQueryServerInfo(
IN LPCTSTR lpszServerName, // Name of server.
OUT ISMSERVERINFO * psi // Server information returned.
);
//
// Change the state of the service (started, stopped, paused) for the
// listed servers.
//
DWORD ISMChangeServiceState(
IN int nNewState, // INetService* definition.
OUT int * pnCurrentState, // Current state information
IN DWORD dwInstance, // /* K2 */ -- Instance number
// (0 - for non-instance)
IN LPCTSTR lpszServers // Double NULL terminated list of servers.
);
//
// The big-one: Show the configuration dialog or
// property sheets, whatever, and allow the user
// to make changes as needed.
//
DWORD ISMConfigureServers(
IN HWND hWnd, // Main app window handle
IN DWORD dwInstance, // /* K2 */ -- Instance number
// (0 - for non-instance)
IN LPCTSTR lpszServers // Double NULL terminated list of servers
);
///////////////////////////////////////////////////////////////////////////
// //
// K2 Methods Below //
// //
///////////////////////////////////////////////////////////////////////////
//
// Bind to a server, and return a HANDLE. This handle is
// merely an opaque identifier that's meaningful to the
// service configuration module.
//
HRESULT ISMBind(
IN LPCTSTR lpszServer, // Server name
OUT HANDLE *phServer // Returns handle
);
//
// Sever the connection. The service configuration
// module does whatever needs to be done to cleanup
//
HRESULT ISMUnbind(
IN HANDLE hServer // Server handle
);
//
// Enumerate instances
//
HRESULT ISMEnumerateInstances(
IN HANDLE hServer, // Server handle
IN OUT ISMINSTANCEINFO * pii, // Instance info buffer
IN OUT HANDLE * pdwEnum // Enumeration handle
);
//
// Add an instance
//
HRESULT ISMAddInstance(
IN HANDLE hServer, // Server handle
IN DWORD dwSourceInstance, // Source instance ID to clone
OUT ISMINSTANCEINFO * pii, // Instance info buffer. May be NULL
IN DWORD dwBufferSize // Size of buffer
);
//
// Delete an instance
//
HRESULT ISMDeleteInstance(
IN HANDLE hServer, // Server handle
IN DWORD dwInstance // Instance to be deleted
);
//
// Get instance specific information.
//
HRESULT ISMQueryInstanceInfo(
IN HANDLE hServer, // Server handle
IN BOOL fInherit, // TRUE to inherit, FALSE otherwise
OUT ISMINSTANCEINFO * pii, // Instance info buffer
IN DWORD dwInstance // Instance number
);
//
// Enumerate children.
//
HRESULT ISMEnumerateChildren(
IN HANDLE hServer, // Server handle
IN OUT ISMCHILDINFO * pii, // Child info buffer
IN OUT HANDLE * phEnum, // Enumeration handle
IN DWORD dwInstance, // Instance
IN LPCTSTR lpszParent // Parent path
);
//
// Add a child
//
HRESULT ISMAddChild(
IN HANDLE hServer, // Server handle
OUT ISMCHILDINFO * pii, // Child info buffer
IN DWORD dwBufferSize, // Size of info buffer
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent // Parent path
);
//
// Delete a child
//
HRESULT ISMDeleteChild(
IN HANDLE hServer, // Server handle
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent, // Parent path
IN LPCTSTR lpszAlias // Alias of child to be deleted
);
//
// Rename a child
//
HRESULT ISMRenameChild(
IN HANDLE hServer, // Server handle
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent, // Parent path
IN LPCTSTR lpszAlias, // Alias of child to be renamed
IN LPCTSTR lpszNewName // New alias of child
);
//
// Configure Child
//
HRESULT ISMConfigureChild(
IN HANDLE hServer, // Server handle
IN HWND hWnd, // Main app window handle
IN DWORD dwAttributes, // Child attributes
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent, // Parent path
IN LPCTSTR lpszAlias // Child alias
);
//
// Get child-specific info
//
HRESULT ISMQueryChildInfo(
IN HANDLE hServer, // Server handle
IN BOOL fInherit, // TRUE to inherit, FALSE otherwise
OUT ISMCHILDINFO * pii, // Child info buffer
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent, // Parent Path ("" for root)
IN LPCTSTR lpszAlias // Alias of child to be deleted
);
//
// Configure servers using MMC property pages
//
HRESULT ISMMMCConfigureServers(
IN HANDLE hServer, // Server handle
IN PVOID lpfnProvider, // MMC Parameter
IN LPARAM param, // MMC Parameter
IN LONG_PTR handle, // MMC Parameter
IN DWORD dwInstance // Instance number
);
//
// Configure Child using MMC property pages
//
HRESULT ISMMMCConfigureChild(
IN HANDLE hServer, // Server handle
IN PVOID lpfnProvider, // MMC Parameter
IN LPARAM param, // MMC Parameter
IN LONG_PTR handle, // MMC Parameter
IN DWORD dwAttributes, // Child attributes
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent, // Parent path
IN LPCTSTR lpszAlias // Child alias
);
//
// Launch security wizard
//
HRESULT ISMSecurityWizard(
HANDLE hServer, // Server handle
DWORD dwInstance, // Instance number
LPCTSTR lpszParent, // Parent path
LPCTSTR lpszAlias // Child alias name
);
//
// Function Pointers
//
protected:
#ifdef USE_VTABLE
//
// ISM Method VTable
//
pfnISMMethod m_rgpfnISMMethods[ISM_NUM_METHODS];
#else // !USE_VTABLE
//
// ISM Api Function pointers
//
pfnQueryServiceInfo m_pfnQueryServiceInfo;
pfnDiscoverServers m_pfnDiscoverServers;
pfnQueryServerInfo m_pfnQueryServerInfo;
pfnChangeServiceState m_pfnChangeServiceState;
pfnConfigure m_pfnConfigure;
pfnBind m_pfnBind;
pfnUnbind m_pfnUnbind;
pfnConfigureChild m_pfnConfigureChild;
pfnEnumerateInstances m_pfnEnumerateInstances;
pfnEnumerateChildren m_pfnEnumerateChildren;
pfnAddInstance m_pfnAddInstance;
pfnDeleteInstance m_pfnDeleteInstance;
pfnAddChild m_pfnAddChild;
pfnDeleteChild m_pfnDeleteChild;
pfnRenameChild m_pfnRenameChild;
pfnQueryInstanceInfo m_pfnQueryInstanceInfo;
pfnQueryChildInfo m_pfnQueryChildInfo;
pfnISMMMCConfigureServers m_pfnISMMMCConfigureServers;
pfnISMMMCConfigureChild m_pfnISMMMCConfigureChild;
pfnISMSecurityWizard m_pfnISMSecurityWizard;
#endif // USE_VTABLE
protected:
static LPCTSTR s_cszSupcfg;
protected:
CServiceInfo * m_psiMaster;
private:
int m_nID; // Service ID
int m_iBmpID; // Bitmap ID index
int m_iBmpChildID; // Child bitmap ID index
CString m_strDLLName; // DLL Name
CString m_strSupDLLName; // Superceed configuration DLL name.
ISMSERVICEINFO m_si; // Service Info.
HINSTANCE m_hModule; // Library handle
HRESULT m_hrReturnCode;
BOOL m_fIsSelected;
};
class CNewInstanceCmd : public CObjectPlus
/*++
Class Description:
New instance command object. MMC adds these items at the machine
node level for create new.
Public Interface:
CNewInstanceCmd : Constructor
GetServiceInfo : Get the service info object
GetMenuCommand : Get the menu command that describes this object
GetTTText : Get the tool tips text
--*/
{
public:
CNewInstanceCmd(
IN CServiceInfo * pServiceInfo
);
public:
CServiceInfo * GetServiceInfo() { return m_pServiceInfo; }
CString & GetMenuCommand() { return m_strMenuCommand; }
CString & GetTTText() { return m_strTTText; }
HINSTANCE QueryInstanceHandle();
private:
CServiceInfo * m_pServiceInfo;
CString m_strMenuCommand;
CString m_strTTText;
};
class CServerInfo : public CObjectPlus
{
/*++
Class Description:
Server info class. Each object describes a single server/service
relationship.
Public Interface:
CServerInfo : Various constructors
~CServerInfo : Destructor
operator= : Assignment operator
CompareByServer : Comparison function to compare server names
CompareByService : Comparison function to compare services
operator == : Comparison operator
CleanServerName : Static function to clean up a computer/hostname
ConfigureServer : Configure instance on this this server
ConfigureChild : Configure child on this server
ChangeServiceState : Change the server or instance state
QueryServerName : Return the API-suitable name
QueryServerDisplayName : Get the display name of the server
GetServerComment : Get the server comment
GetServiceStatePtr : Get service state pointer
QueryServiceState : Find out service state (running,
paused, stopped, unknown)
IsServiceRunning : TRUE if the service is running
IsServiceStopped : TRUE if the service is stopped
IsServicePaused : TRUE if the service is paused
IsServiceStatusUnknown : TRUE if the service status cannot be determined
IsConfigurable : TRUE if the service is configurable
QueryInstanceHandle : Get the config DLL instance handle
IsServiceSelected : TRUE if the service is selected in the toolbar
GetServiceName : Get the (short) service name.
QueryServiceID : Get ID code assigned to the config DLL
CanControlService : TRUE if this service controllable
CanPauseService : TRUE if this service is pausable
SupportsInstances : TRUE if the service supports instances
SupportsChildren : TRUE if the service supports children
UnderstandsInstanceCodes : TRUE if the service understands instance IDs
QueryServiceBitmapID : Get the bitmap resource ID of the service
Refresh : Refresh information
--*/
//
// Construction/Destruction
//
public:
//
// Construct with a server name. This is typically
// in response to a single connection attempt.
//
CServerInfo(
IN LPCTSTR lpszServerName, // Name of this server
OUT ISMSERVERINFO * psi, // Server info
IN CServiceInfo * pServiceInfo // service that found it.
);
//
// Construct with information from the inetsloc discover
// process.
//
CServerInfo(
IN LPCSTR lpszServerName, // Name of this server
IN LPINET_SERVICE_INFO lpisi, // Discovery information
IN CObListPlus & oblServices // List of installed services
);
//
// Copy constructor
//
CServerInfo(
IN const CServerInfo &si
);
~CServerInfo();
//
// Assignment operator
//
const CServerInfo & operator=(
IN const CServerInfo &si
);
//
// Comparison Functions and operators
//
int CompareByServer(IN CServerInfo * psi) const;
//
// Compare server names
//
BOOL MatchServerName(IN LPCTSTR lpszServerName) const;
//
// Compare two services
//
int CompareByService(IN CServerInfo * psi);
//
// Compare two service
//
BOOL operator ==(
IN CServerInfo & si
);
public:
//
// Utility function to clean up a computer/hostname
//
static LPCTSTR CleanServerName(
IN CString & str
);
//
// Server Info Access Functions
//
public:
//
// Perform configuration on this server
//
DWORD ConfigureServer(
IN HWND hWnd, // Window handle
IN DWORD dwInstance = MASTER_INSTANCE // Instance number
);
//
// Configure servers using MMC property pages
//
HRESULT MMMCConfigureServer(
IN PVOID lpfnProvider, // MMC Parameter
IN LPARAM param, // MMC Parameter
IN LONG_PTR handle, // MMC Parameter
IN DWORD dwInstance // Instance number
);
//
// Perform configuration on a child
//
HRESULT ConfigureChild(
IN HWND hWnd, // Window handle
IN DWORD dwAttributes, // Child attributes
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent, // Parent path
IN LPCTSTR lpszAlias // Child alias
);
//
// Perform configuration on a child using MMC property pages
//
HRESULT MMCConfigureChild(
IN PVOID lpfnProvider, // MMC parameter
IN LPARAM param, // MMC parameter
IN LONG_PTR handle, // MMC parameter
IN DWORD dwAttributes, // Child attributes
IN DWORD dwInstance, // Instance number
IN LPCTSTR lpszParent, // Parent path
IN LPCTSTR lpszAlias // Child alias
);
//
// Rename a child node
//
HRESULT RenameChild(
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent, // Parent path
IN LPCTSTR lpszAlias, // Alias of child to be renamed
IN LPCTSTR lpszNewName // New alias of child
);
//
// Add a child
//
HRESULT AddChild(
IN ISMCHILDINFO * pii, // Child info buffer or NULL
IN DWORD dwBufferSize, // Size of info buffer
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent // Parent Path ("" for root)
);
//
// Delete a child
//
HRESULT DeleteChild(
IN DWORD dwInstance, // Parent instance
IN LPCTSTR lpszParent, // Parent Path ("" for root)
IN LPCTSTR lpszAlias // Alias of child to be deleted
);
//
// Get instance specific information
//
HRESULT QueryInstanceInfo(
IN BOOL fInherit, // TRUE to inherit,
// FALSE otherwise
OUT ISMINSTANCEINFO * pii, // Returns instance info
IN DWORD dwInstance // Instance number
);
//
// Get child specific information
//
HRESULT QueryChildInfo(
IN BOOL fInherit, // TRUE to inherit,
// FALSE otherwise
OUT ISMCHILDINFO * pii, // Returns child info
IN DWORD dwInstance, // Instance number
IN LPCTSTR lpszParent, // Parent path
IN LPCTSTR lpszAlias // Alias name
);
//
// Add an instance
//
HRESULT AddInstance(
OUT ISMINSTANCEINFO * pii, // Instance info buffer or NULL
IN DWORD dwBufferSize // Size of buffer
);
//
// Delete an instance
//
HRESULT DeleteInstance(
IN DWORD dwInstance // Instance to be deleted
);
//
// Enumerate children.
//
HRESULT ISMEnumerateChildren(
IN OUT ISMCHILDINFO * pii, // Child info buffer
IN OUT HANDLE * phEnum, // Enumeration handle
IN DWORD dwInstance, // Instance
IN LPCTSTR lpszParent // Parent path
);
//
// Enumerate instances
//
HRESULT ISMEnumerateInstances(
IN OUT ISMINSTANCEINFO * pii, // Instance info buffer
IN OUT HANDLE * pdwEnum // Enumeration handle
);
//
// Launch security wizard
//
HRESULT ISMSecurityWizard(
DWORD dwInstance, // Instance number
LPCTSTR lpszParent, // Parent path
LPCTSTR lpszAlias // Child alias name
);
//
// Change service state
//
DWORD ChangeServiceState(
IN int nNewState, // New state to set
OUT int * pnCurrentState, // Returns current state
IN DWORD dwInstance = MASTER_INSTANCE // Instance number
);
//
// Return the API-suitable name (with
// backslashes)
//
LPCTSTR QueryServerName() const { return (LPCTSTR)m_strServerName; }
//
// Return the name without backslashes,
// suitable for display.
//
LPCTSTR QueryServerDisplayName() const;
//
// Obtain the server comment
//
CString & GetServerComment() { return m_strComment; }
//
// Allow modification
//
int * GetServiceStatePtr() { return &m_nServiceState; }
//
// Find out service state (running, stopped, paused)
//
int QueryServiceState() const { return m_nServiceState; }
//
// Return TRUE if the service is currently running
//
BOOL IsServiceRunning() const;
//
// Return TRUE if the service is currently stopped
//
BOOL IsServiceStopped() const;
//
// Return TRUE if the service is currently paused
//
BOOL IsServicePaused() const;
//
// Return TRUE if the service status is unknown
//
BOOL IsServiceStatusUnknown() const;
//
// Were we able to match it up to one of our installed services?
//
BOOL IsConfigurable() const { return m_pService != NULL; }
//
// Service Info Access Functions
//
public:
//
// Attempt to rebind lost connection...
//
HRESULT ISMRebind();
//
// Get the service info object
//
CServiceInfo * GetServiceInfo() { return m_pService; }
//
// Get the short name for this service
//
LPCTSTR GetShortName() const;
//
// Get the longer name for this service
//
LPCTSTR GetLongName() const;
//
// Get Server Handle
//
HANDLE GetHandle() { return m_hServer; }
//
// Get the protocol for this service (if any)
//
LPCTSTR GetProtocol() const;
//
// Get the metabase name for this service (if any)
//
LPCTSTR GetMetabaseName() const;
//
// Get the instance handle for the dll
//
HINSTANCE QueryInstanceHandle();
//
// Check to see if we're in the service mask -- that
// is, is the button depressed, and should we show
// this service in the view?
//
BOOL IsServiceSelected() const;
//
// Get the (short) service name.
//
LPCTSTR GetServiceName() const;
//
// Get the assigned service ID
//
int QueryServiceID() const;
//
// Get the assigned bitmap index for this service
//
int QueryBitmapIndex() const;
//
// Get the assigned child bitmap index
//
int QueryChildBitmapIndex() const;
//
// Is this service controllable?
//
BOOL CanControlService() const;
//
// Is the service pausable?
//
BOOL CanPauseService() const;
//
// Does the service support instances?
//
BOOL SupportsInstances() const;
//
// Does the service support children?
//
BOOL SupportsChildren() const;
//
// Use file system?
//
BOOL SupportsFileSystem() const;
//
// TRUE if the service supports a security wizard
//
BOOL SupportsSecurityWizard() const;
//
// Does the service understance instance ID codes
// -- eventhough it may not actually support
// instances
//
BOOL UnderstandsInstanceCodes() const;
//
// TRUE if the service supports prot://address browsing
//
BOOL HasWebProtocol() const;
//
// Use MMC property pages to show the property sheet for this
// service?
//
BOOL SupportsMMC() const;
//
// Does the service support the extended K2 services?
//
BOOL IsK2Service() const;
//
// Get the service bitmap ID (used for display
// in some views)
//
UINT QueryServiceBitmapID() const;
//
// Refresh information
//
DWORD Refresh();
protected:
//
// Given the inetsloc mask, return the service this
// fits. Return NULL if the service was not found.
//
static CServiceInfo * FindServiceByMask(
ULONGLONG ullTarget,
CObListPlus & oblServices
);
private:
//
// Name is maintained in API friendly format
//
CString m_strServerName;
//
// Maintain server handle for K2 services
//
HANDLE m_hServer;
//
// comment
//
CString m_strComment;
//
// Service state (started/stopped/paused)
//
int m_nServiceState;
//
// A pointer referring back to the service that
// it belongs to. This class does not own
// this pointer.
//
CServiceInfo * m_pService;
};
class CSnapinApp : public CWinApp
/*++
Class Description:
Main app object
Public Interface:
InitInstance : Instance initiation handler
ExitInstance : Exit instance handler
--*/
{
//
// Initialization
//
public:
CSnapinApp();
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//
// Access
//
public:
void SetHelpPath(CServerInfo * pItem = NULL);
LPCTSTR QueryInetMgrHelpPath() const { return m_strInetMgrHelpPath; }
protected:
//{{AFX_MSG(CSnapinApp)
afx_msg void OnHelp();
afx_msg void OnContextHelp();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
LPCTSTR m_lpOriginalHelpPath;
CString m_strHelpPath;
CString m_strInetMgrHelpPath;
};
//
// Inline Expansion
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
inline BOOL CServiceInfo::IsSuperDllFor(CServiceInfo * pTarget) const
{
return pTarget->m_strSupDLLName.CompareNoCase(m_strDLLName) == 0;
}
inline void CServiceInfo::AssignSuperDll(CServiceInfo * pTarget)
{
ASSERT(m_psiMaster == NULL);
m_psiMaster = pTarget;
}
inline CServiceInfo * CServiceInfo::GetSuperDll()
{
ASSERT(m_psiMaster != NULL);
return m_psiMaster;
}
inline BOOL CServiceInfo::UseInetSlocDiscover() const
{
return (m_si.flServiceInfoFlags & ISMI_INETSLOCDISCOVER) != 0;
}
inline BOOL CServiceInfo::CanControlService() const
{
return (m_si.flServiceInfoFlags & ISMI_CANCONTROLSERVICE) != 0;
}
inline BOOL CServiceInfo::CanPauseService() const
{
return (m_si.flServiceInfoFlags & ISMI_CANPAUSESERVICE) != 0;
}
inline BOOL CServiceInfo::UseNormalColorMapping() const
{
return (m_si.flServiceInfoFlags & ISMI_NORMALTBMAPPING) != 0;
}
inline BOOL CServiceInfo::SupportsFileSystem() const
{
return (m_si.flServiceInfoFlags & ISMI_FILESYSTEM) != 0;
}
inline BOOL CServiceInfo::SupportsSecurityWizard() const
{
return (m_si.flServiceInfoFlags & ISMI_SECURITYWIZARD) != 0;
}
inline BOOL CServiceInfo::SupportsInstances() const
{
return (m_si.flServiceInfoFlags & ISMI_INSTANCES) != 0;
}
inline BOOL CServiceInfo::SupportsChildren() const
{
return (m_si.flServiceInfoFlags & ISMI_CHILDREN) != 0;
}
inline BOOL CServiceInfo::UnderstandsInstanceCodes() const
{
return (m_si.flServiceInfoFlags & ISMI_UNDERSTANDINSTANCE) != 0;
}
inline BOOL CServiceInfo::HasWebProtocol() const
{
return (m_si.flServiceInfoFlags & ISMI_HASWEBPROTOCOL) != 0;
}
inline BOOL CServiceInfo::SupportsMMC() const
{
#ifdef USE_VTABLE
return m_rgpfnISMMethods[ISM_MMC_CONFIGURE] != NULL;
#else
return m_pfnISMMMCConfigureServers != NULL;
#endif // USE_VTABLE
}
inline BOOL CServiceInfo::IsK2Service() const
{
#ifdef USE_VTABLE
return m_rgpfnISMMethods[ISM_BIND] != NULL;
#else
return m_pfnBind != NULL;
#endif // USE_VTABLE
}
inline void CServiceInfo::SelectService(BOOL fSelected)
{
m_fIsSelected = fSelected;
}
#ifdef USE_VTABLE
//
// Helper Macros to access VTable
//
#define ISM_VTABLE_ENTRY(iID)\
(m_rgpfnISMMethods[iID] != NULL)
#define ISM_NO_VTABLE_ENTRY(iID)\
(m_rgpfnISMMethods[iID] == NULL)
#define ASSERT_VTABLE_ENTRY(iID)\
ASSERT(iID >= 0 && iID < ISM_NUM_METHODS);\
ASSERT(ISM_VTABLE_ENTRY(iID));
#define ISM_VTABLE(iID)\
(*m_rgpfnISMMethods[iID])
inline DWORD CServiceInfo::ISMDiscoverServers(
OUT ISMSERVERINFO * psi,
IN OUT DWORD * pdwBufferSize,
OUT int * pcServers
)
{
ASSERT_VTABLE_ENTRY(ISM_DISCOVER_SERVERS);
return ISM_VTABLE(ISM_DISCOVER_SERVERS)(
psi,
pdwBufferSize,
pcServers
);
}
inline DWORD CServiceInfo::ISMChangeServiceState(
IN int nNewState,
OUT int * pnCurrentState,
IN DWORD dwInstance,
IN LPCTSTR lpszServers
)
{
ASSERT_VTABLE_ENTRY(ISM_CHANGE_SERVICE_STATE);
return ISM_VTABLE(ISM_CHANGE_SERVICE_STATE)(
nNewState,
pnCurrentState,
dwInstance,
lpszServers
);
}
inline DWORD CServiceInfo::ISMConfigureServers(
IN HWND hWnd,
IN DWORD dwInstance,
IN LPCTSTR lpszServers
)
{
ASSERT_VTABLE_ENTRY(ISM_CONFIGURE);
return ISM_VTABLE(ISM_CONFIGURE)(
hWnd,
dwInstance,
lpszServers
);
}
inline HRESULT CServiceInfo::ISMBind(
IN LPCTSTR lpszServer,
OUT HANDLE *phServer
)
{
ASSERT_VTABLE_ENTRY(ISM_BIND);
return ISM_VTABLE(ISM_BIND)(lpszServer, phServer);
}
inline HRESULT CServiceInfo::ISMUnbind(
IN HANDLE hServer
)
{
ASSERT_VTABLE_ENTRY(ISM_UNBIND);
return ISM_VTABLE(ISM_UNBIND)(hServer);
}
inline HRESULT CServiceInfo::ISMEnumerateInstances(
IN HANDLE hServer,
IN OUT ISMINSTANCEINFO * pii,
IN OUT HANDLE * phEnum
)
{
ASSERT_VTABLE_ENTRY(ISM_ENUMERATE_INSTANCES);
return ISM_VTABLE(ISM_ENUMERATE_INSTANCES)(
hServer,
pii,
phEnum
);
}
inline HRESULT CServiceInfo::ISMAddInstance(
IN HANDLE hServer,
IN DWORD dwSourceInstance,
OUT ISMINSTANCEINFO * pii,
IN DWORD dwBufferSize
)
{
ASSERT_VTABLE_ENTRY(ISM_ADD_INSTANCE);
return ISM_VTABLE(ISM_ADD_INSTANCE)(
hServer,
dwSourceInstance,
pii,
dwBufferSize
);
}
inline HRESULT CServiceInfo::ISMDeleteInstance(
IN HANDLE hServer,
IN DWORD dwInstance
)
{
ASSERT_VTABLE_ENTRY(ISM_DELETE_INSTANCE);
return ISM_VTABLE(ISM_DELETE_INSTANCE)(
hServer,
dwInstance
);
}
inline HRESULT CServiceInfo::ISMQueryInstanceInfo(
IN HANDLE hServer,
IN BOOL fInherit,
OUT ISMINSTANCEINFO * pii,
IN DWORD dwInstance
)
{
ASSERT_VTABLE_ENTRY(ISM_QUERY_INSTANCE_INFO);
return ISM_VTABLE(ISM_QUERY_INSTANCE_INFO)(
hServer,
fInherit,
pii,
dwInstance
);
}
inline HRESULT CServiceInfo::ISMEnumerateChildren(
IN HANDLE hServer,
IN OUT ISMCHILDINFO * pii,
IN OUT HANDLE * pdwEnum,
IN DWORD dwInstance,
IN LPCTSTR lpszParent
)
{
ASSERT_VTABLE_ENTRY(ISM_ENUMERATE_CHILDREN);
return ISM_VTABLE(ISM_ENUMERATE_CHILDREN)(
hServer,
pii,
pdwEnum,
dwInstance,
lpszParent
);
}
inline HRESULT CServiceInfo::ISMQueryChildInfo(
IN HANDLE hServer,
IN BOOL fInherit,
OUT ISMCHILDINFO * pii,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT_VTABLE_ENTRY(ISM_QUERY_CHILD_INFO);
return ISM_VTABLE(ISM_QUERY_CHILD_INFO)(
hServer,
fInherit,
pii,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServiceInfo::ISMConfigureChild(
IN HANDLE hServer,
IN HWND hWnd,
IN DWORD dwAttributes,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT_VTABLE_ENTRY(ISM_CONFIGURE_CHILD);
return ISM_VTABLE(ISM_CONFIGURE_CHILD)(
hServer,
hWnd,
dwAttributes,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServiceInfo::ISMAddChild(
IN HANDLE hServer,
OUT ISMCHILDINFO * pii,
IN DWORD dwBufferSize,
IN DWORD dwInstance,
IN LPCTSTR lpszParent
)
{
ASSERT_VTABLE_ENTRY(ISM_ADD_CHILD);
return ISM_VTABLE(ISM_ADD_CHILD)(
hServer,
pii,
dwBufferSize,
dwInstance,
lpszParent
);
}
inline HRESULT CServiceInfo::ISMSecurityWizard(
HANDLE hServer,
DWORD dwInstance,
LPCTSTR lpszParent,
LPCTSTR lpszAlias
)
{
ASSERT_VTABLE_ENTRY(ISM_SECURITY_WIZARD);
return ISM_VTABLE(ISM_SECURITY_WIZARD)(
hServer,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServiceInfo::ISMDeleteChild(
IN HANDLE hServer,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT_VTABLE_ENTRY(ISM_DELETE_CHILD);
return ISM_VTABLE(ISM_DELETE_CHILD)(
hServer,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServiceInfo::ISMRenameChild(
IN HANDLE hServer,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias,
IN LPCTSTR lpszNewAlias
)
{
ASSERT_VTABLE_ENTRY(ISM_RENAME_CHILD);
return ISM_VTABLE(ISM_RENAME_CHILD)(
hServer,
dwInstance,
lpszParent,
lpszAlias,
lpszNewAlias
);
}
inline HRESULT CServiceInfo::ISMMMCConfigureServers(
IN HANDLE hServer,
IN PVOID lpfnProvider,
IN LPARAM param,
IN LONG_PTR handle,
IN DWORD dwInstance
)
{
ASSERT_VTABLE_ENTRY(ISM_MMC_CONFIGURE);
return ISM_VTABLE(ISM_MMC_CONFIGURE)(
hServer,
lpfnProvider,
param,
handle,
dwInstance
);
}
inline HRESULT CServiceInfo::ISMMMCConfigureChild(
IN HANDLE hServer,
IN PVOID lpfnProvider,
IN LPARAM param,
IN LONG_PTR handle,
IN DWORD dwAttributes,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT_VTABLE_ENTRY(ISM_MMC_CONFIGURE_CHILD);
return ISM_VTABLE(ISM_MMC_CONFIGURE_CHILD)(
hServer,
lpfnProvider,
param,
handle,
dwAttributes,
dwInstance,
lpszParent,
lpszAlias
);
}
#else ! USE_VTABLE
inline DWORD CServiceInfo::ISMDiscoverServers(
OUT ISMSERVERINFO * psi,
IN OUT DWORD * pdwBufferSize,
OUT int * pcServers
)
{
ASSERT(m_pfnDiscoverServers != NULL);
return (*m_pfnDiscoverServers)(psi, pdwBufferSize, pcServers);
}
inline DWORD CServiceInfo::ISMChangeServiceState(
IN int nNewState,
OUT int * pnCurrentState,
IN DWORD dwInstance,
IN LPCTSTR lpszServers
)
{
ASSERT(m_pfnChangeServiceState != NULL);
return (*m_pfnChangeServiceState)(
nNewState,
pnCurrentState,
dwInstance,
lpszServers
);
}
inline DWORD CServiceInfo::ISMConfigureServers(
IN HWND hWnd,
IN DWORD dwInstance,
IN LPCTSTR lpszServers
)
{
ASSERT(m_pfnConfigure != NULL);
return (*m_pfnConfigure)(hWnd, dwInstance, lpszServers);
}
inline HRESULT CServiceInfo::ISMBind(
IN LPCTSTR lpszServer,
OUT HANDLE *phServer
)
{
ASSERT(m_pfnBind != NULL);
return (*m_pfnBind)(lpszServer, phServer);
}
inline HRESULT CServiceInfo::ISMUnbind(
IN HANDLE hServer
)
{
ASSERT(m_pfnUnbind != NULL);
return (*m_pfnUnbind)(hServer);
}
inline HRESULT CServiceInfo::ISMEnumerateInstances(
IN HANDLE hServer,
IN OUT ISMINSTANCEINFO * pii,
IN OUT HANDLE * phEnum
)
{
ASSERT(m_pfnEnumerateInstances != NULL);
return (*m_pfnEnumerateInstances)(hServer, pii, phEnum);
}
inline HRESULT CServiceInfo::ISMEnumerateChildren(
IN HANDLE hServer,
IN OUT ISMCHILDINFO * pii,
IN OUT HANDLE * phEnum,
IN DWORD dwInstance,
IN LPCTSTR lpszParent
)
{
ASSERT(m_pfnEnumerateChildren != NULL);
return (*m_pfnEnumerateChildren)(
hServer,
pii,
phEnum,
dwInstance,
lpszParent
);
}
inline HRESULT CServiceInfo::ISMConfigureChild(
IN HANDLE hServer,
IN HWND hWnd,
IN DWORD dwAttributes,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT(m_pfnConfigureChild != NULL);
return (*m_pfnConfigureChild)(
hServer,
hWnd,
dwAttributes,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServiceInfo::ISMAddInstance(
IN HANDLE hServer,
IN DWORD dwSourceInstance,
OUT ISMINSTANCEINFO * pii,
IN DWORD dwBufferSize
)
{
ASSERT(m_pfnAddInstance != NULL);
return (*m_pfnAddInstance)(hServer, dwSourceInstance, pii, dwBufferSize);
}
inline HRESULT CServiceInfo::ISMDeleteInstance(
IN HANDLE hServer,
IN DWORD dwInstance
)
{
ASSERT(m_pfnDeleteInstance != NULL);
return (*m_pfnDeleteInstance)(hServer, dwInstance);
}
inline HRESULT CServiceInfo::ISMQueryInstanceInfo(
IN HANDLE hServer,
IN BOOL fInherit,
OUT ISMINSTANCEINFO * pii,
IN DWORD dwInstance
)
{
ASSERT(m_pfnQueryInstanceInfo != NULL);
return (*m_pfnQueryInstanceInfo)(hServer, fInherit, pii, dwInstance);
}
inline HRESULT CServiceInfo::ISMQueryChildInfo(
IN HANDLE hServer,
IN BOOL fInherit,
OUT ISMCHILDINFO * pii,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT(m_pfnQueryChildInfo != NULL);
return (*m_pfnQueryChildInfo)(
hServer,
fInherit,
pii,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServiceInfo::ISMAddChild(
IN HANDLE hServer,
OUT ISMCHILDINFO * pii,
IN DWORD dwBufferSize,
IN DWORD dwInstance,
IN LPCTSTR lpszParent
)
{
ASSERT(m_pfnAddChild != NULL);
return (*m_pfnAddChild)(
hServer,
pii,
dwBufferSize,
dwInstance,
lpszParent
);
}
inline HRESULT CServiceInfo::ISMSecurityWizard(
HANDLE hServer,
DWORD dwInstance,
LPCTSTR lpszParent,
LPCTSTR lpszAlias
)
{
ASSERT(m_pfnISMSecurityWizard != NULL);
return (*m_pfnISMSecurityWizard)(
hServer,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServiceInfo::ISMDeleteChild(
IN HANDLE hServer,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT(m_pfnDeleteChild != NULL);
return (*m_pfnDeleteChild)(hServer, dwInstance, lpszParent, lpszAlias);
}
inline HRESULT CServiceInfo::ISMRenameChild(
IN HANDLE hServer,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias,
IN LPCTSTR lpszNewAlias
)
{
ASSERT(m_pfnDeleteChild != NULL);
return (*m_pfnRenameChild)(
hServer,
dwInstance,
lpszParent,
lpszAlias,
lpszNewAlias
);
}
inline HRESULT CServiceInfo::ISMMMCConfigureServers(
IN HANDLE hServer,
IN PVOID lpfnProvider,
IN LPARAM param,
IN LONG_PTR handle,
IN DWORD dwInstance
)
{
ASSERT(m_pfnISMMMCConfigureServers != NULL);
return (*m_pfnISMMMCConfigureServers)(
hServer,
lpfnProvider,
param,
handle,
dwInstance
);
}
inline HRESULT CServiceInfo::ISMMMCConfigureChild(
IN HANDLE hServer,
IN PVOID lpfnProvider,
IN LPARAM param,
IN LONG_PTR handle,
IN DWORD dwAttributes,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT(m_pfnISMMMCConfigureChild != NULL);
return (*m_pfnISMMMCConfigureChild)(
hServer,
lpfnProvider,
param,
handle,
dwAttributes,
dwInstance,
lpszParent,
lpszAlias
);
}
#endif // USE_VTABLE
//
// Assign the service bitmap index
//
inline void CServiceInfo::SetBitmapIndex(int iID)
{
m_iBmpID = iID;
}
//
// Assign the child bitmap index
//
inline void CServiceInfo::SetChildBitmapIndex(int iID)
{
m_iBmpChildID = iID;
}
inline HINSTANCE CNewInstanceCmd::QueryInstanceHandle()
{
return GetServiceInfo()->QueryInstanceHandle();
}
inline int CServerInfo::CompareByServer(CServerInfo * psi) const
{
return ::lstrcmpi(
QueryServerDisplayName(),
psi->QueryServerDisplayName()
);
}
inline BOOL CServerInfo::MatchServerName(LPCTSTR lpszServerName) const
{
return ::lstrcmpi(QueryServerDisplayName(), lpszServerName) == 0;
}
inline int CServerInfo::CompareByService(CServerInfo * psi)
{
return ::lstrcmpi(GetServiceName(), psi->GetServiceName());
}
inline HRESULT CServerInfo::ConfigureChild(
IN HWND hWnd,
IN DWORD dwAttributes,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT(m_pService);
return m_pService->ISMConfigureChild(
m_hServer,
hWnd,
dwAttributes,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServerInfo::MMCConfigureChild(
IN PVOID lpfnProvider,
IN LPARAM param,
IN LONG_PTR handle,
IN DWORD dwAttributes,
IN DWORD dwInstance,
IN LPCTSTR lpszParent,
IN LPCTSTR lpszAlias
)
{
ASSERT(m_pService);
return m_pService->ISMMMCConfigureChild(
m_hServer,
lpfnProvider,
param,
handle,
dwAttributes,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServerInfo::RenameChild(
DWORD dwInstance,
LPCTSTR lpszParent,
LPCTSTR lpszAlias,
LPCTSTR lpszNewName
)
{
ASSERT(m_pService);
return m_pService->ISMRenameChild(
m_hServer,
dwInstance,
lpszParent,
lpszAlias,
lpszNewName
);
}
inline HRESULT CServerInfo::AddChild(
ISMCHILDINFO * pii,
DWORD dwBufferSize,
DWORD dwInstance,
LPCTSTR lpszParent
)
{
ASSERT(m_pService);
return m_pService->ISMAddChild(
m_hServer,
pii,
dwBufferSize,
dwInstance,
lpszParent
);
}
inline HRESULT CServerInfo::ISMSecurityWizard(
DWORD dwInstance, // Instance number
LPCTSTR lpszParent, // Parent path
LPCTSTR lpszAlias // Child alias name
)
{
ASSERT(m_pService);
return m_pService->ISMSecurityWizard(
m_hServer,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServerInfo::DeleteChild(
DWORD dwInstance,
LPCTSTR lpszParent,
LPCTSTR lpszAlias
)
{
ASSERT(m_pService);
return m_pService->ISMDeleteChild(
m_hServer,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServerInfo::QueryInstanceInfo(
BOOL fInherit,
ISMINSTANCEINFO * pii,
DWORD dwInstance
)
{
ASSERT(m_pService);
return m_pService->ISMQueryInstanceInfo(
m_hServer,
fInherit,
pii,
dwInstance
);
}
inline HRESULT CServerInfo::QueryChildInfo(
BOOL fInherit,
ISMCHILDINFO * pii,
DWORD dwInstance,
LPCTSTR lpszParent,
LPCTSTR lpszAlias
)
{
ASSERT(m_pService);
return m_pService->ISMQueryChildInfo(
m_hServer,
fInherit,
pii,
dwInstance,
lpszParent,
lpszAlias
);
}
inline HRESULT CServerInfo::AddInstance(
ISMINSTANCEINFO * pii,
DWORD dwBufferSize
)
{
ASSERT(m_pService);
return m_pService->ISMAddInstance(
m_hServer,
0L, // Source instance
pii,
dwBufferSize
);
}
inline HRESULT CServerInfo::DeleteInstance(
DWORD dwInstance
)
{
ASSERT(m_pService);
return m_pService->ISMDeleteInstance(m_hServer, dwInstance);
}
inline HRESULT CServerInfo::ISMEnumerateChildren(
ISMCHILDINFO * pii,
HANDLE * phEnum,
DWORD dwInstance,
LPCTSTR lpszParent
)
{
ASSERT(m_pService);
return m_pService->ISMEnumerateChildren(
m_hServer,
pii,
phEnum,
dwInstance,
lpszParent
);
}
inline HRESULT CServerInfo::ISMEnumerateInstances(
ISMINSTANCEINFO * pii,
HANDLE * pdwEnum
)
{
ASSERT(m_pService);
return m_pService->ISMEnumerateInstances(m_hServer, pii, pdwEnum);
}
inline LPCTSTR CServerInfo::QueryServerDisplayName() const
{
#ifdef ENFORCE_NETBIOS
return ((LPCTSTR)m_strServerName) + 2;
#else
return (LPCTSTR)m_strServerName;
#endif // ENFORCE_NETBIOS
}
inline BOOL CServerInfo::IsServiceRunning() const
{
return m_nServiceState == INetServiceRunning;
}
inline BOOL CServerInfo::IsServiceStopped() const
{
return m_nServiceState == INetServiceStopped;
}
inline BOOL CServerInfo::IsServicePaused() const
{
return m_nServiceState == INetServicePaused;
}
inline BOOL CServerInfo::IsServiceStatusUnknown() const
{
return m_nServiceState == INetServiceUnknown;
}
inline HINSTANCE CServerInfo::QueryInstanceHandle()
{
ASSERT(m_pService != NULL);
return m_pService->QueryInstanceHandle();
}
inline BOOL CServerInfo::IsServiceSelected() const
{
ASSERT(m_pService != NULL);
return m_pService->IsSelected();
}
inline LPCTSTR CServerInfo::GetServiceName() const
{
ASSERT(m_pService != NULL);
return m_pService->GetShortName();
}
inline int CServerInfo::QueryServiceID() const
{
ASSERT(m_pService != NULL);
return m_pService->QueryServiceID();
}
inline int CServerInfo::QueryBitmapIndex() const
{
ASSERT(m_pService != NULL);
return m_pService->QueryBitmapIndex();
}
inline int CServerInfo::QueryChildBitmapIndex() const
{
ASSERT(m_pService != NULL);
return m_pService->QueryChildBitmapIndex();
}
inline LPCTSTR CServerInfo::GetShortName() const
{
ASSERT(m_pService != NULL);
return m_pService->GetShortName();
}
inline LPCTSTR CServerInfo::GetLongName() const
{
ASSERT(m_pService != NULL);
return m_pService->GetLongName();
}
inline LPCTSTR CServerInfo::GetProtocol() const
{
ASSERT(m_pService != NULL);
return m_pService->GetProtocol();
}
inline LPCTSTR CServerInfo::GetMetabaseName() const
{
ASSERT(m_pService != NULL);
return m_pService->GetMetabaseName();
}
inline BOOL CServerInfo::CanControlService() const
{
ASSERT(m_pService != NULL);
return m_pService->CanControlService();
}
inline BOOL CServerInfo::CanPauseService() const
{
ASSERT(m_pService != NULL);
return m_pService->CanPauseService();
}
inline BOOL CServerInfo::SupportsInstances() const
{
ASSERT(m_pService != NULL);
return m_pService->SupportsInstances();
}
inline BOOL CServerInfo::SupportsChildren() const
{
ASSERT(m_pService != NULL);
return m_pService->SupportsChildren();
}
inline BOOL CServerInfo::SupportsFileSystem() const
{
ASSERT(m_pService != NULL);
return m_pService->SupportsFileSystem();
}
inline BOOL CServerInfo::SupportsSecurityWizard() const
{
ASSERT(m_pService != NULL);
return m_pService->SupportsSecurityWizard();
}
inline BOOL CServerInfo::UnderstandsInstanceCodes() const
{
ASSERT(m_pService != NULL);
return m_pService->UnderstandsInstanceCodes();
}
inline BOOL CServerInfo::HasWebProtocol() const
{
ASSERT(m_pService != NULL);
return m_pService->HasWebProtocol();
}
inline BOOL CServerInfo::SupportsMMC() const
{
ASSERT(m_pService != NULL);
return m_pService->SupportsMMC();
}
inline BOOL CServerInfo::IsK2Service() const
{
ASSERT(m_pService != NULL);
return m_pService->IsK2Service();
}
inline UINT CServerInfo::QueryServiceBitmapID() const
{
ASSERT(m_pService != NULL);
return m_pService->QueryServiceBitmapID();
}
extern CSnapinApp theApp;
#include "iisobj.h"
#include "menuex.h"
#endif // _INETMGR_H