void Test_NtUserSystemParametersInfo_Winsta(PTESTINFO pti) { HWINSTA hwinsta, hwinstaOld; INT ai[20]; BOOL bRet; // INT i; hwinstaOld = GetProcessWindowStation(); hwinsta = CreateWindowStation(NULL, 0, READ_CONTROL, NULL); SetProcessWindowStation(hwinsta); printf("hwinstaOld=%p, hwinsta=%p\n", hwinstaOld, hwinsta); #if 1 // currently Winsta stuff is broken in ros TEST(SystemParametersInfoA(SPI_GETBEEP, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_ACCESS_DENIED); TEST(SystemParametersInfoA(SPI_SETBEEP, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); TEST(SystemParametersInfoA(SPI_GETMOUSE, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_ACCESS_DENIED); TEST(SystemParametersInfoA(SPI_SETMOUSE, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); TEST(SystemParametersInfoA(SPI_GETBORDER, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_ACCESS_DENIED); TEST(SystemParametersInfoA(SPI_SETBORDER, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); TEST(SystemParametersInfoA(SPI_GETKEYBOARDSPEED, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_ACCESS_DENIED); TEST(SystemParametersInfoA(SPI_SETKEYBOARDSPEED, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); TEST(SystemParametersInfoA(SPI_ICONHORIZONTALSPACING, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_ACCESS_DENIED); TEST(SystemParametersInfoA(SPI_ICONHORIZONTALSPACING, 32, 0, 0) == 0); TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); TEST(SystemParametersInfoA(SPI_GETSCREENSAVETIMEOUT, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_ACCESS_DENIED); TEST(SystemParametersInfoA(SPI_SETSCREENSAVETIMEOUT, 0, ai, 0) == 0); TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); TEST(SystemParametersInfoA(SPI_GETKEYBOARDCUES, 0, &bRet, 0) == 0); TEST(GetLastError() == ERROR_ACCESS_DENIED); TEST(SystemParametersInfoA(SPI_SETKEYBOARDCUES, 0, (PVOID)1, 0) == 0); TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); #endif SetProcessWindowStation(hwinstaOld); }
static void test_handles(void) { HWINSTA w1, w2, w3; HDESK d1, d2, d3; HANDLE hthread; DWORD id, flags, le; ATOM atom; char buffer[20]; /* win stations */ w1 = GetProcessWindowStation(); ok( GetProcessWindowStation() == w1, "GetProcessWindowStation returned different handles\n" ); ok( !CloseWindowStation(w1), "closing process win station succeeded\n" ); SetLastError( 0xdeadbeef ); ok( !CloseHandle(w1), "closing process win station handle succeeded\n" ); ok( GetLastError() == ERROR_INVALID_HANDLE, "bad last error %d\n", GetLastError() ); print_object( w1 ); flags = 0; ok( GetHandleInformation( w1, &flags ), "GetHandleInformation failed\n" ); ok( !(flags & HANDLE_FLAG_PROTECT_FROM_CLOSE) || broken(flags & HANDLE_FLAG_PROTECT_FROM_CLOSE), /* set on nt4 */ "handle %p PROTECT_FROM_CLOSE set\n", w1 ); ok( DuplicateHandle( GetCurrentProcess(), w1, GetCurrentProcess(), (PHANDLE)&w2, 0, TRUE, DUPLICATE_SAME_ACCESS ), "DuplicateHandle failed\n" ); ok( CloseWindowStation(w2), "closing dup win station failed\n" ); ok( DuplicateHandle( GetCurrentProcess(), w1, GetCurrentProcess(), (PHANDLE)&w2, 0, TRUE, DUPLICATE_SAME_ACCESS ), "DuplicateHandle failed\n" ); ok( CloseHandle(w2), "closing dup win station handle failed\n" ); w2 = CreateWindowStation("WinSta0", 0, WINSTA_ALL_ACCESS, NULL ); le = GetLastError(); ok( w2 != 0 || le == ERROR_ACCESS_DENIED, "CreateWindowStation failed (%u)\n", le ); if (w2 != 0) { ok( w2 != w1, "CreateWindowStation returned default handle\n" ); SetLastError( 0xdeadbeef ); ok( !CloseDesktop( (HDESK)w2 ), "CloseDesktop succeeded on win station\n" ); ok( GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == 0xdeadbeef), /* wow64 */ "bad last error %d\n", GetLastError() ); ok( CloseWindowStation( w2 ), "CloseWindowStation failed\n" ); w2 = CreateWindowStation("WinSta0", 0, WINSTA_ALL_ACCESS, NULL ); ok( CloseHandle( w2 ), "CloseHandle failed\n" ); } else if (le == ERROR_ACCESS_DENIED) win_skip( "Not enough privileges for CreateWindowStation\n" ); w2 = OpenWindowStation("winsta0", TRUE, WINSTA_ALL_ACCESS ); ok( w2 != 0, "OpenWindowStation failed\n" ); ok( w2 != w1, "OpenWindowStation returned default handle\n" ); ok( CloseWindowStation( w2 ), "CloseWindowStation failed\n" ); w2 = OpenWindowStation("dummy name", TRUE, WINSTA_ALL_ACCESS ); ok( !w2, "open dummy win station succeeded\n" ); CreateMutexA( NULL, 0, "foobar" ); w2 = CreateWindowStation("foobar", 0, WINSTA_ALL_ACCESS, NULL ); le = GetLastError(); ok( w2 != 0 || le == ERROR_ACCESS_DENIED, "create foobar station failed (%u)\n", le ); if (w2 != 0) { w3 = OpenWindowStation("foobar", TRUE, WINSTA_ALL_ACCESS ); ok( w3 != 0, "open foobar station failed\n" ); ok( w3 != w2, "open foobar station returned same handle\n" ); ok( CloseWindowStation( w2 ), "CloseWindowStation failed\n" ); ok( CloseWindowStation( w3 ), "CloseWindowStation failed\n" ); w3 = OpenWindowStation("foobar", TRUE, WINSTA_ALL_ACCESS ); ok( !w3, "open foobar station succeeded\n" ); w2 = CreateWindowStation("foobar1", 0, WINSTA_ALL_ACCESS, NULL ); ok( w2 != 0, "create foobar station failed\n" ); w3 = CreateWindowStation("foobar2", 0, WINSTA_ALL_ACCESS, NULL ); ok( w3 != 0, "create foobar station failed\n" ); ok( GetHandleInformation( w2, &flags ), "GetHandleInformation failed\n" ); ok( GetHandleInformation( w3, &flags ), "GetHandleInformation failed\n" ); SetProcessWindowStation( w2 ); atom = GlobalAddAtomA("foo"); ok( GlobalGetAtomNameA( atom, buffer, sizeof(buffer) ) == 3, "GlobalGetAtomName failed\n" ); ok( !lstrcmpiA( buffer, "foo" ), "bad atom value %s\n", buffer ); ok( !CloseWindowStation( w2 ), "CloseWindowStation succeeded\n" ); ok( GetHandleInformation( w2, &flags ), "GetHandleInformation failed\n" ); SetProcessWindowStation( w3 ); ok( GetHandleInformation( w2, &flags ), "GetHandleInformation failed\n" ); ok( CloseWindowStation( w2 ), "CloseWindowStation failed\n" ); ok( GlobalGetAtomNameA( atom, buffer, sizeof(buffer) ) == 3, "GlobalGetAtomName failed\n" ); ok( !lstrcmpiA( buffer, "foo" ), "bad atom value %s\n", buffer ); } else if (le == ERROR_ACCESS_DENIED) win_skip( "Not enough privileges for CreateWindowStation\n" ); /* desktops */ d1 = GetThreadDesktop(GetCurrentThreadId()); initial_desktop = d1; ok( GetThreadDesktop(GetCurrentThreadId()) == d1, "GetThreadDesktop returned different handles\n" ); flags = 0; ok( GetHandleInformation( d1, &flags ), "GetHandleInformation failed\n" ); ok( !(flags & HANDLE_FLAG_PROTECT_FROM_CLOSE), "handle %p PROTECT_FROM_CLOSE set\n", d1 ); SetLastError( 0xdeadbeef ); ok( !CloseDesktop(d1), "closing thread desktop succeeded\n" ); ok( GetLastError() == ERROR_BUSY || broken(GetLastError() == 0xdeadbeef), /* wow64 */ "bad last error %d\n", GetLastError() ); SetLastError( 0xdeadbeef ); if (CloseHandle( d1 )) /* succeeds on nt4 */ { win_skip( "NT4 desktop handle management is completely different\n" ); return; } ok( GetLastError() == ERROR_INVALID_HANDLE, "bad last error %d\n", GetLastError() ); ok( DuplicateHandle( GetCurrentProcess(), d1, GetCurrentProcess(), (PHANDLE)&d2, 0, TRUE, DUPLICATE_SAME_ACCESS ), "DuplicateHandle failed\n" ); ok( CloseDesktop(d2), "closing dup desktop failed\n" ); ok( DuplicateHandle( GetCurrentProcess(), d1, GetCurrentProcess(), (PHANDLE)&d2, 0, TRUE, DUPLICATE_SAME_ACCESS ), "DuplicateHandle failed\n" ); ok( CloseHandle(d2), "closing dup desktop handle failed\n" ); d2 = OpenDesktop( "dummy name", 0, TRUE, DESKTOP_ALL_ACCESS ); ok( !d2, "open dummy desktop succeeded\n" ); d2 = CreateDesktop( "foobar", NULL, NULL, 0, DESKTOP_ALL_ACCESS, NULL ); ok( d2 != 0, "create foobar desktop failed\n" ); SetLastError( 0xdeadbeef ); ok( !CloseWindowStation( (HWINSTA)d2 ), "CloseWindowStation succeeded on desktop\n" ); ok( GetLastError() == ERROR_INVALID_HANDLE || broken(GetLastError() == 0xdeadbeef), /* wow64 */ "bad last error %d\n", GetLastError() ); SetLastError( 0xdeadbeef ); d3 = CreateDesktop( "foobar", NULL, NULL, 0, DESKTOP_ALL_ACCESS, NULL ); ok( d3 != 0, "create foobar desktop again failed\n" ); ok( GetLastError() == 0xdeadbeef, "bad last error %d\n", GetLastError() ); ok( CloseDesktop( d3 ), "CloseDesktop failed\n" ); d3 = OpenDesktop( "foobar", 0, TRUE, DESKTOP_ALL_ACCESS ); ok( d3 != 0, "open foobar desktop failed\n" ); ok( d3 != d2, "open foobar desktop returned same handle\n" ); ok( CloseDesktop( d2 ), "CloseDesktop failed\n" ); ok( CloseDesktop( d3 ), "CloseDesktop failed\n" ); d3 = OpenDesktop( "foobar", 0, TRUE, DESKTOP_ALL_ACCESS ); ok( !d3, "open foobar desktop succeeded\n" ); ok( !CloseHandle(d1), "closing thread desktop handle succeeded\n" ); d2 = GetThreadDesktop(GetCurrentThreadId()); ok( d1 == d2, "got different handles after close\n" ); register_class(); trace( "thread 1 desktop: %p\n", d1 ); print_object( d1 ); hthread = CreateThread( NULL, 0, thread, (LPVOID)2, 0, &id ); Sleep(1000); trace( "get other thread desktop: %p\n", GetThreadDesktop(id) ); WaitForSingleObject( hthread, INFINITE ); CloseHandle( hthread ); }
QConsolePrivate::QConsolePrivate (QWinTerminalImpl* parent, const QString& cmd) : q (parent), m_command (cmd), m_process (NULL), m_inWheelEvent (false) { //log (NULL); // Possibly detach from any existing console log ("Detaching from existing console (if any)...\n"); FreeConsole (); log ("Closing standard IO...\n"); closeStandardIO (0, STD_INPUT_HANDLE, "STDIN"); closeStandardIO (1, STD_OUTPUT_HANDLE, "STDOUT"); closeStandardIO (2, STD_ERROR_HANDLE, "STDERR"); #ifdef HIDDEN_CONSOLE HWINSTA hOrigSta, hNewSta; // Create new (hidden) console hOrigSta = GetProcessWindowStation (); hNewSta = CreateWindowStation (NULL, 0, GENERIC_ALL, NULL); log ("Current Windows station: %p.\nNew Windows station: %p.\n", hOrigSta, hNewSta); if (! SetProcessWindowStation (hNewSta)) log ("Failed to switch to new Windows station.\n"); #endif if (! AllocConsole ()) log ("Failed to create new console.\n"); #ifdef HIDDEN_CONSOLE if (! SetProcessWindowStation (hOrigSta)) log ("Failed to restore original Windows station.\n"); if (! CloseWindowStation (hNewSta)) log ("Failed to close new Windows station.\n"); #endif log ("New (hidden) console created.\n"); setupStandardIO (STD_INPUT_HANDLE, 0, "STDIN", "CONIN$"); setupStandardIO (STD_OUTPUT_HANDLE, 1, "STDOUT", "CONOUT$"); setupStandardIO (STD_ERROR_HANDLE, 2, "STDERR", "CONOUT$"); log ("Standard input/output/error set up.\n"); *stdin = *(fdopen (0, "rb")); *stdout = *(fdopen (1, "wb")); *stderr = *(fdopen (2, "wb")); log ("POSIX standard streams created.\n"); setvbuf (stdin, NULL, _IONBF, 0); setvbuf (stdout, NULL, _IONBF, 0); setvbuf (stderr, NULL, _IONBF, 0); log ("POSIX standard stream buffers adjusted.\n"); HANDLE hStdOut = GetStdHandle (STD_OUTPUT_HANDLE); log ("Console allocated: hStdOut: %p\n", hStdOut); m_stdOut = hStdOut; m_consoleWindow = GetConsoleWindow (); // In case the console window hasn't been created hidden... ShowWindow (m_consoleWindow, SW_HIDE); CONSOLE_SCREEN_BUFFER_INFO sbi; GetConsoleScreenBufferInfo (hStdOut, &sbi); m_bufferSize = QSize (sbi.dwSize.X, qMax (sbi.dwSize.Y, (SHORT)500)); m_consoleRect = QRect (sbi.srWindow.Left, sbi.srWindow.Top, sbi.srWindow.Right - sbi.srWindow.Left + 1, sbi.srWindow.Bottom - sbi.srWindow.Top + 1); m_cursorPos = QPoint (sbi.dwCursorPosition.X, sbi.dwCursorPosition.Y); log ("Initial console parameters:\n"); log (" buffer size: %d x %d\n", m_bufferSize.width (), m_bufferSize.height ()); log (" window: (%d, %d) -> (%d, %d) [%d x %d]\n", m_consoleRect.left (), m_consoleRect.top (), m_consoleRect.right (), m_consoleRect.bottom (), m_consoleRect.width (), m_consoleRect.height ()); wchar_t titleBuf[260]; GetConsoleTitleW (titleBuf, sizeof (titleBuf)); q->setWindowTitle (QString::fromWCharArray (titleBuf)); m_font.setFamily ("Lucida Console"); m_font.setPointSize (9); m_font.setStyleHint (QFont::TypeWriter); m_backgroundColor = Qt::white; m_buffer = m_tmpBuffer = 0; m_consoleView = new QConsoleView (parent); m_scrollBar = new QScrollBar (Qt::Vertical, parent); QHBoxLayout* l = new QHBoxLayout (parent); l->setContentsMargins (0, 0, 0, 0); l->setSpacing (0); l->addWidget (m_consoleView, 1); l->addWidget (m_scrollBar, 0); m_consoleView->setPalette (QPalette (m_backgroundColor)); m_consoleView->setAutoFillBackground (true); m_consoleView->setFont (m_font); parent->setFocusPolicy (Qt::StrongFocus); parent->winId (); updateScrollBar (); m_consoleWatcher = new QTimer (parent); m_consoleWatcher->setInterval (10); m_consoleWatcher->setSingleShot (false); QObject::connect (m_scrollBar, SIGNAL (valueChanged (int)), q, SLOT (scrollValueChanged (int))); QObject::connect (m_consoleWatcher, SIGNAL (timeout (void)), q, SLOT (monitorConsole (void))); m_consoleWatcher->start (); if (m_command.isEmpty ()) m_consoleThread = 0; else { m_consoleThread = new QConsoleThread (q); QObject::connect (m_consoleThread, SIGNAL (finished (void)), q, SIGNAL (terminated (void))); m_consoleThread->start (); } }
HWINSTA ZCreateWindowStationW(LPWSTR lpwinsta, LPSECURITY_ATTRIBUTES lpsa) { return CreateWindowStation(lpwinsta, lpsa ) ; }