#include "mtpt.h" class CVolume; class CMtPtLocal : public CMountPoint { /////////////////////////////////////////////////////////////////////////////// // Public methods /////////////////////////////////////////////////////////////////////////////// public: CMtPtLocal(); ~CMtPtLocal(); HRESULT GetMountPointName(LPWSTR pszMountPoint, DWORD cchMountPoint); HRESULT Eject(HWND hwnd); BOOL IsEjectable(); BOOL HasMedia(); BOOL IsFormatted(); BOOL IsMounted(); HRESULT GetCDInfo(DWORD* pdwDriveCapabilities, DWORD* pdwMediaCapabilities); HRESULT GetLabel(LPTSTR pszLabel, DWORD cchLabel); HRESULT GetLabelNoFancy(LPTSTR pszLabel, DWORD cchLabel); HRESULT SetLabel(HWND hwnd, LPCTSTR pszLabel); HRESULT SetDriveLabel(HWND hwnd, LPCTSTR pszLabel); HRESULT ChangeNotifyRegisterAlias(void) { /* no-op */ return NOERROR; } int GetDriveFlags(); HRESULT GetRemotePath(LPWSTR pszPath, DWORD cchPath) { return E_NOTIMPL; } void GetTypeString(LPTSTR pszType, DWORD cchType); void StoreIconForUpdateImage(int iImage); UINT GetIcon(LPTSTR pszModule, DWORD cchModule); HRESULT GetAssocSystemElement(IAssociationElement **ppae); DWORD GetShellDescriptionID(); HKEY GetRegKey(); static BOOL IsVolume(LPCWSTR pszDeviceID); /////////////////////////////////////////////////////////////////////////////// // Miscellaneous helpers /////////////////////////////////////////////////////////////////////////////// public: // should be used in mtptmgmt2.cpp only BOOL _IsMiniMtPt(); BOOL _NeedToRefresh(); public: // should be used in mtptarun2.cpp only (when used outside of CMtPtLocal) BOOL _IsMediaPresent(); BOOL _CanUseVolume(); private: HRESULT _InitWithVolume(LPCWSTR pszMtPt, CVolume* pvol); HRESULT _Init(LPCWSTR pszMtPt); LPCTSTR _GetNameForFctCall(); BOOL _IsFloppy(); BOOL _IsFloppy35(); BOOL _IsFloppy525(); BOOL _IsCDROM(); // real removable, excludes floppies BOOL _IsStrictRemovable(); BOOL _IsFixedDisk(); BOOL _IsFormattable(); BOOL _IsAudioCD(); BOOL _IsAudioCDNoData(); BOOL _IsDVD(); BOOL _IsRemovableDevice(); BOOL _IsAutorun(); BOOL _IsDVDDisc(); BOOL _IsDVDRAMMedia(); BOOL _IsAudioDisc(); BOOL _ForceCheckMediaPresent(); BOOL _IsFormatted(); BOOL _IsReadOnly(); // returns DT_* defined above DWORD _GetMTPTDriveType(); // returns CT_* defined above DWORD _GetMTPTContentType(); BOOL _GetFileAttributes(DWORD* pdwAttrib); BOOL _GetFileSystemName(LPTSTR pszFileSysName, DWORD cchFileSysName); BOOL _GetGVILabelOrMixedCaseFromReg(LPTSTR pszLabel, DWORD cchLabel); BOOL _GetGVILabel(LPTSTR pszLabel, DWORD cchLabel); BOOL _GetSerialNumber(DWORD* pdwSerialNumber); BOOL _GetFileSystemFlags(DWORD* pdwFlags); int _GetGVIDriveFlags(); int _GetDriveType(); DWORD _GetAutorunContentType(); HRESULT _Eject(HWND hwnd, LPTSTR pszMountPointNameForError); BOOL _HasAutorunLabel(); BOOL _HasAutorunIcon(); UINT _GetAutorunIcon(LPTSTR pszModule, DWORD cchModule); void _GetAutorunLabel(LPWSTR pszLabel, DWORD cchLabel); void _InitLegacyRegIconAndLabelHelper(); void _InitAutorunInfo(); BOOL _IsMountedOnDriveLetter(); HANDLE _GetHandleWithAccessAndShareMode(DWORD dwDesiredAccess, DWORD dwShareMode); HANDLE _GetHandleReadRead(); UINT _GetCDROMIcon(); BOOL _GetCDROMName(LPWSTR pszName, DWORD cchName); DWORD _GetRegVolumeGen(); public: static BOOL Initialize(); static void FinalCleanUp(); static HRESULT _GetAndRemoveVolumeAndItsMtPts(LPCWSTR pszDeviceIDVolume, CVolume** ppvol, HDPA hdpaMtPts); static CVolume* _GetVolumeByID(LPCWSTR pszDeviceIDVolume); static CVolume* _GetVolumeByMtPt(LPCWSTR pszMountPoint); static HRESULT _CreateMtPtLocalWithVolume(LPCWSTR pszMountPoint, CVolume* pvol); static HRESULT _CreateMtPtLocal(LPCWSTR pszMountPoint); static HRESULT _CreateMtPtLocalFromVolumeGuid(LPCWSTR pszVolumeGuid, CMountPoint ** ppmtpt ); static HRESULT _CreateVolume(VOLUMEINFO* pvolinfo, CVolume** ppvolNew); static HRESULT _CreateVolumeFromReg(LPCWSTR pszDeviceIDVolume, CVolume** ppvolNew); static HRESULT _CreateVolumeFromRegHelper(LPCWSTR pszGUID, CVolume** ppvolNew); static HRESULT _CreateVolumeFromVOLUMEINFO2(VOLUMEINFO2* pvolinfo2, CVolume** ppvolNew); static CVolume* _GetAndRemoveVolumeByID(LPCWSTR pszDeviceIDVolume); static HRESULT _UpdateVolumeRegInfo(VOLUMEINFO* pvolinfo); static HRESULT _UpdateVolumeRegInfo2(VOLUMEINFO2* pvolinfo2); /////////////////////////////////////////////////////////////////////////////// // Data /////////////////////////////////////////////////////////////////////////////// public: // should be used in mtptarun2.cpp only (when used outside of CMtPtLocal) CVolume* _pvol; // should be used in mtptevnt.cpp only (when used outside of CMtPtLocal) // Watch out! No constructor nor destructor called on the next member static CRegSupport _rsVolumes; private: BOOL _fMountedOnDriveLetter; BOOL _fVolumePoint; WCHAR _szNameNoVolume[2]; #ifdef DEBUG private: static DWORD _cMtPtLocal; #endif }; class CVolume { public: DWORD dwGeneration; DWORD dwState; LPWSTR pszDeviceIDVolume; // \\?\STORAGE#Volume#...{...GUID...} LPWSTR pszVolumeGUID; // \\?\Volume{...GUID...} DWORD dwVolumeFlags; // see HWDVF_... flags DWORD dwDriveType; // see HWDT_... flags DWORD dwDriveCapability; // see HWDDC_... flags LPWSTR pszLabel; // LPWSTR pszFileSystem; // DWORD dwFileSystemFlags; // DWORD dwMaxFileNameLen; // DWORD dwRootAttributes; // DWORD dwSerialNumber; // DWORD dwDriveState; // see HWDDS_... DWORD dwMediaState; // see HWDMS_... DWORD dwMediaCap; int iShellImageForUpdateImage; LPWSTR pszAutorunIconLocation; LPWSTR pszAutorunLabel; LPWSTR pszKeyName; LPWSTR pszIconFromService; LPWSTR pszNoMediaIconFromService; LPWSTR pszLabelFromService; public: ULONG AddRef() { return InterlockedIncrement(&_cRef); } ULONG Release() { ASSERT( 0 != _cRef ); ULONG cRef = InterlockedDecrement(&_cRef); if ( 0 == cRef ) { delete this; } return cRef; } private: LONG _cRef; public: CVolume() : _cRef(1) { #ifdef DEBUG ++_cVolume; #endif } ~CVolume() { if (pszDeviceIDVolume) { LocalFree(pszDeviceIDVolume); } if (pszVolumeGUID) { LocalFree(pszVolumeGUID); } if (pszLabel) { LocalFree(pszLabel); } if (pszFileSystem) { LocalFree(pszFileSystem); } if (pszAutorunIconLocation) { LocalFree(pszAutorunIconLocation); } if (pszAutorunLabel) { LocalFree(pszAutorunLabel); } if (pszIconFromService) { LocalFree(pszIconFromService); } if (pszNoMediaIconFromService) { LocalFree(pszNoMediaIconFromService); } if (pszLabelFromService) { LocalFree(pszLabelFromService); } #ifdef DEBUG --_cVolume; #endif } #ifdef DEBUG private: static DWORD _cVolume; #endif };