FreeRDP
Loading...
Searching...
No Matches
wf_interface.c
1
21#include <freerdp/config.h>
22
23#include <winpr/tchar.h>
24#include <winpr/windows.h>
25#include <winpr/winsock.h>
26#include <winpr/assert.h>
27
28#include <freerdp/freerdp.h>
29#include <freerdp/listener.h>
30#include <freerdp/constants.h>
31#include <freerdp/channels/wtsvc.h>
32#include <freerdp/channels/channels.h>
33#include <freerdp/build-config.h>
34
35#include "wf_peer.h"
36#include "wf_settings.h"
37#include "wf_info.h"
38
39#include "wf_interface.h"
40
41#include <freerdp/log.h>
42#define TAG SERVER_TAG("windows")
43
44#define SERVER_KEY "Software\\" FREERDP_VENDOR_STRING "\\" FREERDP_PRODUCT_STRING "\\Server"
45
46static cbCallback cbEvent = nullptr;
47
48int get_screen_info(int id, _TCHAR* name, size_t length, int* width, int* height, int* bpp)
49{
50 DISPLAY_DEVICE dd = WINPR_C_ARRAY_INIT;
51
52 dd.cb = sizeof(DISPLAY_DEVICE);
53
54 if (EnumDisplayDevices(nullptr, id, &dd, 0) != 0)
55 {
56 HDC dc;
57
58 if (name != nullptr)
59 _stprintf_s(name, length, _T("%s (%s)"), dd.DeviceName, dd.DeviceString);
60
61 dc = CreateDC(dd.DeviceName, nullptr, nullptr, nullptr);
62 *width = GetDeviceCaps(dc, HORZRES);
63 *height = GetDeviceCaps(dc, VERTRES);
64 *bpp = GetDeviceCaps(dc, BITSPIXEL);
65 // ReleaseDC(nullptr, dc);
66 DeleteDC(dc);
67 }
68 else
69 {
70 return 0;
71 }
72
73 return 1;
74}
75
76void set_screen_id(int id)
77{
78 wfInfo* wfi;
79
80 wfi = wf_info_get_instance();
81 if (!wfi)
82 return;
83 wfi->screenID = id;
84
85 return;
86}
87
88static DWORD WINAPI wf_server_main_loop(LPVOID lpParam)
89{
90 freerdp_listener* instance;
91 wfInfo* wfi;
92
93 wfi = wf_info_get_instance();
94 if (!wfi)
95 {
96 WLog_ERR(TAG, "Failed to get instance");
97 return -1;
98 }
99
100 wfi->force_all_disconnect = FALSE;
101
102 instance = (freerdp_listener*)lpParam;
103 WINPR_ASSERT(instance);
104 WINPR_ASSERT(instance->GetEventHandles);
105 WINPR_ASSERT(instance->CheckFileDescriptor);
106
107 while (wfi->force_all_disconnect == FALSE)
108 {
109 DWORD status;
110 HANDLE handles[MAXIMUM_WAIT_OBJECTS] = WINPR_C_ARRAY_INIT;
111 DWORD count = instance->GetEventHandles(instance, handles, ARRAYSIZE(handles));
112
113 if (count == 0)
114 {
115 WLog_ERR(TAG, "Failed to get FreeRDP file descriptor");
116 break;
117 }
118
119 status = WaitForMultipleObjects(count, handles, FALSE, INFINITE);
120 if (status == WAIT_FAILED)
121 {
122 WLog_ERR(TAG, "WaitForMultipleObjects failed");
123 break;
124 }
125
126 if (instance->CheckFileDescriptor(instance) != TRUE)
127 {
128 WLog_ERR(TAG, "Failed to check FreeRDP file descriptor");
129 break;
130 }
131 }
132
133 WLog_INFO(TAG, "wf_server_main_loop terminating");
134 instance->Close(instance);
135
136 return 0;
137}
138
139BOOL wfreerdp_server_start(wfServer* server)
140{
141 freerdp_listener* instance;
142
143 server->instance = freerdp_listener_new();
144 server->instance->PeerAccepted = wf_peer_accepted;
145 instance = server->instance;
146
147 wf_settings_read_dword(HKEY_LOCAL_MACHINE, SERVER_KEY, _T("DefaultPort"), &server->port);
148
149 if (!instance->Open(instance, nullptr, (UINT16)server->port))
150 return FALSE;
151
152 if (!(server->thread =
153 CreateThread(nullptr, 0, wf_server_main_loop, (void*)instance, 0, nullptr)))
154 return FALSE;
155
156 return TRUE;
157}
158
159BOOL wfreerdp_server_stop(wfServer* server)
160{
161 wfInfo* wfi;
162
163 wfi = wf_info_get_instance();
164 if (!wfi)
165 return FALSE;
166 WLog_INFO(TAG, "Stopping server");
167 wfi->force_all_disconnect = TRUE;
168 server->instance->Close(server->instance);
169 return TRUE;
170}
171
172wfServer* wfreerdp_server_new()
173{
174 WSADATA wsaData = WINPR_C_ARRAY_INIT;
175 wfServer* server;
176
177 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
178 return nullptr;
179
180 if (!WTSRegisterWtsApiFunctionTable(FreeRDP_InitWtsApi()))
181 return nullptr;
182
183 wfServer* server = (wfServer*)calloc(1, sizeof(wfServer));
184
185 if (server)
186 {
187 server->port = 3389;
188 }
189
190 cbEvent = nullptr;
191
192 return server;
193}
194
195void wfreerdp_server_free(wfServer* server)
196{
197 free(server);
198
199 WSACleanup();
200}
201
202BOOL wfreerdp_server_is_running(wfServer* server)
203{
204 DWORD tStatus;
205 BOOL bRet;
206
207 bRet = GetExitCodeThread(server->thread, &tStatus);
208 if (bRet == 0)
209 {
210 WLog_ERR(TAG, "Error in call to GetExitCodeThread");
211 return FALSE;
212 }
213
214 if (tStatus == STILL_ACTIVE)
215 return TRUE;
216 return FALSE;
217}
218
219UINT32 wfreerdp_server_num_peers()
220{
221 wfInfo* wfi;
222
223 wfi = wf_info_get_instance();
224 if (!wfi)
225 return -1;
226 return wfi->peerCount;
227}
228
229UINT32 wfreerdp_server_get_peer_hostname(int pId, wchar_t* dstStr)
230{
231 wfInfo* wfi;
232 freerdp_peer* peer;
233
234 wfi = wf_info_get_instance();
235 if (!wfi)
236 return 0;
237 peer = wfi->peers[pId];
238
239 if (peer)
240 {
241 UINT32 sLen;
242
243 sLen = strnlen_s(peer->hostname, 50);
244 swprintf(dstStr, 50, L"%hs", peer->hostname);
245 return sLen;
246 }
247 else
248 {
249 WLog_WARN(TAG, "nonexistent peer id=%d", pId);
250 return 0;
251 }
252}
253
254BOOL wfreerdp_server_peer_is_local(int pId)
255{
256 wfInfo* wfi;
257 freerdp_peer* peer;
258
259 wfi = wf_info_get_instance();
260 if (!wfi)
261 return FALSE;
262 peer = wfi->peers[pId];
263
264 if (peer)
265 {
266 return peer->local;
267 }
268 else
269 {
270 return FALSE;
271 }
272}
273
274BOOL wfreerdp_server_peer_is_connected(int pId)
275{
276 wfInfo* wfi;
277 freerdp_peer* peer;
278
279 wfi = wf_info_get_instance();
280 if (!wfi)
281 return FALSE;
282 peer = wfi->peers[pId];
283
284 if (peer)
285 {
286 return peer->connected;
287 }
288 else
289 {
290 return FALSE;
291 }
292}
293
294BOOL wfreerdp_server_peer_is_activated(int pId)
295{
296 wfInfo* wfi;
297 freerdp_peer* peer;
298
299 wfi = wf_info_get_instance();
300 if (!wfi)
301 return FALSE;
302 peer = wfi->peers[pId];
303
304 if (peer)
305 {
306 return peer->activated;
307 }
308 else
309 {
310 return FALSE;
311 }
312}
313
314BOOL wfreerdp_server_peer_is_authenticated(int pId)
315{
316 wfInfo* wfi;
317 freerdp_peer* peer;
318
319 wfi = wf_info_get_instance();
320 if (!wfi)
321 return FALSE;
322 peer = wfi->peers[pId];
323
324 if (peer)
325 {
326 return peer->authenticated;
327 }
328 else
329 {
330 return FALSE;
331 }
332}
333
334void wfreerdp_server_register_callback_event(cbCallback cb)
335{
336 cbEvent = cb;
337}
338
339void wfreerdp_server_peer_callback_event(int pId, UINT32 eType)
340{
341 if (cbEvent)
342 cbEvent(pId, eType);
343}