Reenabled and fixed windows server compile.

This commit is contained in:
Armin Novak 2018-11-14 15:13:11 +01:00
parent a2cd934184
commit 26b83ea74e
6 changed files with 141 additions and 172 deletions

View File

@ -30,7 +30,7 @@ if(FREERDP_VENDOR)
add_subdirectory(Mac)
endif()
else()
#add_subdirectory(Windows)
add_subdirectory(Windows)
endif()
if(NOT DEFINED WITH_FREERDS)

View File

@ -37,7 +37,7 @@
#define TAG SERVER_TAG("windows")
#define SERVER_KEY "Software\\"FREERDP_VENDOR_STRING"\\" \
FREERDP_PRODUCT_STRING"\\Server"
FREERDP_PRODUCT_STRING"\\Server"
static wfInfo* wfInfoInstance = NULL;
static int _IDcount = 0;
@ -45,21 +45,20 @@ static int _IDcount = 0;
BOOL wf_info_lock(wfInfo* wfi)
{
DWORD dRes;
dRes = WaitForSingleObject(wfi->mutex, INFINITE);
switch (dRes)
{
case WAIT_ABANDONED:
case WAIT_OBJECT_0:
return TRUE;
case WAIT_ABANDONED:
case WAIT_OBJECT_0:
return TRUE;
case WAIT_TIMEOUT:
return FALSE;
case WAIT_TIMEOUT:
return FALSE;
case WAIT_FAILED:
WLog_ERR(TAG, "wf_info_lock failed with 0x%08lX", GetLastError());
return FALSE;
case WAIT_FAILED:
WLog_ERR(TAG, "wf_info_lock failed with 0x%08lX", GetLastError());
return FALSE;
}
return FALSE;
@ -68,21 +67,20 @@ BOOL wf_info_lock(wfInfo* wfi)
BOOL wf_info_try_lock(wfInfo* wfi, DWORD dwMilliseconds)
{
DWORD dRes;
dRes = WaitForSingleObject(wfi->mutex, dwMilliseconds);
switch (dRes)
{
case WAIT_ABANDONED:
case WAIT_OBJECT_0:
return TRUE;
case WAIT_ABANDONED:
case WAIT_OBJECT_0:
return TRUE;
case WAIT_TIMEOUT:
return FALSE;
case WAIT_TIMEOUT:
return FALSE;
case WAIT_FAILED:
WLog_ERR(TAG, "wf_info_try_lock failed with 0x%08lX", GetLastError());
return FALSE;
case WAIT_FAILED:
WLog_ERR(TAG, "wf_info_try_lock failed with 0x%08lX", GetLastError());
return FALSE;
}
return FALSE;
@ -102,7 +100,6 @@ BOOL wf_info_unlock(wfInfo* wfi)
wfInfo* wf_info_init()
{
wfInfo* wfi;
wfi = (wfInfo*) calloc(1, sizeof(wfInfo));
if (wfi != NULL)
@ -112,7 +109,6 @@ wfInfo* wf_info_init()
DWORD dwType;
DWORD dwSize;
DWORD dwValue;
wfi->mutex = CreateMutex(NULL, FALSE, NULL);
if (wfi->mutex == NULL)
@ -123,6 +119,7 @@ wfInfo* wf_info_init()
}
wfi->updateSemaphore = CreateSemaphore(NULL, 0, 32, NULL);
if (!wfi->updateSemaphore)
{
WLog_ERR(TAG, "CreateSemaphore error: %lu", GetLastError());
@ -142,7 +139,8 @@ wfInfo* wf_info_init()
return NULL;
}
wfi->peers = (freerdp_peer**) calloc(WF_INFO_MAXPEERS, sizeof(freerdp_peer*));
wfi->peers = (freerdp_peer**) calloc(FREERDP_SERVER_WIN_INFO_MAXPEERS, sizeof(freerdp_peer*));
if (!wfi->peers)
{
WLog_ERR(TAG, "Failed to allocate memory for peer");
@ -154,30 +152,33 @@ wfInfo* wf_info_init()
}
//Set FPS
wfi->framesPerSecond = WF_INFO_DEFAULT_FPS;
wfi->framesPerSecond = FREERDP_SERVER_WIN_INFO_DEFAULT_FPS;
status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, SERVER_KEY, 0,
KEY_READ | KEY_WOW64_64KEY, &hKey);
KEY_READ | KEY_WOW64_64KEY, &hKey);
if (status == ERROR_SUCCESS)
{
if (RegQueryValueEx(hKey, _T("FramesPerSecond"), NULL, &dwType, (BYTE*) &dwValue, &dwSize) == ERROR_SUCCESS)
if (RegQueryValueEx(hKey, _T("FramesPerSecond"), NULL, &dwType, (BYTE*) &dwValue,
&dwSize) == ERROR_SUCCESS)
wfi->framesPerSecond = dwValue;
}
RegCloseKey(hKey);
RegCloseKey(hKey);
//Set input toggle
wfi->input_disabled = FALSE;
status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, SERVER_KEY,
0, KEY_READ | KEY_WOW64_64KEY, &hKey);
0, KEY_READ | KEY_WOW64_64KEY, &hKey);
if (status == ERROR_SUCCESS)
{
if (RegQueryValueEx(hKey, _T("DisableInput"), NULL, &dwType, (BYTE*) &dwValue, &dwSize) == ERROR_SUCCESS)
if (RegQueryValueEx(hKey, _T("DisableInput"), NULL, &dwType, (BYTE*) &dwValue,
&dwSize) == ERROR_SUCCESS)
{
if (dwValue != 0)
wfi->input_disabled = TRUE;
}
}
RegCloseKey(hKey);
}
@ -203,27 +204,32 @@ BOOL wf_info_peer_register(wfInfo* wfi, wfPeerContext* context)
if (!wf_info_lock(wfi))
return FALSE;
if (wfi->peerCount == WF_INFO_MAXPEERS)
if (wfi->peerCount == FREERDP_SERVER_WIN_INFO_MAXPEERS)
goto fail_peer_count;
context->info = wfi;
if (!(context->updateEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
goto fail_update_event;
//get the offset of the top left corner of selected screen
EnumDisplayMonitors(NULL, NULL, wf_info_monEnumCB, 0);
_IDcount = 0;
#ifdef WITH_DXGI_1_2
if (wfi->peerCount == 0)
if (wf_dxgi_init(wfi) != 0)
goto fail_driver_init;
#else
if (!wf_mirror_driver_activate(wfi))
goto fail_driver_init;
#endif
//look through the array of peers until an empty slot
for (i = 0; i < WF_INFO_MAXPEERS; ++i)
for (i = 0; i < FREERDP_SERVER_WIN_INFO_MAXPEERS; ++i)
{
//empty index will be our peer id
if (wfi->peers[i] == NULL)
@ -236,13 +242,10 @@ BOOL wf_info_peer_register(wfInfo* wfi, wfPeerContext* context)
wfi->peers[peerId] = ((rdpContext*) context)->peer;
wfi->peers[peerId]->pId = peerId;
wfi->peerCount++;
WLog_INFO(TAG, "Registering Peer: id=%d #=%d", peerId, wfi->peerCount);
wf_info_unlock(wfi);
wfreerdp_server_peer_callback_event(peerId, WF_SRV_CALLBACK_EVENT_CONNECT);
wfreerdp_server_peer_callback_event(peerId, FREERDP_SERVER_WIN_SRV_CALLBACK_EVENT_CONNECT);
return TRUE;
fail_driver_init:
CloseHandle(context->updateEvent);
context->updateEvent = NULL;
@ -258,32 +261,34 @@ void wf_info_peer_unregister(wfInfo* wfi, wfPeerContext* context)
if (wf_info_lock(wfi))
{
int peerId;
peerId = ((rdpContext*) context)->peer->pId;
wfi->peers[peerId] = NULL;
wfi->peerCount--;
CloseHandle(context->updateEvent);
WLog_INFO(TAG, "Unregistering Peer: id=%d, #=%d", peerId, wfi->peerCount);
#ifdef WITH_DXGI_1_2
if (wfi->peerCount == 0)
wf_dxgi_cleanup(wfi);
#endif
wf_info_unlock(wfi);
wfreerdp_server_peer_callback_event(peerId, WF_SRV_CALLBACK_EVENT_DISCONNECT);
wfreerdp_server_peer_callback_event(peerId, FREERDP_SERVER_WIN_SRV_CALLBACK_EVENT_DISCONNECT);
}
}
BOOL wf_info_have_updates(wfInfo* wfi)
{
#ifdef WITH_DXGI_1_2
if (wfi->framesWaiting == 0)
return FALSE;
#else
if (wfi->nextUpdate == wfi->lastUpdate)
return FALSE;
#endif
return TRUE;
}
@ -294,7 +299,6 @@ void wf_info_update_changes(wfInfo* wfi)
wf_dxgi_nextFrame(wfi, wfi->framesPerSecond * 1000);
#else
GETCHANGESBUF* buf;
buf = (GETCHANGESBUF*) wfi->changeBuffer;
wfi->nextUpdate = buf->buffer->counter;
#endif
@ -307,7 +311,6 @@ void wf_info_find_invalid_region(wfInfo* wfi)
#else
int i;
GETCHANGESBUF* buf;
buf = (GETCHANGESBUF*) wfi->changeBuffer;
for (i = wfi->lastUpdate; i != wfi->nextUpdate; i = (i + 1) % MAXCHANGES_BUF)
@ -315,10 +318,10 @@ void wf_info_find_invalid_region(wfInfo* wfi)
LPRECT lpR = &buf->buffer->pointrect[i].rect;
//need to make sure we only get updates from the selected screen
if ( (lpR->left >= wfi->servscreen_xoffset) &&
(lpR->right <= (wfi->servscreen_xoffset + wfi->servscreen_width) ) &&
(lpR->top >= wfi->servscreen_yoffset) &&
(lpR->bottom <= (wfi->servscreen_yoffset + wfi->servscreen_height) ) )
if ((lpR->left >= wfi->servscreen_xoffset) &&
(lpR->right <= (wfi->servscreen_xoffset + wfi->servscreen_width)) &&
(lpR->top >= wfi->servscreen_yoffset) &&
(lpR->bottom <= (wfi->servscreen_yoffset + wfi->servscreen_height)))
{
UnionRect(&wfi->invalid, &wfi->invalid, lpR);
}
@ -327,6 +330,7 @@ void wf_info_find_invalid_region(wfInfo* wfi)
continue;
}
}
#endif
if (wfi->invalid.left < 0)
@ -364,7 +368,6 @@ void wf_info_getScreenData(wfInfo* wfi, long* width, long* height, BYTE** pBits,
{
*width = (wfi->invalid.right - wfi->invalid.left);
*height = (wfi->invalid.bottom - wfi->invalid.top);
#ifdef WITH_DXGI_1_2
wf_dxgi_getPixelData(wfi, pBits, pitch, &wfi->invalid);
#else
@ -372,22 +375,21 @@ void wf_info_getScreenData(wfInfo* wfi, long* width, long* height, BYTE** pBits,
long offset;
GETCHANGESBUF* changes;
changes = (GETCHANGESBUF*) wfi->changeBuffer;
*width += 1;
*height += 1;
offset = (4 * wfi->invalid.left) + (wfi->invalid.top * wfi->virtscreen_width * 4);
*pBits = ((BYTE*) (changes->Userbuffer)) + offset;
*pBits = ((BYTE*)(changes->Userbuffer)) + offset;
*pitch = wfi->virtscreen_width * 4;
}
#endif
}
BOOL CALLBACK wf_info_monEnumCB(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
BOOL CALLBACK wf_info_monEnumCB(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor,
LPARAM dwData)
{
wfInfo * wfi;
wfInfo* wfi;
wfi = wf_info_get_instance();
if (!wfi)
return FALSE;
@ -398,6 +400,5 @@ BOOL CALLBACK wf_info_monEnumCB(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMo
}
_IDcount++;
return TRUE;
}

View File

@ -23,6 +23,9 @@
#include "wf_mirage.h"
#include <freerdp/log.h>
#define TAG SERVER_TAG("Windows.mirror")
#define DEVICE_KEY_PREFIX _T("\\Registry\\Machine\\")
/*
This function will iterate over the loaded display devices until it finds
@ -36,7 +39,6 @@ BOOL wf_mirror_driver_find_display_device(wfInfo* wfi)
BOOL devFound;
DWORD deviceNumber;
DISPLAY_DEVICE deviceInfo;
devFound = FALSE;
deviceNumber = 0;
deviceInfo.cb = sizeof(deviceInfo);
@ -47,18 +49,18 @@ BOOL wf_mirror_driver_find_display_device(wfInfo* wfi)
{
int deviceKeyLength;
int deviceKeyPrefixLength;
deviceKeyPrefixLength = _tcslen(DEVICE_KEY_PREFIX);
if (_tcsnicmp(deviceInfo.DeviceKey, DEVICE_KEY_PREFIX, deviceKeyPrefixLength) == 0)
{
deviceKeyLength = _tcslen(deviceInfo.DeviceKey) - deviceKeyPrefixLength;
wfi->deviceKey = (LPTSTR) malloc((deviceKeyLength + 1) * sizeof(TCHAR));
if (!wfi->deviceKey)
return FALSE;
_tcsncpy_s(wfi->deviceKey, deviceKeyLength + 1,
&deviceInfo.DeviceKey[deviceKeyPrefixLength], deviceKeyLength);
&deviceInfo.DeviceKey[deviceKeyPrefixLength], deviceKeyLength);
}
_tcsncpy_s(wfi->deviceName, 32, deviceInfo.DeviceName, _tcslen(deviceInfo.DeviceName));
@ -75,9 +77,9 @@ BOOL wf_mirror_driver_find_display_device(wfInfo* wfi)
* This function will attempt to access the the windows registry using the device
* key stored in the current wfi. It will attempt to read the value of the
* "Attach.ToDesktop" subkey and will return TRUE if the value is already set to
* val. If unable to read the subkey, this function will return FALSE. If the
* subkey is not set to val it will then attempt to set it to val and return TRUE. If
* unsuccessful or an unexpected value is encountered, the function returns
* val. If unable to read the subkey, this function will return FALSE. If the
* subkey is not set to val it will then attempt to set it to val and return TRUE. If
* unsuccessful or an unexpected value is encountered, the function returns
* FALSE.
*/
@ -88,9 +90,8 @@ BOOL wf_mirror_driver_display_device_attach(wfInfo* wfi, DWORD mode)
DWORD dwType;
DWORD dwSize;
DWORD dwValue;
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, wfi->deviceKey,
0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);
0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);
if (status != ERROR_SUCCESS)
{
@ -104,7 +105,7 @@ BOOL wf_mirror_driver_display_device_attach(wfInfo* wfi, DWORD mode)
dwSize = sizeof(DWORD);
status = RegQueryValueEx(hKey, _T("Attach.ToDesktop"),
NULL, &dwType, (BYTE*) &dwValue, &dwSize);
NULL, &dwType, (BYTE*) &dwValue, &dwSize);
if (status != ERROR_SUCCESS)
{
@ -120,9 +121,8 @@ BOOL wf_mirror_driver_display_device_attach(wfInfo* wfi, DWORD mode)
{
dwValue = mode;
dwSize = sizeof(DWORD);
status = RegSetValueEx(hKey, _T("Attach.ToDesktop"),
0, REG_DWORD, (BYTE*) &dwValue, dwSize);
0, REG_DWORD, (BYTE*) &dwValue, dwSize);
if (status != ERROR_SUCCESS)
{
@ -148,35 +148,35 @@ void wf_mirror_driver_print_display_change_status(LONG status)
case DISP_CHANGE_SUCCESSFUL:
_tcscpy(disp_change, _T("DISP_CHANGE_SUCCESSFUL"));
break;
case DISP_CHANGE_BADDUALVIEW:
_tcscpy(disp_change, _T("DISP_CHANGE_BADDUALVIEW"));
break;
case DISP_CHANGE_BADFLAGS:
_tcscpy(disp_change, _T("DISP_CHANGE_BADFLAGS"));
break;
case DISP_CHANGE_BADMODE:
_tcscpy(disp_change, _T("DISP_CHANGE_BADMODE"));
break;
case DISP_CHANGE_BADPARAM:
_tcscpy(disp_change, _T("DISP_CHANGE_BADPARAM"));
break;
case DISP_CHANGE_FAILED:
_tcscpy(disp_change, _T("DISP_CHANGE_FAILED"));
break;
case DISP_CHANGE_NOTUPDATED:
_tcscpy(disp_change, _T("DISP_CHANGE_NOTUPDATED"));
break;
case DISP_CHANGE_RESTART:
_tcscpy(disp_change, _T("DISP_CHANGE_RESTART"));
break;
default:
_tcscpy(disp_change, _T("DISP_CHANGE_UNKNOWN"));
break;
@ -189,8 +189,8 @@ void wf_mirror_driver_print_display_change_status(LONG status)
}
/**
* This function will attempt to apply the currently configured display settings
* in the registry to the display driver. It will return TRUE if successful
* This function will attempt to apply the currently configured display settings
* in the registry to the display driver. It will return TRUE if successful
* otherwise it returns FALSE.
* If mode is MIRROR_UNLOAD then the the driver will be asked to remove itself.
*/
@ -205,21 +205,21 @@ BOOL wf_mirror_driver_update(wfInfo* wfi, int mode)
LONG disp_change_status;
DWORD dmf_devmodewext_magic_sig = 0xDF20C0DE;
if ( (mode != MIRROR_LOAD) && (mode != MIRROR_UNLOAD) )
if ((mode != MIRROR_LOAD) && (mode != MIRROR_UNLOAD))
{
WLog_DBG(TAG, "Invalid mirror mode!");
return FALSE;
}
deviceMode = (DEVMODE*) malloc(sizeof(DEVMODE) + EXT_DEVMODE_SIZE_MAX);
if (!deviceMode)
return FALSE;
deviceMode->dmDriverExtra = 2 * sizeof(DWORD);
extHdr = (DWORD*)((BYTE*) &deviceMode + sizeof(DEVMODE));
extHdr = (DWORD*)((BYTE*) &deviceMode + sizeof(DEVMODE));
extHdr[0] = dmf_devmodewext_magic_sig;
extHdr[1] = 0;
drvExtraSaved = deviceMode->dmDriverExtra;
memset(deviceMode, 0, sizeof(DEVMODE) + EXT_DEVMODE_SIZE_MAX);
deviceMode->dmSize = sizeof(DEVMODE);
@ -229,7 +229,6 @@ BOOL wf_mirror_driver_update(wfInfo* wfi, int mode)
{
wfi->virtscreen_width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
wfi->virtscreen_height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
deviceMode->dmPelsWidth = wfi->virtscreen_width;
deviceMode->dmPelsHeight = wfi->virtscreen_height;
deviceMode->dmBitsPerPel = wfi->bitsPerPixel;
@ -238,23 +237,20 @@ BOOL wf_mirror_driver_update(wfInfo* wfi, int mode)
}
deviceMode->dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_POSITION;
_tcsncpy_s(deviceMode->dmDeviceName, 32, wfi->deviceName, _tcslen(wfi->deviceName));
disp_change_status = ChangeDisplaySettingsEx(wfi->deviceName, deviceMode, NULL, CDS_UPDATEREGISTRY, NULL);
disp_change_status = ChangeDisplaySettingsEx(wfi->deviceName, deviceMode, NULL, CDS_UPDATEREGISTRY,
NULL);
status = (disp_change_status == DISP_CHANGE_SUCCESSFUL) ? TRUE : FALSE;
if (!status)
wf_mirror_driver_print_display_change_status(disp_change_status);
return status;
}
BOOL wf_mirror_driver_map_memory(wfInfo* wfi)
{
int status;
wfi->driverDC = CreateDC(wfi->deviceName, NULL, NULL, NULL);
if (wfi->driverDC == NULL)
@ -262,31 +258,30 @@ BOOL wf_mirror_driver_map_memory(wfInfo* wfi)
WLog_ERR(TAG, "Could not create device driver context!");
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL);
// Display the error message and exit the process
WLog_ERR(TAG, "CreateDC failed on device [%s] with error %lu: %s", wfi->deviceName, dw, lpMsgBuf);
LocalFree(lpMsgBuf);
}
return FALSE;
}
wfi->changeBuffer = calloc(1, sizeof(GETCHANGESBUF));
if (!wfi->changeBuffer)
return FALSE;
status = ExtEscape(wfi->driverDC, dmf_esc_usm_pipe_map, 0, 0, sizeof(GETCHANGESBUF), (LPSTR) wfi->changeBuffer);
status = ExtEscape(wfi->driverDC, dmf_esc_usm_pipe_map, 0, 0, sizeof(GETCHANGESBUF),
(LPSTR) wfi->changeBuffer);
if (status <= 0)
{
@ -302,9 +297,9 @@ BOOL wf_mirror_driver_map_memory(wfInfo* wfi)
BOOL wf_mirror_driver_cleanup(wfInfo* wfi)
{
int status;
status = ExtEscape(wfi->driverDC, dmf_esc_usm_pipe_unmap, sizeof(GETCHANGESBUF), (LPSTR) wfi->changeBuffer, 0, 0);
status = ExtEscape(wfi->driverDC, dmf_esc_usm_pipe_unmap, sizeof(GETCHANGESBUF),
(LPSTR) wfi->changeBuffer, 0, 0);
if (status <= 0)
{
WLog_ERR(TAG, "Failed to unmap shared memory from the driver! code %d", status);
@ -321,7 +316,6 @@ BOOL wf_mirror_driver_cleanup(wfInfo* wfi)
}
free(wfi->changeBuffer);
return TRUE;
}
@ -354,6 +348,7 @@ BOOL wf_mirror_driver_activate(wfInfo* wfi)
WLog_DBG(TAG, "Unable to map memory for mirror driver!");
return FALSE;
}
wfi->mirrorDriverActive = TRUE;
}

