#include <winsock2.h>
#include "help.h"
#include "shell_ext.h"
+#include "winreg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
static char THIS_FILE[] = __FILE__;
#endif
+static const IID IID_IShellExt =
+{ 0xdc515c27, 0x6cac, 0x11d1, { 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd2 } };
/////////////////////////////////////////////////////////////////////////////
// CAfsShlExt
/////////////////////////////////////////////////////////////////////////////
// CAfsShlExt initialization
+HINSTANCE g_hInstance;
BOOL CAfsShlExt::InitInstance()
{
return S_FALSE;
}
+int WideCharToLocal(LPTSTR pLocal, LPCWSTR pWide, DWORD dwChars)
+{
+ *pLocal = 0;
+ WideCharToMultiByte( CP_ACP, 0, pWide, -1, pLocal, dwChars, NULL, NULL);
+ return lstrlen(pLocal);
+}
+
+LRESULT DoRegCLSID(HKEY hKey,PTCHAR szSubKey,PTCHAR szData,PTCHAR szValue=NULL)
+{
+ DWORD dwDisp;
+ LRESULT lResult;
+ HKEY thKey;
+ lResult = RegCreateKeyEx(hKey, szSubKey, 0, NULL,
+ REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
+ &thKey, &dwDisp);
+ if(NOERROR == lResult)
+ {
+ lResult = RegSetValueEx(thKey, szValue, 0, REG_SZ,
+ (LPBYTE)szData, (lstrlen(szData) + 1)
+ * sizeof(TCHAR));
+ RegCloseKey(thKey);
+ }
+ RegCloseKey(hKey);
+ return lResult;
+}
+
// by exporting DllRegisterServer, you can use regsvr.exe
STDAPI DllRegisterServer(void)
{
LPWSTR pwsz;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
COleObjectFactory::UpdateRegistryAll();
+
+ StringFromIID(IID_IShellExt, &pwsz);
+ if(pwsz)
+ {
+ WideCharToMultiByte( CP_ACP, 0,pwsz, -1, szCLSID, sizeof(szCLSID), NULL, NULL);
+ LPMALLOC pMalloc;
+ CoGetMalloc(1, &pMalloc);
+ if(pMalloc)
+ {
+ (pMalloc->Free)(pwsz);
+ (pMalloc->Release)();
+ }
+ } else {
+ return E_FAIL;
+ }
+
+ /*
+ [HKEY_CLASSES_ROOT\CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}\InprocServer32]
+ @="Y:\\DEST\\root.client\\usr\\vice\\etc\\afs_shl_ext.dll"
+ "ThreadingModel"="Apartment"
+ */
+ HMODULE hModule=GetModuleHandle("afs_shl_ext.dll");
+ DWORD 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,"Apartment","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_TITLE);
+ 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]
+ "{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}"="AFS Client Shell Extension"
+
+ [HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers\AFS Client Shell Extension]
+ @="{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}"
+ */
+
+ OSVERSIONINFO osvi;
+ 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,STR_EXT_TITLE,szCLSID))!=NOERROR)
+ return lResult;
+ }
+ wsprintf(szSubKey, TEXT("*\\shellex\\ContextMenuHandlers\\%s"),STR_EXT_TITLE);
+ if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,szCLSID))!=NOERROR)
+ return lResult;
+ wsprintf(szSubKey, TEXT("Folder\\shellex\\ContextMenuHandlers\\%s"),STR_EXT_TITLE);
+ if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,szCLSID))!=NOERROR)
+ return lResult;
+
+ /*
+ Register InfoTip
+
+ [HKEY_CLASSES_ROOT\Folder\shellex\{00021500-0000-0000-C000-000000000046}]
+ @="{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}"
+ */
+
+ wsprintf(szSubKey, TEXT("Folder\\shellex\\{00021500-0000-0000-C000-000000000046}"));
+ if ((lResult=DoRegCLSID(HKEY_CLASSES_ROOT,szSubKey,szCLSID))!=NOERROR)
+ return lResult;
+
+
+ /* Below needs to be merged with above */
+
+ wsprintf(szSubKey, TEXT("%s\\%s"), STR_REG_PATH, STR_EXT_TITLE);
lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
szSubKey,
0,
if(NOERROR == lResult)
{
- //Create the value string.
+ //Create the value string.
lResult = RegSetValueEx( hKey,
NULL,
0,
return SELFREG_E_CLASS;
//If running on NT, register the extension as approved.
- OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(osvi);
GetVersionEx(&osvi);
if(VER_PLATFORM_WIN32_NT == osvi.dwPlatformId)
}
return S_OK;
}
+
+//returnValue = RegOpenKeyEx (HKEY_CLASSES_ROOT, keyName, 0, KEY_ALL_ACCESS, ®istryKey);
+
+LRESULT DoValueDelete(HKEY hKey,PTCHAR pszSubKey,PTCHAR szValue=NULL)
+{
+ LRESULT lResult;
+ HKEY thKey;
+ if (szValue==NULL) {
+ lResult=RegDeleteKey(hKey, pszSubKey);
+ return lResult;
+ }
+ lResult = RegOpenKeyEx( hKey,
+ pszSubKey,
+ 0,
+ KEY_ALL_ACCESS,
+ &thKey);
+ if(NOERROR == lResult)
+ {
+ lResult=RegDeleteValue(hKey, szValue);
+ RegCloseKey(thKey);
+ }
+ return lResult;
+}
+
+STDAPI DllUnregisterServer(void)
+{
+ TCHAR szSubKey[MAX_PATH];
+ TCHAR szCLSID[MAX_PATH];
+ LPWSTR pwsz;
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ COleObjectFactory::UpdateRegistryAll(FALSE);
+ StringFromIID(IID_IShellExt, &pwsz);
+ if(pwsz)
+ {
+ WideCharToMultiByte( CP_ACP, 0,pwsz, -1, szCLSID, sizeof(szCLSID), NULL, NULL);
+ LPMALLOC pMalloc;
+ CoGetMalloc(1, &pMalloc);
+ if(pMalloc)
+ {
+ (pMalloc->Free)(pwsz);
+ (pMalloc->Release)();
+ }
+ } else {
+ return E_FAIL;
+ }
+ wsprintf(szSubKey, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved"));
+ DoValueDelete(HKEY_LOCAL_MACHINE,szSubKey,szCLSID);
+ wsprintf(szSubKey, TEXT("*\\shellex\\ContextMenuHandlers\\%s"),STR_EXT_TITLE);
+ DoValueDelete(HKEY_CLASSES_ROOT, szSubKey);
+ wsprintf(szSubKey, TEXT("Folder\\shellex\\{00021500-0000-0000-C000-000000000046}"));
+ DoValueDelete(HKEY_CLASSES_ROOT, szSubKey);
+ wsprintf(szSubKey, TEXT("Folder\\shellex\\ContextMenuHandlers\\%s"),STR_EXT_TITLE);
+ DoValueDelete(HKEY_CLASSES_ROOT, szSubKey);
+ wsprintf(szSubKey, TEXT("%s\\%s"), STR_REG_PATH, STR_EXT_TITLE);
+ DoValueDelete(HKEY_LOCAL_MACHINE, szSubKey);
+ return S_OK;
+}
+