#include "namellst.h" #include "hwdev.h" #include "cmmn.h" #include "misc.h" #include #include /////////////////////////////////////////////////////////////////////////////// // // /////////////////////////////////////////////////////////////////////////////// class CVolume : public CNamedElem, public CHandleNotifTarget { public: // CNamedElem HRESULT Init(LPCWSTR pszElemName); // CHandleNotifTarget HRESULT HNTHandleEvent(DEV_BROADCAST_HANDLE* pdbh, DWORD dwEventType); // CVolume // Returns S_FALSE if can't find it HRESULT GetHWDeviceInst(CHWDeviceInst** pphwdevinst); HRESULT GetDeviceType(DEVICE_TYPE* pdevtype); HRESULT GetDeviceNumber(ULONG* puldeviceNumber); HRESULT GetVolumeConstInfo(LPWSTR pszVolumeGUID, DWORD cchVolumeGUID, DWORD* pdwVolumeFlags, DWORD* pdwDriveType, DWORD* pdwDriveCap); HRESULT GetVolumeMediaInfo(LPWSTR pszLabel, DWORD cchLabel, LPWSTR pszFileSystem, DWORD cchFileSystem, DWORD* pdwFileSystemFlags, DWORD* pdwMaxFileNameLen, DWORD* pdwRootAttributes, DWORD* pdwSerialNumber, DWORD* pdwDriveState, DWORD* pdwMediaState, DWORD* pdwMediaCap); HRESULT GetIconAndLabelInfo(LPWSTR pszAutorunIconLocation, DWORD cchAutorunIconLocation, LPWSTR pszAutorunLabel, DWORD cchAutorunLabel, LPWSTR pszIconLocationFromService, DWORD cchIconLocationFromService, LPWSTR pszNoMediaIconLocationFromService, DWORD cchNoMediaIconLocationFromService, LPWSTR pszLabelFromService, DWORD cchLabelFromService); HRESULT HandleArrival(); HRESULT HandleRemoval(); // Caller needs to free the returned ppsz HRESULT GetAllMountPoints(LPWSTR* ppsz); HRESULT MediaIsAccessible(BOOL* pfAccessible); public: static HRESULT Create(CNamedElem** ppelem); static HRESULT GetFillEnum(CFillEnum** ppfillenum); public: CVolume(); ~CVolume(); private: HRESULT _InitHelper(LPCWSTR pszElemName); void _HandleAccessDenied(); HRESULT _CreateMountPoints(); HRESULT _UpdateMountPoints(); HRESULT _GetMountPoints(LPWSTR* ppsz, DWORD* pcch); HRESULT _CreateMtPt(LPWSTR pszMtPt); HRESULT _RemoveMtPt(LPWSTR pszMtPt); HRESULT _RegisterNotif(); HRESULT _UnregisterNotif(); HRESULT _InitDriveType(HANDLE hDevice); HRESULT _InitHWDeviceInst(); HRESULT _UpdateConstInfo(HANDLE hDevice); HRESULT _UpdateMediaInfo(HANDLE hDevice, BOOL fImpersonate); HRESULT _UpdateMediaInfoOnRemove(); HRESULT _UpdateSoftEjectCaps(); HRESULT _UpdateRemovableDevice(); HRESULT _UpdateHasMedia(HANDLE hDevice); HRESULT _UpdateSpecialFilePresence(); HRESULT _UpdateTrackInfo(HANDLE hDevice); HRESULT _FillMMC2CD(HANDLE hDevice); HRESULT _UpdateMMC2CDInfo(HANDLE hDevice); HRESULT _ExtractAutorunIconAndLabel(); HRESULT _GetDeviceHandleSafe(HANDLE* phDevice, BOOL fGenericReadRequired); HRESULT _CloseDeviceHandleSafe(HANDLE hDevice); HRESULT _HandleMediaArrival(); HRESULT _HandleMediaRemoval(); HRESULT _HandleVolumeChange(); HRESULT _AdviseVolumeChangeHelper(BOOL fAdded); HRESULT _AdviseMountPointHelper(LPCWSTR pszMountPoint, BOOL fAdded); HRESULT _AdviseVolumeMountingEvent(DWORD dwEvent); HRESULT _GetVOLUMEINFO2(VOLUMEINFO2** ppvolinfo2); HRESULT _ShouldTryAutoplay(BOOL* pfTry); HRESULT _GetDeviceIDDisk(LPWSTR pszDeviceIDDisk, DWORD cchDeviceIDDisk); HRESULT _DVDRAMHack(HANDLE hDevice); public: DWORD _dwState; private: DWORD _dwMediaPresentFromEvent; DWORD _dwMediaState; DWORD _dwMediaCap; WCHAR _szVolumeGUID[50]; DWORD _dwVolumeFlags; DWORD _dwDriveType; DWORD _dwDriveCap; DWORD _dwDriveState; WCHAR _szDeviceIDDisk[MAX_DEVICEID]; WCHAR _szLabel[MAX_LABEL]; DWORD _dwSerialNumber; DWORD _dwMaxFileNameLen; DWORD _dwFileSystemFlags; WCHAR _szFileSystem[MAX_FILESYSNAME]; DWORD _dwRootAttributes; DEVICE_TYPE _devtype; ULONG _ulDeviceNumber; ULONG _ulPartitionNumber; LPWSTR _pszMountPoints; DWORD _cchMountPoints; CHWDeviceInst _hwdevinst; BOOL _fHWDevInstInited; DWORD* _prgMMC2Features; BOOL _fFirstTime; CCriticalSection _cs; DEVINST _devinst; HDEVNOTIFY _hdevnotify; #ifdef DEBUG BOOL _fGenericReadRequired; #endif BOOL _fProcessMediaArrived; public: //for now, and for CStorageInfoImpl only WCHAR _szAutorunIconLocation[MAX_ICONLOCATION]; WCHAR _szAutorunLabel[MAX_LABEL]; }; class CVolumeFillEnum : public CFillEnum { public: HRESULT Next(LPWSTR pszElemName, DWORD cchElemName, DWORD* pcchRequired); public: HRESULT _Init(); private: CIntfFillEnum _intffillenum; };