Merge pull request #5016 from akallabeth/windows_server_build_fix

Windows server build fix
This commit is contained in:
Martin Fleisz 2018-11-21 16:02:47 +01:00 committed by GitHub
commit 947aa80033
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 198 additions and 213 deletions

View File

@ -154,8 +154,8 @@ static UINT cliprdr_send_data_request(wfClipboard* clipboard, UINT32 format);
static UINT cliprdr_send_lock(wfClipboard* clipboard);
static UINT cliprdr_send_unlock(wfClipboard* clipboard);
static UINT cliprdr_send_request_filecontents(wfClipboard* clipboard,
void* streamid,
int index, int flag, DWORD positionhigh,
const void* streamid,
LONG index, int flag, DWORD positionhigh,
DWORD positionlow, ULONG request);
static void CliprdrDataObject_Delete(CliprdrDataObject* instance);
@ -1289,8 +1289,8 @@ static UINT cliprdr_send_format_list(wfClipboard* clipboard)
for (index = 0; index < numFormats; index++)
{
if(GetClipboardFormatNameA(formats[index].formatId, formatName,
sizeof(formatName)))
if (GetClipboardFormatNameA(formats[index].formatId, formatName,
sizeof(formatName)))
{
formats[index].formatName = _strdup(formatName);
}
@ -1330,10 +1330,10 @@ static UINT cliprdr_send_data_request(wfClipboard* clipboard, UINT32 formatId)
return rc;
}
static UINT cliprdr_send_request_filecontents(wfClipboard* clipboard,
const void* streamid,
int index, int flag, DWORD positionhigh,
DWORD positionlow, ULONG nreq)
UINT cliprdr_send_request_filecontents(wfClipboard* clipboard,
const void* streamid,
LONG index, int flag, DWORD positionhigh,
DWORD positionlow, ULONG nreq)
{
UINT rc;
CLIPRDR_FILE_CONTENTS_REQUEST fileContentsRequest;
@ -2046,7 +2046,7 @@ static BOOL wf_cliprdr_process_filename(wfClipboard* clipboard,
if (!wf_cliprdr_add_to_file_arrays(clipboard, wFileName, pathLen))
return FALSE;
if ((clipboard->fileDescriptor[clipboard->nFiles - 1]->dwFileAttributes &
if ((clipboard->fileDescriptor[clipboard->nFiles - 1]->dwFileAttributes&
FILE_ATTRIBUTE_DIRECTORY) != 0)
{
/* this is a directory */

View File

@ -108,6 +108,7 @@ ELSEIF(WIN32 AND NOT CYGWIN)
"libeay32${MSVC_RUNTIME_SUFFIX}d"
libeay32
libcrypto
libcrypto-1_1
${_OPENSSL_ROOT_HINTS_AND_PATHS}
PATH_SUFFIXES
${MSVC_RUNTIME_PATH_SUFFIX}
@ -121,6 +122,7 @@ ELSEIF(WIN32 AND NOT CYGWIN)
"libeay32${MSVC_RUNTIME_SUFFIX}"
libeay32
libcrypto
libcrypto-1_1
${_OPENSSL_ROOT_HINTS_AND_PATHS}
PATH_SUFFIXES
${MSVC_RUNTIME_PATH_SUFFIX}
@ -135,6 +137,7 @@ ELSEIF(WIN32 AND NOT CYGWIN)
ssleay32
ssl
libssl
libssl-1_1
${_OPENSSL_ROOT_HINTS_AND_PATHS}
PATH_SUFFIXES
${MSVC_RUNTIME_PATH_SUFFIX}
@ -149,6 +152,7 @@ ELSEIF(WIN32 AND NOT CYGWIN)
ssleay32
ssl
libssl
libssl-1_1
${_OPENSSL_ROOT_HINTS_AND_PATHS}
PATH_SUFFIXES
${MSVC_RUNTIME_PATH_SUFFIX}
@ -193,6 +197,7 @@ ELSEIF(WIN32 AND NOT CYGWIN)
NAMES
libeay32
libcrypto
libcrypto-1_1
HINTS
${_OPENSSL_LIBDIR}
${_OPENSSL_ROOT_HINTS_AND_PATHS}
@ -204,6 +209,7 @@ ELSEIF(WIN32 AND NOT CYGWIN)
NAMES
ssleay32
libssl
libssl-1_1
HINTS
${_OPENSSL_LIBDIR}
${_OPENSSL_ROOT_HINTS_AND_PATHS}
@ -220,6 +226,7 @@ ELSE(WIN32 AND NOT CYGWIN)
NAMES
ssl
ssleay32
libssl-1_1
"ssleay32${MSVC_RUNTIME_SUFFIX}"
HINTS
${_OPENSSL_LIBDIR}
@ -231,6 +238,7 @@ ELSE(WIN32 AND NOT CYGWIN)
FIND_LIBRARY(OPENSSL_CRYPTO_LIBRARY
NAMES
crypto
libcrypto-1_1
HINTS
${_OPENSSL_LIBDIR}
${_OPENSSL_ROOT_HINTS_AND_PATHS}

View File

@ -35,7 +35,9 @@
#include <freerdp/client/drdynvc.h>
#include <freerdp/channels/channels.h>
#define CHANNEL_MAX_COUNT 31
#ifndef CHANNEL_MAX_COUNT
#define CHANNEL_MAX_COUNT 30
#endif
struct rdp_channel_client_data
{

View File

@ -573,7 +573,7 @@ static char* object_string(ASN1_TYPE* object)
return 0;
}
result = (char*)strdup((char*)utf8String);
result = (char*)_strdup((char*)utf8String);
OPENSSL_free(utf8String);
return result;
}
@ -638,7 +638,7 @@ char* crypto_cert_get_email(X509* x509)
return 0;
}
result = strdup(list.strings[0]);
result = _strdup(list.strings[0]);
OPENSSL_free(list.strings[0]);
string_list_free(&list);
return result;

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++;
}

View File

@ -28,7 +28,7 @@
/* Defined in winnt.h, do not redefine */
#define STATUS_WAIT_0 ((NTSTATUS)0x00000000L)
#define STATUS_WAIT_0 ((NTSTATUS)0x00000000L)
#define STATUS_ABANDONED_WAIT_0 ((NTSTATUS)0x00000080L)
#define STATUS_USER_APC ((NTSTATUS)0x000000C0L)
#define STATUS_TIMEOUT ((NTSTATUS)0x00000102L)
@ -78,9 +78,9 @@
#define STATUS_DLL_INIT_FAILED ((NTSTATUS)0xC0000142L)
#define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS)0xC00002B4L)
#define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS)0xC00002B5L)
#define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS)0xC00002C9L)
#define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS)0xC0000409L)
#define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS)0xC0000417L)
#define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS)0xC00002C9L)
#define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS)0xC0000409L)
#define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS)0xC0000417L)
#define STATUS_ASSERTION_FAILURE ((NTSTATUS)0xC0000420L)
#define STATUS_SXS_EARLY_DEACTIVATION ((NTSTATUS)0xC015000FL)
#define STATUS_SXS_INVALID_DEACTIVATION ((NTSTATUS)0xC0150010L)
@ -377,12 +377,16 @@
#define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS)0xC000005C)
#define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS)0xC000005D)
#define STATUS_NO_LOGON_SERVERS ((NTSTATUS)0xC000005E)
#ifndef STATUS_NO_SUCH_LOGON_SESSION
#define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS)0xC000005F)
#endif
#define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS)0xC0000060)
#define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS)0xC0000061)
#define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS)0xC0000062)
#define STATUS_USER_EXISTS ((NTSTATUS)0xC0000063)
#ifndef STATUS_NO_SUCH_USER
#define STATUS_NO_SUCH_USER ((NTSTATUS)0xC0000064)
#endif
#define STATUS_GROUP_EXISTS ((NTSTATUS)0xC0000065)
#define STATUS_NO_SUCH_GROUP ((NTSTATUS)0xC0000066)
#define STATUS_MEMBER_IN_GROUP ((NTSTATUS)0xC0000067)
@ -1259,7 +1263,7 @@
#if !defined(NTSTATUS_FROM_WIN32) && !defined(INLINE_NTSTATUS_FROM_WIN32)
static INLINE NTSTATUS NTSTATUS_FROM_WIN32(long x)
{
return x <= 0 ? (NTSTATUS)x : (NTSTATUS) (((x) & 0x0000FFFF) | (0x7 << 16) | 0xC0000000);
return x <= 0 ? (NTSTATUS)x : (NTSTATUS)(((x) & 0x0000FFFF) | (0x7 << 16) | 0xC0000000);
}
#endif
@ -1269,7 +1273,7 @@ static INLINE NTSTATUS NTSTATUS_FROM_WIN32(long x)
* winternl.h contains an incomplete definition of enum FILE_INFORMATION_CLASS
* avoid conflict by prefixing the winternl.h definition by _WINTERNL_ and then
* make a complete definition of enum FILE_INFORMATION_CLASS ourselves.
*
*
* For more information, refer to [MS-FSCC]: File System Control Codes:
* http://msdn.microsoft.com/en-us/library/cc231987.aspx
*/
@ -1379,7 +1383,7 @@ typedef enum _FILE_INFORMATION_CLASS
#define FILE_EXISTS 0x00000004
#define FILE_DOES_NOT_EXIST 0x00000005
typedef CONST char *PCSZ;
typedef CONST char* PCSZ;
typedef struct _STRING
{
@ -1387,7 +1391,7 @@ typedef struct _STRING
USHORT MaximumLength;
PCHAR Buffer;
} STRING;
typedef STRING *PSTRING;
typedef STRING* PSTRING;
typedef STRING ANSI_STRING;
typedef PSTRING PANSI_STRING;
@ -1423,7 +1427,7 @@ typedef struct _OBJECT_ATTRIBUTES
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES* POBJECT_ATTRIBUTES;
typedef struct _IO_STATUS_BLOCK
{
@ -1548,35 +1552,37 @@ WINPR_API VOID _RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceStr
WINPR_API VOID _RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString);
WINPR_API NTSTATUS _RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString,
PCANSI_STRING SourceString, BOOLEAN AllocateDestinationString);
PCANSI_STRING SourceString, BOOLEAN AllocateDestinationString);
WINPR_API VOID _RtlFreeUnicodeString(PUNICODE_STRING UnicodeString);
WINPR_API ULONG _RtlNtStatusToDosError(NTSTATUS status);
WINPR_API VOID _InitializeObjectAttributes(POBJECT_ATTRIBUTES InitializedAttributes,
PUNICODE_STRING ObjectName, ULONG Attributes, HANDLE RootDirectory,
PSECURITY_DESCRIPTOR SecurityDescriptor);
PUNICODE_STRING ObjectName, ULONG Attributes, HANDLE RootDirectory,
PSECURITY_DESCRIPTOR SecurityDescriptor);
WINPR_API NTSTATUS _NtCreateFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock,
PLARGE_INTEGER AllocationSize, ULONG FileAttributes, ULONG ShareAccess,
ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength);
POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock,
PLARGE_INTEGER AllocationSize, ULONG FileAttributes, ULONG ShareAccess,
ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength);
WINPR_API NTSTATUS _NtOpenFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock,
ULONG ShareAccess, ULONG OpenOptions);
POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock,
ULONG ShareAccess, ULONG OpenOptions);
WINPR_API NTSTATUS _NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);
WINPR_API NTSTATUS _NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine,
PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);
WINPR_API NTSTATUS _NtWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);
WINPR_API NTSTATUS _NtWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine,
PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);
WINPR_API NTSTATUS _NtDeviceIoControlFile(HANDLE FileHandle, HANDLE Event,
PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock,
ULONG IoControlCode, PVOID InputBuffer, ULONG InputBufferLength,
PVOID OutputBuffer, ULONG OutputBufferLength);
PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock,
ULONG IoControlCode, PVOID InputBuffer, ULONG InputBufferLength,
PVOID OutputBuffer, ULONG OutputBufferLength);
WINPR_API NTSTATUS _NtClose(HANDLE Handle);

