annotate src/dosinst.h @ 34627:5071d4c3ff2e v9.1.0202

patch 9.1.0202: leaking memory in add_user() on failure Commit: https://github.com/vim/vim/commit/7a2f217988afa1c35b9c093a9d3477198ea250b9 Author: Christian Brabandt <cb@256bit.org> Date: Sun Mar 24 09:50:03 2024 +0100 patch 9.1.0202: leaking memory in add_user() on failure Problem: leaking memory in add_user() (LuMingYinDetect) Solution: free user_copy pointer instead of the user ptr add_user() is called with a user pointer and the user pointer comes from these functions: - return value from the getpwent() function (Unix). - return value from the getpwnam() function (Unix). - return value from the NetUserEnum() function (MS Windows). For the first 2 callers, the man page for those functions directly says, one should not free the returned pointer (since it comes from static memory). For the third caller (on MS Windows), the returned buffer is already freed directly after calling the add_user() function in NetApiBufferFree(), so this would lead to a double free(). This all indicates, the user ptr is wrongly freed in the add_user() function and the intention was to free the user_copy pointer instead in case of an error. So let's just use that now. fixes: #14250 closes: #14260 Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sun, 24 Mar 2024 10:00:09 +0100
parents 495d55210aac
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9 /*
18174
1ec6539cef68 patch 8.1.2082: some files have a weird name to fit in 8.3 characters
Bram Moolenaar <Bram@vim.org>
parents: 16606
diff changeset
10 * dosinst.h: Common code for dosinst.c and uninstall.c
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 */
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 7
diff changeset
12
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13 #include <stdio.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 #include <stdlib.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 #include <string.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 #include <sys/stat.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 #include <fcntl.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 #ifndef UNIX_LINT
19380
1e78bf92f168 patch 8.2.0248: MS-Windows: dealing with deprecation is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 18753
diff changeset
20 # include <io.h>
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21 # include <ctype.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
23 # include <direct.h>
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
25 # include <windows.h>
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
26 # include <shlobj.h>
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 #ifdef UNIX_LINT
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
30 // Running lint on Unix: Some things are missing.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31 char *searchpath(char *name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
34 #if defined(UNIX_LINT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 # include <unistd.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36 # include <errno.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
37 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 #include "version.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
41 #if defined(UNIX_LINT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 # define vim_mkdir(x, y) mkdir((char *)(x), y)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43 #else
16606
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 15941
diff changeset
44 # define vim_mkdir(x, y) _mkdir((char *)(x))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 #endif
2287
573da4dac306 Make the dos installer work with more compilers.
Bram Moolenaar <bram@vim.org>
parents: 2217
diff changeset
46
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
47 #define sleep(n) Sleep((n) * 1000)
2287
573da4dac306 Make the dos installer work with more compilers.
Bram Moolenaar <bram@vim.org>
parents: 2217
diff changeset
48
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
49 // ----------------------------------------
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
52 #define BUFSIZE (MAX_PATH*2) // long enough to hold a file name path
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 #define NUL 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 #define FAIL 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 #define OK 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 #ifndef FALSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 # define FALSE 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 #ifndef TRUE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 # define TRUE 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64
2449
943280505f72 Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents: 2287
diff changeset
65 /*
943280505f72 Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents: 2287
diff changeset
66 * Modern way of creating registry entries, also works on 64 bit windows when
943280505f72 Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents: 2287
diff changeset
67 * compiled as a 32 bit program.
943280505f72 Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents: 2287
diff changeset
68 */
943280505f72 Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents: 2287
diff changeset
69 # ifndef KEY_WOW64_64KEY
943280505f72 Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents: 2287
diff changeset
70 # define KEY_WOW64_64KEY 0x0100
943280505f72 Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents: 2287
diff changeset
71 # endif
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
72 # ifndef KEY_WOW64_32KEY
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
73 # define KEY_WOW64_32KEY 0x0200
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
74 # endif
2449
943280505f72 Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents: 2287
diff changeset
75
29105
faf7fcd1c8d5 patch 8.2.5073: clang on MS-Windows produces warnings
Bram Moolenaar <Bram@vim.org>
parents: 19431
diff changeset
76 #ifdef __MINGW32__
faf7fcd1c8d5 patch 8.2.5073: clang on MS-Windows produces warnings
Bram Moolenaar <Bram@vim.org>
parents: 19431
diff changeset
77 # define UNUSED __attribute__((unused))
faf7fcd1c8d5 patch 8.2.5073: clang on MS-Windows produces warnings
Bram Moolenaar <Bram@vim.org>
parents: 19431
diff changeset
78 #else
faf7fcd1c8d5 patch 8.2.5073: clang on MS-Windows produces warnings
Bram Moolenaar <Bram@vim.org>
parents: 19431
diff changeset
79 # define UNUSED
faf7fcd1c8d5 patch 8.2.5073: clang on MS-Windows produces warnings
Bram Moolenaar <Bram@vim.org>
parents: 19431
diff changeset
80 #endif
faf7fcd1c8d5 patch 8.2.5073: clang on MS-Windows produces warnings
Bram Moolenaar <Bram@vim.org>
parents: 19431
diff changeset
81
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 #define VIM_STARTMENU "Programs\\Vim " VIM_VERSION_SHORT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
84 int interactive; // non-zero when running interactively
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 * Call malloc() and exit when out of memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 static void *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 alloc(int len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 {
15941
b9098585d945 patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents: 15892
diff changeset
92 void *p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93
15941
b9098585d945 patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents: 15892
diff changeset
94 p = malloc(len);
b9098585d945 patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents: 15892
diff changeset
95 if (p == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 printf("ERROR: out of memory\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 exit(1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 }
15941
b9098585d945 patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents: 15892
diff changeset
100 return p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 * The toupper() in Bcc 5.5 doesn't work, use our own implementation.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 mytoupper(int c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 if (c >= 'a' && c <= 'z')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 return c - 'a' + 'A';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 return c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 myexit(int n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 if (!interactive)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118 {
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
119 // Present a prompt, otherwise error messages can't be read.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 printf("Press Enter to continue\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 rewind(stdin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 (void)getchar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 exit(n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
128 typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 /*
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
130 * Check if this is a 64-bit OS.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 */
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
132 static BOOL
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
133 is_64bit_os(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 {
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
135 #ifdef _WIN64
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
136 return TRUE;
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
137 #else
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
138 BOOL bIsWow64 = FALSE;
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
139 LPFN_ISWOW64PROCESS pIsWow64Process;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
141 pIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
142 GetModuleHandle("kernel32"), "IsWow64Process");
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
143 if (pIsWow64Process != NULL)
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
144 pIsWow64Process(GetCurrentProcess(), &bIsWow64);
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
145 return bIsWow64;
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
146 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 static char *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 searchpath(char *name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 static char widename[2 * BUFSIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 static char location[2 * BUFSIZE + 2];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
155 // There appears to be a bug in FindExecutableA() on Windows NT.
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
156 // Use FindExecutableW() instead...
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
157 MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)name, -1,
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
158 (LPWSTR)widename, BUFSIZE);
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
159 if (FindExecutableW((LPCWSTR)widename, (LPCWSTR)"",
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
160 (LPWSTR)location) > (HINSTANCE)32)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 {
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
162 WideCharToMultiByte(CP_ACP, 0, (LPWSTR)location, -1,
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
163 (LPSTR)widename, 2 * BUFSIZE, NULL, NULL);
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
164 return widename;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 * Call searchpath() and save the result in allocated memory, or return NULL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172 static char *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 searchpath_save(char *name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175 char *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 char *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178 p = searchpath(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 s = alloc(strlen(p) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 strcpy(s, p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 return s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185
826
1cdd2661f34c updated for version 7.0d01
vimboss
parents: 782
diff changeset
186
1cdd2661f34c updated for version 7.0d01
vimboss
parents: 782
diff changeset
187 #ifndef CSIDL_COMMON_PROGRAMS
1cdd2661f34c updated for version 7.0d01
vimboss
parents: 782
diff changeset
188 # define CSIDL_COMMON_PROGRAMS 0x0017
1cdd2661f34c updated for version 7.0d01
vimboss
parents: 782
diff changeset
189 #endif
1cdd2661f34c updated for version 7.0d01
vimboss
parents: 782
diff changeset
190 #ifndef CSIDL_COMMON_DESKTOPDIRECTORY
1cdd2661f34c updated for version 7.0d01
vimboss
parents: 782
diff changeset
191 # define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019
1cdd2661f34c updated for version 7.0d01
vimboss
parents: 782
diff changeset
192 #endif
1cdd2661f34c updated for version 7.0d01
vimboss
parents: 782
diff changeset
193
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 * Get the path to a requested Windows shell folder.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 * Return FAIL on error, OK on success
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 get_shell_folder_path(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 char *shell_folder_path,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 const char *shell_folder_name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 * The following code was successfully built with make_mvc.mak.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 * The resulting executable worked on Windows 95, Millennium Edition, and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 * 2000 Professional. But it was changed after testing...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 */
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
209 LPITEMIDLIST pidl = 0; // Pointer to an Item ID list allocated below
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
210 LPMALLOC pMalloc; // Pointer to an IMalloc interface
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 int csidl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 int alt_csidl = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 static int desktop_csidl = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 static int programs_csidl = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 int *pcsidl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 int r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 if (strcmp(shell_folder_name, "desktop") == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 pcsidl = &desktop_csidl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 csidl = CSIDL_COMMON_DESKTOPDIRECTORY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222 alt_csidl = CSIDL_DESKTOP;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 else if (strncmp(shell_folder_name, "Programs", 8) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 pcsidl = &programs_csidl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 csidl = CSIDL_COMMON_PROGRAMS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 alt_csidl = CSIDL_PROGRAMS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 printf("\nERROR (internal) unrecognised shell_folder_name: \"%s\"\n\n",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 shell_folder_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
237 // Did this stuff before, use the same ID again.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 if (*pcsidl >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 csidl = *pcsidl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 alt_csidl = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 retry:
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
245 // Initialize pointer to IMalloc interface
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 if (NOERROR != SHGetMalloc(&pMalloc))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 printf("\nERROR getting interface for shell_folder_name: \"%s\"\n\n",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 shell_folder_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
253 // Get an ITEMIDLIST corresponding to the folder code
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 if (NOERROR != SHGetSpecialFolderLocation(0, csidl, &pidl))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 if (alt_csidl < 0 || NOERROR != SHGetSpecialFolderLocation(0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 alt_csidl, &pidl))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 printf("\nERROR getting ITEMIDLIST for shell_folder_name: \"%s\"\n\n",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 shell_folder_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 csidl = alt_csidl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 alt_csidl = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
267 // Translate that ITEMIDLIST to a string
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 r = SHGetPathFromIDList(pidl, shell_folder_path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
270 // Free the data associated with pidl
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 pMalloc->lpVtbl->Free(pMalloc, pidl);
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
272 // Release the IMalloc interface
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 pMalloc->lpVtbl->Release(pMalloc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 if (!r)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 if (alt_csidl >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 {
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
279 // We probably get here for Windows 95: the "all users"
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
280 // desktop/start menu entry doesn't exist.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 csidl = alt_csidl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 alt_csidl = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 printf("\nERROR translating ITEMIDLIST for shell_folder_name: \"%s\"\n\n",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 shell_folder_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
290 // If there is an alternative: verify we can write in this directory.
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
291 // This should cause a retry when the "all users" directory exists but we
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
292 // are a normal user and can't write there.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 if (alt_csidl >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 char tbuf[BUFSIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 FILE *fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 strcpy(tbuf, shell_folder_path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 strcat(tbuf, "\\vim write test");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 fd = fopen(tbuf, "w");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 if (fd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 csidl = alt_csidl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 alt_csidl = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 fclose(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 unlink(tbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 * Keep the found csidl for next time, so that we don't have to do the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 * write test every time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 if (*pcsidl < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 *pcsidl = csidl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 if (strncmp(shell_folder_name, "Programs\\", 9) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 strcat(shell_folder_path, shell_folder_name + 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 * List of targets. The first one (index zero) is used for the default path
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 * for the batch files.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 */
782
d20041a02ee5 updated for version 7.0228
vimboss
parents: 714
diff changeset
328 #define TARGET_COUNT 9
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 {
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
332 char *name; // Vim exe name (without .exe)
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
333 char *batname; // batch file name
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
334 char *lnkname; // shortcut file name
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
335 char *exename; // exe file name
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
336 char *exenamearg; // exe file name when using exearg
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
337 char *exearg; // argument for vim.exe or gvim.exe
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
338 char *oldbat; // path to existing xxx.bat or NULL
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
339 char *oldexe; // path to existing xxx.exe or NULL
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
340 char batpath[BUFSIZE]; // path of batch file to create; not
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
341 // created when it's empty
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 } targets[TARGET_COUNT] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
343 {
29113
495d55210aac patch 8.2.5077: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 29105
diff changeset
344 {"all", "batch files", NULL, NULL, NULL, NULL, NULL, NULL, ""},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 {"vim", "vim.bat", "Vim.lnk",
29113
495d55210aac patch 8.2.5077: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 29105
diff changeset
346 "vim.exe", "vim.exe", "", NULL, NULL, ""},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 {"gvim", "gvim.bat", "gVim.lnk",
29113
495d55210aac patch 8.2.5077: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 29105
diff changeset
348 "gvim.exe", "gvim.exe", "", NULL, NULL, ""},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 {"evim", "evim.bat", "gVim Easy.lnk",
29113
495d55210aac patch 8.2.5077: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 29105
diff changeset
350 "evim.exe", "gvim.exe", "-y", NULL, NULL, ""},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 {"view", "view.bat", "Vim Read-only.lnk",
29113
495d55210aac patch 8.2.5077: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 29105
diff changeset
352 "view.exe", "vim.exe", "-R", NULL, NULL, ""},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
353 {"gview", "gview.bat", "gVim Read-only.lnk",
29113
495d55210aac patch 8.2.5077: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 29105
diff changeset
354 "gview.exe", "gvim.exe", "-R", NULL, NULL, ""},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 {"vimdiff", "vimdiff.bat", "Vim Diff.lnk",
29113
495d55210aac patch 8.2.5077: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 29105
diff changeset
356 "vimdiff.exe","vim.exe", "-d", NULL, NULL, ""},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
357 {"gvimdiff","gvimdiff.bat", "gVim Diff.lnk",
29113
495d55210aac patch 8.2.5077: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 29105
diff changeset
358 "gvimdiff.exe","gvim.exe", "-d", NULL, NULL, ""},
782
d20041a02ee5 updated for version 7.0228
vimboss
parents: 714
diff changeset
359 {"vimtutor","vimtutor.bat", "Vim tutor.lnk",
29113
495d55210aac patch 8.2.5077: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 29105
diff changeset
360 "vimtutor.bat", "vimtutor.bat", "", NULL, NULL, ""},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362
19431
9800e126eaa2 patch 8.2.0273: MS-Windows uninstall may delete wrong batch file
Bram Moolenaar <Bram@vim.org>
parents: 19380
diff changeset
363 /* Uninstall key for vim.bat, etc. */
9800e126eaa2 patch 8.2.0273: MS-Windows uninstall may delete wrong batch file
Bram Moolenaar <Bram@vim.org>
parents: 19380
diff changeset
364 #define VIMBAT_UNINSTKEY "rem # uninstall key: " VIM_VERSION_NODOT " #"
9800e126eaa2 patch 8.2.0273: MS-Windows uninstall may delete wrong batch file
Bram Moolenaar <Bram@vim.org>
parents: 19380
diff changeset
365
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 #define ICON_COUNT 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 char *(icon_names[ICON_COUNT]) =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 {"gVim " VIM_VERSION_SHORT,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 "gVim Easy " VIM_VERSION_SHORT,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 "gVim Read only " VIM_VERSION_SHORT};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 char *(icon_link_names[ICON_COUNT]) =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 {"gVim " VIM_VERSION_SHORT ".lnk",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 "gVim Easy " VIM_VERSION_SHORT ".lnk",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 "gVim Read only " VIM_VERSION_SHORT ".lnk"};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375
12626
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
376 /* This is only used for dosinst.c. */
aca41efd888c patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
377 #if defined(DOSINST)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 * Run an external command and wait for it to finish.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 run_command(char *cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 char *cmd_path;
15892
e43b5e6d9190 patch 8.1.0952: compilation warnings when building the MS-Windows installer
Bram Moolenaar <Bram@vim.org>
parents: 12626
diff changeset
385 char cmd_buf[BUFSIZE * 2 + 35];
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 char *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
388 // On WinNT, 'start' is a shell built-in for cmd.exe rather than an
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
389 // executable (start.exe) like in Win9x.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 cmd_path = searchpath_save("cmd.exe");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 if (cmd_path != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 {
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
393 // There is a cmd.exe, so this might be Windows NT. If it is,
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
394 // we need to call cmd.exe explicitly. If it is a later OS,
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
395 // calling cmd.exe won't hurt if it is present.
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
396 // Also, "start" on NT expects a window title argument.
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
397 // Replace the slashes with backslashes.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 while ((p = strchr(cmd_path, '/')) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 *p = '\\';
2217
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 1222
diff changeset
400 sprintf(cmd_buf, "%s /c start \"vimcmd\" /wait %s", cmd_path, cmd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 free(cmd_path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 {
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
405 // No cmd.exe, just make the call and let the system handle it.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 sprintf(cmd_buf, "start /w %s", cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 system(cmd_buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 * Append a backslash to "name" if there isn't one yet.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 */
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 2475
diff changeset
415 void
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 add_pathsep(char *name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 int len = strlen(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 if (len > 0 && name[len - 1] != '\\' && name[len - 1] != '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
421 strcat(name, "\\");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425 * The normal chdir() does not change the default drive. This one does.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 change_drive(int drive)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 char temp[3] = "-:";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 temp[0] = (char)(drive + 'A' - 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 return !SetCurrentDirectory(temp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 * Change directory to "path".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 * Return 0 for success, -1 for failure.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 mch_chdir(char *path)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 {
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
442 if (path[0] == NUL) // just checking...
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 return 0;
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
444 if (path[1] == ':') // has a drive name
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 if (change_drive(mytoupper(path[0]) - 'A' + 1))
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
447 return -1; // invalid drive name
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 path += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 }
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
450 if (*path == NUL) // drive name only
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 return 0;
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
452 return chdir(path); // let the normal chdir() do the rest
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456 * Expand the executable name into a full path name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458 static char *
29105
faf7fcd1c8d5 patch 8.2.5073: clang on MS-Windows produces warnings
Bram Moolenaar <Bram@vim.org>
parents: 19431
diff changeset
459 my_fullpath(char *buf, char *fname UNUSED, int len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 {
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
461 // Only GetModuleFileName() will get the long file name path.
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
462 // GetFullPathName() may still use the short (FAT) name.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 DWORD len_read = GetModuleFileName(NULL, buf, (size_t)len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 return (len_read > 0 && len_read < (DWORD)len) ? buf : NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 * Remove the tail from a file or directory name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470 * Puts a NUL on the last '/' or '\'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 remove_tail(char *path)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 for (i = strlen(path) - 1; i > 0; --i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
478 if (path[i] == '/' || path[i] == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 path[i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
486 char installdir[MAX_PATH-9]; // top of the installation dir, where the
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
487 // install.exe is located, E.g.:
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
488 // "c:\vim\vim60"
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
489 int runtimeidx; // index in installdir[] where "vim60" starts
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
490 char *sysdrive; // system drive or "c:\"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493 * Setup for using this program.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494 * Sets "installdir[]".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 do_inits(char **argv)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 {
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
499 // Find out the full path of our executable.
15941
b9098585d945 patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents: 15892
diff changeset
500 if (my_fullpath(installdir, argv[0], sizeof(installdir)) == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 printf("ERROR: Cannot get name of executable\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 myexit(1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 }
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
505 // remove the tail, the executable name "install.exe"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 remove_tail(installdir);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
508 // change to the installdir
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 mch_chdir(installdir);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510
18753
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
511 // Find the system drive. Only used for searching the Vim executable, not
6e3dc2d630c2 patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18174
diff changeset
512 // very important.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513 sysdrive = getenv("SYSTEMDRIVE");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 if (sysdrive == NULL || *sysdrive == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 sysdrive = "C:\\";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 }