RDPListener::RDPListener(std::string uuid, int vm_id, uint16_t port, RDPServerWorker *parent, std::string auth, Glib::RefPtr<Gio::DBus::Connection> conn) : shm_buffer(nullptr), dbus_conn(conn), parent(parent), port(port), uuid(uuid), samfile(), vm_id(vm_id), listener_running(false), targetFPS(30), credential_path() { WTSRegisterWtsApiFunctionTable(FreeRDP_InitWtsApi()); shadow_subsystem_set_entry(RDPMux_ShadowSubsystemEntry); server = shadow_server_new(); if (!auth.empty()) samfile = auth; this->Authenticating(!auth.empty()); if (!server) { LOG(FATAL) << "LISTENER " << this << ": Shadow server didn't alloc properly, exiting."; } }
int main(int argc, char** argv) { MSG msg; int status = 0; DWORD dwExitCode; rdpSettings* settings; rdpShadowServer* server; shadow_subsystem_set_entry_builtin(NULL); server = shadow_server_new(); if (!server) { status = -1; goto fail_server_new; } settings = server->settings; settings->NlaSecurity = FALSE; settings->TlsSecurity = TRUE; settings->RdpSecurity = TRUE; #ifdef WITH_SHADOW_X11 server->authentication = TRUE; #else server->authentication = FALSE; #endif if ((status = shadow_server_parse_command_line(server, argc, argv)) < 0) { shadow_server_command_line_status_print(server, argc, argv, status); goto fail_parse_command_line; } if ((status = shadow_server_init(server)) < 0) goto fail_server_init; if ((status = shadow_server_start(server)) < 0) goto fail_server_start; if (g_MessagePump) { while (GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } WaitForSingleObject(server->thread, INFINITE); if (!GetExitCodeThread(server->thread, &dwExitCode)) status = -1; else status = (int) dwExitCode; fail_server_start: shadow_server_uninit(server); fail_server_init: fail_parse_command_line: shadow_server_free(server); fail_server_new: return status; }