View File

@ -115,11 +115,11 @@ static char* GetPath_TEMP(void)
static char* GetPath_XDG_DATA_HOME(void)
{
size_t size;
char* path = NULL;
#if defined(WIN32) || defined(__IOS__)
path = GetPath_XDG_CONFIG_HOME();
#else
size_t size;
char* home = NULL;
/**
* There is a single base directory relative to which user-specific data files should be written.
@ -155,7 +155,6 @@ static char* GetPath_XDG_DATA_HOME(void)
static char* GetPath_XDG_CONFIG_HOME(void)
{
size_t size;
char* path = NULL;
#if defined(WIN32) && !defined(_UWP)
path = calloc(MAX_PATH, sizeof(char));
@ -172,6 +171,7 @@ static char* GetPath_XDG_CONFIG_HOME(void)
#elif defined(__IOS__)
path = ios_get_data();
#else
size_t size;
char* home = NULL;
/**
* There is a single base directory relative to which user-specific configuration files should be written.
@ -210,7 +210,6 @@ static char* GetPath_XDG_CONFIG_HOME(void)
static char* GetPath_XDG_CACHE_HOME(void)
{
size_t size;
char* path = NULL;
char* home = NULL;
#if defined(WIN32)
@ -229,6 +228,7 @@ static char* GetPath_XDG_CACHE_HOME(void)
#elif defined(__IOS__)
path = ios_get_cache();
#else
size_t size;
/**
* There is a single base directory relative to which user-specific non-essential (cached) data should be written.
* This directory is defined by the environment variable $XDG_CACHE_HOME.

View File

@ -25,7 +25,7 @@
#include <string.h>
#include <winpr/strlst.h>
#include <winpr/string.h>
void string_list_free(char** string_list)
@ -62,7 +62,7 @@ char** string_list_copy(const char* const* string_list)
for (i = 0; i < length; i ++)
{
copy[i] = strdup(string_list[i]);
copy[i] = _strdup(string_list[i]);
}
copy[length] = 0;