/* * Creates a window station and starts a process under it. The new process * also gets a new console. */ #include #include #include int main() { BOOL success; SECURITY_ATTRIBUTES sa; memset(&sa, 0, sizeof(sa)); sa.bInheritHandle = TRUE; HWINSTA originalStation = GetProcessWindowStation(); printf("originalStation == 0x%x\n", originalStation); HWINSTA station = CreateWindowStation(NULL, 0, WINSTA_ALL_ACCESS, &sa); printf("station == 0x%x\n", station); if (!SetProcessWindowStation(station)) printf("SetWindowStation failed!\n"); HDESK desktop = CreateDesktop("Default", NULL, NULL, /*dwFlags=*/0, GENERIC_ALL, &sa); printf("desktop = 0x%x\n", desktop); char stationName[256]; stationName[0] = '\0'; success = GetUserObjectInformation(station, UOI_NAME, stationName, sizeof(stationName), NULL); printf("stationName = [%s]\n", stationName); char startupDesktop[256]; sprintf(startupDesktop, "%s\\Default", stationName); STARTUPINFO sui; PROCESS_INFORMATION pi; memset(&sui, 0, sizeof(sui)); memset(&pi, 0, sizeof(pi)); sui.cb = sizeof(STARTUPINFO); sui.lpDesktop = startupDesktop; // Start a cmd subprocess, and have it start its own cmd subprocess. // Both subprocesses will connect to the same non-interactive window // station. const char program[] = "c:\\windows\\system32\\cmd.exe"; char cmdline[256]; sprintf(cmdline, "%s /c cmd", program); success = CreateProcess(program, cmdline, NULL, NULL, /*bInheritHandles=*/FALSE, /*dwCreationFlags=*/CREATE_NEW_CONSOLE, NULL, NULL, &sui, &pi); printf("pid == %d\n", pi.dwProcessId); // This sleep is necessary. We must give the child enough time to // connect to the specified window station. Sleep(5000); SetProcessWindowStation(originalStation); CloseWindowStation(station); CloseDesktop(desktop); Sleep(5000); return 0; }