22#define WIN32_NO_STATUS
36#define DESKTOP_ALL_ACCESS 0x01ff
45 trace(
"could not get info for %p\n",
obj );
50 trace(
"could not get type for %p\n",
obj );
82 HWND hwnd =
CreateWindowExA(0,
"WinStationClass",
"test",
WS_POPUP,0,0,100,100,
GetDesktopWindow(),0,0,0);
83 ok(
hwnd != 0,
"CreateWindow failed\n" );
85 trace(
"thread %p desktop: %p\n",
arg, d1 );
97 trace(
"created desktop %p\n", d2 );
98 ok( d2 != 0,
"CreateDesktop failed\n" );
108 ok( d1 == d2,
"GetThreadDesktop did not return set desktop %p/%p\n", d1, d2 );
127 char buffer[29], default_name[29] =
"";
140 ok( !
CloseHandle(
w1),
"closing process win station handle succeeded\n" );
147 "Got unexpected access %#lx\n",
info.GrantedAccess );
153 "handle %p PROTECT_FROM_CLOSE set\n",
w1 );
168 ok(
w2 !=
w1,
"CreateWindowStation returned default handle\n" );
170 ok( !
CloseDesktop( (HDESK)
w2 ),
"CloseDesktop succeeded on win station\n" );
179 win_skip(
"Not enough privileges for CreateWindowStation\n" );
182 ok(
w2 != 0,
"OpenWindowStation failed\n" );
183 ok(
w2 !=
w1,
"OpenWindowStation returned default handle\n" );
187 ok( !
w2,
"open dummy win station succeeded\n" );
197 ok( w3 != 0,
"open foobar station failed\n" );
198 ok( w3 !=
w2,
"open foobar station returned same handle\n" );
203 ok( !w3,
"open foobar station succeeded\n" );
206 ok(
w2 != 0,
"create foobar station failed\n" );
208 ok( w3 != 0,
"create foobar station failed\n" );
227 win_skip(
"Not enough privileges for CreateWindowStation\n" );
231 ok( !
w2,
"open station succeeded\n" );
247 ok( !
strcmp(
buffer, default_name ),
"unexpected window station name '%s' expected '%s'\n",
buffer, default_name );
262 ok( !
strcmp(
buffer, default_name ),
"unexpected window station name '%s' expected '%s'\n",
buffer, default_name );
267 ok( !
w2,
"create station succeeded\n" );
273 ok( !
w2,
"create station succeeded\n" );
280 "GetThreadDesktop returned different handles\n" );
289 "Got unexpected access %#lx\n",
info.GrantedAccess );
299 win_skip(
"NT4 desktop handle management is completely different\n" );
310 ok(
CloseHandle(d2),
"closing dup desktop handle failed\n" );
313 ok( !d2,
"open dummy desktop succeeded\n" );
317 ok( !d2,
"create empty desktop succeeded\n" );
322 ok( !d2,
"open empty desktop succeeded\n" );
327 ok( !d2,
"create desktop succeeded\n" );
332 ok( !d2,
"open desktop succeeded\n" );
336 ok( d2 != 0,
"create foobar desktop failed\n" );
344 ok( d3 != 0,
"create foobar desktop again failed\n" );
349 ok( d3 != 0,
"open foobar desktop failed\n" );
350 ok( d3 != d2,
"open foobar desktop returned same handle\n" );
355 ok( !d3,
"open foobar desktop succeeded\n" );
357 ok( !
CloseHandle(d1),
"closing thread desktop handle succeeded\n" );
359 ok( d1 == d2,
"got different handles after close\n" );
362 trace(
"thread 1 desktop: %p\n", d1 );
378 trace(
"window_station_callbackA called with argument %s\n", winsta);
386 trace(
"open_window_station_callbackA called with argument %s\n", winsta);
388 ok(hwinsta !=
NULL,
"Could not open desktop %s!\n", winsta);
403 ok(!
ret,
"EnumWindowStationsA returned successfully!\n");
412 win_skip(
"Not enough privileges for CreateWindowStation\n");
418 ok(
ret == 0x12345,
"EnumWindowStationsA returned %lx\n",
ret);
423 ok(!
ret,
"EnumWindowStationsA returned %lx\n",
ret);
429 trace(
"desktop_callbackA called with argument %s\n", desktop);
438 trace(
"open_desktop_callbackA called with argument %s\n", desktop);
444 ok(hdesk !=
NULL,
"Could not open desktop %s!\n", desktop);
458 ok(!
ret,
"EnumDesktopsA returned successfully!\n");
464 ok(
ret == 0x12345,
"EnumDesktopsA returned %x\n",
ret);
469 ok(
ret == 0x12345,
"EnumDesktopsA returned %x\n",
ret);
474 ok(!
ret,
"EnumDesktopsA returned %x\n",
ret);
479 ok(!
ret,
"EnumDesktopsA returned %x\n",
ret);
487 WCHAR foobarTestW[] = {
'\\',
'f',
'o',
'o',
'b',
'a',
'r',
'T',
'e',
's',
't',0};
488 WCHAR DesktopW[] = {
'D',
'e',
's',
'k',
't',
'o',
'p',0};
498 ok(desk != 0,
"open foobarTest desktop failed\n");
509 ok(!
ret,
"GetUserObjectInformationA returned %x\n",
ret);
518 ok(
ret,
"GetUserObjectInformationA returned %x\n",
ret);
529 ok(!
ret,
"GetUserObjectInformationW returned %x\n",
ret);
538 ok(
ret,
"GetUserObjectInformationW returned %x\n",
ret);
541 ok(
lstrcmpW(bufferW, foobarTestW + 1) == 0,
"Buffer is not set to 'foobarTest'\n");
558 ok(!
ret,
"GetUserObjectInformationA returned %x\n",
ret);
567 ok(
ret,
"GetUserObjectInformationA returned %x\n",
ret);
578 ok(!
ret,
"GetUserObjectInformationW returned %x\n",
ret);
587 ok(
ret,
"GetUserObjectInformationW returned %x\n",
ret);
590 ok(
lstrcmpW(bufferW, DesktopW) == 0,
"Buffer is not set to 'Desktop'\n");
598 HDESK input_desk, old_input_desk, thread_desk, old_thread_desk, new_desk;
604 inputs[0].
ki.
wVk = 0;
606 inputs[0].
ki.
dwFlags = KEYEVENTF_UNICODE;
610 ok(old_input_desk !=
NULL,
"OpenInputDesktop failed!\n");
613 ok(
ret,
"GetUserObjectInformation failed!\n");
617 ok(input_desk !=
NULL,
"OpenInputDesktop failed!\n");
620 ok(
ret,
"GetUserObjectInformation failed!\n");
623 ok(old_input_desk != input_desk,
"returned the same handle!\n");
625 ok(
ret,
"CloseDesktop failed!\n");
629 ok(old_thread_desk !=
NULL,
"GetThreadDesktop failed!\n");
637 ok(
ret == 1,
"unexpected return count %ld\n",
ret);
641 ok(new_desk !=
NULL,
"CreateDesktop failed!\n");
643 ok(
ret,
"SetThreadDesktop failed!\n");
645 ok(thread_desk == new_desk,
"thread desktop doesn't match!\n");
666 ok(
ret,
"SetThreadDesktop failed!\n");
668 ok(thread_desk == old_thread_desk,
"thread desktop doesn't match!\n");
676 ok(
ret == 1,
"unexpected return count %ld\n",
ret);
680 ok(
ret,
"SetThreadDesktop failed!\n");
682 ok(thread_desk == old_input_desk,
"thread desktop doesn't match!\n");
690 ok(
ret == 1,
"unexpected return count %ld\n",
ret);
694 ok(
ret,
"SwitchDesktop failed!\n");
696 ok(input_desk !=
NULL,
"OpenInputDesktop failed!\n");
697 ok(input_desk != new_desk,
"returned the same handle!\n");
700 ok(
ret,
"GetUserObjectInformation failed!\n");
703 ok(
ret,
"CloseDesktop failed!\n");
712 ok(
ret,
"SetThreadDesktop failed!\n");
714 ok(thread_desk == new_desk,
"thread desktop doesn't match!\n");
722 ok(
ret == 1,
"unexpected return count %ld\n",
ret);
728 ok(input_desk !=
NULL,
"OpenInputDesktop failed!\n");
729 ok(input_desk != old_input_desk,
"returned the same handle!\n");
732 ok(
ret,
"GetUserObjectInformation failed!\n");
736 ok(
ret,
"SetThreadDesktop failed!\n");
738 ok(thread_desk == old_thread_desk,
"thread desktop doesn't match!\n");
746 ok(
ret == 1,
"unexpected return count %ld\n",
ret);
750 ok(
ret,
"CloseDesktop failed!\n");
752 ok(
ret,
"CloseDesktop failed!\n");
754 ok(
ret,
"CloseDesktop failed!\n");
760 HDESK thread_desk, new_desk, input_desk, hdesk;
764 ok(thread_desk !=
NULL,
"GetThreadDesktop failed!\n");
766 ok(
w1 !=
NULL,
"GetProcessWindowStation failed!\n");
773 win_skip(
"Not enough privileges for CreateWindowStation\n");
778 ok(!
ret,
"EnumDesktopsA failed!\n");
780 ok(input_desk !=
NULL,
"OpenInputDesktop failed!\n");
782 ok(
ret,
"CloseDesktop failed!\n");
785 ok(
ret,
"SetProcessWindowStation failed!\n");
787 ok(hdesk !=
NULL,
"GetThreadDesktop failed!\n");
788 ok(hdesk == thread_desk,
"thread desktop should not change after winstation changed!\n");
792 ok(new_desk !=
NULL,
"CreateDesktop failed!\n");
794 ok(!
ret,
"EnumDesktopsA failed!\n");
797 ok(input_desk ==
NULL,
"OpenInputDesktop should fail on non default winstation!\n");
801 ok(hdesk !=
NULL,
"OpenDesktop failed!\n");
804 ok(!
ret,
"Switch to desktop belong to non default winstation should fail!\n");
808 ok(
ret,
"SetThreadDesktop failed!\n");
813 ok(
ret,
"SetThreadDesktop should success even desktop is not belong to process winstation!\n");
815 ok(
ret,
"SetProcessWindowStation failed!\n");
817 ok(
ret,
"SetThreadDesktop failed!\n");
819 ok(
ret,
"CloseWindowStation failed!\n");
821 ok(
ret,
"CloseDesktop failed!\n");
823 ok(
ret,
"CloseDesktop failed!\n");
852 ok(
ret,
"SetThreadDesktop failed!\n");
853 param1->
hwnd =
CreateWindowA(
"test_class", param1->
wnd_name,
WS_POPUP, 0, 0, 100, 100,
NULL,
NULL,
NULL,
NULL);
854 ok(param1->
hwnd != 0,
"CreateWindowA failed!\n");
856 ok(
ret,
"SetEvent failed!\n");
877 trace(
"\"%s\" %p %08lx hwnd %p %08lx\n", win_text, hwnd_fore, fore_id,
hwnd, set_id);
879 trace(
"AttachThreadInput returned %08lx\n",
ret);
881 trace(
"ShowWindow returned %08lx\n",
ret);
883 trace(
"set topmost returned %08lx\n",
ret);
885 trace(
"set notopmost returned %08lx\n",
ret);
887 trace(
"SetForegroundWindow returned %08lx\n",
ret);
895 HWND hwnd, hwnd_test, partners[2], hwnds[2];
897 int thread_desk_id, input_desk_id, hwnd_id;
905 memset( &wclass, 0,
sizeof(wclass) );
909 param.wnd_name =
"win_name";
912 ok(hdesks[0] !=
NULL,
"OpenDesktop failed!\n");
919 win_skip(
"Not enough privileges for CreateDesktop\n");
930 trace(
"old timeout %ld\n", timeout_old);
933 ok(
ret,
"set foreground lock timeout failed!\n");
935 ok(
ret,
"get foreground lock timeout failed!\n");
938 for (thread_desk_id = 0; thread_desk_id <
DESKTOPS; thread_desk_id++)
940 param.hdesk = hdesks[thread_desk_id];
945 hwnds[thread_desk_id] =
param.hwnd;
948 for (thread_desk_id = 0; thread_desk_id <
DESKTOPS; thread_desk_id++)
950 param.hdesk = hdesks[thread_desk_id];
955 partners[thread_desk_id] =
param.hwnd;
958 trace(
"hwnd0 %p hwnd1 %p partner0 %p partner1 %p\n", hwnds[0], hwnds[1], partners[0], partners[1]);
960 for (hwnd_id = 0; hwnd_id <
DESKTOPS; hwnd_id++)
961 for (thread_desk_id = 0; thread_desk_id <
DESKTOPS; thread_desk_id++)
962 for (input_desk_id = 0; input_desk_id <
DESKTOPS; input_desk_id++)
964 trace(
"testing thread_desk %d input_desk %d hwnd %d\n",
965 thread_desk_id, input_desk_id, hwnd_id);
966 hwnd_test = hwnds[hwnd_id];
968 ok(
ret,
"set thread desktop failed!\n");
970 ok(
ret,
"switch desktop failed!\n");
974 ok(
hwnd != hwnd_test,
"unexpected foreground window %p\n",
hwnd);
978 trace(
"hwnd %p name %s\n",
hwnd, win_text);
979 if (input_desk_id == hwnd_id)
981 if (input_desk_id == thread_desk_id)
983 ok(
ret,
"SetForegroundWindow failed!\n");
985 ok(
hwnd == hwnd_test ,
"unexpected foreground window %p\n",
hwnd);
995 if (input_desk_id == thread_desk_id)
997 ok(!
ret,
"SetForegroundWindow should fail!\n");
999 ok(
hwnd == partners[input_desk_id] ,
"unexpected foreground window %p\n",
hwnd);
1005 ok(
hwnd == 0,
"unexpected foreground window %p\n",
hwnd);
1012 for (thread_desk_id =
DESKTOPS - 1; thread_desk_id >= 0; thread_desk_id--)
1015 ok(
ret,
"set thread desktop failed!\n");
1021 ok(
ret,
"switch desktop failed!\n");
1025 ok(
ret,
"set foreground lock timeout failed!\n");
1027 ok(
ret,
"get foreground lock timeout failed!\n");
1039 ok(!!desktop,
"GetThreadDesktop failed, error %lu.\n",
GetLastError());
1060 HWINSTA old_winstation, winstation;
1067 ok(!!old_winstation,
"GetProcessWindowStation failed, error %lu.\n",
GetLastError());
1069 ok(!!winstation,
"CreateWindowStationW failed, error %lu.\n",
GetLastError());
1073 ok(!!desktop,
"CreateDesktopA failed, error %lu.\n",
GetLastError());
1078 strcat(desktop_name,
"\\invisible_winstation_desktop");
1081 si.lpDesktop = desktop_name;
1119 ok(
size == expect_size,
"got size %lu\n",
size );
1136 win_skip(
"WindowStation calls not supported on this platform\n");
ATOM WINAPI GlobalAddAtomA(LPCSTR lpString)
EXTERN_C NTSTATUS WINAPI NtQueryObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG)
#define ERROR_INSUFFICIENT_BUFFER
#define ERROR_INVALID_FUNCTION
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
#define ERROR_CALL_NOT_IMPLEMENTED
#define ERROR_INVALID_PARAMETER
#define GetProcAddress(x, y)
#define INVALID_HANDLE_VALUE
#define GetCurrentProcess()
#define ERROR_INVALID_HANDLE
#define ERROR_ACCESS_DENIED
UINT WINAPI GlobalGetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize)
BOOL WINAPI GetHandleInformation(IN HANDLE hObject, OUT LPDWORD lpdwFlags)
BOOL WINAPI DuplicateHandle(IN HANDLE hSourceProcessHandle, IN HANDLE hSourceHandle, IN HANDLE hTargetProcessHandle, OUT LPHANDLE lpTargetHandle, IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwOptions)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
int WINAPI lstrcmpA(LPCSTR str1, LPCSTR str2)
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA(const char *app_name, char *cmd_line, SECURITY_ATTRIBUTES *process_attr, SECURITY_ATTRIBUTES *thread_attr, BOOL inherit, DWORD flags, void *env, const char *cur_dir, STARTUPINFOA *startup_info, PROCESS_INFORMATION *info)
_ACRTIMP int __cdecl strcmp(const char *, const char *)
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble GLdouble w2
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble w1
#define todo_wine_if(is_todo)
#define ERROR_FILE_NOT_FOUND
static HWND create_window(void)
static PROCESS_INFORMATION pi
DWORD SECURITY_INFORMATION
#define STANDARD_RIGHTS_REQUIRED
int winetest_get_mainargs(char ***pargv)
#define wait_child_process
BOOL WINAPI IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR pSecurityDescriptor)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateMutexA(IN LPSECURITY_ATTRIBUTES lpMutexAttributes OPTIONAL, IN BOOL bInitialOwner, IN LPCSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
HDESK WINAPI CreateDesktopA(LPCSTR lpszDesktop, LPCSTR lpszDevice, LPDEVMODEA pDevmode, DWORD dwFlags, ACCESS_MASK dwDesiredAccess, LPSECURITY_ATTRIBUTES lpsa)
int WINAPI GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount)
UINT WINAPI SendInput(UINT, LPINPUT, int)
DWORD WINAPI GetLastError(void)
DWORD WINAPI GetCurrentThreadId(void)
#define HANDLE_FLAG_PROTECT_FROM_CLOSE
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
HWINSTA WINAPI GetProcessWindowStation(void)
#define ERROR_PATH_NOT_FOUND
#define ERROR_BAD_PATHNAME
static void register_class(void)
static BOOL CALLBACK desktop_callbackA(LPSTR desktop, LPARAM lp)
static void test_inputdesktop(void)
static void test_invisible_winstation(char **argv)
static void test_foregroundwindow(void)
static void test_invisible_winstation_child(char *expected_info)
static BOOL CALLBACK window_station_callbackA(LPSTR winsta, LPARAM lp)
static void test_get_security(void)
static DWORD set_foreground(HWND hwnd)
static void test_enumdesktops(void)
static void test_getuserobjectinformation(void)
static BOOL CALLBACK open_window_station_callbackA(LPSTR winsta, LPARAM lp)
static void test_inputdesktop2(void)
static void test_enumstations(void)
struct tag_wnd_param wnd_param
#define DESKTOP_ALL_ACCESS
static OBJECT_INFORMATION_CLASS
static void print_object(HANDLE obj)
static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
static BOOL CALLBACK open_desktop_callbackA(LPSTR desktop, LPARAM lp)
static HDESK initial_desktop
static void test_handles(void)
HGDIOBJ WINAPI GetStockObject(_In_ int)
HDESK WINAPI GetThreadDesktop(_In_ DWORD)
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
#define SM_CYVIRTUALSCREEN
#define DESKTOP_CREATEWINDOW
BOOL WINAPI TranslateMessage(_In_ const MSG *)
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
HWND WINAPI GetForegroundWindow(void)
BOOL WINAPI SwitchDesktop(_In_ HDESK)
HWINSTA WINAPI OpenWindowStationA(_In_ LPCSTR, _In_ BOOL, _In_ DWORD)
BOOL WINAPI AttachThreadInput(_In_ DWORD, _In_ DWORD, _In_ BOOL)
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI SetThreadDesktop(_In_ HDESK)
HWINSTA WINAPI CreateWindowStationW(_In_opt_ LPCWSTR lpwinsta, _In_ DWORD dwFlags, _In_ ACCESS_MASK dwDesiredAccess, _In_opt_ LPSECURITY_ATTRIBUTES lpsa)
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
HDESK WINAPI OpenInputDesktop(_In_ DWORD, _In_ BOOL, _In_ DWORD)
HDESK WINAPI OpenDesktopA(_In_ LPCSTR, _In_ DWORD, _In_ BOOL, _In_ DWORD)
#define DESKTOP_ENUMERATE
BOOL WINAPI SetForegroundWindow(_In_ HWND)
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HWINSTA WINAPI CreateWindowStationA(_In_opt_ LPCSTR lpwinsta, _In_ DWORD dwFlags, _In_ ACCESS_MASK dwDesiredAccess, _In_opt_ LPSECURITY_ATTRIBUTES lpsa)
BOOL WINAPI CloseWindowStation(_In_ HWINSTA)
BOOL WINAPI EnumWindowStationsA(_In_ WINSTAENUMPROCA, _In_ LPARAM lParam)
BOOL WINAPI SetProcessWindowStation(_In_ HWINSTA)
HWND WINAPI GetDesktopWindow(void)
#define SM_CXVIRTUALSCREEN
#define WINSTA_ALL_ACCESS
#define SPIF_UPDATEINIFILE
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
BOOL WINAPI GetUserObjectInformationW(_In_ HANDLE hObj, _In_ int nIndex, _Out_writes_bytes_opt_(nLength) PVOID pvInfo, _In_ DWORD nLength, _Out_opt_ LPDWORD lpnLengthNeeded)
BOOL WINAPI GetUserObjectInformationA(_In_ HANDLE hObj, _In_ int nIndex, _Out_writes_bytes_opt_(nLength) PVOID pvInfo, _In_ DWORD nLength, _Out_opt_ LPDWORD lpnLengthNeeded)
BOOL WINAPI SystemParametersInfoA(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)
#define SM_XVIRTUALSCREEN
BOOL WINAPI CloseDesktop(_In_ HDESK)
BOOL WINAPI GetMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL WINAPI DestroyWindow(_In_ HWND)
int WINAPI GetSystemMetrics(_In_ int)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SM_YVIRTUALSCREEN
#define WINSTA_CREATEDESKTOP
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
BOOL WINAPI EnumDesktopsA(_In_opt_ HWINSTA, _In_ DESKTOPENUMPROCA, _In_ LPARAM)
BOOL WINAPI GetUserObjectSecurity(_In_ HANDLE hObj, _In_ PSECURITY_INFORMATION pSIRequested, _Out_writes_bytes_opt_(nLength) PSECURITY_DESCRIPTOR pSID, _In_ DWORD nLength, _Out_ LPDWORD lpnLengthNeeded)
#define DUPLICATE_SAME_ACCESS
#define DACL_SECURITY_INFORMATION