14#define ok_ShellExecuteEx (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : TestShellExecuteEx
27 wcscpy(
Buffer,
L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\");
37 wcscpy(
Buffer,
L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\");
58 wcscpy(
Buffer,
L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\");
71 ZeroMemory(&ShellExecInfo,
sizeof(ShellExecInfo));
72 ShellExecInfo.
cbSize =
sizeof(ShellExecInfo);
128#define DONT_CARE 0x0BADF00D
132 { __LINE__,
TRUE,
TRUE,
"test program" },
133 { __LINE__,
TRUE,
TRUE,
"test program.bat" },
134 { __LINE__,
TRUE,
TRUE,
"test program.exe" },
136 { __LINE__,
FALSE,
FALSE,
" test program.bat" },
137 { __LINE__,
FALSE,
FALSE,
" test program.exe" },
139 { __LINE__,
TRUE,
TRUE,
"test program.bat " },
140 { __LINE__,
TRUE,
TRUE,
"test program.exe " },
141 { __LINE__,
TRUE,
TRUE,
"test program",
"TEST" },
142 { __LINE__,
TRUE,
TRUE,
"test program.bat",
"TEST" },
143 { __LINE__,
TRUE,
TRUE,
"test program.exe",
"TEST" },
144 { __LINE__,
FALSE,
FALSE,
".\\test program.bat" },
145 { __LINE__,
FALSE,
FALSE,
".\\test program.exe" },
146 { __LINE__,
TRUE,
TRUE,
"\"test program\"" },
147 { __LINE__,
TRUE,
TRUE,
"\"test program.bat\"" },
148 { __LINE__,
TRUE,
TRUE,
"\"test program.exe\"" },
149 { __LINE__,
FALSE,
FALSE,
"\"test program\" TEST" },
150 { __LINE__,
FALSE,
FALSE,
"\"test program.bat\" TEST" },
151 { __LINE__,
FALSE,
FALSE,
"\"test program.exe\" TEST" },
152 { __LINE__,
FALSE,
FALSE,
" \"test program\"" },
153 { __LINE__,
FALSE,
FALSE,
" \"test program.bat\"" },
154 { __LINE__,
FALSE,
FALSE,
" \"test program.exe\"" },
155 { __LINE__,
FALSE,
FALSE,
"\"test program\" " },
156 { __LINE__,
FALSE,
FALSE,
"\"test program.bat\" " },
157 { __LINE__,
FALSE,
FALSE,
"\"test program.exe\" " },
158 { __LINE__,
FALSE,
FALSE,
"\".\\test program.bat\"" },
159 { __LINE__,
FALSE,
FALSE,
"\".\\test program.exe\"" },
166 { __LINE__,
FALSE,
FALSE,
"invalid program" },
167 { __LINE__,
FALSE,
FALSE,
"invalid program.bat" },
168 { __LINE__,
FALSE,
FALSE,
"invalid program.exe" },
169 { __LINE__,
TRUE,
TRUE,
"test_file.txt" },
170 { __LINE__,
TRUE,
TRUE,
"test_file.txt",
"parameters parameters" },
171 { __LINE__,
TRUE,
TRUE,
"test_file.txt",
"parameters parameters",
"." },
172 { __LINE__,
TRUE,
TRUE,
"shell32_apitest_sub.exe" },
173 { __LINE__,
TRUE,
TRUE,
".\\shell32_apitest_sub.exe" },
174 { __LINE__,
TRUE,
TRUE,
"\"shell32_apitest_sub.exe\"" },
175 { __LINE__,
TRUE,
TRUE,
"\".\\shell32_apitest_sub.exe\"" },
177 { __LINE__,
TRUE,
FALSE,
"::{450d8fba-ad25-11d0-98a8-0800361b1103}" },
178 { __LINE__,
TRUE,
FALSE,
"shell:::{450d8fba-ad25-11d0-98a8-0800361b1103}" },
179 { __LINE__,
TRUE,
FALSE,
"shell:sendto" },
184 { __LINE__,
TRUE,
TRUE,
"test program" },
185 { __LINE__,
TRUE,
TRUE,
"test program",
"TEST" },
186 { __LINE__,
TRUE,
TRUE,
"\"test program\"" },
244 ok(
ret ==
pEntry->ret,
"Line %u: ret expected %d, got %d\n",
251 if (
pEntry->bProcessHandle)
253 ok(!!
info.hProcess,
"Line %u: hProcess expected non-NULL\n",
pEntry->lineno);
257 ok(!
info.hProcess,
"Line %u: hProcess expected NULL\n",
pEntry->lineno);
269 ok(0,
"Process %s did not quit!\n",
pEntry->file);
299 skip(
"shell32_apitest_sub.exe is not found\n");
309 skip(
"Please retry with admin rights\n");
316 skip(
"EnumWindows failed\n");
403 for (
int n = 0;
n < 100; ++
n)
430 info.lpVerb =
L"properties";
432 info.lpParameters =
L"";
462 info.lpFile =
L"complete garbage, cannot run this!";
466 ok(bRet == 0,
"Succeeded!\n");
static char s_win_txt_file[MAX_PATH]
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
BOOL CALLBACK EnumProc(_In_ HWND hwnd, _In_ LPARAM lParam)
static char s_sub_program[MAX_PATH]
static char s_win_bat_file[MAX_PATH]
static void DoTestEntries(void)
static VOID TestShellExecuteEx(const WCHAR *Name, BOOL ExpectedResult)
BOOL WaitAndCloseWindow()
static VOID DeleteAppPathRegKey(const WCHAR *Name)
static char s_win_test_exe[MAX_PATH]
static void test_properties()
static void DoAppPathTest(void)
static BOOL CreateAppPathRegKey(const WCHAR *Name)
static char s_sys_bat_file[MAX_PATH]
static const TEST_ENTRY s_entries_1[]
#define ok_ShellExecuteEx
static const TEST_ENTRY s_entries_2[]
static char s_sys_txt_file[MAX_PATH]
static char s_sys_test_exe[MAX_PATH]
struct TEST_ENTRY TEST_ENTRY
static void CleanupNewlyCreatedWindows(void)
static VOID DoTestEntry(const TEST_ENTRY *pEntry)
static BOOL GetSubProgramPath(void)
#define ok_int(expression, result)
#define ok_ptr(expression, result)
#define RegCloseKey(hKey)
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
LONG WINAPI RegSetValueW(HKEY hKeyOriginal, LPCWSTR lpSubKey, DWORD dwType, LPCWSTR lpData, DWORD cbData)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
LPWSTR WINAPI StrStrIW(LPCWSTR lpszStr, LPCWSTR lpszSearch)
BOOL WINAPI CopyFileA(IN LPCSTR lpExistingFileName, IN LPCSTR lpNewFileName, IN BOOL bFailIfExists)
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
BOOL WINAPI TerminateProcess(IN HANDLE hProcess, IN UINT uExitCode)
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
BOOL WINAPI PathRemoveFileSpecA(LPSTR lpszPath)
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
BOOL WINAPI PathFileExistsA(LPCSTR lpszPath)
BOOL WINAPI PathAppendA(LPSTR lpszPath, LPCSTR lpszAppend)
_Inout_opt_ PUNICODE_STRING Extension
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
_In_ ULONG _In_ ULONG _In_ ULONG Length
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
static HWND DoWaitForWindow(LPCWSTR clsname, LPCWSTR text, BOOL bClosing, BOOL bForce)
#define SEE_MASK_NOCLOSEPROCESS
struct _SHELLEXECUTEINFOW SHELLEXECUTEINFOW
#define SEE_MASK_INVOKEIDLIST
#define SEE_MASK_FLAG_NO_UI
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExA(LPSHELLEXECUTEINFOA sei)
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
DWORD WINAPI GetLastError(void)
DWORD WINAPI GetCurrentProcessId(void)
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
#define HKEY_LOCAL_MACHINE
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam)
DWORD WINAPI WaitForInputIdle(_In_ HANDLE, _In_ DWORD)
BOOL WINAPI IsWindowVisible(_In_ HWND)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO