diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 73d39f789..feb979981 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -30,7 +30,7 @@ if(FREERDP_VENDOR) add_subdirectory(Mac) endif() else() - #add_subdirectory(Windows) + add_subdirectory(Windows) endif() if(NOT DEFINED WITH_FREERDS) diff --git a/server/Windows/wf_info.c b/server/Windows/wf_info.c index f8f8c3ea4..149b83ba3 100644 --- a/server/Windows/wf_info.c +++ b/server/Windows/wf_info.c @@ -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; } diff --git a/server/Windows/wf_mirage.c b/server/Windows/wf_mirage.c index 812b532d1..69d0882d0 100644 --- a/server/Windows/wf_mirage.c +++ b/server/Windows/wf_mirage.c @@ -23,6 +23,9 @@ #include "wf_mirage.h" +#include +#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; } diff --git a/server/Windows/wf_peer.c b/server/Windows/wf_peer.c index 686461ead..83dbff280 100644 --- a/server/Windows/wf_peer.c +++ b/server/Windows/wf_peer.c @@ -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; } diff --git a/server/Windows/wf_peer.h b/server/Windows/wf_peer.h index 0abbb5a18..19d823c20 100644 --- a/server/Windows/wf_peer.h +++ b/server/Windows/wf_peer.h @@ -24,28 +24,6 @@ #include - - -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 */ diff --git a/server/Windows/wf_update.c b/server/Windows/wf_update.c index 344aa3b1f..4b93df9d8 100644 --- a/server/Windows/wf_update.c +++ b/server/Windows/wf_update.c @@ -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++; }