// 32-bit
static const IID IID_IShellExt =
{ 0xdc515c27, 0x6cac, 0x11d1, { 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd2 } };
+static const IID IID_IShellExt2 =
+ { 0xdc515c27, 0x6cac, 0x11d1, { 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd3 } };
#else
// 64-bit
static const IID IID_IShellExt =
{ 0x5f820ca1, 0x3dde, 0x11db, {0xb2, 0xce, 0x00, 0x15, 0x58, 0x09, 0x2d, 0xb5} };
+static const IID IID_IShellExt2 =
+ { 0x5f820ca1, 0x3dde, 0x11db, {0xb2, 0xce, 0x00, 0x15, 0x58, 0x09, 0x2d, 0xb6} };
#endif
RegCloseKey(hKey);
} else
return SELFREG_E_CLASS;
- }
+ }
+
+ StringFromIID(IID_IShellExt2, &pwsz);
+ if(pwsz)
+ {
+#ifdef UNICODE
+ StringCbCopy(szCLSID, sizeof(szCLSID), pwsz);
+#else
+ WideCharToMultiByte( CP_ACP, 0,pwsz, -1, szCLSID, sizeof(szCLSID), NULL, NULL);
+#endif
+ CoTaskMemFree(pwsz);
+ } else {
+ return E_FAIL;
+ }
+
+ /*
+ [HKEY_CLASSES_ROOT\CLSID\{$CLSID}\InprocServer32]
+ @="Y:\\DEST\\root.client\\usr\\vice\\etc\\afs_shl_ext.dll"
+ "ThreadingModel"="Apartment"
+ */
+ hModule=GetModuleHandle(TEXT("afs_shl_ext.dll"));
+ z=GetModuleFileName(hModule,szModule,sizeof(szModule));
+ wsprintf(szSubKey, TEXT("CLSID\\%s\\InprocServer32"),szCLSID);
+ if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,szModule))!=NOERROR)
+ return lResult;
+
+ wsprintf(szSubKey, TEXT("CLSID\\%s\\InprocServer32"),szCLSID);
+ if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,
+ TEXT("Apartment"),TEXT("ThreadingModel")))!=NOERROR)
+ return lResult;
+
+ /*
+ [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\AFS Client Shell Extension]
+ @="{EA3775F2-28BE-11D3-9C8D-00105A24ED29}"
+ */
+
+ wsprintf(szSubKey, TEXT("%s\\%s"), STR_REG_PATH, STR_EXT_TITLE2);
+ if ((lResult=DoRegCLSID(HKEY_LOCAL_MACHINE,szSubKey,szCLSID))!=NOERROR)
+ return lResult;
+
+ //If running on NT, register the extension as approved.
+ /*
+ [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved]
+ "{$(CLSID)}"="AFS Client Shell Extension"
+
+ [HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers\AFS Client Shell Extension]
+ @="{$(CLSID)}"
+ */
+
+ osvi.dwOSVersionInfoSize = sizeof(osvi);
+ GetVersionEx(&osvi);
+ if(VER_PLATFORM_WIN32_NT == osvi.dwPlatformId)
+ {
+ wsprintf(szSubKey, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved"));
+ if ((lResult=DoRegCLSID(HKEY_LOCAL_MACHINE,szSubKey,_TEXT(STR_EXT_TITLE2),szCLSID))!=NOERROR)
+ return lResult;
+ }
+
+
return S_OK;
}
DoValueDelete(HKEY_CLASSES_ROOT, szSubKey);
wsprintf(szSubKey, TEXT("%s\\%s"), STR_REG_PATH, STR_EXT_TITLE);
DoValueDelete(HKEY_LOCAL_MACHINE, szSubKey);
+
+ StringFromIID(IID_IShellExt2, &pwsz);
+ if(pwsz)
+ {
+#ifdef UNICODE
+ StringCbCopy(szCLSID, sizeof(szCLSID), pwsz);
+#else
+ WideCharToMultiByte( CP_ACP, 0,pwsz, -1, szCLSID, sizeof(szCLSID), NULL, NULL);
+#endif
+ CoTaskMemFree(pwsz);
+ } else {
+ return E_FAIL;
+ }
+ wsprintf(szSubKey, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved"));
+ DoValueDelete(HKEY_LOCAL_MACHINE,szSubKey,szCLSID);
+
return S_OK;
}
// CShellExt
IMPLEMENT_DYNCREATE(CShellExt, CCmdTarget)
+IMPLEMENT_DYNCREATE(CShellExt2, CCmdTarget)
#define REG_CLIENT_PARMS_KEY "SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"
#define OVERLAYENABLED 1
HRESULT hr;
UINT code;
DWORD ShellOption,LSPsize,LSPtype;
+ m_overlayObject = 0;
hr = SHGetMalloc(&m_pAlloc);
m_bIsOverlayEnabled=FALSE;
if (FAILED(hr))
// {DC515C27-6CAC-11D1-BAE7-00C04FD140D2}
static const IID IID_IShellExt =
{ 0xdc515c27, 0x6cac, 0x11d1, { 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd2 } };
+static const IID IID_IShellExt2 =
+{ 0xdc515c27, 0x6cac, 0x11d1, { 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd3 } };
#else
// 64-bit
// {5f820ca1-3dde-11db-b2ce-001558092db5}
static const IID IID_IShellExt =
{ 0x5f820ca1, 0x3dde, 0x11db, {0xb2, 0xce, 0x00, 0x15, 0x58, 0x09, 0x2d, 0xb5 } };
+static const IID IID_IShellExt2 =
+{ 0x5f820ca1, 0x3dde, 0x11db, {0xb2, 0xce, 0x00, 0x15, 0x58, 0x09, 0x2d, 0xb6 } };
#endif
BEGIN_INTERFACE_MAP(CShellExt, CCmdTarget)
#ifndef _WIN64
// 32-bit
IMPLEMENT_OLECREATE(CShellExt, STR_EXT_TITLE, 0xdc515c27, 0x6cac, 0x11d1, 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd2)
+IMPLEMENT_OLECREATE(CShellExt2, STR_EXT_TITLE, 0xdc515c27, 0x6cac, 0x11d1, 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd3)
#else
// 64-bit
IMPLEMENT_OLECREATE(CShellExt, STR_EXT_TITLE, 0x5f820ca1, 0x3dde, 0x11db, 0xb2, 0xce, 0x0, 0x15, 0x58, 0x09, 0x2d, 0xb5)
+IMPLEMENT_OLECREATE(CShellExt2, STR_EXT_TITLE, 0x5f820ca1, 0x3dde, 0x11db, 0xb2, 0xce, 0x0, 0x15, 0x58, 0x09, 0x2d, 0xb6)
#endif
STDMETHODIMP CShellExt::XIconExt::GetOverlayInfo(LPWSTR pwszIconFile
,int cchMax,int* pIndex,DWORD* pdwFlags)
{
+ METHOD_PROLOGUE(CShellExt, IconExt);
if(IsBadWritePtr(pIndex, sizeof(int)))
return E_INVALIDARG;
if(IsBadWritePtr(pdwFlags, sizeof(DWORD)))
return E_INVALIDARG;
- HMODULE hModule=GetModuleHandle(_T("shell32.dll"));
+ // The icons must reside in the same path as this dll
TCHAR szModule[MAX_PATH];
- DWORD z=GetModuleFileName(hModule,szModule,sizeof(szModule));
+ GetModuleFileName(theApp.m_hInstance, szModule, MAX_PATH);
+ TCHAR * slash = _tcsrchr(szModule, '\\');
+ if (slash) {
+ *slash = 0;
+ switch (pThis->GetOverlayObject())
+ {
+ case 0:
+ _tcscat(szModule, _T("\\link.ico"));
+ break;
+ case 1:
+ _tcscat(szModule, _T("\\mount.ico"));
+ break;
+ }
+ }
#ifndef UNICODE
MultiByteToWideChar( CP_ACP,0,szModule,-1,pwszIconFile,cchMax);
#else
_tcsncpy(pwszIconFile, szModule, cchMax);
#endif
- *pIndex = 30;
- *pdwFlags = ISIOI_ICONFILE|ISIOI_ICONINDEX;
+ *pIndex = 0;
+ *pdwFlags = ISIOI_ICONFILE;
return S_OK;
}
STDMETHODIMP CShellExt::XIconExt::IsMemberOf(LPCWSTR pwszPath,DWORD dwAttrib)
{
+ METHOD_PROLOGUE(CShellExt, IconExt);
TCHAR szPath[MAX_PATH];
#ifdef UNICODE
_tcscpy(szPath, pwszPath);
#else
WideCharToMultiByte( CP_ACP,0,pwszPath,-1,szPath,MAX_PATH,NULL,NULL);
#endif
- if (IsSymlink(szPath) || IsMountPoint(szPath)) {
+ if ((pThis->GetOverlayObject() == 0)&&(IsSymlink(szPath))) {
+ return S_OK;
+ }
+ if ((pThis->GetOverlayObject() == 1)&&(IsMountPoint(szPath))) {
return S_OK;
}
return S_FALSE;
extern ULONG nXPRefCount; // IPersistFile ref count
#define STR_EXT_TITLE "AfsClientContextMenu"
+#define STR_EXT_TITLE2 "AfsClientOverlayHandler"
#define STR_REG_PATH TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIconOverlayIdentifiers")
/////////////////////////////////////////////////////////////////////////////
BOOL m_bIsSymlink; // is symbolic link!
TCHAR m_szFile[MAX_PATH];
BOOL m_bIsOverlayEnabled;
+ int m_overlayObject;
BOOL IsOverlayEnabled(){return m_bIsOverlayEnabled;}
CStringArray m_astrFileNames;
// Operations
public:
-
+ int GetOverlayObject() {return m_overlayObject;}
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CShellExt)
DECLARE_INTERFACE_MAP()
};
+class CShellExt2 : public CShellExt
+{
+public:
+ DECLARE_DYNCREATE(CShellExt2)
+ CShellExt2() : CShellExt()
+ {
+ m_overlayObject = 1;
+ }
+ ~CShellExt2()
+ {
+ }
+ DECLARE_OLECREATE(CShellExt2)
+};
+
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}