Reenabled and fixed windows server compile.
This commit is contained in:
parent
a2cd934184
commit
26b83ea74e
@ -30,7 +30,7 @@ if(FREERDP_VENDOR)
|
||||
add_subdirectory(Mac)
|
||||
endif()
|
||||
else()
|
||||
#add_subdirectory(Windows)
|
||||
add_subdirectory(Windows)
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED WITH_FREERDS)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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++;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user