123 lines
2.9 KiB
C++
123 lines
2.9 KiB
C++
|
#include "shellprv.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "pidl.h"
|
||
|
#include "ids.h"
|
||
|
#include "drives.h"
|
||
|
#include "mtpt.h"
|
||
|
#include "shitemid.h"
|
||
|
#include "xiconwrap.h"
|
||
|
#include "hwcmmn.h"
|
||
|
|
||
|
// From drivfldr.cpp
|
||
|
int _GetSHID(int iDrive);
|
||
|
|
||
|
class CDrvExtIconBase : public CExtractIconBase
|
||
|
{
|
||
|
public:
|
||
|
HRESULT _GetIconLocationW(UINT uFlags, LPWSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags);
|
||
|
HRESULT _ExtractW(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);
|
||
|
|
||
|
HRESULT _Init(LPCWSTR pszDrive)
|
||
|
{
|
||
|
_pszDrive = StrDup(pszDrive);
|
||
|
return _pszDrive ? S_OK : E_OUTOFMEMORY;
|
||
|
}
|
||
|
|
||
|
CDrvExtIconBase() : CExtractIconBase(), _pszDrive(NULL) {}
|
||
|
|
||
|
protected:
|
||
|
~CDrvExtIconBase();
|
||
|
|
||
|
private:
|
||
|
LPWSTR _pszDrive;
|
||
|
};
|
||
|
|
||
|
CDrvExtIconBase::~CDrvExtIconBase()
|
||
|
{
|
||
|
LocalFree((HLOCAL)_pszDrive); // accepts NULL
|
||
|
}
|
||
|
|
||
|
|
||
|
STDAPI SHCreateDrvExtIcon(LPCWSTR pszDrive, REFIID riid, void **ppv)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
CDrvExtIconBase* pdeib = new CDrvExtIconBase();
|
||
|
if (pdeib)
|
||
|
{
|
||
|
hr = pdeib->_Init(pszDrive);
|
||
|
if (SUCCEEDED(hr))
|
||
|
hr = pdeib->QueryInterface(riid, ppv);
|
||
|
pdeib->Release();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CDrvExtIconBase::_GetIconLocationW(UINT uFlags, LPWSTR pszIconFile,
|
||
|
UINT cchMax, int *piIndex, UINT *pwFlags)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
pszIconFile[0] = 0;
|
||
|
|
||
|
if (uFlags & GIL_DEFAULTICON)
|
||
|
{
|
||
|
*piIndex = CMountPoint::GetSuperPlainDriveIcon(_pszDrive,
|
||
|
GetDriveType(_pszDrive));
|
||
|
|
||
|
lstrcpyn(pszIconFile, TEXT("shell32.dll"), cchMax);
|
||
|
|
||
|
*pwFlags = GIL_PERCLASS;
|
||
|
|
||
|
// Make sure our default icon makes it to the cache
|
||
|
Shell_GetCachedImageIndex(c_szShell32Dll, *piIndex, *pwFlags);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (!(uFlags & GIL_ASYNC))
|
||
|
{
|
||
|
CMountPoint* pmtpt = CMountPoint::GetMountPoint(_pszDrive);
|
||
|
|
||
|
if (pmtpt)
|
||
|
{
|
||
|
*piIndex = pmtpt->GetIcon(pszIconFile, cchMax);
|
||
|
|
||
|
if (!*pszIconFile)
|
||
|
{
|
||
|
GetModuleFileName(HINST_THISDLL, pszIconFile, cchMax);
|
||
|
}
|
||
|
|
||
|
pmtpt->StoreIconForUpdateImage(Shell_GetCachedImageIndex(
|
||
|
pszIconFile, *piIndex, 0));
|
||
|
|
||
|
pmtpt->Release();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
*piIndex = CMountPoint::GetSuperPlainDriveIcon(_pszDrive,
|
||
|
GetDriveType(_pszDrive));
|
||
|
|
||
|
lstrcpyn(pszIconFile, TEXT("shell32.dll"), cchMax);
|
||
|
}
|
||
|
|
||
|
*pwFlags = GIL_PERCLASS;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_PENDING;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CDrvExtIconBase::_ExtractW(LPCWSTR pszFile, UINT nIconIndex,
|
||
|
HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
|
||
|
{
|
||
|
return SHDefExtractIcon(pszFile, nIconIndex, GIL_PERCLASS, phiconLarge,
|
||
|
phiconSmall, nIconSize);
|
||
|
}
|