17 #define SECL_NO_UI 0x2 18 #define SECL_LOG_USAGE 0x8 19 #define SECL_USE_IDLIST 0x10 20 #define SECL_ALLOW_NONEXE 0x20 21 #define SECL_RUNAS 0x40 24 #define ShellExecCmdLine proxy_ShellExecCmdLine 26 #define shell32_hInstance GetModuleHandle(NULL) 27 #define IDS_FILE_NOT_FOUND (-1) 49 for (
pch = psz + 1; *
pch && ich + 1 < cchArg0; ++ich, ++
pch)
56 else if (*
pch ==
L'"')
103 if (pwszCommand ==
NULL)
217 info.lpVerb = pszVerb;
218 info.lpFile = szFile;
219 info.lpParameters = (pchParams && *pchParams) ? pchParams :
NULL;
220 info.lpDirectory = pwszStartDir;
239 #undef ShellExecCmdLine 271 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad",
L"." },
272 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad",
L"system32" },
273 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad",
L"C:\\Program Files" },
274 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad \"Test File.txt\"",
NULL },
275 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad \"Test File.txt\"",
L"." },
277 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad",
L"." },
278 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad",
L"system32" },
279 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad",
L"C:\\Program Files" },
280 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad \"Test File.txt\"",
NULL },
281 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad \"Test File.txt\"",
L"." },
284 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad.exe",
L"." },
285 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad.exe",
L"system32" },
286 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad.exe",
L"C:\\Program Files" },
287 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad.exe \"Test File.txt\"",
NULL },
288 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"notepad.exe \"Test File.txt\"",
L"." },
290 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad.exe",
L"." },
291 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad.exe",
L"system32" },
292 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad.exe",
L"C:\\Program Files" },
293 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad.exe \"Test File.txt\"",
NULL },
294 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"notepad.exe \"Test File.txt\"",
L"." },
310 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad\"",
L"." },
311 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad\"",
L"system32" },
312 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad\"",
L"C:\\Program Files" },
313 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad\" \"Test File.txt\"",
NULL },
314 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad\" \"Test File.txt\"",
L"." },
316 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad\"",
L"." },
317 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad\"",
L"system32" },
318 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad\"",
L"C:\\Program Files" },
319 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad\" \"Test File.txt\"",
NULL },
320 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad\" \"Test File.txt\"",
L"." },
323 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad.exe\"",
L"." },
324 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad.exe\"",
L"system32" },
325 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad.exe\"",
L"C:\\Program Files" },
326 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad.exe\" \"Test File.txt\"",
NULL },
327 { __LINE__,
S_OK,
FALSE,
L"Notepad",
L"\"notepad.exe\" \"Test File.txt\"",
L"." },
329 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad.exe\"",
L"." },
330 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad.exe\"",
L"system32" },
331 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad.exe\"",
L"C:\\Program Files" },
332 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad.exe\" \"Test File.txt\"",
NULL },
333 { __LINE__,
S_OK,
TRUE,
L"Notepad",
L"\"notepad.exe\" \"Test File.txt\"",
L"." },
400 { __LINE__,
S_OK,
TRUE,
NULL,
L"::{450d8fba-ad25-11d0-98a8-0800361b1103}",
NULL },
401 { __LINE__,
S_OK,
TRUE,
NULL,
L"shell:::{450d8fba-ad25-11d0-98a8-0800361b1103}",
NULL },
403 { __LINE__,
S_OK,
TRUE,
NULL,
L"::{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}",
NULL },
404 { __LINE__,
S_OK,
TRUE,
NULL,
L"shell:::{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}",
NULL },
438 #define RETRY_COUNT 5 439 #define RETRY_INTERVAL 250 456 ok(bFound,
"Line %d: The window not found\n",
pEntry->lineno);
459 #undef RETRY_INTERVAL 470 skip(
"ShellExecCmdLine is not available on this platform\n");
478 skip(
"ShellExecCmdLine is not found\n");
485 ok(fp !=
NULL,
"failed to create a test file\n");
490 ok(fp !=
NULL,
"failed to create a test file\n");
517 { __LINE__,
S_OK,
TRUE,
L"Notepad", buf0,
L"." },
520 { __LINE__,
S_OK,
TRUE,
L"Notepad", buf1,
L"." },
521 { __LINE__,
S_OK,
TRUE,
L"Notepad", buf1,
L"system32" },
523 { __LINE__,
S_OK,
TRUE,
L"Notepad", buf2,
L"." },
524 { __LINE__,
S_OK,
TRUE,
L"Notepad", buf2,
L"system32" },
560 for (
size_t i = 0;
i <
_countof(additionals2); ++
i)
572 skip(
"pch == NULL\n");
582 strcpy(
pch,
"\\My Directory\\Notepad.exe");
609 for (
size_t i = 0;
i <
_countof(additionals3); ++
i)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
static const WCHAR wszExe[]
struct TEST_ENTRY TEST_ENTRY
static const WCHAR wszOpen[]
BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath)
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
static const char s_testfile2[]
#define HRESULT_FROM_WIN32(x)
VOID WINAPI CoTaskMemFree(LPVOID ptr)
static __inline void __SHCloneStrW(WCHAR **target, const WCHAR *source)
HRESULT(WINAPI * SHELLEXECCMDLINE)(HWND, LPCWSTR, LPCWSTR, INT, LPVOID, DWORD)
#define EXCEPTION_ACCESS_VIOLATION
#define GetCurrentDirectoryW(x, y)
#define EXCEPTION_NONCONTINUABLE
DWORD WINAPI GetLastError(VOID)
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
BOOL WINAPI CopyFileA(IN LPCSTR lpExistingFileName, IN LPCSTR lpNewFileName, IN BOOL bFailIfExists)
_Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
static const WCHAR wszCom[]
BOOL WINAPI GetBinaryTypeW(LPCWSTR lpApplicationName, LPDWORD lpBinaryType)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
static const WCHAR szText[]
START_TEST(ShellExecCmdLine)
LPWSTR WINAPI PathAddBackslashW(LPWSTR lpszPath)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
#define EXCEPTION_EXECUTE_HANDLER
BOOL WINAPI CreateDirectoryA(IN LPCSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
#define SEE_MASK_FLAG_NO_UI
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
#define SECL_ALLOW_NONEXE
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
VERSIONHELPERAPI IsWindowsVistaOrGreater()
HRESULT WINAPI AssocQueryStringW(ASSOCF cfFlags, ASSOCSTR str, LPCWSTR pszAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut)
#define ERROR_FILE_NOT_FOUND
static const char s_testfile1[]
SHELLEXECCMDLINE g_pShellExecCmdLine
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
HWND WINAPI FindWindowW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR)
static LPCWSTR SplitParams(LPCWSTR psz, LPWSTR pszArg0, size_t cchArg0)
#define SEE_MASK_DOENVSUBST
#define IDS_FILE_NOT_FOUND
#define INVALID_FILE_ATTRIBUTES
static const TEST_ENTRY s_entries[]
HINSTANCE WINAPI FindExecutableA(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
_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)
DWORD WINAPI SearchPathW(IN LPCWSTR lpPath OPTIONAL, IN LPCWSTR lpFileName, IN LPCWSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart OPTIONAL)
#define shell32_hInstance
VOID WINAPI RaiseException(IN DWORD dwExceptionCode, IN DWORD dwExceptionFlags, IN DWORD nNumberOfArguments, IN CONST ULONG_PTR *lpArguments OPTIONAL)
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
#define SEE_MASK_FLAG_LOG_USAGE
BOOL WINAPI SetCurrentDirectoryW(IN LPCWSTR lpPathName)
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
static void DoEntry(const TEST_ENTRY *pEntry)
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
void WINAPI SHFree(LPVOID pv)
char * strcpy(char *DstString, const char *SrcString)
#define SEE_MASK_INVOKEIDLIST
#define GetProcAddress(x, y)
#define _SEH2_EXCEPT(...)
LPVOID WINAPI SHAlloc(SIZE_T len)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize