diff options
Diffstat (limited to 'public/sdk/inc/cisvc.hxx')
-rw-r--r-- | public/sdk/inc/cisvc.hxx | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/public/sdk/inc/cisvc.hxx b/public/sdk/inc/cisvc.hxx new file mode 100644 index 000000000..3d7b2fdd0 --- /dev/null +++ b/public/sdk/inc/cisvc.hxx @@ -0,0 +1,211 @@ +//+------------------------------------------------------------------------- +// +// 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 |