How To Set Thread to Windows Default Desktop from Winlogon

0

TL;DR I am writing a remote desktop application and having trouble with logging the user in and capturing the default desktop using DXGI; currently, I am only able to capture the screensaver desktop.

Hello! I'm writing a C application that uses DXGI to capture the desktop of a remote computer (like TeamViewer or VNC). Following these posts (1) (2) and TightVNC's source code, I wrote the following code which opens a Windows Station and desktop and gives the thread access to the desktop:

  BOOL logon = LogonUser("username",
            NULL,
            "password",
            LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT,
            &hToken);

  hwinsta = OpenWindowStation("winsta0",
                              FALSE,
                              GENERIC_ALL);

  BOOL process = SetProcessWindowStation(hwinsta);  
  HDESK hdesk = OpenInputDesktop(0,
                      FALSE,
                      GENERIC_ALL);
  SetThreadDesktop(hdesk);

After this, I call DXGI (as documented [here]), but the output that's captured is the Windows screensaver desktop (despite me successfully calling the LogonUser() function). I tried manually setting the desktop to the default desktop with

  HDESK hdesk = OpenDesktop("default",
                      0,
                      FALSE,
                      GENERIC_ALL);

but when I do so, the DuplicateOutput() function fails with 0x80070005, which is the ACCESS_DENIED error.

question:

Does anyone have an idea of what I could be doing differently to log the user on and switch past the screensaver/winlogon desktops to the default desktop?

Thank you!

windows
winapi
remote-desktop
vnc
dxgi
asked on Stack Overflow Jan 30, 2020 by M. Ying • edited Jun 20, 2020 by Community

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0