Windows2003-3790/inetsrv/query/h/drvnotif.hxx

132 lines
3.7 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998-1999.
//
// File: DrvNotif.hxx
//
// Contents: This file contains a class that keeps the information of a
// volume which is registered for device notification.
//
// History: 23-Jun-98 KitmanH Created
//
//--------------------------------------------------------------------------
#pragma once
enum eCiSvcVolState
{
eVolReady,
eVolLocked
};
//+-------------------------------------------------------------------------
//
// Function: IsRemovableDrive
//
// Synopsis: Checks if a drive is removable or cd-rom/dvd
//
// Arguments: [wc] - Dirve letter
//
// Returns: TRUE if removable, FALSE otherwise
//
// History: 1-Apr-99 dlee Created
//
//--------------------------------------------------------------------------
inline BOOL IsRemovableDrive( WCHAR wc )
{
WCHAR awc[4];
wcscpy( awc, L"C:\\" );
awc[0] = wc;
UINT uiRC = GetDriveType( awc );
return ( DRIVE_REMOVABLE == uiRC || DRIVE_CDROM == uiRC );
} //IsRemovableDrive
//+---------------------------------------------------------------------------
//
// Class: CDrvNotificationInfo
//
// Purpose: Maintains the info for a volume regarding receiving
// notificaitons
//
// History: 06/23/98 KitmanH created
//
//----------------------------------------------------------------------------
class CDrvNotificationInfo
{
public:
CDrvNotificationInfo( WCHAR wcDriveLetter, BOOL fAutoMountMode = FALSE );
~CDrvNotificationInfo();
BOOL RegisterNotification();
void UnregisterNotification();
BOOL Touch();
WCHAR GetDrvLetter() const { return (WCHAR) toupper( _wcDriveLetter ); }
HDEVNOTIFY const GethNotify() { return _hNotify; }
void AddOldState( DWORD dwOldState, WCHAR * wcsCatName );
DWORD * GetOldState( WCHAR * wcsCatName ) const;
DWORD GetVolState() const { return _dwVolState; }
void SetVolState( DWORD dwVolState )
{
// no lock needed, since it's only called in service control
// which can has no contender
_dwVolState = dwVolState;
}
void ClearOldStateArray();
void CloseVolumeHandle()
{
if ( INVALID_HANDLE_VALUE != _hVol )
{
CloseHandle( _hVol );
_hVol = INVALID_HANDLE_VALUE;
}
}
DWORD GetLockAttempts() const { return _cLockAttempts; }
void IncLockAttempts() { _cLockAttempts++; }
void DecLockAttempts() { _cLockAttempts--; }
void ResetLockAttempts() { _cLockAttempts = 0; }
BOOL IsAutoMount() const { return _fAutoMountMode; }
BOOL IsRemovable() const { return DRIVE_REMOVABLE == _uiDriveType ||
DRIVE_CDROM == _uiDriveType; }
BOOL IsCDROM() const { return DRIVE_CDROM == _uiDriveType; }
BOOL IsRegistered() const { return INVALID_HANDLE_VALUE != _hNotify; }
private:
BOOL ReallyTouch();
BOOL GetVolumeHandle();
HANDLE _hVol;
HDEVNOTIFY _hNotify;
WCHAR _wcDriveLetter;
DWORD _dwVolState; // is the drive dismounted or locked
DWORD _cLockAttempts; // how many times a volume lock is attempted
BOOL _fAutoMountMode;
UINT _uiDriveType;
};