/* * This test inspects the same window station aspects that are used in the * Cygwin fhandler_console.cc!fhandler_console::create_invisible_console() * function, see: * https://github.com/cygwin/cygwin/blob/7b9bfb4136f23655e243bab89fb62b04bdbacc7f/winsup/cygwin/fhandler_console.cc#L2494 */ VOID DoTest(HWND hWnd) { HWINSTA hWinSta; LPCWSTR lpszWinSta = L"Test-WinSta"; BOOL bIsItOk; LOG_FILE LogFile; WCHAR szBuffer[2048]; bIsItOk = InitLog(&LogFile, L"test_winsta.log", szBuffer, sizeof(szBuffer)); if (!bIsItOk) { MessageBoxW(hWnd, L"Could not create the log file, stopping test now...", L"Error", MB_ICONERROR | MB_OK); return; } /* Switch output to UTF-16 (little endian) */ WriteToLog(&LogFile, "\xFF\xFE", 2); WriteToLogPrintf(&LogFile, L"Creating Window Station '%s'\r\n", lpszWinSta); hWinSta = CreateWindowStationW(lpszWinSta, 0, WINSTA_ALL_ACCESS, NULL); WriteToLogPrintf(&LogFile, L"--> Returned handle 0x%p ; last error: %lu\r\n", hWinSta, GetLastError()); if (!hWinSta) { WriteToLogPuts(&LogFile, L"\r\nHandle is NULL, cannot proceed further, stopping the test!\r\n\r\n"); return; } WriteToLogPrintf(&LogFile, L"Enumerate desktops on Window Station '%s' (0x%p) (before process attach)\r\n", lpszWinSta, hWinSta); bIsItOk = EnumDesktopsW(hWinSta, EnumDesktopProc, (LPARAM)&LogFile); WriteToLogPrintf(&LogFile, L"--> Returned %s ; last error: %lu\r\n", (bIsItOk ? L"success" : L"failure"), GetLastError()); WriteToLogPrintf(&LogFile, L"Setting current process to Window Station '%s' (0x%p)\r\n", lpszWinSta, hWinSta); bIsItOk = SetProcessWindowStation(hWinSta); WriteToLogPrintf(&LogFile, L"--> Returned %s ; last error: %lu\r\n", (bIsItOk ? L"success" : L"failure"), GetLastError()); WriteToLogPrintf(&LogFile, L"Enumerate desktops on Window Station '%s' (0x%p) (after process attach, before allocating console)\r\n", lpszWinSta, hWinSta); bIsItOk = EnumDesktopsW(hWinSta, EnumDesktopProc, (LPARAM)&LogFile); WriteToLogPrintf(&LogFile, L"--> Returned %s ; last error: %lu\r\n", (bIsItOk ? L"success" : L"failure"), GetLastError()); WriteToLogPrintf(&LogFile, L"Allocating a new console on Window Station '%s' (0x%p)\r\n", lpszWinSta, hWinSta); bIsItOk = AllocConsole(); WriteToLogPrintf(&LogFile, L"--> Returned %s ; last error: %lu\r\n", (bIsItOk ? L"success" : L"failure"), GetLastError()); WriteToLogPrintf(&LogFile, L"Enumerate desktops on Window Station '%s' (0x%p) (after allocating console)\r\n", lpszWinSta, hWinSta); bIsItOk = EnumDesktopsW(hWinSta, EnumDesktopProc, (LPARAM)&LogFile); WriteToLogPrintf(&LogFile, L"--> Returned %s ; last error: %lu\r\n", (bIsItOk ? L"success" : L"failure"), GetLastError()); WriteToLogPrintf(&LogFile, L"Now closing Window Station '%s' (0x%p)\r\n", lpszWinSta, hWinSta); bIsItOk = CloseWindowStation(hWinSta); WriteToLogPrintf(&LogFile, L"--> Returned %s ; last error: %lu\r\n\r\n", (bIsItOk ? L"success" : L"failure"), GetLastError()); CloseLog(&LogFile); }
/****************************************************************************** * EnumDesktopsA (USER32.@) */ BOOL WINAPI EnumDesktopsA( HWINSTA winsta, DESKTOPENUMPROCA func, LPARAM lparam ) { struct enum_proc_lparam data; data.func = func; data.lparam = lparam; return EnumDesktopsW( winsta, enum_names_WtoA, (LPARAM)&data ); }
BOOL shutdown_all_desktops( BOOL force ) { BOOL ret; HDESK prev_desktop; prev_desktop = GetThreadDesktop(GetCurrentThreadId()); ret = EnumDesktopsW( NULL, shutdown_one_desktop, (LPARAM)force ); SetThreadDesktop(prev_desktop); return ret; }
BOOL CALLBACK EnumWindowStationProc(LPWSTR lpszWindowStation, LPARAM lParam) { HWINSTA hWinSta; printf("%S\n", lpszWindowStation); hWinSta = OpenWindowStationW(lpszWindowStation, FALSE, WINSTA_ENUMDESKTOPS); if (hWinSta == NULL) { printf("\tCan't open window station.\n"); return TRUE; } EnumDesktopsW(hWinSta, EnumDesktopProc, 0xdede); return TRUE; }