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