//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: cisvc.hxx
//
// Contents: Interfaces to CI Filter service
//
// History: 07-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
#if !defined( __CIFILTERSERVICECONTROLS_HXX__ )
#define __CIFILTERSERVICECONTROLS_HXX__
static WCHAR * wcsCiFilterServiceName = L"CiFilter";
//+-------------------------------------------------------------------------
//
// Class: CCiFilterServiceCommand
//
// Purpose: To build 1-byte command buffers used to transmit command to
// the Ci Filter Service.
//
// History: 23-Jun-94 DwightKr Created
//
// Notes: The SMALLEST legal user-defined command issued to a service
// is 128. In fact, the allowable range is 128-255. Hence
// we'll force the high bits such that they are the service
// command, and by making the smallest command code 4, the top
// bit in the command byte will always be 1, hence the smallest
// numerical value will be 128.
//
//--------------------------------------------------------------------------
class CCiFilterServiceCommand
{
public:
enum ServiceCommand { SERVICE_DELETE_DRIVE=4,
SERVICE_ADD_DRIVE,
SERVICE_REFRESH,
SERVICE_SCANDISK };
enum ServiceOperand { SERVICE_REFRESH_REGISTRY,
SERVICE_REFRESH_DRIVELIST };
inline CCiFilterServiceCommand(ServiceCommand Action,
const ULONG drive);
inline CCiFilterServiceCommand( ULONG ulCommand );
inline operator DWORD () { return *((DWORD *) this) & 0xFF; }
inline WCHAR const GetDriveLetter() { return (WCHAR) (_operand + L'A'); }
inline unsigned const GetOperand() { return (unsigned) _operand; }
inline unsigned const GetAction() { return _action; }
private:
const ULONG _operand : 5; // Allows for 32 drives
const ULONG _action : 3; // Smallest command must be 4
};
//+-------------------------------------------------------------------------
//--------------------------------------------------------------------------
inline CCiFilterServiceCommand::CCiFilterServiceCommand(ServiceCommand action,
const ULONG operand) :
_action(action),
_operand(operand)
{
}
//+-------------------------------------------------------------------------
//--------------------------------------------------------------------------
inline CCiFilterServiceCommand::CCiFilterServiceCommand( ULONG ulCommand ) :
_action( (ulCommand >> 5) & 0x7 ),
_operand( ulCommand & 0x1F )
{
}
//+-------------------------------------------------------------------------
//
// Class: CControlCiFilterService
//
// Purpose: To allow applications to send CI Filter Service specific
// commands to the service.
//
// History: 23-Jun-94 DwightKr Created
//
// Notes: This is the interface applications can use to communicate
// with the CI Filter Service. Currently two operations on the
// service are supported: disable filtering on a specific drive,
// and enable filtering. These operations are for the current
// session only. If then system is rebooted, then all OFS drives
// will be enabled.
//
// To perminately disable filtering on a OFS drive, a bit in the
// OFS volume must be set to disable filtering permenatly.
//
// The CControlCiFilterService object can be used as follows:
//
// {
// CControlCiFIlterService controlCiService;
//
// if ( !controlCiService.Ok() ) return GetLastError();
// BOOL fSuccess = controlCiService.StopFiltering( L"D:" );
//
// .
// .
// .
//
//
// fSuccess = controlCiService.StartFiltering( L"D:" );
// }
//
//
//--------------------------------------------------------------------------
class CControlCiFilterService
{
public :
CControlCiFilterService() :
_hManager( OpenSCManager( NULL, NULL, SC_MANAGER_CONNECT ) ),
_hService( OpenService( _hManager, wcsCiFilterServiceName, SERVICE_ALL_ACCESS ) )
{
}
~CControlCiFilterService()
{
CloseServiceHandle( _hService );
CloseServiceHandle( _hManager );
}
BOOL Ok() const { return (_hManager != NULL && _hService != NULL); }
BOOL StartFiltering( WCHAR * wcsDrive )
{
int drive = StringToDrive( wcsDrive );
if ( -1 == drive )
{
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
CCiFilterServiceCommand command(CCiFilterServiceCommand::SERVICE_ADD_DRIVE,
drive);
return ControlService(_hService, command, &_Status);
}
BOOL StopFiltering( WCHAR * wcsDrive )
{
int drive = StringToDrive( wcsDrive );
if ( -1 == drive )
{
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
CCiFilterServiceCommand command(CCiFilterServiceCommand::SERVICE_DELETE_DRIVE,
drive);
return ControlService(_hService, command, &_Status);
}
BOOL ScanDisk( WCHAR * wcsDrive )
{
int drive = StringToDrive( wcsDrive );
if ( -1 == drive )
{
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
CCiFilterServiceCommand command(CCiFilterServiceCommand::SERVICE_SCANDISK,
drive);
return ControlService(_hService, command, &_Status);
}
BOOL Refresh()
{
CCiFilterServiceCommand command(CCiFilterServiceCommand::SERVICE_REFRESH,
CCiFilterServiceCommand::SERVICE_REFRESH_DRIVELIST );
return ControlService(_hService, command, &_Status);
}
SERVICE_STATUS * GetStatus() { return &_Status; }
private:
int StringToDrive(WCHAR * wcsDrive)
{
if ( *wcsDrive >= L'a' && *wcsDrive <= L'z' )
return *wcsDrive - L'a';
else if ( *wcsDrive >= L'A' && *wcsDrive <= L'Z' )
return *wcsDrive - L'A';
else
return -1;
}
SERVICE_STATUS _Status;
const SC_HANDLE _hManager;
const SC_HANDLE _hService;
};
#endif