View File

@ -45,7 +45,9 @@
#define SERVER_KEY "Software\\"FREERDP_VENDOR_STRING"\\" \
FREERDP_PRODUCT_STRING
BOOL wf_peer_context_new(freerdp_peer* client, wfPeerContext* context)
static DWORD WINAPI wf_peer_main_loop(LPVOID lpParam);
static BOOL wf_peer_context_new(freerdp_peer* client, wfPeerContext* context)
{
if (!(context->info = wf_info_get_instance()))
return FALSE;
@ -65,7 +67,7 @@ BOOL wf_peer_context_new(freerdp_peer* client, wfPeerContext* context)
return TRUE;
}
void wf_peer_context_free(freerdp_peer* client, wfPeerContext* context)
static void wf_peer_context_free(freerdp_peer* client, wfPeerContext* context)
{
wf_info_peer_unregister(context->info, context);
@ -80,46 +82,44 @@ void wf_peer_context_free(freerdp_peer* client, wfPeerContext* context)
WTSCloseServer(context->vcm);
}
BOOL wf_peer_init(freerdp_peer* client)
static BOOL wf_peer_init(freerdp_peer* client)
{
client->ContextSize = sizeof(wfPeerContext);
client->ContextNew = (psPeerContextNew) wf_peer_context_new;
client->ContextFree = (psPeerContextFree) wf_peer_context_free;
return freerdp_peer_context_new(client);
}
BOOL wf_peer_post_connect(freerdp_peer* client)
static BOOL wf_peer_post_connect(freerdp_peer* client)
{
int i;
wfInfo* wfi;
rdpSettings* settings;
wfPeerContext* context = (wfPeerContext*) client->context;
wfi = context->info;
settings = client->settings;
if ((get_screen_info(wfi->screenID, NULL, &wfi->servscreen_width, &wfi->servscreen_height, &wfi->bitsPerPixel) == 0) ||
(wfi->servscreen_width == 0) ||
(wfi->servscreen_height == 0) ||
(wfi->bitsPerPixel == 0) )
if ((get_screen_info(wfi->screenID, NULL, &wfi->servscreen_width, &wfi->servscreen_height,
&wfi->bitsPerPixel) == 0) ||
(wfi->servscreen_width == 0) ||
(wfi->servscreen_height == 0) ||
(wfi->bitsPerPixel == 0))
{
WLog_ERR(TAG, "postconnect: error getting screen info for screen %d", wfi->screenID);
WLog_ERR(TAG, "\t%dx%dx%d", wfi->servscreen_height, wfi->servscreen_width, wfi->bitsPerPixel);
return FALSE;
}
if ((settings->DesktopWidth != wfi->servscreen_width) || (settings->DesktopHeight != wfi->servscreen_height))
if ((settings->DesktopWidth != wfi->servscreen_width) ||
(settings->DesktopHeight != wfi->servscreen_height))
{
/*
WLog_DBG(TAG, "Client requested resolution %"PRIu32"x%"PRIu32", but will resize to %dx%d",
settings->DesktopWidth, settings->DesktopHeight, wfi->servscreen_width, wfi->servscreen_height);
*/
settings->DesktopWidth = wfi->servscreen_width;
settings->DesktopHeight = wfi->servscreen_height;
settings->ColorDepth = wfi->bitsPerPixel;
client->update->DesktopResize(client->update->context);
}
@ -131,29 +131,27 @@ BOOL wf_peer_post_connect(freerdp_peer* client)
return TRUE;
}
BOOL wf_peer_activate(freerdp_peer* client)
static BOOL wf_peer_activate(freerdp_peer* client)
{
wfInfo* wfi;
wfPeerContext* context = (wfPeerContext*) client->context;
wfi = context->info;
client->activated = TRUE;
wf_update_peer_activate(wfi, context);
wfreerdp_server_peer_callback_event(((rdpContext*) context)->peer->pId, WF_SRV_CALLBACK_EVENT_ACTIVATE);
wfreerdp_server_peer_callback_event(((rdpContext*) context)->peer->pId,
FREERDP_SERVER_WIN_SRV_CALLBACK_EVENT_ACTIVATE);
return TRUE;
}
BOOL wf_peer_logon(freerdp_peer* client, SEC_WINNT_AUTH_IDENTITY* identity, BOOL automatic)
static BOOL wf_peer_logon(freerdp_peer* client, SEC_WINNT_AUTH_IDENTITY* identity, BOOL automatic)
{
wfreerdp_server_peer_callback_event(((rdpContext*) client->context)->peer->pId, WF_SRV_CALLBACK_EVENT_AUTH);
wfreerdp_server_peer_callback_event(((rdpContext*) client->context)->peer->pId,
FREERDP_SERVER_WIN_SRV_CALLBACK_EVENT_AUTH);
return TRUE;
}
void wf_peer_synchronize_event(rdpInput* input, UINT32 flags)
static void wf_peer_synchronize_event(rdpInput* input, UINT32 flags)
{
}
BOOL wf_peer_accepted(freerdp_listener* instance, freerdp_peer* client)
@ -176,7 +174,6 @@ static DWORD WINAPI wf_peer_socket_listener(LPVOID lpParam)
fd_set rfds_set;
wfPeerContext* context;
freerdp_peer* client = (freerdp_peer*) lpParam;
ZeroMemory(rfds, sizeof(rfds));
context = (wfPeerContext*) client->context;
@ -207,7 +204,6 @@ static DWORD WINAPI wf_peer_socket_listener(LPVOID lpParam)
break;
select(max_fds + 1, &rfds_set, NULL, NULL, NULL);
SetEvent(context->socketEvent);
WaitForSingleObject(context->socketSemaphore, INFINITE);
@ -218,20 +214,22 @@ static DWORD WINAPI wf_peer_socket_listener(LPVOID lpParam)
return 0;
}
BOOL wf_peer_read_settings(freerdp_peer* client)
static BOOL wf_peer_read_settings(freerdp_peer* client)
{
if (!wf_settings_read_string_ascii(HKEY_LOCAL_MACHINE, SERVER_KEY,
_T("CertificateFile"), &(client->settings->CertificateFile)))
_T("CertificateFile"), &(client->settings->CertificateFile)))
{
client->settings->CertificateFile = _strdup("server.crt");
if (!client->settings->CertificateFile)
return FALSE;
}
if (!wf_settings_read_string_ascii(HKEY_LOCAL_MACHINE, SERVER_KEY,
_T("PrivateKeyFile"), &(client->settings->PrivateKeyFile)))
_T("PrivateKeyFile"), &(client->settings->PrivateKeyFile)))
{
client->settings->PrivateKeyFile = _strdup("server.key");
if (!client->settings->PrivateKeyFile)
return FALSE;
}
@ -239,7 +237,7 @@ BOOL wf_peer_read_settings(freerdp_peer* client)
return TRUE;
}
static DWORD WINAPI wf_peer_main_loop(LPVOID lpParam)
DWORD WINAPI wf_peer_main_loop(LPVOID lpParam)
{
wfInfo* wfi;
DWORD nCount;
@ -265,13 +263,13 @@ static DWORD WINAPI wf_peer_main_loop(LPVOID lpParam)
settings->ColorDepth = 32;
settings->NSCodec = FALSE;
settings->JpegCodec = FALSE;
if (!wf_peer_read_settings(client))
goto fail_peer_init;
client->PostConnect = wf_peer_post_connect;
client->Activate = wf_peer_activate;
client->Logon = wf_peer_logon;
client->input->SynchronizeEvent = wf_peer_synchronize_event;
client->input->KeyboardEvent = wf_peer_keyboard_event;
client->input->UnicodeKeyboardEvent = wf_peer_unicode_keyboard_event;
@ -282,7 +280,7 @@ static DWORD WINAPI wf_peer_main_loop(LPVOID lpParam)
goto fail_client_initialize;
context = (wfPeerContext*) client->context;
if (context->socketClose)
goto fail_socked_closed;
@ -366,9 +364,7 @@ static DWORD WINAPI wf_peer_main_loop(LPVOID lpParam)
}
wf_update_peer_deactivate(wfi, context);
client->Disconnect(client);
fail_socket_thread:
CloseHandle(context->socketSemaphore);
context->socketSemaphore = NULL;
@ -381,6 +377,5 @@ fail_client_initialize:
freerdp_peer_context_free(client);
fail_peer_init:
freerdp_peer_free(client);
return 0;
}

