afscreds-shortcut-params-20040227
[openafs.git] / src / WINNT / client_creds / shortcut.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include <objbase.h>
16 #include <initguid.h>
17 #include <windows.h>
18 #include <windowsx.h>
19 #undef INITGUID
20 #include <shlobj.h>
21 #include <shellapi.h>
22 #include <shobjidl.h>
23 #include <shlguid.h>
24 #include "afscreds.h"
25 #include "shortcut.h"
26
27
28 /*
29  * ROUTINES ___________________________________________________________________
30  *
31  */
32
33 void Shortcut_Init (void)
34 {
35    CoInitialize(0);
36 }
37
38
39 void Shortcut_Exit (void)
40 {
41    CoUninitialize();
42 }
43
44 static char OpenAFSConfigKeyName[] = "SOFTWARE\\OpenAFS\\Client";
45
46 BOOL Shortcut_Create (LPTSTR pszTarget, LPCTSTR pszSource, LPTSTR pszDesc, LPTSTR pszArgs)
47 {
48    IShellLink *psl;
49    HRESULT rc = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);
50    if (SUCCEEDED (rc))
51       {
52       IPersistFile *ppf;
53       rc = psl->QueryInterface (IID_IPersistFile, (void **)&ppf);
54       if (SUCCEEDED (rc))
55          { 
56          rc = psl->SetPath (pszSource);
57          if (SUCCEEDED (rc))
58             {
59             rc = psl->SetDescription (pszDesc ? pszDesc : pszSource);
60             if (SUCCEEDED (rc))
61                {
62                if ( pszArgs )
63                    rc = psl->SetArguments (pszArgs);
64                    if (SUCCEEDED (rc))
65                    {
66 #ifdef UNICODE
67                    rc = ppf->Save (pszTarget, TRUE);
68 #else
69                    WORD wsz[ MAX_PATH ];
70                    MultiByteToWideChar (CP_ACP, 0, pszTarget, -1, wsz, MAX_PATH);
71                    rc = ppf->Save (wsz, TRUE);
72 #endif
73                    }
74                }
75             }
76          ppf->Release ();
77          }
78       psl->Release ();
79       }
80    return SUCCEEDED(rc) ? TRUE : FALSE;
81
82
83
84 void Shortcut_FixStartup (LPCTSTR pszLinkName, BOOL fAutoStart)
85 {
86    TCHAR szShortcut[ MAX_PATH + 10 ] = TEXT("");
87
88    HKEY hk;
89    if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"), &hk) == 0)
90       {
91       DWORD dwSize = sizeof(szShortcut);
92       DWORD dwType = REG_SZ;
93       RegQueryValueEx (hk, TEXT("Common Startup"), NULL, &dwType, (LPBYTE)szShortcut, &dwSize);
94       if (szShortcut[0] == TEXT('\0'))
95          {
96          dwSize = sizeof(szShortcut);
97          dwType = REG_SZ;
98          RegQueryValueEx (hk, TEXT("Startup"), NULL, &dwType, (LPBYTE)szShortcut, &dwSize);
99          }
100       RegCloseKey (hk);
101       }
102    if (szShortcut[0] == TEXT('\0'))
103       {
104       GetWindowsDirectory (szShortcut, MAX_PATH);
105       lstrcat (szShortcut, TEXT("\\Start Menu\\Programs\\Startup"));
106       }
107    lstrcat (szShortcut, TEXT("\\"));
108    lstrcat (szShortcut, pszLinkName);
109
110    TCHAR szSource[ MAX_PATH ];
111    GetModuleFileName (GetModuleHandle(NULL), szSource, MAX_PATH);
112
113    if (fAutoStart)
114    {
115        DWORD code, len, type; 
116        TCHAR szParams[ 64 ] = TEXT(AFSCREDS_SHORTCUT_OPTIONS);
117
118        code = RegOpenKeyEx(HKEY_CURRENT_USER, OpenAFSConfigKeyName,
119                             0, KEY_QUERY_VALUE, &hk);
120        if (code != ERROR_SUCCESS)
121            code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, OpenAFSConfigKeyName,
122                                 0, KEY_QUERY_VALUE, &hk);
123        if (code == ERROR_SUCCESS) {
124            len = sizeof(szParams);
125            type = REG_SZ;
126            code = RegQueryValueEx(hk, "AfscredsShortcutParams", NULL, &type,
127                                    (BYTE *) &szParams, &len);
128            RegCloseKey (hk);
129        }
130        Shortcut_Create (szShortcut, szSource, "Autostart Authentication Agent", szParams);
131    }
132    else // (!g.fAutoStart)
133    {
134       DeleteFile (szShortcut);
135    }
136 }
137