ReactOS 0.4.15-dev-6656-gbbb33a6
ShellExecuteEx.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Testing ShellExecuteEx
5 * PROGRAMMER: Yaroslav Veremenko <yaroslav@veremenko.info>
6 * Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 */
8
9#include "shelltest.h"
10#include <shlwapi.h>
11#include <stdio.h>
12#include "shell32_apitest_sub.h"
13
14#define ok_ShellExecuteEx (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : TestShellExecuteEx
15
16static
17BOOL
19{
20 HKEY RegistryKey;
22 WCHAR Buffer[1024];
23 WCHAR KeyValue[1024];
24 DWORD Length = sizeof(KeyValue);
26
27 wcscpy(Buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\");
28 wcscat(Buffer, L"IEXPLORE.EXE");
30 if (Result != ERROR_SUCCESS) trace("Could not open iexplore.exe key. Status: %lu\n", Result);
31 if (Result) goto end;
32 Result = RegQueryValueExW(RegistryKey, NULL, NULL, NULL, (LPBYTE)KeyValue, &Length);
33 if (Result != ERROR_SUCCESS) trace("Could not read iexplore.exe key. Status: %lu\n", Result);
34 if (Result) goto end;
35 RegCloseKey(RegistryKey);
36
37 wcscpy(Buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\");
40 0, KEY_WRITE, NULL, &RegistryKey, &Disposition);
41 if (Result != ERROR_SUCCESS) trace("Could not create test key. Status: %lu\n", Result);
42 if (Result) goto end;
43 Result = RegSetValueW(RegistryKey, NULL, REG_SZ, KeyValue, 0);
44 if (Result != ERROR_SUCCESS) trace("Could not set value of the test key. Status: %lu\n", Result);
45 if (Result) goto end;
46 RegCloseKey(RegistryKey);
47end:
48 if (RegistryKey) RegCloseKey(RegistryKey);
49 return Result == ERROR_SUCCESS;
50}
51
52static
53VOID
55{
57 WCHAR Buffer[1024];
58 wcscpy(Buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\");
61 if (Result != ERROR_SUCCESS) trace("Could not remove the test key. Status: %lu\n", Result);
62}
63
64static
65VOID
66TestShellExecuteEx(const WCHAR* Name, BOOL ExpectedResult)
67{
68 SHELLEXECUTEINFOW ShellExecInfo;
70
71 ZeroMemory(&ShellExecInfo, sizeof(ShellExecInfo));
72 ShellExecInfo.cbSize = sizeof(ShellExecInfo);
74 ShellExecInfo.hwnd = NULL;
75 ShellExecInfo.nShow = SW_SHOWNORMAL;
76 ShellExecInfo.lpFile = Name;
77 ShellExecInfo.lpDirectory = NULL;
78
79 Result = ShellExecuteExW(&ShellExecInfo);
80 ok(Result == ExpectedResult, "ShellExecuteEx lpFile %s failed. Error: %lu\n", wine_dbgstr_w(Name), GetLastError());
81 if (ShellExecInfo.hProcess)
82 {
83 Result = TerminateProcess(ShellExecInfo.hProcess, 0);
84 if (!Result) trace("Terminate process failed. Error: %lu\n", GetLastError());
86 CloseHandle(ShellExecInfo.hProcess);
87 }
88}
89
90static void DoAppPathTest(void)
91{
92 ok_ShellExecuteEx(L"iexplore", TRUE);
93 ok_ShellExecuteEx(L"iexplore.exe", TRUE);
94
95 if (CreateAppPathRegKey(L"iexplore.bat"))
96 {
97 ok_ShellExecuteEx(L"iexplore.bat", TRUE);
98 ok_ShellExecuteEx(L"iexplore.bat.exe", FALSE);
99 DeleteAppPathRegKey(L"iexplore.bat");
100 }
101
102 if (CreateAppPathRegKey(L"iexplore.bat.exe"))
103 {
104 ok_ShellExecuteEx(L"iexplore.bat", FALSE);
105 ok_ShellExecuteEx(L"iexplore.bat.exe", TRUE);
106 DeleteAppPathRegKey(L"iexplore.bat.exe");
107 }
108}
109
110typedef struct TEST_ENTRY
111{
112 INT lineno;
113 BOOL ret;
115 LPCSTR file;
119
127
128#define DONT_CARE 0x0BADF00D
129
130static const TEST_ENTRY s_entries_1[] =
131{
132 { __LINE__, TRUE, TRUE, "test program" },
133 { __LINE__, TRUE, TRUE, "test program.bat" },
134 { __LINE__, TRUE, TRUE, "test program.exe" },
135 { __LINE__, FALSE, FALSE, " test program" },
136 { __LINE__, FALSE, FALSE, " test program.bat" },
137 { __LINE__, FALSE, FALSE, " test program.exe" },
138 { __LINE__, FALSE, FALSE, "test program " },
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\"" },
160 { __LINE__, TRUE, TRUE, s_win_test_exe },
161 { __LINE__, TRUE, TRUE, s_sys_test_exe },
162 { __LINE__, TRUE, TRUE, s_win_bat_file },
163 { __LINE__, TRUE, TRUE, s_sys_bat_file },
164 { __LINE__, TRUE, TRUE, s_win_bat_file, "TEST" },
165 { __LINE__, TRUE, TRUE, s_sys_bat_file, "TEST" },
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\"" },
176 { __LINE__, TRUE, DONT_CARE, "https://google.com" },
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" },
180};
181
182static const TEST_ENTRY s_entries_2[] =
183{
184 { __LINE__, TRUE, TRUE, "test program" },
185 { __LINE__, TRUE, TRUE, "test program", "TEST" },
186 { __LINE__, TRUE, TRUE, "\"test program\"" },
187 { __LINE__, TRUE, TRUE, s_win_test_exe },
188 { __LINE__, TRUE, TRUE, s_sys_test_exe },
189 { __LINE__, FALSE, FALSE, s_win_bat_file },
190 { __LINE__, FALSE, FALSE, s_sys_bat_file },
191 { __LINE__, FALSE, FALSE, s_win_bat_file, "TEST" },
192 { __LINE__, FALSE, FALSE, s_sys_bat_file, "TEST" },
193};
194
195typedef struct OPENWNDS
196{
197 UINT count;
198 HWND *phwnd;
200
201static OPENWNDS s_wi0 = { 0 }, s_wi1 = { 0 };
202
204{
206 info->phwnd = (HWND *)realloc(info->phwnd, (info->count + 1) * sizeof(HWND));
207 if (!info->phwnd)
208 return FALSE;
209 info->phwnd[info->count] = hwnd;
210 ++(info->count);
211 return TRUE;
212}
213
215{
217 for (UINT i1 = 0; i1 < s_wi1.count; ++i1)
218 {
219 BOOL bFound = FALSE;
220 for (UINT i0 = 0; i0 < s_wi0.count; ++i0)
221 {
222 if (s_wi1.phwnd[i1] == s_wi0.phwnd[i0])
223 {
224 bFound = TRUE;
225 break;
226 }
227 }
228 if (!bFound)
229 PostMessageW(s_wi1.phwnd[i1], WM_CLOSE, 0, 0);
230 }
232 ZeroMemory(&s_wi1, sizeof(s_wi1));
233}
234
236{
237 SHELLEXECUTEINFOA info = { sizeof(info) };
239 info.nShow = SW_SHOWNORMAL;
240 info.lpFile = pEntry->file;
241 info.lpParameters = pEntry->params;
242 info.lpDirectory = pEntry->curdir;
244 ok(ret == pEntry->ret, "Line %u: ret expected %d, got %d\n",
245 pEntry->lineno, pEntry->ret, ret);
246 if (!pEntry->ret)
247 return;
248
249 if ((UINT)pEntry->bProcessHandle != DONT_CARE)
250 {
251 if (pEntry->bProcessHandle)
252 {
253 ok(!!info.hProcess, "Line %u: hProcess expected non-NULL\n", pEntry->lineno);
254 }
255 else
256 {
257 ok(!info.hProcess, "Line %u: hProcess expected NULL\n", pEntry->lineno);
258 return;
259 }
260 }
261
262 WaitForInputIdle(info.hProcess, INFINITE);
263
265
266 if (WaitForSingleObject(info.hProcess, 10 * 1000) == WAIT_TIMEOUT)
267 {
268 TerminateProcess(info.hProcess, 11);
269 ok(0, "Process %s did not quit!\n", pEntry->file);
270 }
271 CloseHandle(info.hProcess);
272}
273
274static BOOL
276{
279 PathAppendA(s_sub_program, "shell32_apitest_sub.exe");
280
282 {
284 PathAppendA(s_sub_program, "testdata\\shell32_apitest_sub.exe");
285
287 {
288 return FALSE;
289 }
290 }
291
292 return TRUE;
293}
294
295static void DoTestEntries(void)
296{
297 if (!GetSubProgramPath())
298 {
299 skip("shell32_apitest_sub.exe is not found\n");
300 return;
301 }
302
303 // s_win_test_exe
305 PathAppendA(s_win_test_exe, "test program.exe");
307 if (!ret)
308 {
309 skip("Please retry with admin rights\n");
310 return;
311 }
312
313 // record open windows
315 {
316 skip("EnumWindows failed\n");
319 return;
320 }
321
322 // s_sys_test_exe
324 PathAppendA(s_sys_test_exe, "test program.exe");
326
327 // s_win_bat_file
329 PathAppendA(s_win_bat_file, "test program.bat");
330 FILE *fp = fopen(s_win_bat_file, "wb");
331 fprintf(fp, "exit /b 3");
332 fclose(fp);
334
335 // s_sys_bat_file
337 PathAppendA(s_sys_bat_file, "test program.bat");
338 fp = fopen(s_sys_bat_file, "wb");
339 fprintf(fp, "exit /b 4");
340 fclose(fp);
342
343 // s_win_txt_file
345 PathAppendA(s_win_txt_file, "test_file.txt");
346 fp = fopen(s_win_txt_file, "wb");
347 fclose(fp);
349
350 // s_sys_txt_file
352 PathAppendA(s_sys_txt_file, "test_file.txt");
353 fp = fopen(s_sys_txt_file, "wb");
354 fclose(fp);
356
357 for (UINT iTest = 0; iTest < _countof(s_entries_1); ++iTest)
358 {
359 DoTestEntry(&s_entries_1[iTest]);
360 }
361
364
365 for (UINT iTest = 0; iTest < _countof(s_entries_2); ++iTest)
366 {
367 DoTestEntry(&s_entries_2[iTest]);
368 }
369
374
376}
377
379
381{
382 DWORD pid = 0;
384 if (pid == GetCurrentProcessId() &&
386 {
387 WCHAR Buffer[512] = {0};
388
390 if (Buffer[0] && StrStrIW(Buffer, ExeName))
391 {
392 HWND* pHwnd = (HWND*)lParam;
393 *pHwnd = hwnd;
394 return FALSE;
395 }
396 }
397 return TRUE;
398}
399
401{
402 HWND hWnd = NULL;
403 for (int n = 0; n < 100; ++n)
404 {
405 Sleep(50);
406
408
409 if (hWnd)
410 {
412 return TRUE;
413 break;
414 }
415 }
416 return FALSE;
417}
418
419static void test_properties()
420{
421 WCHAR Buffer[MAX_PATH * 4];
422
424
426 SHELLEXECUTEINFOW info = { 0 };
427
428 info.cbSize = sizeof(SHELLEXECUTEINFOW);
430 info.lpVerb = L"properties";
431 info.lpFile = Buffer;
432 info.lpParameters = L"";
433 info.nShow = SW_SHOW;
434
435 BOOL bRet = ShellExecuteExW(&info);
436 ok(bRet, "Failed! (GetLastError(): %d)\n", (int)GetLastError());
437 ok_ptr(info.hInstApp, (HINSTANCE)42);
438
441 if (Extension)
442 {
443 // The inclusion of this depends on the file display settings!
445 }
446
447 if (bRet)
448 {
449 ok(WaitAndCloseWindow(), "Could not find properties window!\n");
450 }
451
452 // Now retry it with the extension cut off
453 bRet = ShellExecuteExW(&info);
454 ok(bRet, "Failed! (GetLastError(): %d)\n", (int)GetLastError());
455 ok_ptr(info.hInstApp, (HINSTANCE)42);
456
457 if (bRet)
458 {
459 ok(WaitAndCloseWindow(), "Could not find properties window!\n");
460 }
461
462 info.lpFile = L"complete garbage, cannot run this!";
463
464 // Now retry it with complete garabage
465 bRet = ShellExecuteExW(&info);
466 ok(bRet == 0, "Succeeded!\n");
467 ok_ptr(info.hInstApp, (HINSTANCE)2);
468}
469
471{
475
477 Sleep(100);
478}
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
WCHAR * ExeName
static const TEST_ENTRY s_entries_2[]
static char s_sys_txt_file[MAX_PATH]
static OPENWNDS s_wi1
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)
static OPENWNDS s_wi0
#define DONT_CARE
struct NameRec_ * Name
Definition: cdprocs.h:460
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ok_int(expression, result)
Definition: atltest.h:134
#define ok_ptr(expression, result)
Definition: atltest.h:108
HWND hWnd
Definition: settings.c:17
#define RegCloseKey(hKey)
Definition: registry.h:47
Definition: bufpool.h:45
LPARAM lParam
Definition: combotst.c:139
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
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)
Definition: reg.c:1091
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3353
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1234
LONG WINAPI RegSetValueW(HKEY hKeyOriginal, LPCWSTR lpSubKey, DWORD dwType, LPCWSTR lpData, DWORD cbData)
Definition: reg.c:5015
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4118
LPWSTR WINAPI StrStrIW(LPCWSTR lpszStr, LPCWSTR lpszSearch)
Definition: string.c:384
#define CloseHandle
Definition: compat.h:739
HANDLE HWND
Definition: compat.h:19
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
BOOL WINAPI CopyFileA(IN LPCSTR lpExistingFileName, IN LPCSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:404
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:539
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2337
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2283
BOOL WINAPI TerminateProcess(IN HANDLE hProcess, IN UINT uExitCode)
Definition: proc.c:1532
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
BOOL WINAPI PathRemoveFileSpecA(LPSTR lpszPath)
Definition: path.c:586
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
BOOL WINAPI PathFileExistsA(LPCSTR lpszPath)
Definition: path.c:1755
BOOL WINAPI PathAppendA(LPSTR lpszPath, LPCSTR lpszAppend)
Definition: path.c:106
#define INFINITE
Definition: serial.h:102
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_Inout_opt_ PUNICODE_STRING Extension
Definition: fltkernel.h:1092
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
GLuint GLuint end
Definition: gl.h:1545
GLdouble n
Definition: glext.h:7729
_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)
#define wine_dbgstr_w
Definition: kernel32.h:34
#define REG_SZ
Definition: layer.c:22
#define _In_
Definition: ms_sal.h:308
unsigned int UINT
Definition: ndis.h:50
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
Definition: cmfuncs.h:56
#define KEY_READ
Definition: nt_native.h:1023
#define KEY_WRITE
Definition: nt_native.h:1031
#define UNICODE_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
_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 CLASSNAME
#define SEE_MASK_NOCLOSEPROCESS
Definition: shellapi.h:31
#define ShellExecuteEx
Definition: shellapi.h:691
struct _SHELLEXECUTEINFOW SHELLEXECUTEINFOW
#define SEE_MASK_INVOKEIDLIST
Definition: shellapi.h:28
#define SEE_MASK_FLAG_NO_UI
Definition: shellapi.h:36
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExA(LPSHELLEXECUTEINFOA sei)
Definition: shlexec.cpp:2285
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2335
#define _countof(array)
Definition: sndvol32.h:68
Definition: cmd.c:13
BOOL bProcessHandle
INT lineno
Definition: fc.c:16
INT ret
Definition: fc.c:17
LPCSTR curdir
LPCSTR params
LPCSTR file
LPCWSTR lpDirectory
Definition: shellapi.h:331
unsigned int count
Definition: notification.c:64
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
int ret
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1412
#define ZeroMemory
Definition: winbase.h:1700
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3837
LONG_PTR LPARAM
Definition: windef.h:208
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define WM_CLOSE
Definition: winuser.h:1611
#define WM_SYSCOMMAND
Definition: winuser.h:1731
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)
#define SC_CLOSE
Definition: winuser.h:2582
#define SW_SHOW
Definition: winuser.h:769
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
Definition: wsk.h:409
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180