patch-from-shadow-to-jaltman-bkbox-20031120
[openafs.git] / src / WINNT / client_exp / afs_shl_ext.cpp
index d0917b2..d1eebfa 100644 (file)
@@ -17,6 +17,7 @@ extern "C" {
 #include <winsock2.h>
 #include "help.h"
 #include "shell_ext.h"
+#include "winreg.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -24,6 +25,8 @@ extern "C" {
 static char THIS_FILE[] = __FILE__;
 #endif
 
+static const IID IID_IShellExt =
+{ 0xdc515c27, 0x6cac, 0x11d1, { 0xba, 0xe7, 0x0, 0xc0, 0x4f, 0xd1, 0x40, 0xd2 } };
 
 /////////////////////////////////////////////////////////////////////////////
 // CAfsShlExt
@@ -52,6 +55,7 @@ CAfsShlExt theApp;
 
 /////////////////////////////////////////////////////////////////////////////
 // CAfsShlExt initialization
+HINSTANCE g_hInstance;
 
 BOOL CAfsShlExt::InitInstance()
 {
@@ -86,6 +90,32 @@ STDAPI DllCanUnloadNow(void)
        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)
 {
@@ -99,7 +129,86 @@ 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,
@@ -112,7 +221,7 @@ STDAPI DllRegisterServer(void)
 
        if(NOERROR == lResult)
        {
-       //Create the value string.
+        //Create the value string.
                lResult = RegSetValueEx(   hKey,
                                                                NULL,
                                                                0,
@@ -125,7 +234,6 @@ STDAPI DllRegisterServer(void)
                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)
@@ -162,3 +270,61 @@ STDAPI DllRegisterServer(void)
        }
        return S_OK;
 }
+
+//returnValue = RegOpenKeyEx (HKEY_CLASSES_ROOT, keyName, 0, KEY_ALL_ACCESS, &registryKey);
+
+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;
+}
+