Files
NapCatQQ/.pnpm-store/v3/files/9c/eae67f1089a2c961b66ff7a233e02e2c803535e07682e0770fdc6a76cd0429e07d510657d2200b311f938f74b974af3a5ecc260626f2da6d8174b7b983e287
T
TanTan e311ca3275
Build NapCat Artifacts / Type Check & Test (push) Waiting to run
docs: 仓库链接指向本镜像仓库
2026-11-13 09:25:58 +08:00

79 lines
2.4 KiB
Plaintext

/*
* Creates a window station and starts a process under it. The new process
* also gets a new console.
*/
#include <windows.h>
#include <string.h>
#include <stdio.h>
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;
}