ReactOS  0.4.15-dev-4869-g35a816a
ShellExecCmdLine.cpp
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS API tests
3  * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4  * PURPOSE: Test for ShellExecCmdLine
5  * PROGRAMMERS: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6  */
7 #include "shelltest.h"
8 #include <shlwapi.h>
9 #include <strsafe.h>
10 #include <versionhelpers.h>
11 #include "shell32_apitest_sub.h"
12 
13 #define NDEBUG
14 #include <debug.h>
15 #include <stdio.h>
16 
17 #ifndef SECL_NO_UI
18  #define SECL_NO_UI 0x2
19  #define SECL_LOG_USAGE 0x8
20  #define SECL_USE_IDLIST 0x10
21  #define SECL_ALLOW_NONEXE 0x20
22  #define SECL_RUNAS 0x40
23 #endif
24 
25 #define ShellExecCmdLine proxy_ShellExecCmdLine
26 
27 #define shell32_hInstance GetModuleHandle(NULL)
28 #define IDS_FILE_NOT_FOUND (-1)
29 
30 static const WCHAR wszOpen[] = L"open";
31 static const WCHAR wszExe[] = L".exe";
32 static const WCHAR wszCom[] = L".com";
33 
34 static __inline void __SHCloneStrW(WCHAR **target, const WCHAR *source)
35 {
36  *target = (WCHAR *)SHAlloc((lstrlenW(source) + 1) * sizeof(WCHAR) );
38 }
39 
40 // NOTE: You have to sync the following code to dll/win32/shell32/shlexec.cpp.
41 static LPCWSTR
42 SplitParams(LPCWSTR psz, LPWSTR pszArg0, size_t cchArg0)
43 {
44  LPCWSTR pch;
45  size_t ich = 0;
46  if (*psz == L'"')
47  {
48  // 1st argument is quoted. the string in quotes is quoted 1st argument.
49  // [pch] --> [pszArg0+ich]
50  for (pch = psz + 1; *pch && ich + 1 < cchArg0; ++ich, ++pch)
51  {
52  if (*pch == L'"' && pch[1] == L'"')
53  {
54  // doubled double quotations found!
55  pszArg0[ich] = L'"';
56  }
57  else if (*pch == L'"')
58  {
59  // single double quotation found!
60  ++pch;
61  break;
62  }
63  else
64  {
65  // otherwise
66  pszArg0[ich] = *pch;
67  }
68  }
69  }
70  else
71  {
72  // 1st argument is unquoted. non-space sequence is 1st argument.
73  // [pch] --> [pszArg0+ich]
74  for (pch = psz; *pch && !iswspace(*pch) && ich + 1 < cchArg0; ++ich, ++pch)
75  {
76  pszArg0[ich] = *pch;
77  }
78  }
79  pszArg0[ich] = 0;
80 
81  // skip space
82  while (iswspace(*pch))
83  ++pch;
84 
85  return pch;
86 }
87 
89  HWND hwnd,
90  LPCWSTR pwszCommand,
91  LPCWSTR pwszStartDir,
92  int nShow,
93  LPVOID pUnused,
94  DWORD dwSeclFlags)
95 {
98  LPCWSTR pszVerb = NULL;
99  WCHAR szFile[MAX_PATH], szFile2[MAX_PATH];
100  HRESULT hr;
101  LPCWSTR pchParams;
102  LPWSTR lpCommand = NULL;
103 
104  if (pwszCommand == NULL)
106  1, (ULONG_PTR*)pwszCommand);
107 
108  __SHCloneStrW(&lpCommand, pwszCommand);
109  StrTrimW(lpCommand, L" \t");
110 
111  if (dwSeclFlags & SECL_NO_UI)
113  if (dwSeclFlags & SECL_LOG_USAGE)
115  if (dwSeclFlags & SECL_USE_IDLIST)
117 
118  if (dwSeclFlags & SECL_RUNAS)
119  {
120  dwSize = 0;
121  hr = AssocQueryStringW(0, ASSOCSTR_COMMAND, lpCommand, L"RunAs", NULL, &dwSize);
122  if (SUCCEEDED(hr) && dwSize != 0)
123  {
124  pszVerb = L"runas";
125  }
126  }
127 
128  if (UrlIsFileUrlW(lpCommand))
129  {
130  StringCchCopyW(szFile, _countof(szFile), lpCommand);
131  pchParams = NULL;
132  }
133  else
134  {
135  pchParams = SplitParams(lpCommand, szFile, _countof(szFile));
136  if (szFile[0] != UNICODE_NULL && szFile[1] == L':' &&
137  szFile[2] == UNICODE_NULL)
138  {
139  PathAddBackslashW(szFile);
140  }
141 
142  WCHAR szCurDir[MAX_PATH];
143  GetCurrentDirectoryW(_countof(szCurDir), szCurDir);
144  if (pwszStartDir)
145  {
146  SetCurrentDirectoryW(pwszStartDir);
147  }
148 
149  if (PathIsRelativeW(szFile) &&
150  GetFullPathNameW(szFile, _countof(szFile2), szFile2, NULL) &&
151  PathFileExistsW(szFile2))
152  {
153  StringCchCopyW(szFile, _countof(szFile), szFile2);
154  }
155  else if (SearchPathW(NULL, szFile, NULL, _countof(szFile2), szFile2, NULL) ||
156  SearchPathW(NULL, szFile, wszExe, _countof(szFile2), szFile2, NULL) ||
157  SearchPathW(NULL, szFile, wszCom, _countof(szFile2), szFile2, NULL) ||
158  SearchPathW(pwszStartDir, szFile, NULL, _countof(szFile2), szFile2, NULL) ||
159  SearchPathW(pwszStartDir, szFile, wszExe, _countof(szFile2), szFile2, NULL) ||
160  SearchPathW(pwszStartDir, szFile, wszCom, _countof(szFile2), szFile2, NULL))
161  {
162  StringCchCopyW(szFile, _countof(szFile), szFile2);
163  }
164  else if (SearchPathW(NULL, lpCommand, NULL, _countof(szFile2), szFile2, NULL) ||
165  SearchPathW(NULL, lpCommand, wszExe, _countof(szFile2), szFile2, NULL) ||
166  SearchPathW(NULL, lpCommand, wszCom, _countof(szFile2), szFile2, NULL) ||
167  SearchPathW(pwszStartDir, lpCommand, NULL, _countof(szFile2), szFile2, NULL) ||
168  SearchPathW(pwszStartDir, lpCommand, wszExe, _countof(szFile2), szFile2, NULL) ||
169  SearchPathW(pwszStartDir, lpCommand, wszCom, _countof(szFile2), szFile2, NULL))
170  {
171  StringCchCopyW(szFile, _countof(szFile), szFile2);
172  pchParams = NULL;
173  }
174 
175  if (pwszStartDir)
176  {
177  SetCurrentDirectoryW(szCurDir);
178  }
179 
180  if (!(dwSeclFlags & SECL_ALLOW_NONEXE))
181  {
182  if (!GetBinaryTypeW(szFile, &dwType))
183  {
184  SHFree(lpCommand);
185 
186  if (!(dwSeclFlags & SECL_NO_UI))
187  {
188  WCHAR szText[128 + MAX_PATH], szFormat[128];
190  StringCchPrintfW(szText, _countof(szText), szFormat, szFile);
191  MessageBoxW(hwnd, szText, NULL, MB_ICONERROR);
192  }
193  return CO_E_APPNOTFOUND;
194  }
195  }
196  else
197  {
199  {
200  SHFree(lpCommand);
201 
202  if (!(dwSeclFlags & SECL_NO_UI))
203  {
204  WCHAR szText[128 + MAX_PATH], szFormat[128];
206  StringCchPrintfW(szText, _countof(szText), szFormat, szFile);
207  MessageBoxW(hwnd, szText, NULL, MB_ICONERROR);
208  }
210  }
211  }
212  }
213 
214  ZeroMemory(&info, sizeof(info));
215  info.cbSize = sizeof(info);
216  info.fMask = dwFlags;
217  info.hwnd = hwnd;
218  info.lpVerb = pszVerb;
219  info.lpFile = szFile;
220  info.lpParameters = (pchParams && *pchParams) ? pchParams : NULL;
221  info.lpDirectory = pwszStartDir;
222  info.nShow = nShow;
223  if (ShellExecuteExW(&info))
224  {
225  if (info.lpIDList)
226  CoTaskMemFree(info.lpIDList);
227 
228  SHFree(lpCommand);
229 
230  return S_OK;
231  }
232 
233  dwError = GetLastError();
234 
235  SHFree(lpCommand);
236 
237  return HRESULT_FROM_WIN32(dwError);
238 }
239 
240 #undef ShellExecCmdLine
241 
244 
245 typedef struct TEST_ENTRY
246 {
247  INT lineno;
252 } TEST_ENTRY;
253 
258 
259 static BOOL
261 {
264  PathAppendW(s_sub_program, L"shell32_apitest_sub.exe");
265 
267  {
269  PathAppendW(s_sub_program, L"testdata\\shell32_apitest_sub.exe");
270 
272  {
273  return FALSE;
274  }
275  }
276 
277  return TRUE;
278 }
279 
280 static const TEST_ENTRY s_entries_1[] =
281 {
282  // NULL
283  { __LINE__, 0xBADFACE, FALSE, NULL, NULL },
284  { __LINE__, 0xBADFACE, FALSE, NULL, L"." },
285  { __LINE__, 0xBADFACE, FALSE, NULL, L"system32" },
286  { __LINE__, 0xBADFACE, FALSE, NULL, L"C:\\Program Files" },
287  { __LINE__, 0xBADFACE, TRUE, NULL, NULL },
288  { __LINE__, 0xBADFACE, TRUE, NULL, L"." },
289  { __LINE__, 0xBADFACE, TRUE, NULL, L"system32" },
290  { __LINE__, 0xBADFACE, TRUE, NULL, L"C:\\Program Files" },
291  // notepad
292  { __LINE__, TRUE, FALSE, L"notepad", NULL },
293  { __LINE__, TRUE, FALSE, L"notepad", L"." },
294  { __LINE__, TRUE, FALSE, L"notepad", L"system32" },
295  { __LINE__, TRUE, FALSE, L"notepad", L"C:\\Program Files" },
296  { __LINE__, TRUE, FALSE, L"notepad \"Test File.txt\"", NULL },
297  { __LINE__, TRUE, FALSE, L"notepad \"Test File.txt\"", L"." },
298  { __LINE__, TRUE, TRUE, L"notepad", NULL },
299  { __LINE__, TRUE, TRUE, L"notepad", L"." },
300  { __LINE__, TRUE, TRUE, L"notepad", L"system32" },
301  { __LINE__, TRUE, TRUE, L"notepad", L"C:\\Program Files" },
302  { __LINE__, TRUE, TRUE, L"notepad \"Test File.txt\"", NULL },
303  { __LINE__, TRUE, TRUE, L"notepad \"Test File.txt\"", L"." },
304  // notepad.exe
305  { __LINE__, TRUE, FALSE, L"notepad.exe", NULL },
306  { __LINE__, TRUE, FALSE, L"notepad.exe", L"." },
307  { __LINE__, TRUE, FALSE, L"notepad.exe", L"system32" },
308  { __LINE__, TRUE, FALSE, L"notepad.exe", L"C:\\Program Files" },
309  { __LINE__, TRUE, FALSE, L"notepad.exe \"Test File.txt\"", NULL },
310  { __LINE__, TRUE, FALSE, L"notepad.exe \"Test File.txt\"", L"." },
311  { __LINE__, TRUE, TRUE, L"notepad.exe", NULL },
312  { __LINE__, TRUE, TRUE, L"notepad.exe", L"." },
313  { __LINE__, TRUE, TRUE, L"notepad.exe", L"system32" },
314  { __LINE__, TRUE, TRUE, L"notepad.exe", L"C:\\Program Files" },
315  { __LINE__, TRUE, TRUE, L"notepad.exe \"Test File.txt\"", NULL },
316  { __LINE__, TRUE, TRUE, L"notepad.exe \"Test File.txt\"", L"." },
317  // C:\notepad.exe
318  { __LINE__, FALSE, FALSE, L"C:\\notepad.exe", NULL },
319  { __LINE__, FALSE, FALSE, L"C:\\notepad.exe", L"." },
320  { __LINE__, FALSE, FALSE, L"C:\\notepad.exe", L"system32" },
321  { __LINE__, FALSE, FALSE, L"C:\\notepad.exe", L"C:\\Program Files" },
322  { __LINE__, FALSE, FALSE, L"C:\\notepad.exe \"Test File.txt\"", NULL },
323  { __LINE__, FALSE, FALSE, L"C:\\notepad.exe \"Test File.txt\"", L"." },
324  { __LINE__, FALSE, TRUE, L"C:\\notepad.exe", NULL },
325  { __LINE__, FALSE, TRUE, L"C:\\notepad.exe", L"." },
326  { __LINE__, FALSE, TRUE, L"C:\\notepad.exe", L"system32" },
327  { __LINE__, FALSE, TRUE, L"C:\\notepad.exe", L"C:\\Program Files" },
328  { __LINE__, FALSE, TRUE, L"C:\\notepad.exe \"Test File.txt\"", NULL },
329  { __LINE__, FALSE, TRUE, L"C:\\notepad.exe \"Test File.txt\"", L"." },
330  // "notepad"
331  { __LINE__, TRUE, FALSE, L"\"notepad\"", NULL },
332  { __LINE__, TRUE, FALSE, L"\"notepad\"", L"." },
333  { __LINE__, TRUE, FALSE, L"\"notepad\"", L"system32" },
334  { __LINE__, TRUE, FALSE, L"\"notepad\"", L"C:\\Program Files" },
335  { __LINE__, TRUE, FALSE, L"\"notepad\" \"Test File.txt\"", NULL },
336  { __LINE__, TRUE, FALSE, L"\"notepad\" \"Test File.txt\"", L"." },
337  { __LINE__, TRUE, TRUE, L"\"notepad\"", NULL },
338  { __LINE__, TRUE, TRUE, L"\"notepad\"", L"." },
339  { __LINE__, TRUE, TRUE, L"\"notepad\"", L"system32" },
340  { __LINE__, TRUE, TRUE, L"\"notepad\"", L"C:\\Program Files" },
341  { __LINE__, TRUE, TRUE, L"\"notepad\" \"Test File.txt\"", NULL },
342  { __LINE__, TRUE, TRUE, L"\"notepad\" \"Test File.txt\"", L"." },
343  // "notepad.exe"
344  { __LINE__, TRUE, FALSE, L"\"notepad.exe\"", NULL },
345  { __LINE__, TRUE, FALSE, L"\"notepad.exe\"", L"." },
346  { __LINE__, TRUE, FALSE, L"\"notepad.exe\"", L"system32" },
347  { __LINE__, TRUE, FALSE, L"\"notepad.exe\"", L"C:\\Program Files" },
348  { __LINE__, TRUE, FALSE, L"\"notepad.exe\" \"Test File.txt\"", NULL },
349  { __LINE__, TRUE, FALSE, L"\"notepad.exe\" \"Test File.txt\"", L"." },
350  { __LINE__, TRUE, TRUE, L"\"notepad.exe\"", NULL },
351  { __LINE__, TRUE, TRUE, L"\"notepad.exe\"", L"." },
352  { __LINE__, TRUE, TRUE, L"\"notepad.exe\"", L"system32" },
353  { __LINE__, TRUE, TRUE, L"\"notepad.exe\"", L"C:\\Program Files" },
354  { __LINE__, TRUE, TRUE, L"\"notepad.exe\" \"Test File.txt\"", NULL },
355  { __LINE__, TRUE, TRUE, L"\"notepad.exe\" \"Test File.txt\"", L"." },
356  // test program
357  { __LINE__, FALSE, FALSE, L"test program", NULL },
358  { __LINE__, FALSE, FALSE, L"test program", L"." },
359  { __LINE__, FALSE, FALSE, L"test program", L"system32" },
360  { __LINE__, FALSE, FALSE, L"test program", L"C:\\Program Files" },
361  { __LINE__, FALSE, FALSE, L"test program \"Test File.txt\"", NULL },
362  { __LINE__, FALSE, FALSE, L"test program \"Test File.txt\"", L"." },
363  { __LINE__, FALSE, TRUE, L"test program", NULL },
364  { __LINE__, FALSE, TRUE, L"test program", L"." },
365  { __LINE__, FALSE, TRUE, L"test program", L"system32" },
366  { __LINE__, FALSE, TRUE, L"test program", L"C:\\Program Files" },
367  { __LINE__, FALSE, TRUE, L"test program \"Test File.txt\"", NULL },
368  { __LINE__, FALSE, TRUE, L"test program \"Test File.txt\"", L"." },
369  // test program.exe
370  { __LINE__, FALSE, FALSE, L"test program.exe", NULL },
371  { __LINE__, FALSE, FALSE, L"test program.exe", L"." },
372  { __LINE__, FALSE, FALSE, L"test program.exe", L"system32" },
373  { __LINE__, FALSE, FALSE, L"test program.exe", L"C:\\Program Files" },
374  { __LINE__, FALSE, FALSE, L"test program.exe \"Test File.txt\"", NULL },
375  { __LINE__, FALSE, FALSE, L"test program.exe \"Test File.txt\"", L"." },
376  { __LINE__, FALSE, TRUE, L"test program.exe", NULL },
377  { __LINE__, FALSE, TRUE, L"test program.exe", L"." },
378  { __LINE__, FALSE, TRUE, L"test program.exe", L"system32" },
379  { __LINE__, FALSE, TRUE, L"test program.exe", L"C:\\Program Files" },
380  { __LINE__, FALSE, TRUE, L"test program.exe \"Test File.txt\"", NULL },
381  { __LINE__, FALSE, TRUE, L"test program.exe \"Test File.txt\"", L"." },
382  // test program.bat
383  { __LINE__, FALSE, FALSE, L"test program.bat", NULL },
384  { __LINE__, FALSE, FALSE, L"test program.bat", L"." },
385  { __LINE__, FALSE, FALSE, L"test program.bat", L"system32" },
386  { __LINE__, FALSE, FALSE, L"test program.bat", L"C:\\Program Files" },
387  { __LINE__, FALSE, FALSE, L"test program.bat \"Test File.txt\"", NULL },
388  { __LINE__, FALSE, FALSE, L"test program.bat \"Test File.txt\"", L"." },
389  { __LINE__, FALSE, TRUE, L"test program.bat", NULL },
390  { __LINE__, FALSE, TRUE, L"test program.bat", L"." },
391  { __LINE__, FALSE, TRUE, L"test program.bat", L"system32" },
392  { __LINE__, FALSE, TRUE, L"test program.bat", L"C:\\Program Files" },
393  { __LINE__, FALSE, TRUE, L"test program.bat \"Test File.txt\"", NULL },
394  { __LINE__, FALSE, TRUE, L"test program.bat \"Test File.txt\"", L"." },
395  // "test program"
396  { __LINE__, FALSE, FALSE, L"\"test program\"", NULL },
397  { __LINE__, FALSE, FALSE, L"\"test program\"", L"." },
398  { __LINE__, FALSE, FALSE, L"\"test program\"", L"system32" },
399  { __LINE__, FALSE, FALSE, L"\"test program\"", L"C:\\Program Files" },
400  { __LINE__, FALSE, FALSE, L"\"test program\" \"Test File.txt\"", NULL },
401  { __LINE__, FALSE, FALSE, L"\"test program\" \"Test File.txt\"", L"." },
402  { __LINE__, FALSE, TRUE, L"\"test program\"", NULL },
403  { __LINE__, FALSE, TRUE, L"\"test program\"", L"." },
404  { __LINE__, FALSE, TRUE, L"\"test program\"", L"system32" },
405  { __LINE__, FALSE, TRUE, L"\"test program\"", L"C:\\Program Files" },
406  { __LINE__, FALSE, TRUE, L"\"test program\" \"Test File.txt\"", NULL },
407  { __LINE__, FALSE, TRUE, L"\"test program\" \"Test File.txt\"", L"." },
408  // "test program.exe"
409  { __LINE__, TRUE, FALSE, L"\"test program.exe\"", NULL },
410  { __LINE__, TRUE, FALSE, L"\"test program.exe\"", L"." },
411  { __LINE__, TRUE, FALSE, L"\"test program.exe\"", L"system32" },
412  { __LINE__, TRUE, FALSE, L"\"test program.exe\"", L"C:\\Program Files" },
413  { __LINE__, TRUE, FALSE, L"\"test program.exe\" \"Test File.txt\"", NULL },
414  { __LINE__, TRUE, FALSE, L"\"test program.exe\" \"Test File.txt\"", L"." },
415  { __LINE__, TRUE, TRUE, L"\"test program.exe\"", NULL },
416  { __LINE__, TRUE, TRUE, L"\"test program.exe\"", L"." },
417  { __LINE__, TRUE, TRUE, L"\"test program.exe\"", L"system32" },
418  { __LINE__, TRUE, TRUE, L"\"test program.exe\"", L"C:\\Program Files" },
419  { __LINE__, TRUE, TRUE, L"\"test program.exe\" \"Test File.txt\"", NULL },
420  { __LINE__, TRUE, TRUE, L"\"test program.exe\" \"Test File.txt\"", L"." },
421  // "test program.bat"
422  { __LINE__, FALSE, FALSE, L"\"test program.bat\"", NULL },
423  { __LINE__, FALSE, FALSE, L"\"test program.bat\"", L"." },
424  { __LINE__, FALSE, FALSE, L"\"test program.bat\"", L"system32" },
425  { __LINE__, FALSE, FALSE, L"\"test program.bat\"", L"C:\\Program Files" },
426  { __LINE__, FALSE, FALSE, L"\"test program.bat\" \"Test File.txt\"", NULL },
427  { __LINE__, FALSE, FALSE, L"\"test program.bat\" \"Test File.txt\"", L"." },
428  { __LINE__, FALSE, TRUE, L"\"test program.bat\"", NULL },
429  { __LINE__, FALSE, TRUE, L"\"test program.bat\"", L"." },
430  { __LINE__, FALSE, TRUE, L"\"test program.bat\"", L"system32" },
431  { __LINE__, FALSE, TRUE, L"\"test program.bat\"", L"C:\\Program Files" },
432  { __LINE__, FALSE, TRUE, L"\"test program.bat\" \"Test File.txt\"", NULL },
433  { __LINE__, FALSE, TRUE, L"\"test program.bat\" \"Test File.txt\"", L"." },
434  // invalid program
435  { __LINE__, FALSE, FALSE, L"invalid program", NULL },
436  { __LINE__, FALSE, FALSE, L"invalid program", L"." },
437  { __LINE__, FALSE, FALSE, L"invalid program", L"system32" },
438  { __LINE__, FALSE, FALSE, L"invalid program", L"C:\\Program Files" },
439  { __LINE__, FALSE, FALSE, L"invalid program \"Test File.txt\"", NULL },
440  { __LINE__, FALSE, FALSE, L"invalid program \"Test File.txt\"", L"." },
441  { __LINE__, FALSE, TRUE, L"invalid program", NULL },
442  { __LINE__, FALSE, TRUE, L"invalid program", L"." },
443  { __LINE__, FALSE, TRUE, L"invalid program", L"system32" },
444  { __LINE__, FALSE, TRUE, L"invalid program", L"C:\\Program Files" },
445  { __LINE__, FALSE, TRUE, L"invalid program \"Test File.txt\"", NULL },
446  { __LINE__, FALSE, TRUE, L"invalid program \"Test File.txt\"", L"." },
447  // \"invalid program.exe\"
448  { __LINE__, FALSE, FALSE, L"\"invalid program.exe\"", NULL },
449  { __LINE__, FALSE, FALSE, L"\"invalid program.exe\"", L"." },
450  { __LINE__, FALSE, FALSE, L"\"invalid program.exe\"", L"system32" },
451  { __LINE__, FALSE, FALSE, L"\"invalid program.exe\"", L"C:\\Program Files" },
452  { __LINE__, FALSE, FALSE, L"\"invalid program.exe\" \"Test File.txt\"", NULL },
453  { __LINE__, FALSE, FALSE, L"\"invalid program.exe\" \"Test File.txt\"", L"." },
454  { __LINE__, FALSE, TRUE, L"\"invalid program.exe\"", NULL },
455  { __LINE__, FALSE, TRUE, L"\"invalid program.exe\"", L"." },
456  { __LINE__, FALSE, TRUE, L"\"invalid program.exe\"", L"system32" },
457  { __LINE__, FALSE, TRUE, L"\"invalid program.exe\"", L"C:\\Program Files" },
458  { __LINE__, FALSE, TRUE, L"\"invalid program.exe\" \"Test File.txt\"", NULL },
459  { __LINE__, FALSE, TRUE, L"\"invalid program.exe\" \"Test File.txt\"", L"." },
460  // My Documents
461  { __LINE__, TRUE, TRUE, L"::{450d8fba-ad25-11d0-98a8-0800361b1103}", NULL },
462  { __LINE__, TRUE, TRUE, L"shell:::{450d8fba-ad25-11d0-98a8-0800361b1103}", NULL },
463  // shell:sendto
464  { __LINE__, TRUE, TRUE, L"shell:sendto", NULL },
465  // iexplore.exe
466  { __LINE__, TRUE, FALSE, L"iexplore", NULL },
467  { __LINE__, TRUE, FALSE, L"iexplore.exe", NULL },
468  { __LINE__, TRUE, TRUE, L"iexplore", NULL },
469  { __LINE__, TRUE, TRUE, L"iexplore.exe", NULL },
470  // https://google.com
471  { __LINE__, TRUE, FALSE, L"https://google.com", NULL },
472  { __LINE__, TRUE, TRUE, L"https://google.com", NULL },
473  // Test File 1.txt
474  { __LINE__, FALSE, FALSE, L"Test File 1.txt", NULL },
475  { __LINE__, FALSE, FALSE, L"Test File 1.txt", L"." },
476  { __LINE__, FALSE, FALSE, L"Test File 1.txt", L"system32" },
477  { __LINE__, FALSE, FALSE, L"Test File 1.txt", s_cur_dir },
478  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\"", NULL },
479  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\"", L"." },
480  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\"", L"system32" },
481  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\"", s_cur_dir },
482  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\" \"Test File.txt\"", NULL },
483  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\" \"Test File.txt\"", L"." },
484  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\" \"Test File.txt\"", L"system32" },
485  { __LINE__, FALSE, TRUE, L"Test File 1.txt", NULL },
486  { __LINE__, TRUE, TRUE, L"Test File 1.txt", L"." },
487  { __LINE__, FALSE, TRUE, L"Test File 1.txt", L"system32" },
488  { __LINE__, TRUE, TRUE, L"Test File 1.txt", s_cur_dir },
489  { __LINE__, FALSE, TRUE, L"\"Test File 1.txt\"", NULL },
490  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\"", L"." },
491  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\"", L"system32" },
492  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\"", s_cur_dir },
493  { __LINE__, FALSE, TRUE, L"\"Test File 1.txt\" \"Test File.txt\"", NULL },
494  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\" \"Test File.txt\"", L"." },
495  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\" \"Test File.txt\"", L"system32" },
496  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\" \"Test File.txt\"", s_cur_dir },
497  // Test File 2.bat
498  { __LINE__, FALSE, FALSE, L"Test File 2.bat", NULL },
499  { __LINE__, FALSE, FALSE, L"Test File 2.bat", L"." },
500  { __LINE__, FALSE, FALSE, L"Test File 2.bat", L"system32" },
501  { __LINE__, FALSE, FALSE, L"Test File 2.bat", s_cur_dir },
502  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\"", NULL },
503  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\"", L"." },
504  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\"", L"system32" },
505  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\"", s_cur_dir },
506  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\" \"Test File.txt\"", NULL },
507  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\" \"Test File.txt\"", L"." },
508  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\" \"Test File.txt\"", L"system32" },
509  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\" \"Test File.txt\"", s_cur_dir },
510  { __LINE__, FALSE, TRUE, L"Test File 2.bat", NULL },
511  { __LINE__, FALSE, TRUE, L"Test File 2.bat", L"." },
512  { __LINE__, FALSE, TRUE, L"Test File 2.bat", L"system32" },
513  { __LINE__, FALSE, TRUE, L"Test File 2.bat", s_cur_dir },
514  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\"", NULL },
515  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\"", L"." },
516  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\"", L"system32" },
517  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\"", s_cur_dir },
518  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\" \"Test File.txt\"", NULL },
519  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\" \"Test File.txt\"", L"." },
520  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\" \"Test File.txt\"", L"system32" },
521  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\" \"Test File.txt\"", s_cur_dir },
522 };
523 
524 static const TEST_ENTRY s_entries_2[] =
525 {
526  // Test File 1.txt (with setting path)
527  { __LINE__, FALSE, FALSE, L"Test File 1.txt", NULL },
528  { __LINE__, FALSE, FALSE, L"Test File 1.txt", L"." },
529  { __LINE__, FALSE, FALSE, L"Test File 1.txt", L"system32" },
530  { __LINE__, FALSE, FALSE, L"Test File 1.txt", s_cur_dir },
531  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\"", NULL },
532  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\"", L"." },
533  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\"", L"system32" },
534  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\"", s_cur_dir },
535  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\" \"Test File.txt\"", NULL },
536  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\" \"Test File.txt\"", L"." },
537  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\" \"Test File.txt\"", L"system32" },
538  { __LINE__, FALSE, FALSE, L"\"Test File 1.txt\" \"Test File.txt\"", s_cur_dir },
539  { __LINE__, FALSE, TRUE, L"Test File 1.txt", NULL },
540  { __LINE__, TRUE, TRUE, L"Test File 1.txt", L"." },
541  { __LINE__, FALSE, TRUE, L"Test File 1.txt", L"system32" },
542  { __LINE__, TRUE, TRUE, L"Test File 1.txt", s_cur_dir },
543  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\"", NULL },
544  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\"", L"." },
545  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\"", L"system32" },
546  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\"", s_cur_dir },
547  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\" \"Test File.txt\"", NULL },
548  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\" \"Test File.txt\"", L"." },
549  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\" \"Test File.txt\"", L"system32" },
550  { __LINE__, TRUE, TRUE, L"\"Test File 1.txt\" \"Test File.txt\"", s_cur_dir },
551  // Test File 2.bat (with setting path)
552  { __LINE__, FALSE, FALSE, L"Test File 2.bat", NULL },
553  { __LINE__, FALSE, FALSE, L"Test File 2.bat", L"." },
554  { __LINE__, FALSE, FALSE, L"Test File 2.bat", L"system32" },
555  { __LINE__, FALSE, FALSE, L"Test File 2.bat", s_cur_dir },
556  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\"", NULL },
557  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\"", L"." },
558  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\"", L"system32" },
559  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\"", s_cur_dir },
560  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\" \"Test File.txt\"", NULL },
561  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\" \"Test File.txt\"", L"." },
562  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\" \"Test File.txt\"", L"system32" },
563  { __LINE__, FALSE, FALSE, L"\"Test File 2.bat\" \"Test File.txt\"", s_cur_dir },
564  { __LINE__, FALSE, TRUE, L"Test File 2.bat", NULL },
565  { __LINE__, FALSE, TRUE, L"Test File 2.bat", L"." },
566  { __LINE__, FALSE, TRUE, L"Test File 2.bat", L"system32" },
567  { __LINE__, FALSE, TRUE, L"Test File 2.bat", s_cur_dir },
568  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\"", NULL },
569  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\"", L"." },
570  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\"", L"system32" },
571  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\"", s_cur_dir },
572  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\" \"Test File.txt\"", NULL },
573  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\" \"Test File.txt\"", L"." },
574  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\" \"Test File.txt\"", L"system32" },
575  { __LINE__, FALSE, TRUE, L"\"Test File 2.bat\" \"Test File.txt\"", s_cur_dir },
576 };
577 
578 typedef struct OPENWNDS
579 {
582 } OPENWNDS;
583 
584 static OPENWNDS s_wi0 = { 0 }, s_wi1 = { 0 };
585 
587 {
589  info->phwnd = (HWND *)realloc(info->phwnd, (info->count + 1) * sizeof(HWND));
590  if (!info->phwnd)
591  return FALSE;
592  info->phwnd[info->count] = hwnd;
593  ++(info->count);
594  return TRUE;
595 }
596 
597 static void CleanupNewlyCreatedWindows(void)
598 {
600  for (UINT i1 = 0; i1 < s_wi1.count; ++i1)
601  {
602  BOOL bFound = FALSE;
603  for (UINT i0 = 0; i0 < s_wi0.count; ++i0)
604  {
605  if (s_wi1.phwnd[i1] == s_wi0.phwnd[i0])
606  {
607  bFound = TRUE;
608  break;
609  }
610  }
611  if (!bFound)
612  PostMessageW(s_wi1.phwnd[i1], WM_CLOSE, 0, 0);
613  }
614  free(s_wi1.phwnd);
615  ZeroMemory(&s_wi1, sizeof(s_wi1));
616 }
617 
618 static void DoEntry(const TEST_ENTRY *pEntry)
619 {
620  HRESULT hr;
621  DWORD dwSeclFlags;
622  BOOL result;
623 
624  if (pEntry->bAllowNonExe)
625  dwSeclFlags = SECL_NO_UI | SECL_ALLOW_NONEXE;
626  else
627  dwSeclFlags = SECL_NO_UI;
628 
629  _SEH2_TRY
630  {
631  if (IsReactOS())
632  {
633  hr = proxy_ShellExecCmdLine(NULL, pEntry->pwszCommand, pEntry->pwszStartDir,
634  SW_SHOWNORMAL, NULL, dwSeclFlags);
635  }
636  else
637  {
638  hr = (*g_pShellExecCmdLine)(NULL, pEntry->pwszCommand, pEntry->pwszStartDir,
639  SW_SHOWNORMAL, NULL, dwSeclFlags);
640  }
641  }
643  {
644  hr = 0xBADFACE;
645  }
646  _SEH2_END;
647 
648  if (hr == 0xBADFACE)
649  result = hr;
650  else
651  result = (hr == S_OK);
652 
653  ok(result == pEntry->result, "Line %d: result expected %d, was %d\n",
654  pEntry->lineno, pEntry->result, result);
655 
657 }
658 
660 {
661  using namespace std;
662 
663  if (!IsReactOS())
664  {
666  {
667  skip("ShellExecCmdLine is not available on this platform\n");
668  return;
669  }
670 
671  HMODULE hShell32 = GetModuleHandleA("shell32");
673  if (!g_pShellExecCmdLine)
674  {
675  skip("ShellExecCmdLine is not found\n");
676  return;
677  }
678  }
679 
680  if (!GetSubProgramPath())
681  {
682  skip("shell32_apitest_sub.exe is not found\n");
683  return;
684  }
685 
686  // record open windows
688  {
689  skip("EnumWindows failed\n");
690  free(s_wi0.phwnd);
691  return;
692  }
693 
694  // s_win_test_exe
696  PathAppendW(s_win_test_exe, L"test program.exe");
698  if (!ret)
699  {
700  skip("Please retry with admin rights\n");
701  free(s_wi0.phwnd);
702  return;
703  }
704 
705  FILE *fp;
706 
707  // s_sys_bat_file
709  PathAppendW(s_sys_bat_file, L"test program.bat");
710  fp = _wfopen(s_sys_bat_file, L"wb");
711  fclose(fp);
713 
714  // "Test File 1.txt"
715  fp = fopen("Test File 1.txt", "wb");
716  ok(fp != NULL, "failed to create a test file\n");
717  fclose(fp);
718  ok_int(PathFileExistsA("Test File 1.txt"), TRUE);
719 
720  // "Test File 2.bat"
721  fp = fopen("Test File 2.bat", "wb");
722  ok(fp != NULL, "failed to create a test file\n");
723  fclose(fp);
724  ok_int(PathFileExistsA("Test File 2.bat"), TRUE);
725 
726  // s_cur_dir
728 
729  // do tests
730  for (size_t i = 0; i < _countof(s_entries_1); ++i)
731  {
732  DoEntry(&s_entries_1[i]);
733  }
735  for (size_t i = 0; i < _countof(s_entries_2); ++i)
736  {
737  DoEntry(&s_entries_2[i]);
738  }
739 
740  Sleep(2000);
742 
743  // clean up
744  ok(DeleteFileW(s_win_test_exe), "failed to delete the test file\n");
745  ok(DeleteFileW(s_sys_bat_file), "failed to delete the test file\n");
746  ok(DeleteFileA("Test File 1.txt"), "failed to delete the test file\n");
747  ok(DeleteFileA("Test File 2.bat"), "failed to delete the test file\n");
748  free(s_wi0.phwnd);
749 
751  Sleep(100);
752 }
#define realloc
Definition: debug_ros.c:6
static BOOL GetSubProgramPath(void)
static const WCHAR wszExe[]
struct TEST_ENTRY TEST_ENTRY
static const WCHAR wszOpen[]
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
#define HRESULT
Definition: msvc.h:7
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
Definition: path.c:629
BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath)
Definition: path.c:1578
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
HRESULT hr
Definition: shlfolder.c:183
GLuint64EXT * result
Definition: glext.h:11304
LPCWSTR pwszStartDir
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
LPCWSTR pwszCommand
#define SECL_USE_IDLIST
_Check_return_ _CRTIMP FILE *__cdecl _wfopen(_In_z_ const wchar_t *_Filename, _In_z_ const wchar_t *_Mode)
#define TRUE
Definition: types.h:120
static __inline void __SHCloneStrW(WCHAR **target, const WCHAR *source)
static HWND DoWaitForWindow(LPCWSTR clsname, LPCWSTR text, BOOL bClosing, BOOL bForce)
HRESULT(WINAPI * SHELLEXECCMDLINE)(HWND, LPCWSTR, LPCWSTR, INT, LPVOID, DWORD)
#define EXCEPTION_ACCESS_VIOLATION
Definition: winbase.h:308
#define SECL_NO_UI
#define free
Definition: debug_ros.c:5
#define INT
Definition: polytest.cpp:20
#define GetCurrentDirectoryW(x, y)
Definition: compat.h:615
#define CALLBACK
Definition: compat.h:35
#define EXCEPTION_NONCONTINUABLE
Definition: rtltypes.h:154
HANDLE HWND
Definition: compat.h:19
#define SECL_RUNAS
BOOL WINAPI PathFileExistsA(LPCSTR lpszPath)
Definition: path.c:1754
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
#define ZeroMemory
Definition: winbase.h:1667
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
static void CleanupNewlyCreatedWindows(void)
static const WCHAR wszCom[]
int32_t INT_PTR
Definition: typedefs.h:64
Definition: features.h:417
#define lstrlenW
Definition: compat.h:609
BOOL WINAPI GetBinaryTypeW(LPCWSTR lpApplicationName, LPDWORD lpBinaryType)
Definition: vdm.c:1243
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define DWORD
Definition: nt_native.h:44
int32_t INT
Definition: typedefs.h:58
unsigned int count
Definition: notification.c:64
#define pch(ap)
Definition: match.c:418
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2352
BOOL WINAPI PathAppendW(LPWSTR lpszPath, LPCWSTR lpszAppend)
Definition: path.c:126
_SEH2_TRY
Definition: create.c:4226
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define L(x)
Definition: ntvdm.h:50
#define FALSE
Definition: types.h:117
#define UNICODE_NULL
START_TEST(ShellExecCmdLine)
LPWSTR WINAPI PathAddBackslashW(LPWSTR lpszPath)
Definition: path.c:294
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
static struct _test_info info[]
Definition: SetCursorPos.c:19
if SUCCEEDED(hr)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
#define SEE_MASK_NOASYNC
Definition: shellapi.h:33
#define ok_int(expression, result)
Definition: atltest.h:134
#define SEE_MASK_FLAG_NO_UI
Definition: shellapi.h:36
#define SECL_LOG_USAGE
LONG_PTR LPARAM
Definition: windef.h:208
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
#define SECL_ALLOW_NONEXE
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2343
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
Definition: path.c:1776
INT lineno
Definition: fc.c:16
VERSIONHELPERAPI IsWindowsVistaOrGreater()
const char * LPCSTR
Definition: xmlstorage.h:183
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
HRESULT WINAPI AssocQueryStringW(ASSOCF cfFlags, ASSOCSTR str, LPCWSTR pszAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut)
Definition: assoc.c:427
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static const TEST_ENTRY s_entries_2[]
SHELLEXECCMDLINE g_pShellExecCmdLine
#define ShellExecCmdLine
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
static OPENWNDS s_wi1
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:439
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
#define _countof(array)
Definition: sndvol32.h:68
static LPCWSTR SplitParams(LPCWSTR psz, LPWSTR pszArg0, size_t cchArg0)
#define WM_CLOSE
Definition: winuser.h:1608
#define MAX_PATH
Definition: compat.h:34
#define WINAPI
Definition: msvc.h:6
#define SEE_MASK_DOENVSUBST
Definition: shellapi.h:35
BOOL bAllowNonExe
unsigned long DWORD
Definition: ntddk_ex.h:95
#define IDS_FILE_NOT_FOUND
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam)
#define LPVOID
Definition: nt_native.h:45
BOOL WINAPI DECLSPEC_HOTPATCH SetEnvironmentVariableW(IN LPCWSTR lpName, IN LPCWSTR lpValue)
Definition: environ.c:259
#define iswspace(_c)
Definition: ctype.h:669
int ret
static WCHAR s_sub_program[MAX_PATH]
static const TEST_ENTRY s_entries_1[]
Definition: cmd.c:12
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
#define MB_ICONERROR
Definition: winuser.h:781
#define CLASSNAME
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
static WCHAR s_win_test_exe[MAX_PATH]
#define UrlIsFileUrlW(x)
Definition: shlwapi.h:1377
static OPENWNDS s_wi0
DWORD WINAPI SearchPathW(IN LPCWSTR lpPath OPTIONAL, IN LPCWSTR lpFileName, IN LPCWSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart OPTIONAL)
Definition: path.c:1298
#define S_OK
Definition: intsafe.h:52
#define SW_SHOWNORMAL
Definition: winuser.h:764
_SEH2_END
Definition: create.c:4400
#define shell32_hInstance
VOID WINAPI RaiseException(IN DWORD dwExceptionCode, IN DWORD dwExceptionFlags, IN DWORD nNumberOfArguments, IN CONST ULONG_PTR *lpArguments OPTIONAL)
Definition: except.c:700
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define lstrcpyW
Definition: compat.h:608
struct OPENWNDS OPENWNDS
#define SEE_MASK_FLAG_LOG_USAGE
Definition: shellapi.h:57
BOOL WINAPI SetCurrentDirectoryW(IN LPCWSTR lpPathName)
Definition: path.c:2249
#define ok(value,...)
Definition: atltest.h:57
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
static void DoEntry(const TEST_ENTRY *pEntry)
static WCHAR s_sys_bat_file[MAX_PATH]
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1869
#define skip(...)
Definition: atltest.h:64
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
GLenum target
Definition: glext.h:7315
#define SEE_MASK_INVOKEIDLIST
Definition: shellapi.h:28
BOOL result
#define GetProcAddress(x, y)
Definition: compat.h:612
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:40
#define CO_E_APPNOTFOUND
Definition: winerror.h:2808
WCHAR * LPWSTR
Definition: xmlstorage.h:184
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4022
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
LPARAM lParam
Definition: combotst.c:139
static HMODULE hShell32
Definition: string.c:34
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
static WCHAR s_cur_dir[MAX_PATH]
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56