Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

214 lines
4.7 KiB

/******************************************************************
Copyright (c) 2000 Microsoft Corporation
diskcleanup.h -- disk cleanup COM object for SR
Description:
delete datastores from stale builds
******************************************************************/
#include <emptyvc.h>
extern long g_cLock;
//+---------------------------------------------------------------------------
//
// Class: CSREmptyVolumeCache2
//
// Synopsis: implements IEmptyVolumeCache2
//
// Arguments:
//
// History: 20-Jul-2000 HenryLee Created
//
//----------------------------------------------------------------------------
class CSREmptyVolumeCache2 : IEmptyVolumeCache2
{
public:
STDMETHOD(QueryInterface) (REFIID riid, void ** ppObject)
{
if (riid == IID_IEmptyVolumeCache2)
{
*ppObject = (IEmptyVolumeCache2 *) this;
AddRef();
}
else if (riid == IID_IEmptyVolumeCache)
{
*ppObject = (IEmptyVolumeCache *) this;
AddRef();
}
else return E_NOINTERFACE;
return S_OK;
}
STDMETHOD_(ULONG, AddRef) ()
{
return InterlockedIncrement (&_lRefs);
}
STDMETHOD_(ULONG, Release) ()
{
if (0 == InterlockedDecrement (&_lRefs))
{
delete this;
return 0;
}
return _lRefs;
}
CSREmptyVolumeCache2 ()
{
_lRefs = 1;
_fStop = FALSE;
InterlockedIncrement (&g_cLock);
_ulGuids = 0;
for (int i=0; i < ARRAYSIZE; i++)
_wszGuid[i][0] = L'\0';
_wszVolume[0] = L'\0';
}
~CSREmptyVolumeCache2 ()
{
InterlockedDecrement (&g_cLock);
}
STDMETHOD(Initialize) (
HKEY hkRegKey,
const WCHAR * pcwszVolume,
WCHAR **ppwszDisplayName,
WCHAR **ppwszDescription,
DWORD *pdwFlags)
{
return InitializeEx (
hkRegKey,
pcwszVolume,
NULL,
ppwszDisplayName,
ppwszDescription,
NULL,
pdwFlags);
}
STDMETHOD(InitializeEx) (
HKEY hkRegKey,
const WCHAR *pcwszVolume,
const WCHAR *pcwszKeyName,
WCHAR **ppwszDisplayName,
WCHAR **ppwszDescription,
WCHAR **ppwszBtnText,
DWORD *pdwFlags);
STDMETHOD(GetSpaceUsed) (
DWORDLONG *pdwlSpaceUsed,
IEmptyVolumeCacheCallBack *picb);
STDMETHOD(Purge) (
DWORDLONG dwlSpaceToFree,
IEmptyVolumeCacheCallBack *picb);
STDMETHOD(ShowProperties) (HWND hwnd)
{
return S_OK; // no special UI
}
STDMETHOD(Deactivate) (DWORD *pdwFlags);
private:
DWORD LoadBootIni ();
DWORD EnumDataStores (DWORDLONG *pdwlSpaceUsed,
IEmptyVolumeCacheCallBack *picb,
BOOL fPurge,
WCHAR *pwszVolume);
HRESULT ForAllMountPoints (DWORDLONG *pdwlSpaceUsed,
IEmptyVolumeCacheCallBack *picb,
BOOL fPurge);
static const enum { ARRAYSIZE = 16 };
static const enum { RESTOREGUID_STRLEN = 64 };
LONG _lRefs;
BOOL _fStop;
ULONG _ulGuids;
WCHAR _wszGuid [ARRAYSIZE][RESTOREGUID_STRLEN];
WCHAR _wszVolume [MAX_PATH]; // DOS drive letter
};
//+---------------------------------------------------------------------------
//
// Class: CSRClassFactory
//
// Synopsis: generic class factory
//
// Arguments:
//
// History: 20-Jul-2000 HenryLee Created
//
//----------------------------------------------------------------------------
class CSRClassFactory : IClassFactory
{
public:
STDMETHOD(QueryInterface) (REFIID riid, void ** ppObject)
{
if (riid == IID_IClassFactory)
{
*ppObject = (IClassFactory *) this;
AddRef();
}
else
{
return E_NOINTERFACE;
}
return S_OK;
}
STDMETHOD_(ULONG, AddRef) ()
{
return InterlockedIncrement (&_lRefs);
}
STDMETHOD_(ULONG, Release) ()
{
if (0 == InterlockedDecrement (&_lRefs))
{
delete this;
return 0;
}
return _lRefs;
}
CSRClassFactory ()
{
_lRefs = 1;
InterlockedIncrement (&g_cLock);
}
~CSRClassFactory ()
{
InterlockedDecrement (&g_cLock);
}
STDMETHOD(CreateInstance) (IUnknown *pUnkOuter,
REFIID riid,
void **ppvObject);
STDMETHOD(LockServer) (BOOL fLock)
{
if (fLock) InterlockedIncrement(&g_cLock);
else InterlockedDecrement(&g_cLock);
return S_OK;
}
private:
LONG _lRefs;
};