windows-nt/Source/XPSP1/NT/shell/shell32/mtptr.h
2020-09-26 16:20:57 +08:00

185 lines
4.8 KiB
C++

#include "mtpt.h"
class CShare;
class CMtPtRemote : public CMountPoint
{
///////////////////////////////////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////////////////////////////////
public:
CMtPtRemote();
~CMtPtRemote();
// virtual override
BOOL IsUnavailableNetDrive();
BOOL IsDisconnectedNetDrive();
BOOL IsFormatted();
HRESULT GetLabel(LPTSTR pszLabel, DWORD cchLabel);
HRESULT GetLabelNoFancy(LPTSTR pszLabel, DWORD cchLabel);
HRESULT SetLabel(HWND hwnd, LPCTSTR pszLabel);
HRESULT ChangeNotifyRegisterAlias(void);
HRESULT GetRemotePath(LPWSTR pszPath, DWORD cchPath);
UINT GetIcon(LPTSTR pszModule, DWORD cchModule);
HRESULT GetAssocSystemElement(IAssociationElement **ppae);
DWORD GetShellDescriptionID();
int GetDriveFlags();
void GetTypeString(LPTSTR pszType, DWORD cchType);
HKEY GetRegKey();
static void _NotifyReconnectedNetDrive(LPCWSTR pszMountPoint);
///////////////////////////////////////////////////////////////////////////////
// Miscellaneous helpers
///////////////////////////////////////////////////////////////////////////////
private:
HRESULT _Init(LPCWSTR pszName, LPCWSTR pszShareName, BOOL fUnavailable);
HRESULT _InitWithoutShareName(LPCWSTR pszName);
HRESULT _GetDefaultUNCDisplayName(LPTSTR pszLabel, DWORD cchLabel);
BOOL _GetComputerDisplayNameFromReg(LPTSTR pszLabel, DWORD cchLabel);
LPCTSTR _GetUNCName();
BOOL _IsConnected();
BOOL _IsUnavailableNetDrive();
BOOL _IsUnavailableNetDriveFromStateVar();
BOOL _IsRemote();
BOOL _IsSlow();
BOOL _IsAutorun();
// returns DT_* defined above
DWORD _GetMTPTDriveType();
// returns CT_* defined above
DWORD _GetMTPTContentType();
DWORD _GetPathSpeed();
void _CalcPathSpeed();
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();
UINT _GetAutorunIcon(LPTSTR pszModule, DWORD cchModule);
struct GFAGVICALL* _PrepareThreadParam(HANDLE* phEventBegun,
HANDLE* phEventFinish);
BOOL _HaveGFAAndGVIExpired(DWORD dwNow);
BOOL _UpdateGFAAndGVIInfo();
void _UpdateWNetGCStatus();
BOOL _IsMountedOnDriveLetter();
void _InitOnlyOnceStuff();
void _UpdateLabelFromDesktopINI();
void _UpdateAutorunInfo();
public:
static HRESULT _CreateMtPtRemote(LPCWSTR pszMountPoint,
LPCWSTR pszShareName, BOOL fUnavailable);
static HRESULT _CreateMtPtRemoteWithoutShareName(LPCWSTR pszMountPoint);
static CShare* _GetOrCreateShareFromID(LPCWSTR pszShareName);
static HRESULT _DeleteAllMtPtsAndShares();
static HRESULT _RemoveShareFromHDPA(CShare* pshare);
///////////////////////////////////////////////////////////////////////////////
// Data
///////////////////////////////////////////////////////////////////////////////
private:
class CShare* _pshare;
DWORD _dwWNetGCStatus;
DWORD _dwWNetGC3Status;
WNGC_CONNECTION_STATE _wngcs;
DWORD _dwSpeed;
#ifdef DEBUG
private:
static DWORD _cMtPtRemote;
#endif
};
class CShare
{
public:
DWORD dwGetFileAttributes;
WCHAR szLabel[MAX_LABEL];
DWORD dwSerialNumber;
DWORD dwMaxFileNameLen;
DWORD dwFileSystemFlags;
WCHAR szFileSysName[MAX_FILESYSNAME];
BOOL fGVIRetValue;
DWORD dwGFAGVILastCall;
BOOL fConnected;
LPWSTR pszRemoteName;
LPWSTR pszKeyName;
BOOL fAutorun;
BOOL fFake;
public:
ULONG AddRef()
{ return InterlockedIncrement(&_cRef); }
ULONG Release()
{
if (InterlockedDecrement(&_cRef) > 0)
return _cRef;
delete this;
return 0;
}
private:
LONG _cRef;
public:
CShare() : _cRef(1)
{
#ifdef DEBUG
++_cShare;
#endif
}
~CShare()
{
CMtPtRemote::_RemoveShareFromHDPA(this);
if (pszRemoteName)
{
LocalFree(pszRemoteName);
}
if (pszKeyName)
{
LocalFree(pszKeyName);
}
#ifdef DEBUG
--_cShare;
#endif
}
#ifdef DEBUG
private:
static DWORD _cShare;
#endif
};