Windows: no longer use WinExec in afscreds
[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 #include <winsock2.h>
11 #include <ws2tcpip.h>
12
13 extern "C" {
14 #include <afs/param.h>
15 #include <afs/stds.h>
16 }
17
18 #include <objbase.h>
19 #include <initguid.h>
20 #include <windows.h>
21 #include <windowsx.h>
22 #undef INITGUID
23 #include <shlobj.h>
24 #include <shellapi.h>
25 #include <shobjidl.h>
26 #include <shlguid.h>
27 #include "afscreds.h"
28 #include "shortcut.h"
29
30
31 /*
32  * ROUTINES ___________________________________________________________________
33  *
34  */
35
36 void Shortcut_Init (void)
37 {
38    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
39 }
40
41
42 void Shortcut_Exit (void)
43 {
44    CoUninitialize();
45 }
46
47 BOOL Shortcut_Create (LPTSTR pszTarget, LPCTSTR pszSource, LPTSTR pszDesc, LPTSTR pszArgs)
48 {
49    IShellLink *psl;
50    HRESULT rc = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);
51    if (SUCCEEDED (rc))
52       {
53       IPersistFile *ppf;
54       rc = psl->QueryInterface (IID_IPersistFile, (void **)&ppf);
55       if (SUCCEEDED (rc))
56          { 
57          rc = psl->SetPath (pszSource);
58          if (SUCCEEDED (rc))
59             {
60             rc = psl->SetDescription (pszDesc ? pszDesc : pszSource);
61             if (SUCCEEDED (rc))
62                {
63                if ( pszArgs )
64                    rc = psl->SetArguments (pszArgs);
65                    if (SUCCEEDED (rc))
66                    {
67 #ifdef UNICODE
68                    rc = ppf->Save (pszTarget, TRUE);
69 #else
70                    WORD wsz[ MAX_PATH ];
71                    MultiByteToWideChar (CP_ACP, 0, pszTarget, -1, (LPWSTR)wsz, MAX_PATH);
72                    rc = ppf->Save ((LPCOLESTR)wsz, TRUE);
73 #endif
74                    }
75                }
76             }
77          ppf->Release ();
78          }
79       psl->Release ();
80       }
81    return SUCCEEDED(rc) ? TRUE : FALSE;
82
83
84
85 BOOL Shortcut_FixStartup (LPCTSTR pszLinkName, BOOL fAutoStart)
86 {
87    TCHAR szShortcut[ MAX_PATH + 10 ] = TEXT("");
88    BOOL bSuccess;
89
90    HKEY hk;
91    if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"), &hk) == 0)
92       {
93       DWORD dwSize = sizeof(szShortcut);
94       DWORD dwType = REG_SZ;
95       RegQueryValueEx (hk, TEXT("Common Startup"), NULL, &dwType, (LPBYTE)szShortcut, &dwSize);
96       if (szShortcut[0] == TEXT('\0'))
97          {
98          dwSize = sizeof(szShortcut);
99          dwType = REG_SZ;
100          RegQueryValueEx (hk, TEXT("Startup"), NULL, &dwType, (LPBYTE)szShortcut, &dwSize);
101          }
102       RegCloseKey (hk);
103       }
104    if (szShortcut[0] == TEXT('\0'))
105       {
106       GetWindowsDirectory (szShortcut, MAX_PATH);
107       lstrcat (szShortcut, TEXT("\\Start Menu\\Programs\\Startup"));
108       }
109    lstrcat (szShortcut, TEXT("\\"));
110    lstrcat (szShortcut, pszLinkName);
111
112    TCHAR szSource[ MAX_PATH ];
113    GetModuleFileName (GetModuleHandle(NULL), szSource, MAX_PATH);
114
115    if (fAutoStart)
116    {
117        DWORD code, len, type; 
118        TCHAR szParams[ 64 ] = TEXT(AFSCREDS_SHORTCUT_OPTIONS);
119
120        code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY,
121                             0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk);
122        if (code == ERROR_SUCCESS) {
123            len = sizeof(szParams);
124            type = REG_SZ;
125            code = RegQueryValueEx(hk, "AfscredsShortcutParams", NULL, &type,
126                                    (BYTE *) &szParams, &len);
127            RegCloseKey (hk);
128        }
129        if (code != ERROR_SUCCESS) {
130            code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY,
131                                 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk);
132            if (code == ERROR_SUCCESS) {
133                len = sizeof(szParams);
134                type = REG_SZ;
135                code = RegQueryValueEx(hk, "AfscredsShortcutParams", NULL, &type,
136                                        (BYTE *) &szParams, &len);
137                RegCloseKey (hk);
138            }
139        }
140        bSuccess = Shortcut_Create (szShortcut, szSource, "Autostart Authentication Agent", szParams);
141    }
142    else // (!g.fAutoStart)
143    {
144       bSuccess = DeleteFile (szShortcut);
145    }
146
147    return bSuccess;
148 }
149