View File

@ -24,28 +24,6 @@
#include <freerdp/listener.h>
BOOL wf_peer_context_new(freerdp_peer* client, wfPeerContext* context);
void wf_peer_context_free(freerdp_peer* client, wfPeerContext* context);
BOOL wf_peer_init(freerdp_peer* client);
void wf_dxgi_encode(freerdp_peer* client, UINT timeout);
void wf_rfx_encode(freerdp_peer* client);
BOOL wf_peer_post_connect(freerdp_peer* client);
BOOL wf_peer_activate(freerdp_peer* client);
void wf_peer_synchronize_event(rdpInput* input, UINT32 flags);
void wf_peer_send_changes(freerdp_peer* client);
void wf_detect_win_ver(void);
BOOL wf_peer_accepted(freerdp_listener* instance, freerdp_peer* client);
DWORD WINAPI wf_peer_main_loop(LPVOID lpParam);
#endif /* FREERDP_SERVER_WIN_PEER_H */

View File

@ -67,7 +67,7 @@ DWORD WINAPI wf_update_thread(LPVOID lpParam)
for (peerindex = 0; peerindex < wfi->peerCount; peerindex++)
{
for (; index < WF_INFO_MAXPEERS; index++)
for (; index < FREERDP_SERVER_WIN_INFO_MAXPEERS; index++)
{
if (wfi->peers[index] && wfi->peers[index]->activated)
{
@ -134,12 +134,12 @@ void wf_update_encode(wfInfo* wfi)
cmd->destTop = wfi->invalid.top;
cmd->destRight = wfi->invalid.left + width;
cmd->destBottom = wfi->invalid.top + height;
cmd->bpp = 32;
cmd->codecID = 3;
cmd->width = width;
cmd->height = height;
cmd->bitmapDataLength = Stream_GetPosition(wfi->s);
cmd->bitmapData = Stream_Buffer(wfi->s);
cmd->bmp.bpp = 32;
cmd->bmp.codecID = 3;
cmd->bmp.width = width;
cmd->bmp.height = height;
cmd->bmp.bitmapDataLength = Stream_GetPosition(wfi->s);
cmd->bmp.bitmapData = Stream_Buffer(wfi->s);
}
void wf_update_peer_send(wfInfo* wfi, wfPeerContext* context)
@ -168,7 +168,7 @@ void wf_update_peer_send(wfInfo* wfi, wfPeerContext* context)
wfi->frame_idx, context->frame_idx + 1);
}
wfi->cmd.codecID = client->settings->RemoteFxCodecId;
wfi->cmd.bmp.codecID = client->settings->RemoteFxCodecId;
client->update->SurfaceBits(client->update->context, &wfi->cmd);
context->frame_idx++;
}