Merge remote-tracking branch 'upstream/master' into mh-stream-fix

Conflicts:
	client/Windows/wf_cliprdr.c
This commit is contained in:
Martin Haimberger 2015-06-18 03:06:40 -07:00
commit 6e4e1c2773
100 changed files with 2203 additions and 678 deletions

View File

@ -26,6 +26,10 @@ if(NOT DEFINED VENDOR)
set(VENDOR "FreeRDP" CACHE STRING "FreeRDP package vendor") set(VENDOR "FreeRDP" CACHE STRING "FreeRDP package vendor")
endif() endif()
if(NOT DEFINED PRODUCT)
set(PRODUCT "FreeRDP" CACHE STRING "FreeRDP package name")
endif()
if(NOT DEFINED FREERDP_VENDOR) if(NOT DEFINED FREERDP_VENDOR)
set(FREERDP_VENDOR 1) set(FREERDP_VENDOR 1)
endif() endif()
@ -284,8 +288,8 @@ if(WIN32)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN")
# Set product and vendor for dll and exe version information. # Set product and vendor for dll and exe version information.
set(RC_VERSION_VENDOR "FreeRDP") set(RC_VERSION_VENDOR ${VENDOR})
set(RC_VERSION_PRODUCT "FreeRDP") set(RC_VERSION_PRODUCT ${PRODUCT})
set(RC_VERSION_PATCH ${BUILD_NUMBER}) set(RC_VERSION_PATCH ${BUILD_NUMBER})
set(RC_VERSION_DESCRIPTION ${GIT_REVISION}) set(RC_VERSION_DESCRIPTION ${GIT_REVISION})

View File

@ -1080,7 +1080,7 @@ static WIN32ERROR cliprdr_virtual_channel_event_disconnected(cliprdrPlugin* clip
{ {
UINT rc; UINT rc;
MessageQueue_PostQuit(cliprdr->queue, 0); if (MessageQueue_PostQuit(cliprdr->queue, 0))
WaitForSingleObject(cliprdr->thread, INFINITE); WaitForSingleObject(cliprdr->thread, INFINITE);
MessageQueue_Free(cliprdr->queue); MessageQueue_Free(cliprdr->queue);

View File

@ -1305,7 +1305,7 @@ static WIN32ERROR drdynvc_virtual_channel_event_disconnected(drdynvcPlugin* drdy
{ {
WIN32ERROR status; WIN32ERROR status;
MessageQueue_PostQuit(drdynvc->queue, 0); if (MessageQueue_PostQuit(drdynvc->queue, 0))
WaitForSingleObject(drdynvc->thread, INFINITE); WaitForSingleObject(drdynvc->thread, INFINITE);
MessageQueue_Free(drdynvc->queue); MessageQueue_Free(drdynvc->queue);

View File

@ -658,7 +658,7 @@ static void drive_free(DEVICE* device)
{ {
DRIVE_DEVICE* drive = (DRIVE_DEVICE*) device; DRIVE_DEVICE* drive = (DRIVE_DEVICE*) device;
MessageQueue_PostQuit(drive->IrpQueue, 0); if (MessageQueue_PostQuit(drive->IrpQueue, 0))
WaitForSingleObject(drive->thread, INFINITE); WaitForSingleObject(drive->thread, INFINITE);
CloseHandle(drive->thread); CloseHandle(drive->thread);

View File

@ -1092,7 +1092,8 @@ static WIN32ERROR encomsp_virtual_channel_event_connected(encomspPlugin* encomsp
static WIN32ERROR encomsp_virtual_channel_event_disconnected(encomspPlugin* encomsp) static WIN32ERROR encomsp_virtual_channel_event_disconnected(encomspPlugin* encomsp)
{ {
UINT rc; UINT rc;
MessageQueue_PostQuit(encomsp->queue, 0);
if (MessageQueue_PostQuit(encomsp->queue, 0))
WaitForSingleObject(encomsp->thread, INFINITE); WaitForSingleObject(encomsp->thread, INFINITE);
MessageQueue_Free(encomsp->queue); MessageQueue_Free(encomsp->queue);

View File

@ -328,7 +328,7 @@ static void parallel_free(DEVICE* device)
{ {
PARALLEL_DEVICE* parallel = (PARALLEL_DEVICE*) device; PARALLEL_DEVICE* parallel = (PARALLEL_DEVICE*) device;
MessageQueue_PostQuit(parallel->queue, 0); if (MessageQueue_PostQuit(parallel->queue, 0))
WaitForSingleObject(parallel->thread, INFINITE); WaitForSingleObject(parallel->thread, INFINITE);
CloseHandle(parallel->thread); CloseHandle(parallel->thread);

View File

@ -586,7 +586,7 @@ static WIN32ERROR rail_virtual_channel_event_connected(railPlugin* rail, LPVOID
static void rail_virtual_channel_event_disconnected(railPlugin* rail) static void rail_virtual_channel_event_disconnected(railPlugin* rail)
{ {
UINT rc; UINT rc;
MessageQueue_PostQuit(rail->queue, 0); if (MessageQueue_PostQuit(rail->queue, 0))
WaitForSingleObject(rail->thread, INFINITE); WaitForSingleObject(rail->thread, INFINITE);
MessageQueue_Free(rail->queue); MessageQueue_Free(rail->queue);

View File

@ -1206,7 +1206,7 @@ static WIN32ERROR rdpdr_virtual_channel_event_disconnected(rdpdrPlugin* rdpdr)
{ {
WIN32ERROR error; WIN32ERROR error;
MessageQueue_PostQuit(rdpdr->queue, 0); if (MessageQueue_PostQuit(rdpdr->queue, 0))
WaitForSingleObject(rdpdr->thread, INFINITE); WaitForSingleObject(rdpdr->thread, INFINITE);
MessageQueue_Free(rdpdr->queue); MessageQueue_Free(rdpdr->queue);

View File

@ -745,7 +745,7 @@ static void remdesk_virtual_channel_event_disconnected(remdeskPlugin* remdesk)
{ {
UINT rc; UINT rc;
MessageQueue_PostQuit(remdesk->queue, 0); if (MessageQueue_PostQuit(remdesk->queue, 0))
WaitForSingleObject(remdesk->thread, INFINITE); WaitForSingleObject(remdesk->thread, INFINITE);
MessageQueue_Free(remdesk->queue); MessageQueue_Free(remdesk->queue);

View File

@ -111,7 +111,7 @@ void smartcard_context_free(SMARTCARD_CONTEXT* pContext)
/* cancel blocking calls like SCardGetStatusChange */ /* cancel blocking calls like SCardGetStatusChange */
SCardCancel(pContext->hContext); SCardCancel(pContext->hContext);
MessageQueue_PostQuit(pContext->IrpQueue, 0); if (MessageQueue_PostQuit(pContext->IrpQueue, 0))
WaitForSingleObject(pContext->thread, INFINITE); WaitForSingleObject(pContext->thread, INFINITE);
CloseHandle(pContext->thread); CloseHandle(pContext->thread);
@ -126,7 +126,7 @@ static void smartcard_free(DEVICE* device)
if (smartcard->IrpQueue) if (smartcard->IrpQueue)
{ {
MessageQueue_PostQuit(smartcard->IrpQueue, 0); if (MessageQueue_PostQuit(smartcard->IrpQueue, 0))
WaitForSingleObject(smartcard->thread, INFINITE); WaitForSingleObject(smartcard->thread, INFINITE);
MessageQueue_Free(smartcard->IrpQueue); MessageQueue_Free(smartcard->IrpQueue);

View File

@ -607,7 +607,7 @@ disconnect:
wMessageQueue* input_queue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE); wMessageQueue* input_queue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE);
if (input_queue) if (input_queue)
{ {
MessageQueue_PostQuit(input_queue, 0); if (MessageQueue_PostQuit(input_queue, 0))
WaitForSingleObject(input_thread, INFINITE); WaitForSingleObject(input_thread, INFINITE);
} }
CloseHandle(input_thread); CloseHandle(input_thread);

View File

@ -779,7 +779,7 @@ DWORD WINAPI wf_client_thread(LPVOID lpParam)
{ {
wMessageQueue* input_queue; wMessageQueue* input_queue;
input_queue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE); input_queue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE);
MessageQueue_PostQuit(input_queue, 0); if (MessageQueue_PostQuit(input_queue, 0))
WaitForSingleObject(input_thread, INFINITE); WaitForSingleObject(input_thread, INFINITE);
CloseHandle(input_thread); CloseHandle(input_thread);
} }

View File

@ -107,14 +107,14 @@ HRESULT STDMETHODCALLTYPE CliprdrStream_Read(IStream* This, void *pv, ULONG cb,
*pcbRead = 0; *pcbRead = 0;
if (instance->m_lOffset.QuadPart >= instance->m_lSize.QuadPart) if (instance->m_lOffset.QuadPart >= instance->m_lSize.QuadPart)
return S_FALSE; return E_FAIL;
ret = cliprdr_send_request_filecontents(clipboard, (void*) This, ret = cliprdr_send_request_filecontents(clipboard, (void*) This,
instance->m_lIndex, FILECONTENTS_RANGE, instance->m_lIndex, FILECONTENTS_RANGE,
instance->m_lOffset.HighPart, instance->m_lOffset.LowPart, cb); instance->m_lOffset.HighPart, instance->m_lOffset.LowPart, cb);
if (ret < 0) if (ret < 0)
return S_FALSE; return E_FAIL;
if (clipboard->req_fdata) if (clipboard->req_fdata)
{ {
@ -126,7 +126,7 @@ HRESULT STDMETHODCALLTYPE CliprdrStream_Read(IStream* This, void *pv, ULONG cb,
instance->m_lOffset.QuadPart += clipboard->req_fsize; instance->m_lOffset.QuadPart += clipboard->req_fsize;
if (clipboard->req_fsize < cb) if (clipboard->req_fsize < cb)
return S_FALSE; return E_FAIL;
return S_OK; return S_OK;
} }
@ -157,11 +157,11 @@ HRESULT STDMETHODCALLTYPE CliprdrStream_Seek(IStream* This, LARGE_INTEGER dlibMo
newoffset = instance->m_lSize.QuadPart + dlibMove.QuadPart; newoffset = instance->m_lSize.QuadPart + dlibMove.QuadPart;
break; break;
default: default:
return S_FALSE; return E_INVALIDARG;
} }
if (newoffset < 0 || newoffset >= instance->m_lSize.QuadPart) if (newoffset < 0 || newoffset >= instance->m_lSize.QuadPart)
return FALSE; return E_FAIL;
instance->m_lOffset.QuadPart = newoffset; instance->m_lOffset.QuadPart = newoffset;
@ -739,7 +739,7 @@ HRESULT STDMETHODCALLTYPE CliprdrEnumFORMATETC_Next(IEnumFORMATETC* This, ULONG
if (pceltFetched != 0) if (pceltFetched != 0)
*pceltFetched = copied; *pceltFetched = copied;
return (copied == celt) ? S_OK : S_FALSE; return (copied == celt) ? S_OK : E_FAIL;
} }
HRESULT STDMETHODCALLTYPE CliprdrEnumFORMATETC_Skip(IEnumFORMATETC* This, ULONG celt) HRESULT STDMETHODCALLTYPE CliprdrEnumFORMATETC_Skip(IEnumFORMATETC* This, ULONG celt)
@ -747,7 +747,7 @@ HRESULT STDMETHODCALLTYPE CliprdrEnumFORMATETC_Skip(IEnumFORMATETC* This, ULONG
CliprdrEnumFORMATETC* instance = (CliprdrEnumFORMATETC*) This; CliprdrEnumFORMATETC* instance = (CliprdrEnumFORMATETC*) This;
if (instance->m_nIndex + (LONG) celt > instance->m_nNumFormats) if (instance->m_nIndex + (LONG) celt > instance->m_nNumFormats)
return S_FALSE; return E_FAIL;
instance->m_nIndex += celt; instance->m_nIndex += celt;
@ -1579,7 +1579,7 @@ static WIN32ERROR wf_cliprdr_server_format_data_request(CliprdrClientContext* co
result = OleGetClipboard(&dataObj); result = OleGetClipboard(&dataObj);
if (!SUCCEEDED(result)) if (FAILED(result))
return ERROR_INTERNAL_ERROR; return ERROR_INTERNAL_ERROR;
ZeroMemory(&format_etc, sizeof(FORMATETC)); ZeroMemory(&format_etc, sizeof(FORMATETC));
@ -1618,7 +1618,7 @@ static WIN32ERROR wf_cliprdr_server_format_data_request(CliprdrClientContext* co
result = IDataObject_GetData(dataObj, &format_etc, &stg_medium); result = IDataObject_GetData(dataObj, &format_etc, &stg_medium);
if (!SUCCEEDED(result)) { if (FAILED(result)) {
DEBUG_CLIPRDR("dataObj->GetData failed."); DEBUG_CLIPRDR("dataObj->GetData failed.");
} }
@ -1785,7 +1785,7 @@ WIN32ERROR wf_cliprdr_server_file_contents_request(CliprdrClientContext* context
hRet = OleGetClipboard(&pDataObj); hRet = OleGetClipboard(&pDataObj);
if (!SUCCEEDED(hRet)) if (FAILED(hRet))
{ {
WLog_ERR(TAG, "filecontents: get ole clipboard failed."); WLog_ERR(TAG, "filecontents: get ole clipboard failed.");
goto error; goto error;

View File

@ -1093,9 +1093,11 @@ BOOL xf_post_connect(freerdp* instance)
gdi = context->gdi; gdi = context->gdi;
xfc->primary_buffer = gdi->primary_buffer; xfc->primary_buffer = gdi->primary_buffer;
xfc->palette = gdi->palette;
} }
else else
{ {
xfc->palette = xfc->palette_hwgdi;
xfc->srcBpp = settings->ColorDepth; xfc->srcBpp = settings->ColorDepth;
xf_gdi_register_update_callbacks(update); xf_gdi_register_update_callbacks(update);
} }
@ -1532,7 +1534,7 @@ void* xf_client_thread(void* param)
if (settings->AsyncInput) if (settings->AsyncInput)
{ {
wMessageQueue* inputQueue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE); wMessageQueue* inputQueue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE);
MessageQueue_PostQuit(inputQueue, 0); if (MessageQueue_PostQuit(inputQueue, 0))
WaitForSingleObject(inputThread, INFINITE); WaitForSingleObject(inputThread, INFINITE);
CloseHandle(inputThread); CloseHandle(inputThread);
} }

View File

@ -470,6 +470,7 @@ static BOOL xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI
if (fieldFlags & WINDOW_ORDER_FIELD_TITLE) if (fieldFlags & WINDOW_ORDER_FIELD_TITLE)
{ {
if (appWindow->title)
xf_SetWindowText(xfc, appWindow, appWindow->title); xf_SetWindowText(xfc, appWindow, appWindow->title);
} }

View File

@ -127,7 +127,8 @@ struct xf_context
HANDLE mutex; HANDLE mutex;
BOOL UseXThreads; BOOL UseXThreads;
BOOL cursorHidden; BOOL cursorHidden;
BYTE palette[256 * 4]; BYTE* palette;
BYTE palette_hwgdi[256 * 4];
HGDI_DC hdc; HGDI_DC hdc;
UINT32 bitmap_size; UINT32 bitmap_size;

View File

@ -14,6 +14,9 @@
#define CMAKE_SHARED_LIBRARY_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}" #define CMAKE_SHARED_LIBRARY_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}"
#define CMAKE_SHARED_LIBRARY_PREFIX "${CMAKE_SHARED_LIBRARY_PREFIX}" #define CMAKE_SHARED_LIBRARY_PREFIX "${CMAKE_SHARED_LIBRARY_PREFIX}"
#define FREERDP_VENDOR_STRING "${VENDOR}"
#define FREERDP_PRODUCT_STRING "${PRODUCT}"
/* Include files */ /* Include files */
#cmakedefine HAVE_FCNTL_H #cmakedefine HAVE_FCNTL_H
#cmakedefine HAVE_UNISTD_H #cmakedefine HAVE_UNISTD_H

View File

@ -42,6 +42,13 @@ struct _H264_CONTEXT_SUBSYSTEM
}; };
typedef struct _H264_CONTEXT_SUBSYSTEM H264_CONTEXT_SUBSYSTEM; typedef struct _H264_CONTEXT_SUBSYSTEM H264_CONTEXT_SUBSYSTEM;
enum _H264_RATECONTROL_MODE
{
H264_RATECONTROL_VBR = 0,
H264_RATECONTROL_CQP
};
typedef enum _H264_RATECONTROL_MODE H264_RATECONTROL_MODE;
struct _H264_CONTEXT struct _H264_CONTEXT
{ {
BOOL Compressor; BOOL Compressor;
@ -49,8 +56,10 @@ struct _H264_CONTEXT
UINT32 width; UINT32 width;
UINT32 height; UINT32 height;
H264_RATECONTROL_MODE RateControlMode;
UINT32 BitRate; UINT32 BitRate;
FLOAT FrameRate; FLOAT FrameRate;
UINT32 QP;
UINT32 NumberOfThreads; UINT32 NumberOfThreads;
int iStride[3]; int iStride[3];

View File

@ -35,14 +35,17 @@ typedef struct rdp_certificate_store rdpCertificateStore;
struct rdp_certificate_data struct rdp_certificate_data
{ {
char* hostname; char* hostname;
UINT16 port;
char* subject;
char* issuer;
char* fingerprint; char* fingerprint;
}; };
struct rdp_certificate_store struct rdp_certificate_store
{ {
FILE* fp;
char* path; char* path;
char* file; char* file;
char* legacy_file;
rdpSettings* settings; rdpSettings* settings;
rdpCertificateData* certificate_data; rdpCertificateData* certificate_data;
}; };
@ -51,13 +54,29 @@ struct rdp_certificate_store
extern "C" { extern "C" {
#endif #endif
FREERDP_API rdpCertificateData* certificate_data_new(char* hostname, char* fingerprint); FREERDP_API rdpCertificateData* certificate_data_new(
FREERDP_API void certificate_data_free(rdpCertificateData* certificate_data); char* hostname, UINT16 port, char*subject,
FREERDP_API rdpCertificateStore* certificate_store_new(rdpSettings* settings); char*issuer, char* fingerprint);
FREERDP_API void certificate_data_replace(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data); FREERDP_API void certificate_data_free(
FREERDP_API void certificate_store_free(rdpCertificateStore* certificate_store); rdpCertificateData* certificate_data);
FREERDP_API int certificate_data_match(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data); FREERDP_API rdpCertificateStore* certificate_store_new(
FREERDP_API void certificate_data_print(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data); rdpSettings* settings);
FREERDP_API BOOL certificate_data_replace(
rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data);
FREERDP_API void certificate_store_free(
rdpCertificateStore* certificate_store);
FREERDP_API int certificate_data_match(
rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data);
FREERDP_API BOOL certificate_data_print(
rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data);
FREERDP_API BOOL certificate_get_stored_data(
rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data,
char** subject, char** issuer,
char** fingerprint);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -133,7 +133,7 @@ FREERDP_API void crypto_cert_print_info(X509* xcert);
FREERDP_API void crypto_cert_free(CryptoCert cert); FREERDP_API void crypto_cert_free(CryptoCert cert);
FREERDP_API BOOL x509_verify_certificate(CryptoCert cert, char* certificate_store_path); FREERDP_API BOOL x509_verify_certificate(CryptoCert cert, char* certificate_store_path);
FREERDP_API rdpCertificateData* crypto_get_certificate_data(X509* xcert, char* hostname); FREERDP_API rdpCertificateData* crypto_get_certificate_data(X509* xcert, char* hostname, UINT16 port);
FREERDP_API BOOL crypto_cert_get_public_key(CryptoCert cert, BYTE** PublicKey, DWORD* PublicKeyLength); FREERDP_API BOOL crypto_cert_get_public_key(CryptoCert cert, BYTE** PublicKey, DWORD* PublicKeyLength);
#define TSSK_KEY_LENGTH 64 #define TSSK_KEY_LENGTH 64

View File

@ -98,8 +98,11 @@ FREERDP_API int tls_set_alert_code(rdpTls* tls, int level, int description);
FREERDP_API BOOL tls_match_hostname(char *pattern, int pattern_length, char *hostname); FREERDP_API BOOL tls_match_hostname(char *pattern, int pattern_length, char *hostname);
FREERDP_API int tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname, int port); FREERDP_API int tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname, int port);
FREERDP_API void tls_print_certificate_error(char* hostname, char* fingerprint, char* hosts_file); FREERDP_API void tls_print_certificate_error(char* hostname, UINT16 port,
FREERDP_API void tls_print_certificate_name_mismatch_error(char* hostname, char* common_name, char** alt_names, int alt_names_count); char* fingerprint, char* hosts_file);
FREERDP_API void tls_print_certificate_name_mismatch_error(
char* hostname, UINT16 port, char* common_name, char** alt_names,
int alt_names_count);
FREERDP_API BOOL tls_print_error(char* func, SSL* connection, int value); FREERDP_API BOOL tls_print_error(char* func, SSL* connection, int value);

View File

@ -67,7 +67,10 @@ typedef BOOL (*pPostConnect)(freerdp* instance);
typedef void (*pPostDisconnect)(freerdp* instance); typedef void (*pPostDisconnect)(freerdp* instance);
typedef BOOL (*pAuthenticate)(freerdp* instance, char** username, char** password, char** domain); typedef BOOL (*pAuthenticate)(freerdp* instance, char** username, char** password, char** domain);
typedef BOOL (*pVerifyCertificate)(freerdp* instance, char* subject, char* issuer, char* fingerprint); typedef BOOL (*pVerifyCertificate)(freerdp* instance, char* subject, char* issuer, char* fingerprint);
typedef BOOL (*pVerifyChangedCertificate)(freerdp* instance, char* subject, char* issuer, char* new_fingerprint, char* old_fingerprint); typedef BOOL (*pVerifyChangedCertificate)(freerdp* instance, char* subject,
char* issuer, char* new_fingerprint,
char* old_subject, char* old_issuer,
char* old_fingerprint);
typedef int (*pVerifyX509Certificate)(freerdp* instance, BYTE* data, int length, const char* hostname, int port, DWORD flags); typedef int (*pVerifyX509Certificate)(freerdp* instance, BYTE* data, int length, const char* hostname, int port, DWORD flags);
typedef int (*pLogonErrorInfo)(freerdp* instance, UINT32 data, UINT32 type); typedef int (*pLogonErrorInfo)(freerdp* instance, UINT32 data, UINT32 type);

View File

@ -1512,12 +1512,19 @@ int freerdp_image_copy_from_pointer_data(BYTE* pDstData, UINT32 DstFormat, int n
return 1; return 1;
} }
else if (xorBpp == 24 || xorBpp == 32) else if (xorBpp == 24 || xorBpp == 32 || xorBpp == 16 || xorBpp == 8)
{ {
int xorBytesPerPixel = xorBpp >> 3; int xorBytesPerPixel = xorBpp >> 3;
xorStep = nWidth * xorBytesPerPixel; xorStep = nWidth * xorBytesPerPixel;
pDstPixel = (UINT32*) &pDstData[(nYDst * nDstStep) + (nXDst * 4)]; pDstPixel = (UINT32*) &pDstData[(nYDst * nDstStep) + (nXDst * 4)];
if (xorBpp == 8 && !palette)
{
WLog_ERR(TAG, "null palette in convertion from %d bpp to %d bpp",
xorBpp, dstBitsPerPixel);
return -1;
}
for (y = 0; y < nHeight; y++) for (y = 0; y < nHeight; y++)
{ {
andBit = 0x80; andBit = 0x80;
@ -1536,9 +1543,23 @@ int freerdp_image_copy_from_pointer_data(BYTE* pDstData, UINT32 DstFormat, int n
for (x = 0; x < nWidth; x++) for (x = 0; x < nWidth; x++)
{ {
if (xorBpp == 32) if (xorBpp == 32)
{
xorPixel = *((UINT32*) xorBits); xorPixel = *((UINT32*) xorBits);
}
else if (xorBpp == 16)
{
UINT16 r, g, b;
GetRGB16(r, g, b, *(UINT16*)xorBits);
xorPixel = ARGB32(0xFF, r, g, b);
}
else if (xorBpp == 8)
{
xorPixel = 0xFF << 24 | ((UINT32*)palette)[xorBits[0]];
}
else else
{
xorPixel = xorBits[0] | xorBits[1] << 8 | xorBits[2] << 16 | 0xFF << 24; xorPixel = xorBits[0] | xorBits[1] << 8 | xorBits[2] << 16 | 0xFF << 24;
}
xorBits += xorBytesPerPixel; xorBits += xorBytesPerPixel;

View File

@ -179,8 +179,6 @@ static int openh264_compress(H264_CONTEXT* h264, BYTE** ppDstData, UINT32* pDstS
sys->EncParamExt.iUsageType = SCREEN_CONTENT_REAL_TIME; sys->EncParamExt.iUsageType = SCREEN_CONTENT_REAL_TIME;
sys->EncParamExt.iPicWidth = h264->width; sys->EncParamExt.iPicWidth = h264->width;
sys->EncParamExt.iPicHeight = h264->height; sys->EncParamExt.iPicHeight = h264->height;
sys->EncParamExt.iTargetBitrate = h264->BitRate;
sys->EncParamExt.iRCMode = RC_BITRATE_MODE;
sys->EncParamExt.fMaxFrameRate = h264->FrameRate; sys->EncParamExt.fMaxFrameRate = h264->FrameRate;
sys->EncParamExt.iMaxBitrate = UNSPECIFIED_BIT_RATE; sys->EncParamExt.iMaxBitrate = UNSPECIFIED_BIT_RATE;
sys->EncParamExt.bEnableDenoise = 0; sys->EncParamExt.bEnableDenoise = 0;
@ -191,8 +189,19 @@ static int openh264_compress(H264_CONTEXT* h264, BYTE** ppDstData, UINT32* pDstS
sys->EncParamExt.sSpatialLayers[0].fFrameRate = h264->FrameRate; sys->EncParamExt.sSpatialLayers[0].fFrameRate = h264->FrameRate;
sys->EncParamExt.sSpatialLayers[0].iVideoWidth = sys->EncParamExt.iPicWidth; sys->EncParamExt.sSpatialLayers[0].iVideoWidth = sys->EncParamExt.iPicWidth;
sys->EncParamExt.sSpatialLayers[0].iVideoHeight = sys->EncParamExt.iPicHeight; sys->EncParamExt.sSpatialLayers[0].iVideoHeight = sys->EncParamExt.iPicHeight;
sys->EncParamExt.sSpatialLayers[0].iSpatialBitrate = sys->EncParamExt.iTargetBitrate;
sys->EncParamExt.sSpatialLayers[0].iMaxSpatialBitrate = sys->EncParamExt.iMaxBitrate; sys->EncParamExt.sSpatialLayers[0].iMaxSpatialBitrate = sys->EncParamExt.iMaxBitrate;
switch (h264->RateControlMode)
{
case H264_RATECONTROL_VBR:
sys->EncParamExt.iRCMode = RC_BITRATE_MODE;
sys->EncParamExt.iTargetBitrate = h264->BitRate;
sys->EncParamExt.sSpatialLayers[0].iSpatialBitrate = sys->EncParamExt.iTargetBitrate;
break;
case H264_RATECONTROL_CQP:
sys->EncParamExt.iRCMode = RC_OFF_MODE;
sys->EncParamExt.sSpatialLayers[0].iDLayerQp = h264->QP;
break;
}
if (sys->EncParamExt.iMultipleThreadIdc > 1) if (sys->EncParamExt.iMultipleThreadIdc > 1)
{ {
@ -206,9 +215,21 @@ static int openh264_compress(H264_CONTEXT* h264, BYTE** ppDstData, UINT32* pDstS
WLog_ERR(TAG, "Failed to initialize OpenH264 encoder (status=%ld)", status); WLog_ERR(TAG, "Failed to initialize OpenH264 encoder (status=%ld)", status);
return status; return status;
} }
status = (*sys->pEncoder)->GetOption(sys->pEncoder, ENCODER_OPTION_SVC_ENCODE_PARAM_EXT,
&sys->EncParamExt);
if (status < 0)
{
WLog_ERR(TAG, "Failed to get initial OpenH264 encoder parameters (status=%ld)", status);
return status;
}
} }
else else
{ {
switch (h264->RateControlMode)
{
case H264_RATECONTROL_VBR:
if (sys->EncParamExt.iTargetBitrate != h264->BitRate) if (sys->EncParamExt.iTargetBitrate != h264->BitRate)
{ {
sys->EncParamExt.iTargetBitrate = h264->BitRate; sys->EncParamExt.iTargetBitrate = h264->BitRate;
@ -237,6 +258,23 @@ static int openh264_compress(H264_CONTEXT* h264, BYTE** ppDstData, UINT32* pDstS
return status; return status;
} }
} }
break;
case H264_RATECONTROL_CQP:
if (sys->EncParamExt.sSpatialLayers[0].iDLayerQp != h264->QP)
{
sys->EncParamExt.sSpatialLayers[0].iDLayerQp = h264->QP;
status = (*sys->pEncoder)->SetOption(sys->pEncoder, ENCODER_OPTION_SVC_ENCODE_PARAM_EXT,
&sys->EncParamExt);
if (status < 0)
{
WLog_ERR(TAG, "Failed to set encoder parameters (status=%ld)", status);
return status;
}
}
break;
}
} }
memset(&info, 0, sizeof(SFrameBSInfo)); memset(&info, 0, sizeof(SFrameBSInfo));

View File

@ -161,7 +161,12 @@ int freerdp_assistance_parse_address_list(rdpAssistanceFile* file, char* list)
file->MachinePorts = (UINT32*) calloc(count, sizeof(UINT32)); file->MachinePorts = (UINT32*) calloc(count, sizeof(UINT32));
if (!file->MachineAddresses || !file->MachinePorts) if (!file->MachineAddresses || !file->MachinePorts)
{
free(file->MachineAddresses);
free(file->MachinePorts);
free(tokens);
return -1; return -1;
}
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {

View File

@ -73,7 +73,7 @@ static BOOL autodetect_send_rtt_measure_request(rdpContext* context, UINT16 sequ
Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */ Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */
Stream_Write_UINT16(s, requestType); /* requestType (2 bytes) */ Stream_Write_UINT16(s, requestType); /* requestType (2 bytes) */
context->rdp->autodetect->rttMeasureStartTime = GetTickCount(); context->rdp->autodetect->rttMeasureStartTime = GetTickCountPrecise();
return rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ); return rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ);
} }
@ -257,7 +257,7 @@ static BOOL autodetect_send_bandwidth_measure_results(rdpRdp* rdp, UINT16 respon
UINT32 timeDelta; UINT32 timeDelta;
/* Compute the total time */ /* Compute the total time */
timeDelta = GetTickCount() - rdp->autodetect->bandwidthMeasureStartTime; timeDelta = GetTickCountPrecise() - rdp->autodetect->bandwidthMeasureStartTime;
/* Send the result PDU to the server */ /* Send the result PDU to the server */
@ -361,7 +361,7 @@ static BOOL autodetect_recv_rtt_measure_response(rdpRdp* rdp, wStream* s, AUTODE
WLog_VRB(AUTODETECT_TAG, "received RTT Measure Response PDU"); WLog_VRB(AUTODETECT_TAG, "received RTT Measure Response PDU");
rdp->autodetect->netCharAverageRTT = GetTickCount() - rdp->autodetect->rttMeasureStartTime; rdp->autodetect->netCharAverageRTT = GetTickCountPrecise() - rdp->autodetect->rttMeasureStartTime;
if (rdp->autodetect->netCharBaseRTT == 0 || rdp->autodetect->netCharBaseRTT > rdp->autodetect->netCharAverageRTT) if (rdp->autodetect->netCharBaseRTT == 0 || rdp->autodetect->netCharBaseRTT > rdp->autodetect->netCharAverageRTT)
rdp->autodetect->netCharBaseRTT = rdp->autodetect->netCharAverageRTT; rdp->autodetect->netCharBaseRTT = rdp->autodetect->netCharAverageRTT;
@ -375,10 +375,10 @@ static BOOL autodetect_recv_bandwidth_measure_start(rdpRdp* rdp, wStream* s, AUT
if (autodetectReqPdu->headerLength != 0x06) if (autodetectReqPdu->headerLength != 0x06)
return FALSE; return FALSE;
WLog_VRB(AUTODETECT_TAG, "received Bandwidth Measure Start PDU - time=%lu", GetTickCount()); WLog_VRB(AUTODETECT_TAG, "received Bandwidth Measure Start PDU - time=%lu", GetTickCountPrecise());
/* Initialize bandwidth measurement parameters */ /* Initialize bandwidth measurement parameters */
rdp->autodetect->bandwidthMeasureStartTime = GetTickCount(); rdp->autodetect->bandwidthMeasureStartTime = GetTickCountPrecise();
rdp->autodetect->bandwidthMeasureByteCount = 0; rdp->autodetect->bandwidthMeasureByteCount = 0;
/* Continuous Auto-Detection: mark the start of the measurement */ /* Continuous Auto-Detection: mark the start of the measurement */

View File

@ -376,7 +376,6 @@ void rdp_write_bitmap_capability_set(wStream* s, rdpSettings* settings)
{ {
int header; int header;
BYTE drawingFlags = 0; BYTE drawingFlags = 0;
UINT16 desktopResizeFlag;
UINT16 preferredBitsPerPixel; UINT16 preferredBitsPerPixel;
Stream_EnsureRemainingCapacity(s, 64); Stream_EnsureRemainingCapacity(s, 64);
@ -406,7 +405,6 @@ void rdp_write_bitmap_capability_set(wStream* s, rdpSettings* settings)
else else
preferredBitsPerPixel = 8; preferredBitsPerPixel = 8;
desktopResizeFlag = settings->DesktopResize;
Stream_Write_UINT16(s, preferredBitsPerPixel); /* preferredBitsPerPixel (2 bytes) */ Stream_Write_UINT16(s, preferredBitsPerPixel); /* preferredBitsPerPixel (2 bytes) */
Stream_Write_UINT16(s, 1); /* receive1BitPerPixel (2 bytes) */ Stream_Write_UINT16(s, 1); /* receive1BitPerPixel (2 bytes) */
@ -415,7 +413,7 @@ void rdp_write_bitmap_capability_set(wStream* s, rdpSettings* settings)
Stream_Write_UINT16(s, settings->DesktopWidth); /* desktopWidth (2 bytes) */ Stream_Write_UINT16(s, settings->DesktopWidth); /* desktopWidth (2 bytes) */
Stream_Write_UINT16(s, settings->DesktopHeight); /* desktopHeight (2 bytes) */ Stream_Write_UINT16(s, settings->DesktopHeight); /* desktopHeight (2 bytes) */
Stream_Write_UINT16(s, 0); /* pad2Octets (2 bytes) */ Stream_Write_UINT16(s, 0); /* pad2Octets (2 bytes) */
Stream_Write_UINT16(s, desktopResizeFlag); /* desktopResizeFlag (2 bytes) */ Stream_Write_UINT16(s, settings->DesktopResize); /* desktopResizeFlag (2 bytes) */
Stream_Write_UINT16(s, 1); /* bitmapCompressionFlag (2 bytes) */ Stream_Write_UINT16(s, 1); /* bitmapCompressionFlag (2 bytes) */
Stream_Write_UINT8(s, 0); /* highColorFlags (1 byte) */ Stream_Write_UINT8(s, 0); /* highColorFlags (1 byte) */
Stream_Write_UINT8(s, drawingFlags); /* drawingFlags (1 byte) */ Stream_Write_UINT8(s, drawingFlags); /* drawingFlags (1 byte) */

View File

@ -666,7 +666,8 @@ UINT VCAPITYPE FreeRDP_VirtualChannelWrite(DWORD openHandle, LPVOID pData, ULONG
pChannelOpenEvent->UserData = pUserData; pChannelOpenEvent->UserData = pUserData;
pChannelOpenEvent->pChannelOpenData = pChannelOpenData; pChannelOpenEvent->pChannelOpenData = pChannelOpenData;
MessageQueue_Post(channels->queue, (void*) channels, 0, (void*) pChannelOpenEvent, NULL); if (!MessageQueue_Post(channels->queue, (void*) channels, 0, (void*) pChannelOpenEvent, NULL))
return CHANNEL_RC_NO_MEMORY;
return CHANNEL_RC_OK; return CHANNEL_RC_OK;
} }

View File

@ -43,7 +43,7 @@ BOOL ntlm_client_init(rdpNtlm* ntlm, BOOL http, char* user, char* domain, char*
ntlm->http = http; ntlm->http = http;
ntlm->Bindings = Bindings; ntlm->Bindings = Bindings;
ntlm->table = InitSecurityInterfaceEx(SSPI_INTERFACE_WINPR); ntlm->table = InitSecurityInterface();
if (!ntlm->table) if (!ntlm->table)
return FALSE; return FALSE;

View File

@ -323,6 +323,7 @@ wStream* rdg_build_http_request(rdpRdg* rdg, char* method)
s = http_request_write(rdg->http, request); s = http_request_write(rdg->http, request);
http_request_free(request); http_request_free(request);
if (s)
Stream_SealLength(s); Stream_SealLength(s);
return s; return s;
} }
@ -435,9 +436,7 @@ BOOL rdg_process_in_channel_response(rdpRdg* rdg, HttpResponse* response)
s = rdg_build_http_request(rdg, "RDG_IN_DATA"); s = rdg_build_http_request(rdg, "RDG_IN_DATA");
if (!s) if (!s)
{
return FALSE; return FALSE;
}
status = tls_write_all(rdg->tlsIn, Stream_Buffer(s), Stream_Length(s)); status = tls_write_all(rdg->tlsIn, Stream_Buffer(s), Stream_Length(s));
@ -489,13 +488,16 @@ BOOL rdg_process_handshake_response(rdpRdg* rdg, wStream* s)
{ {
HRESULT errorCode; HRESULT errorCode;
WLog_DBG(TAG, "Handshake response recieved"); WLog_DBG(TAG, "Handshake response received");
if (rdg->state != RDG_CLIENT_STATE_HANDSHAKE) if (rdg->state != RDG_CLIENT_STATE_HANDSHAKE)
{ {
return FALSE; return FALSE;
} }
if (Stream_GetRemainingLength(s) < 12)
return FALSE;
Stream_Seek(s, 8); Stream_Seek(s, 8);
Stream_Read_UINT32(s, errorCode); Stream_Read_UINT32(s, errorCode);
@ -519,6 +521,9 @@ BOOL rdg_process_tunnel_response(rdpRdg* rdg, wStream* s)
return FALSE; return FALSE;
} }
if (Stream_GetRemainingLength(s) < 14)
return FALSE;
Stream_Seek(s, 10); Stream_Seek(s, 10);
Stream_Read_UINT32(s, errorCode); Stream_Read_UINT32(s, errorCode);
@ -542,6 +547,9 @@ BOOL rdg_process_tunnel_authorization_response(rdpRdg* rdg, wStream* s)
return FALSE; return FALSE;
} }
if (Stream_GetRemainingLength(s) < 12)
return FALSE;
Stream_Seek(s, 8); Stream_Seek(s, 8);
Stream_Read_UINT32(s, errorCode); Stream_Read_UINT32(s, errorCode);
@ -565,6 +573,9 @@ BOOL rdg_process_channel_response(rdpRdg* rdg, wStream* s)
return FALSE; return FALSE;
} }
if (Stream_GetRemainingLength(s) < 12)
return FALSE;
Stream_Seek(s, 8); Stream_Seek(s, 8);
Stream_Read_UINT32(s, errorCode); Stream_Read_UINT32(s, errorCode);
@ -585,8 +596,11 @@ BOOL rdg_process_packet(rdpRdg* rdg, wStream* s)
UINT16 type; UINT16 type;
Stream_SetPosition(s, 0); Stream_SetPosition(s, 0);
Stream_Read_UINT16(s, type);
Stream_SetPosition(s, 0); if (Stream_GetRemainingLength(s) < 2)
return FALSE;
Stream_Peek_UINT16(s, type);
switch (type) switch (type)
{ {

View File

@ -321,7 +321,8 @@ int rpc_client_recv_fragment(rdpRpc* rpc, wStream* fragment)
if (rpc->VirtualConnection->DefaultOutChannel->ReceiverAvailableWindow < (rpc->ReceiveWindow / 2)) if (rpc->VirtualConnection->DefaultOutChannel->ReceiverAvailableWindow < (rpc->ReceiveWindow / 2))
{ {
rts_send_flow_control_ack_pdu(rpc); if (rts_send_flow_control_ack_pdu(rpc) < 0)
return -1;
} }
if (!rpc_get_stub_data_info(rpc, buffer, &StubOffset, &StubLength)) if (!rpc_get_stub_data_info(rpc, buffer, &StubOffset, &StubLength))
@ -412,7 +413,8 @@ int rpc_client_recv_fragment(rdpRpc* rpc, wStream* fragment)
return -1; return -1;
Stream_Write(pdu->s, buffer, Stream_Length(fragment)); Stream_Write(pdu->s, buffer, Stream_Length(fragment));
Stream_SealLength(pdu->s); Stream_SealLength(pdu->s);
rpc_client_recv_pdu(rpc, pdu); if (rpc_client_recv_pdu(rpc, pdu) < 0)
return -1;
rpc_pdu_reset(pdu); rpc_pdu_reset(pdu);
} }
else else
@ -420,7 +422,8 @@ int rpc_client_recv_fragment(rdpRpc* rpc, wStream* fragment)
if (rpc->VirtualConnection->State < VIRTUAL_CONNECTION_STATE_OPENED) if (rpc->VirtualConnection->State < VIRTUAL_CONNECTION_STATE_OPENED)
WLog_ERR(TAG, "warning: unhandled RTS PDU"); WLog_ERR(TAG, "warning: unhandled RTS PDU");
rts_recv_out_of_sequence_pdu(rpc, buffer, header->common.frag_length); if (rts_recv_out_of_sequence_pdu(rpc, buffer, header->common.frag_length) < 0)
return -1;
} }
return 1; return 1;
@ -434,7 +437,8 @@ int rpc_client_recv_fragment(rdpRpc* rpc, wStream* fragment)
return -1; return -1;
Stream_Write(pdu->s, buffer, Stream_Length(fragment)); Stream_Write(pdu->s, buffer, Stream_Length(fragment));
Stream_SealLength(pdu->s); Stream_SealLength(pdu->s);
rpc_client_recv_pdu(rpc, pdu); if (rpc_client_recv_pdu(rpc, pdu) < 0)
return -1;
rpc_pdu_reset(pdu); rpc_pdu_reset(pdu);
return 1; return 1;

View File

@ -41,17 +41,14 @@
static BOOL update_message_BeginPaint(rdpContext* context) static BOOL update_message_BeginPaint(rdpContext* context)
{ {
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, BeginPaint), NULL, NULL); MakeMessageId(Update, BeginPaint), NULL, NULL);
return TRUE;
} }
static BOOL update_message_EndPaint(rdpContext* context) static BOOL update_message_EndPaint(rdpContext* context)
{ {
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, EndPaint), NULL, NULL); MakeMessageId(Update, EndPaint), NULL, NULL);
return TRUE;
} }
static BOOL update_message_SetBounds(rdpContext* context, rdpBounds* bounds) static BOOL update_message_SetBounds(rdpContext* context, rdpBounds* bounds)
@ -66,23 +63,20 @@ static BOOL update_message_SetBounds(rdpContext* context, rdpBounds* bounds)
CopyMemory(wParam, bounds, sizeof(rdpBounds)); CopyMemory(wParam, bounds, sizeof(rdpBounds));
} }
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, SetBounds), (void*) wParam, NULL); MakeMessageId(Update, SetBounds), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_Synchronize(rdpContext* context) static BOOL update_message_Synchronize(rdpContext* context)
{ {
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, Synchronize), NULL, NULL); MakeMessageId(Update, Synchronize), NULL, NULL);
return TRUE;
} }
static BOOL update_message_DesktopResize(rdpContext* context) static BOOL update_message_DesktopResize(rdpContext* context)
{ {
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, DesktopResize), NULL, NULL); MakeMessageId(Update, DesktopResize), NULL, NULL);
return TRUE;
} }
static BOOL update_message_BitmapUpdate(rdpContext* context, BITMAP_UPDATE* bitmap) static BOOL update_message_BitmapUpdate(rdpContext* context, BITMAP_UPDATE* bitmap)
@ -125,10 +119,9 @@ static BOOL update_message_BitmapUpdate(rdpContext* context, BITMAP_UPDATE* bitm
wParam->rectangles[index].bitmapLength); wParam->rectangles[index].bitmapLength);
#endif #endif
} }
MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, BitmapUpdate), (void*) wParam, NULL);
return TRUE; return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, BitmapUpdate), (void*) wParam, NULL);
} }
static BOOL update_message_Palette(rdpContext* context, PALETTE_UPDATE* palette) static BOOL update_message_Palette(rdpContext* context, PALETTE_UPDATE* palette)
@ -140,9 +133,8 @@ static BOOL update_message_Palette(rdpContext* context, PALETTE_UPDATE* palette)
return FALSE; return FALSE;
CopyMemory(wParam, palette, sizeof(PALETTE_UPDATE)); CopyMemory(wParam, palette, sizeof(PALETTE_UPDATE));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, Palette), (void*) wParam, NULL); MakeMessageId(Update, Palette), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_PlaySound(rdpContext* context, PLAY_SOUND_UPDATE* playSound) static BOOL update_message_PlaySound(rdpContext* context, PLAY_SOUND_UPDATE* playSound)
@ -154,16 +146,14 @@ static BOOL update_message_PlaySound(rdpContext* context, PLAY_SOUND_UPDATE* pla
return FALSE; return FALSE;
CopyMemory(wParam, playSound, sizeof(PLAY_SOUND_UPDATE)); CopyMemory(wParam, playSound, sizeof(PLAY_SOUND_UPDATE));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, PlaySound), (void*) wParam, NULL); MakeMessageId(Update, PlaySound), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_SetKeyboardIndicators(rdpContext* context, UINT16 led_flags) static BOOL update_message_SetKeyboardIndicators(rdpContext* context, UINT16 led_flags)
{ {
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, SetKeyboardIndicators), (void*)(size_t)led_flags, NULL); MakeMessageId(Update, SetKeyboardIndicators), (void*)(size_t)led_flags, NULL);
return TRUE;
} }
static BOOL update_message_RefreshRect(rdpContext* context, BYTE count, RECTANGLE_16* areas) static BOOL update_message_RefreshRect(rdpContext* context, BYTE count, RECTANGLE_16* areas)
@ -175,9 +165,8 @@ static BOOL update_message_RefreshRect(rdpContext* context, BYTE count, RECTANGL
return FALSE; return FALSE;
CopyMemory(lParam, areas, sizeof(RECTANGLE_16) * count); CopyMemory(lParam, areas, sizeof(RECTANGLE_16) * count);
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, RefreshRect), (void*) (size_t) count, (void*) lParam); MakeMessageId(Update, RefreshRect), (void*) (size_t) count, (void*) lParam);
return TRUE;
} }
static BOOL update_message_SuppressOutput(rdpContext* context, BYTE allow, RECTANGLE_16* area) static BOOL update_message_SuppressOutput(rdpContext* context, BYTE allow, RECTANGLE_16* area)
@ -192,9 +181,8 @@ static BOOL update_message_SuppressOutput(rdpContext* context, BYTE allow, RECTA
CopyMemory(lParam, area, sizeof(RECTANGLE_16)); CopyMemory(lParam, area, sizeof(RECTANGLE_16));
} }
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, SuppressOutput), (void*) (size_t) allow, (void*) lParam); MakeMessageId(Update, SuppressOutput), (void*) (size_t) allow, (void*) lParam);
return TRUE;
} }
static BOOL update_message_SurfaceCommand(rdpContext* context, wStream* s) static BOOL update_message_SurfaceCommand(rdpContext* context, wStream* s)
@ -215,9 +203,8 @@ static BOOL update_message_SurfaceCommand(rdpContext* context, wStream* s)
wParam->pointer = wParam->buffer; wParam->pointer = wParam->buffer;
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, SurfaceCommand), (void*) wParam, NULL); MakeMessageId(Update, SurfaceCommand), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_SurfaceBits(rdpContext* context, SURFACE_BITS_COMMAND* surfaceBitsCommand) static BOOL update_message_SurfaceBits(rdpContext* context, SURFACE_BITS_COMMAND* surfaceBitsCommand)
@ -241,9 +228,8 @@ static BOOL update_message_SurfaceBits(rdpContext* context, SURFACE_BITS_COMMAND
CopyMemory(wParam->bitmapData, surfaceBitsCommand->bitmapData, wParam->bitmapDataLength); CopyMemory(wParam->bitmapData, surfaceBitsCommand->bitmapData, wParam->bitmapDataLength);
#endif #endif
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, SurfaceBits), (void*) wParam, NULL); MakeMessageId(Update, SurfaceBits), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_SurfaceFrameMarker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker) static BOOL update_message_SurfaceFrameMarker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker)
@ -255,18 +241,14 @@ static BOOL update_message_SurfaceFrameMarker(rdpContext* context, SURFACE_FRAME
return FALSE; return FALSE;
CopyMemory(wParam, surfaceFrameMarker, sizeof(SURFACE_FRAME_MARKER)); CopyMemory(wParam, surfaceFrameMarker, sizeof(SURFACE_FRAME_MARKER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, SurfaceFrameMarker), (void*) wParam, NULL); MakeMessageId(Update, SurfaceFrameMarker), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_SurfaceFrameAcknowledge(rdpContext* context, UINT32 frameId) static BOOL update_message_SurfaceFrameAcknowledge(rdpContext* context, UINT32 frameId)
{ {
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(Update, SurfaceFrameAcknowledge), (void*) (size_t) frameId, NULL); MakeMessageId(Update, SurfaceFrameAcknowledge), (void*) (size_t) frameId, NULL);
return TRUE;
} }
/* Primary Update */ /* Primary Update */
@ -280,9 +262,8 @@ static BOOL update_message_DstBlt(rdpContext* context, DSTBLT_ORDER* dstBlt)
return FALSE; return FALSE;
CopyMemory(wParam, dstBlt, sizeof(DSTBLT_ORDER)); CopyMemory(wParam, dstBlt, sizeof(DSTBLT_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, DstBlt), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, DstBlt), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_PatBlt(rdpContext* context, PATBLT_ORDER* patBlt) static BOOL update_message_PatBlt(rdpContext* context, PATBLT_ORDER* patBlt)
@ -296,9 +277,8 @@ static BOOL update_message_PatBlt(rdpContext* context, PATBLT_ORDER* patBlt)
wParam->brush.data = (BYTE*) wParam->brush.p8x8; wParam->brush.data = (BYTE*) wParam->brush.p8x8;
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, PatBlt), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, PatBlt), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_ScrBlt(rdpContext* context, SCRBLT_ORDER* scrBlt) static BOOL update_message_ScrBlt(rdpContext* context, SCRBLT_ORDER* scrBlt)
@ -310,10 +290,8 @@ static BOOL update_message_ScrBlt(rdpContext* context, SCRBLT_ORDER* scrBlt)
return FALSE; return FALSE;
CopyMemory(wParam, scrBlt, sizeof(SCRBLT_ORDER)); CopyMemory(wParam, scrBlt, sizeof(SCRBLT_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, ScrBlt), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, ScrBlt), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_OpaqueRect(rdpContext* context, OPAQUE_RECT_ORDER* opaqueRect) static BOOL update_message_OpaqueRect(rdpContext* context, OPAQUE_RECT_ORDER* opaqueRect)
@ -325,9 +303,8 @@ static BOOL update_message_OpaqueRect(rdpContext* context, OPAQUE_RECT_ORDER* op
return FALSE; return FALSE;
CopyMemory(wParam, opaqueRect, sizeof(OPAQUE_RECT_ORDER)); CopyMemory(wParam, opaqueRect, sizeof(OPAQUE_RECT_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, OpaqueRect), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, OpaqueRect), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_DrawNineGrid(rdpContext* context, DRAW_NINE_GRID_ORDER* drawNineGrid) static BOOL update_message_DrawNineGrid(rdpContext* context, DRAW_NINE_GRID_ORDER* drawNineGrid)
@ -339,9 +316,8 @@ static BOOL update_message_DrawNineGrid(rdpContext* context, DRAW_NINE_GRID_ORDE
return FALSE; return FALSE;
CopyMemory(wParam, drawNineGrid, sizeof(DRAW_NINE_GRID_ORDER)); CopyMemory(wParam, drawNineGrid, sizeof(DRAW_NINE_GRID_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, DrawNineGrid), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, DrawNineGrid), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_MultiDstBlt(rdpContext* context, MULTI_DSTBLT_ORDER* multiDstBlt) static BOOL update_message_MultiDstBlt(rdpContext* context, MULTI_DSTBLT_ORDER* multiDstBlt)
@ -353,9 +329,8 @@ static BOOL update_message_MultiDstBlt(rdpContext* context, MULTI_DSTBLT_ORDER*
return FALSE; return FALSE;
CopyMemory(wParam, multiDstBlt, sizeof(MULTI_DSTBLT_ORDER)); CopyMemory(wParam, multiDstBlt, sizeof(MULTI_DSTBLT_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, MultiDstBlt), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, MultiDstBlt), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_MultiPatBlt(rdpContext* context, MULTI_PATBLT_ORDER* multiPatBlt) static BOOL update_message_MultiPatBlt(rdpContext* context, MULTI_PATBLT_ORDER* multiPatBlt)
@ -369,9 +344,8 @@ static BOOL update_message_MultiPatBlt(rdpContext* context, MULTI_PATBLT_ORDER*
wParam->brush.data = (BYTE*) wParam->brush.p8x8; wParam->brush.data = (BYTE*) wParam->brush.p8x8;
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, MultiPatBlt), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, MultiPatBlt), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_MultiScrBlt(rdpContext* context, MULTI_SCRBLT_ORDER* multiScrBlt) static BOOL update_message_MultiScrBlt(rdpContext* context, MULTI_SCRBLT_ORDER* multiScrBlt)
@ -383,9 +357,8 @@ static BOOL update_message_MultiScrBlt(rdpContext* context, MULTI_SCRBLT_ORDER*
return FALSE; return FALSE;
CopyMemory(wParam, multiScrBlt, sizeof(MULTI_SCRBLT_ORDER)); CopyMemory(wParam, multiScrBlt, sizeof(MULTI_SCRBLT_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, MultiScrBlt), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, MultiScrBlt), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_MultiOpaqueRect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multiOpaqueRect) static BOOL update_message_MultiOpaqueRect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multiOpaqueRect)
@ -397,9 +370,8 @@ static BOOL update_message_MultiOpaqueRect(rdpContext* context, MULTI_OPAQUE_REC
return FALSE; return FALSE;
CopyMemory(wParam, multiOpaqueRect, sizeof(MULTI_OPAQUE_RECT_ORDER)); CopyMemory(wParam, multiOpaqueRect, sizeof(MULTI_OPAQUE_RECT_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, MultiOpaqueRect), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, MultiOpaqueRect), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_MultiDrawNineGrid(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multiDrawNineGrid) static BOOL update_message_MultiDrawNineGrid(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multiDrawNineGrid)
@ -413,9 +385,8 @@ static BOOL update_message_MultiDrawNineGrid(rdpContext* context, MULTI_DRAW_NIN
/* TODO: complete copy */ /* TODO: complete copy */
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, MultiDrawNineGrid), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, MultiDrawNineGrid), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_LineTo(rdpContext* context, LINE_TO_ORDER* lineTo) static BOOL update_message_LineTo(rdpContext* context, LINE_TO_ORDER* lineTo)
@ -427,9 +398,8 @@ static BOOL update_message_LineTo(rdpContext* context, LINE_TO_ORDER* lineTo)
return FALSE; return FALSE;
CopyMemory(wParam, lineTo, sizeof(LINE_TO_ORDER)); CopyMemory(wParam, lineTo, sizeof(LINE_TO_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, LineTo), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, LineTo), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_Polyline(rdpContext* context, POLYLINE_ORDER* polyline) static BOOL update_message_Polyline(rdpContext* context, POLYLINE_ORDER* polyline)
@ -449,9 +419,8 @@ static BOOL update_message_Polyline(rdpContext* context, POLYLINE_ORDER* polylin
} }
CopyMemory(wParam->points, polyline->points, sizeof(DELTA_POINT) * wParam->numDeltaEntries); CopyMemory(wParam->points, polyline->points, sizeof(DELTA_POINT) * wParam->numDeltaEntries);
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, Polyline), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, Polyline), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_MemBlt(rdpContext* context, MEMBLT_ORDER* memBlt) static BOOL update_message_MemBlt(rdpContext* context, MEMBLT_ORDER* memBlt)
@ -463,10 +432,8 @@ static BOOL update_message_MemBlt(rdpContext* context, MEMBLT_ORDER* memBlt)
return FALSE; return FALSE;
CopyMemory(wParam, memBlt, sizeof(MEMBLT_ORDER)); CopyMemory(wParam, memBlt, sizeof(MEMBLT_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, MemBlt), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, MemBlt), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_Mem3Blt(rdpContext* context, MEM3BLT_ORDER* mem3Blt) static BOOL update_message_Mem3Blt(rdpContext* context, MEM3BLT_ORDER* mem3Blt)
@ -480,9 +447,8 @@ static BOOL update_message_Mem3Blt(rdpContext* context, MEM3BLT_ORDER* mem3Blt)
wParam->brush.data = (BYTE*) wParam->brush.p8x8; wParam->brush.data = (BYTE*) wParam->brush.p8x8;
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, Mem3Blt), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, Mem3Blt), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_SaveBitmap(rdpContext* context, SAVE_BITMAP_ORDER* saveBitmap) static BOOL update_message_SaveBitmap(rdpContext* context, SAVE_BITMAP_ORDER* saveBitmap)
@ -494,9 +460,8 @@ static BOOL update_message_SaveBitmap(rdpContext* context, SAVE_BITMAP_ORDER* sa
return FALSE; return FALSE;
CopyMemory(wParam, saveBitmap, sizeof(SAVE_BITMAP_ORDER)); CopyMemory(wParam, saveBitmap, sizeof(SAVE_BITMAP_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, SaveBitmap), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, SaveBitmap), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_GlyphIndex(rdpContext* context, GLYPH_INDEX_ORDER* glyphIndex) static BOOL update_message_GlyphIndex(rdpContext* context, GLYPH_INDEX_ORDER* glyphIndex)
@ -510,9 +475,8 @@ static BOOL update_message_GlyphIndex(rdpContext* context, GLYPH_INDEX_ORDER* gl
wParam->brush.data = (BYTE*) wParam->brush.p8x8; wParam->brush.data = (BYTE*) wParam->brush.p8x8;
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, GlyphIndex), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, GlyphIndex), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_FastIndex(rdpContext* context, FAST_INDEX_ORDER* fastIndex) static BOOL update_message_FastIndex(rdpContext* context, FAST_INDEX_ORDER* fastIndex)
@ -524,9 +488,8 @@ static BOOL update_message_FastIndex(rdpContext* context, FAST_INDEX_ORDER* fast
return FALSE; return FALSE;
CopyMemory(wParam, fastIndex, sizeof(FAST_INDEX_ORDER)); CopyMemory(wParam, fastIndex, sizeof(FAST_INDEX_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, FastIndex), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, FastIndex), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_FastGlyph(rdpContext* context, FAST_GLYPH_ORDER* fastGlyph) static BOOL update_message_FastGlyph(rdpContext* context, FAST_GLYPH_ORDER* fastGlyph)
@ -553,9 +516,8 @@ static BOOL update_message_FastGlyph(rdpContext* context, FAST_GLYPH_ORDER* fast
wParam->glyphData.aj = NULL; wParam->glyphData.aj = NULL;
} }
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, FastGlyph), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, FastGlyph), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_PolygonSC(rdpContext* context, POLYGON_SC_ORDER* polygonSC) static BOOL update_message_PolygonSC(rdpContext* context, POLYGON_SC_ORDER* polygonSC)
@ -575,9 +537,8 @@ static BOOL update_message_PolygonSC(rdpContext* context, POLYGON_SC_ORDER* poly
} }
CopyMemory(wParam->points, polygonSC, sizeof(DELTA_POINT) * wParam->numPoints); CopyMemory(wParam->points, polygonSC, sizeof(DELTA_POINT) * wParam->numPoints);
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, PolygonSC), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, PolygonSC), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_PolygonCB(rdpContext* context, POLYGON_CB_ORDER* polygonCB) static BOOL update_message_PolygonCB(rdpContext* context, POLYGON_CB_ORDER* polygonCB)
@ -599,9 +560,8 @@ static BOOL update_message_PolygonCB(rdpContext* context, POLYGON_CB_ORDER* poly
wParam->brush.data = (BYTE*) wParam->brush.p8x8; wParam->brush.data = (BYTE*) wParam->brush.p8x8;
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, PolygonCB), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, PolygonCB), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_EllipseSC(rdpContext* context, ELLIPSE_SC_ORDER* ellipseSC) static BOOL update_message_EllipseSC(rdpContext* context, ELLIPSE_SC_ORDER* ellipseSC)
@ -613,9 +573,8 @@ static BOOL update_message_EllipseSC(rdpContext* context, ELLIPSE_SC_ORDER* elli
return FALSE; return FALSE;
CopyMemory(wParam, ellipseSC, sizeof(ELLIPSE_SC_ORDER)); CopyMemory(wParam, ellipseSC, sizeof(ELLIPSE_SC_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, EllipseSC), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, EllipseSC), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_EllipseCB(rdpContext* context, ELLIPSE_CB_ORDER* ellipseCB) static BOOL update_message_EllipseCB(rdpContext* context, ELLIPSE_CB_ORDER* ellipseCB)
@ -629,9 +588,8 @@ static BOOL update_message_EllipseCB(rdpContext* context, ELLIPSE_CB_ORDER* elli
wParam->brush.data = (BYTE*) wParam->brush.p8x8; wParam->brush.data = (BYTE*) wParam->brush.p8x8;
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PrimaryUpdate, EllipseCB), (void*) wParam, NULL); MakeMessageId(PrimaryUpdate, EllipseCB), (void*) wParam, NULL);
return TRUE;
} }
/* Secondary Update */ /* Secondary Update */
@ -653,9 +611,8 @@ static BOOL update_message_CacheBitmap(rdpContext* context, CACHE_BITMAP_ORDER*
} }
CopyMemory(wParam->bitmapDataStream, cacheBitmapOrder, wParam->bitmapLength); CopyMemory(wParam->bitmapDataStream, cacheBitmapOrder, wParam->bitmapLength);
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(SecondaryUpdate, CacheBitmap), (void*) wParam, NULL); MakeMessageId(SecondaryUpdate, CacheBitmap), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_CacheBitmapV2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cacheBitmapV2Order) static BOOL update_message_CacheBitmapV2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cacheBitmapV2Order)
@ -675,9 +632,8 @@ static BOOL update_message_CacheBitmapV2(rdpContext* context, CACHE_BITMAP_V2_OR
} }
CopyMemory(wParam->bitmapDataStream, cacheBitmapV2Order->bitmapDataStream, wParam->bitmapLength); CopyMemory(wParam->bitmapDataStream, cacheBitmapV2Order->bitmapDataStream, wParam->bitmapLength);
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(SecondaryUpdate, CacheBitmapV2), (void*) wParam, NULL); MakeMessageId(SecondaryUpdate, CacheBitmapV2), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_CacheBitmapV3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3Order) static BOOL update_message_CacheBitmapV3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3Order)
@ -697,9 +653,8 @@ static BOOL update_message_CacheBitmapV3(rdpContext* context, CACHE_BITMAP_V3_OR
} }
CopyMemory(wParam->bitmapData.data, cacheBitmapV3Order->bitmapData.data, wParam->bitmapData.length); CopyMemory(wParam->bitmapData.data, cacheBitmapV3Order->bitmapData.data, wParam->bitmapData.length);
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(SecondaryUpdate, CacheBitmapV3), (void*) wParam, NULL); MakeMessageId(SecondaryUpdate, CacheBitmapV3), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_CacheColorTable(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cacheColorTableOrder) static BOOL update_message_CacheColorTable(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cacheColorTableOrder)
@ -711,9 +666,8 @@ static BOOL update_message_CacheColorTable(rdpContext* context, CACHE_COLOR_TABL
return FALSE; return FALSE;
CopyMemory(wParam, cacheColorTableOrder, sizeof(CACHE_COLOR_TABLE_ORDER)); CopyMemory(wParam, cacheColorTableOrder, sizeof(CACHE_COLOR_TABLE_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(SecondaryUpdate, CacheColorTable), (void*) wParam, NULL); MakeMessageId(SecondaryUpdate, CacheColorTable), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_CacheGlyph(rdpContext* context, CACHE_GLYPH_ORDER* cacheGlyphOrder) static BOOL update_message_CacheGlyph(rdpContext* context, CACHE_GLYPH_ORDER* cacheGlyphOrder)
@ -725,9 +679,8 @@ static BOOL update_message_CacheGlyph(rdpContext* context, CACHE_GLYPH_ORDER* ca
return FALSE; return FALSE;
CopyMemory(wParam, cacheGlyphOrder, sizeof(CACHE_GLYPH_ORDER)); CopyMemory(wParam, cacheGlyphOrder, sizeof(CACHE_GLYPH_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(SecondaryUpdate, CacheGlyph), (void*) wParam, NULL); MakeMessageId(SecondaryUpdate, CacheGlyph), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_CacheGlyphV2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cacheGlyphV2Order) static BOOL update_message_CacheGlyphV2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cacheGlyphV2Order)
@ -739,9 +692,8 @@ static BOOL update_message_CacheGlyphV2(rdpContext* context, CACHE_GLYPH_V2_ORDE
return FALSE; return FALSE;
CopyMemory(wParam, cacheGlyphV2Order, sizeof(CACHE_GLYPH_V2_ORDER)); CopyMemory(wParam, cacheGlyphV2Order, sizeof(CACHE_GLYPH_V2_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(SecondaryUpdate, CacheGlyphV2), (void*) wParam, NULL); MakeMessageId(SecondaryUpdate, CacheGlyphV2), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_CacheBrush(rdpContext* context, CACHE_BRUSH_ORDER* cacheBrushOrder) static BOOL update_message_CacheBrush(rdpContext* context, CACHE_BRUSH_ORDER* cacheBrushOrder)
@ -753,9 +705,8 @@ static BOOL update_message_CacheBrush(rdpContext* context, CACHE_BRUSH_ORDER* ca
return FALSE; return FALSE;
CopyMemory(wParam, cacheBrushOrder, sizeof(CACHE_BRUSH_ORDER)); CopyMemory(wParam, cacheBrushOrder, sizeof(CACHE_BRUSH_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(SecondaryUpdate, CacheBrush), (void*) wParam, NULL); MakeMessageId(SecondaryUpdate, CacheBrush), (void*) wParam, NULL);
return TRUE;
} }
/* Alternate Secondary Update */ /* Alternate Secondary Update */
@ -779,9 +730,8 @@ static BOOL update_message_CreateOffscreenBitmap(rdpContext* context, CREATE_OFF
} }
CopyMemory(wParam->deleteList.indices, createOffscreenBitmap->deleteList.indices, wParam->deleteList.cIndices); CopyMemory(wParam->deleteList.indices, createOffscreenBitmap->deleteList.indices, wParam->deleteList.cIndices);
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, CreateOffscreenBitmap), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, CreateOffscreenBitmap), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_SwitchSurface(rdpContext* context, SWITCH_SURFACE_ORDER* switchSurface) static BOOL update_message_SwitchSurface(rdpContext* context, SWITCH_SURFACE_ORDER* switchSurface)
@ -793,9 +743,8 @@ static BOOL update_message_SwitchSurface(rdpContext* context, SWITCH_SURFACE_ORD
return FALSE; return FALSE;
CopyMemory(wParam, switchSurface, sizeof(SWITCH_SURFACE_ORDER)); CopyMemory(wParam, switchSurface, sizeof(SWITCH_SURFACE_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, SwitchSurface), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, SwitchSurface), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_CreateNineGridBitmap(rdpContext* context, CREATE_NINE_GRID_BITMAP_ORDER* createNineGridBitmap) static BOOL update_message_CreateNineGridBitmap(rdpContext* context, CREATE_NINE_GRID_BITMAP_ORDER* createNineGridBitmap)
@ -807,9 +756,8 @@ static BOOL update_message_CreateNineGridBitmap(rdpContext* context, CREATE_NINE
return FALSE; return FALSE;
CopyMemory(wParam, createNineGridBitmap, sizeof(CREATE_NINE_GRID_BITMAP_ORDER)); CopyMemory(wParam, createNineGridBitmap, sizeof(CREATE_NINE_GRID_BITMAP_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, CreateNineGridBitmap), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, CreateNineGridBitmap), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_FrameMarker(rdpContext* context, FRAME_MARKER_ORDER* frameMarker) static BOOL update_message_FrameMarker(rdpContext* context, FRAME_MARKER_ORDER* frameMarker)
@ -821,9 +769,8 @@ static BOOL update_message_FrameMarker(rdpContext* context, FRAME_MARKER_ORDER*
return FALSE; return FALSE;
CopyMemory(wParam, frameMarker, sizeof(FRAME_MARKER_ORDER)); CopyMemory(wParam, frameMarker, sizeof(FRAME_MARKER_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, FrameMarker), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, FrameMarker), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_StreamBitmapFirst(rdpContext* context, STREAM_BITMAP_FIRST_ORDER* streamBitmapFirst) static BOOL update_message_StreamBitmapFirst(rdpContext* context, STREAM_BITMAP_FIRST_ORDER* streamBitmapFirst)
@ -837,9 +784,8 @@ static BOOL update_message_StreamBitmapFirst(rdpContext* context, STREAM_BITMAP_
/* TODO: complete copy */ /* TODO: complete copy */
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, StreamBitmapFirst), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, StreamBitmapFirst), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_StreamBitmapNext(rdpContext* context, STREAM_BITMAP_NEXT_ORDER* streamBitmapNext) static BOOL update_message_StreamBitmapNext(rdpContext* context, STREAM_BITMAP_NEXT_ORDER* streamBitmapNext)
@ -853,9 +799,8 @@ static BOOL update_message_StreamBitmapNext(rdpContext* context, STREAM_BITMAP_N
/* TODO: complete copy */ /* TODO: complete copy */
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, StreamBitmapNext), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, StreamBitmapNext), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_DrawGdiPlusFirst(rdpContext* context, DRAW_GDIPLUS_FIRST_ORDER* drawGdiPlusFirst) static BOOL update_message_DrawGdiPlusFirst(rdpContext* context, DRAW_GDIPLUS_FIRST_ORDER* drawGdiPlusFirst)
@ -869,9 +814,8 @@ static BOOL update_message_DrawGdiPlusFirst(rdpContext* context, DRAW_GDIPLUS_FI
/* TODO: complete copy */ /* TODO: complete copy */
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, DrawGdiPlusFirst), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, DrawGdiPlusFirst), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_DrawGdiPlusNext(rdpContext* context, DRAW_GDIPLUS_NEXT_ORDER* drawGdiPlusNext) static BOOL update_message_DrawGdiPlusNext(rdpContext* context, DRAW_GDIPLUS_NEXT_ORDER* drawGdiPlusNext)
@ -885,9 +829,8 @@ static BOOL update_message_DrawGdiPlusNext(rdpContext* context, DRAW_GDIPLUS_NEX
/* TODO: complete copy */ /* TODO: complete copy */
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, DrawGdiPlusNext), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, DrawGdiPlusNext), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_DrawGdiPlusEnd(rdpContext* context, DRAW_GDIPLUS_END_ORDER* drawGdiPlusEnd) static BOOL update_message_DrawGdiPlusEnd(rdpContext* context, DRAW_GDIPLUS_END_ORDER* drawGdiPlusEnd)
@ -901,9 +844,8 @@ static BOOL update_message_DrawGdiPlusEnd(rdpContext* context, DRAW_GDIPLUS_END_
/* TODO: complete copy */ /* TODO: complete copy */
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, DrawGdiPlusEnd), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, DrawGdiPlusEnd), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_DrawGdiPlusCacheFirst(rdpContext* context, DRAW_GDIPLUS_CACHE_FIRST_ORDER* drawGdiPlusCacheFirst) static BOOL update_message_DrawGdiPlusCacheFirst(rdpContext* context, DRAW_GDIPLUS_CACHE_FIRST_ORDER* drawGdiPlusCacheFirst)
@ -917,9 +859,8 @@ static BOOL update_message_DrawGdiPlusCacheFirst(rdpContext* context, DRAW_GDIPL
/* TODO: complete copy */ /* TODO: complete copy */
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, DrawGdiPlusCacheFirst), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, DrawGdiPlusCacheFirst), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_DrawGdiPlusCacheNext(rdpContext* context, DRAW_GDIPLUS_CACHE_NEXT_ORDER* drawGdiPlusCacheNext) static BOOL update_message_DrawGdiPlusCacheNext(rdpContext* context, DRAW_GDIPLUS_CACHE_NEXT_ORDER* drawGdiPlusCacheNext)
@ -933,9 +874,8 @@ static BOOL update_message_DrawGdiPlusCacheNext(rdpContext* context, DRAW_GDIPLU
/* TODO: complete copy */ /* TODO: complete copy */
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, DrawGdiPlusCacheNext), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, DrawGdiPlusCacheNext), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_DrawGdiPlusCacheEnd(rdpContext* context, DRAW_GDIPLUS_CACHE_END_ORDER* drawGdiPlusCacheEnd) static BOOL update_message_DrawGdiPlusCacheEnd(rdpContext* context, DRAW_GDIPLUS_CACHE_END_ORDER* drawGdiPlusCacheEnd)
@ -949,9 +889,8 @@ static BOOL update_message_DrawGdiPlusCacheEnd(rdpContext* context, DRAW_GDIPLUS
/* TODO: complete copy */ /* TODO: complete copy */
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(AltSecUpdate, DrawGdiPlusCacheEnd), (void*) wParam, NULL); MakeMessageId(AltSecUpdate, DrawGdiPlusCacheEnd), (void*) wParam, NULL);
return TRUE;
} }
/* Window Update */ /* Window Update */
@ -974,9 +913,8 @@ static BOOL update_message_WindowCreate(rdpContext* context, WINDOW_ORDER_INFO*
} }
CopyMemory(lParam, windowState, sizeof(WINDOW_STATE_ORDER)); CopyMemory(lParam, windowState, sizeof(WINDOW_STATE_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, WindowCreate), (void*) wParam, (void*) lParam); MakeMessageId(WindowUpdate, WindowCreate), (void*) wParam, (void*) lParam);
return TRUE;
} }
static BOOL update_message_WindowUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState) static BOOL update_message_WindowUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState)
@ -997,9 +935,8 @@ static BOOL update_message_WindowUpdate(rdpContext* context, WINDOW_ORDER_INFO*
} }
CopyMemory(lParam, windowState, sizeof(WINDOW_STATE_ORDER)); CopyMemory(lParam, windowState, sizeof(WINDOW_STATE_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, WindowUpdate), (void*) wParam, (void*) lParam); MakeMessageId(WindowUpdate, WindowUpdate), (void*) wParam, (void*) lParam);
return TRUE;
} }
static BOOL update_message_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon) static BOOL update_message_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon)
@ -1046,9 +983,8 @@ static BOOL update_message_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* or
CopyMemory(lParam->iconInfo->colorTable, windowIcon->iconInfo->colorTable, windowIcon->iconInfo->cbColorTable); CopyMemory(lParam->iconInfo->colorTable, windowIcon->iconInfo->colorTable, windowIcon->iconInfo->cbColorTable);
} }
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, WindowIcon), (void*) wParam, (void*) lParam); MakeMessageId(WindowUpdate, WindowIcon), (void*) wParam, (void*) lParam);
return TRUE;
out_fail: out_fail:
free(lParam->iconInfo->bitsColor); free(lParam->iconInfo->bitsColor);
@ -1078,9 +1014,8 @@ static BOOL update_message_WindowCachedIcon(rdpContext* context, WINDOW_ORDER_IN
} }
CopyMemory(lParam, windowCachedIcon, sizeof(WINDOW_CACHED_ICON_ORDER)); CopyMemory(lParam, windowCachedIcon, sizeof(WINDOW_CACHED_ICON_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, WindowCachedIcon), (void*) wParam, (void*) lParam); MakeMessageId(WindowUpdate, WindowCachedIcon), (void*) wParam, (void*) lParam);
return TRUE;
} }
static BOOL update_message_WindowDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) static BOOL update_message_WindowDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
@ -1092,9 +1027,8 @@ static BOOL update_message_WindowDelete(rdpContext* context, WINDOW_ORDER_INFO*
return FALSE; return FALSE;
CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, WindowDelete), (void*) wParam, NULL); MakeMessageId(WindowUpdate, WindowDelete), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_NotifyIconCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) static BOOL update_message_NotifyIconCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState)
@ -1115,9 +1049,8 @@ static BOOL update_message_NotifyIconCreate(rdpContext* context, WINDOW_ORDER_IN
} }
CopyMemory(lParam, notifyIconState, sizeof(NOTIFY_ICON_STATE_ORDER)); CopyMemory(lParam, notifyIconState, sizeof(NOTIFY_ICON_STATE_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, NotifyIconCreate), (void*) wParam, (void*) lParam); MakeMessageId(WindowUpdate, NotifyIconCreate), (void*) wParam, (void*) lParam);
return TRUE;
} }
static BOOL update_message_NotifyIconUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) static BOOL update_message_NotifyIconUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState)
@ -1138,9 +1071,8 @@ static BOOL update_message_NotifyIconUpdate(rdpContext* context, WINDOW_ORDER_IN
} }
CopyMemory(lParam, notifyIconState, sizeof(NOTIFY_ICON_STATE_ORDER)); CopyMemory(lParam, notifyIconState, sizeof(NOTIFY_ICON_STATE_ORDER));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, NotifyIconUpdate), (void*) wParam, (void*) lParam); MakeMessageId(WindowUpdate, NotifyIconUpdate), (void*) wParam, (void*) lParam);
return TRUE;
} }
static BOOL update_message_NotifyIconDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) static BOOL update_message_NotifyIconDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
@ -1152,9 +1084,8 @@ static BOOL update_message_NotifyIconDelete(rdpContext* context, WINDOW_ORDER_IN
return FALSE; return FALSE;
CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, NotifyIconDelete), (void*) wParam, NULL); MakeMessageId(WindowUpdate, NotifyIconDelete), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop) static BOOL update_message_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop)
@ -1183,9 +1114,8 @@ static BOOL update_message_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_IN
CopyMemory(lParam->windowIds, monitoredDesktop->windowIds, lParam->numWindowIds); CopyMemory(lParam->windowIds, monitoredDesktop->windowIds, lParam->numWindowIds);
} }
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, MonitoredDesktop), (void*) wParam, (void*) lParam); MakeMessageId(WindowUpdate, MonitoredDesktop), (void*) wParam, (void*) lParam);
return TRUE;
} }
static BOOL update_message_NonMonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) static BOOL update_message_NonMonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
@ -1197,9 +1127,8 @@ static BOOL update_message_NonMonitoredDesktop(rdpContext* context, WINDOW_ORDER
return FALSE; return FALSE;
CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(WindowUpdate, NonMonitoredDesktop), (void*) wParam, NULL); MakeMessageId(WindowUpdate, NonMonitoredDesktop), (void*) wParam, NULL);
return TRUE;
} }
/* Pointer Update */ /* Pointer Update */
@ -1213,9 +1142,8 @@ static BOOL update_message_PointerPosition(rdpContext* context, POINTER_POSITION
return FALSE; return FALSE;
CopyMemory(wParam, pointerPosition, sizeof(POINTER_POSITION_UPDATE)); CopyMemory(wParam, pointerPosition, sizeof(POINTER_POSITION_UPDATE));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PointerUpdate, PointerPosition), (void*) wParam, NULL); MakeMessageId(PointerUpdate, PointerPosition), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_PointerSystem(rdpContext* context, POINTER_SYSTEM_UPDATE* pointerSystem) static BOOL update_message_PointerSystem(rdpContext* context, POINTER_SYSTEM_UPDATE* pointerSystem)
@ -1227,9 +1155,8 @@ static BOOL update_message_PointerSystem(rdpContext* context, POINTER_SYSTEM_UPD
return FALSE; return FALSE;
CopyMemory(wParam, pointerSystem, sizeof(POINTER_SYSTEM_UPDATE)); CopyMemory(wParam, pointerSystem, sizeof(POINTER_SYSTEM_UPDATE));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PointerUpdate, PointerSystem), (void*) wParam, NULL); MakeMessageId(PointerUpdate, PointerSystem), (void*) wParam, NULL);
return TRUE;
} }
static BOOL update_message_PointerColor(rdpContext* context, POINTER_COLOR_UPDATE* pointerColor) static BOOL update_message_PointerColor(rdpContext* context, POINTER_COLOR_UPDATE* pointerColor)
@ -1259,9 +1186,8 @@ static BOOL update_message_PointerColor(rdpContext* context, POINTER_COLOR_UPDAT
CopyMemory(wParam->xorMaskData, pointerColor->xorMaskData, wParam->lengthXorMask); CopyMemory(wParam->xorMaskData, pointerColor->xorMaskData, wParam->lengthXorMask);
} }
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PointerUpdate, PointerColor), (void*) wParam, NULL); MakeMessageId(PointerUpdate, PointerColor), (void*) wParam, NULL);
return TRUE;
out_fail: out_fail:
free(wParam->andMaskData); free(wParam->andMaskData);
@ -1297,9 +1223,8 @@ static BOOL update_message_PointerNew(rdpContext* context, POINTER_NEW_UPDATE* p
CopyMemory(wParam->colorPtrAttr.xorMaskData, pointerNew->colorPtrAttr.xorMaskData, wParam->colorPtrAttr.lengthXorMask); CopyMemory(wParam->colorPtrAttr.xorMaskData, pointerNew->colorPtrAttr.xorMaskData, wParam->colorPtrAttr.lengthXorMask);
} }
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PointerUpdate, PointerNew), (void*) wParam, NULL); MakeMessageId(PointerUpdate, PointerNew), (void*) wParam, NULL);
return TRUE;
out_fail: out_fail:
free(wParam->colorPtrAttr.andMaskData); free(wParam->colorPtrAttr.andMaskData);
@ -1317,9 +1242,8 @@ static BOOL update_message_PointerCached(rdpContext* context, POINTER_CACHED_UPD
return FALSE; return FALSE;
CopyMemory(wParam, pointerCached, sizeof(POINTER_CACHED_UPDATE)); CopyMemory(wParam, pointerCached, sizeof(POINTER_CACHED_UPDATE));
MessageQueue_Post(context->update->queue, (void*) context, return MessageQueue_Post(context->update->queue, (void*) context,
MakeMessageId(PointerUpdate, PointerCached), (void*) wParam, NULL); MakeMessageId(PointerUpdate, PointerCached), (void*) wParam, NULL);
return TRUE;
} }
/* Message Queue */ /* Message Queue */
@ -2563,7 +2487,7 @@ void update_message_proxy_free(rdpUpdateProxy* message)
{ {
if (message) if (message)
{ {
MessageQueue_PostQuit(message->update->queue, 0); if (MessageQueue_PostQuit(message->update->queue, 0))
WaitForSingleObject(message->thread, INFINITE); WaitForSingleObject(message->thread, INFINITE);
CloseHandle(message->thread); CloseHandle(message->thread);
free(message); free(message);
@ -2574,55 +2498,48 @@ void update_message_proxy_free(rdpUpdateProxy* message)
static BOOL input_message_SynchronizeEvent(rdpInput* input, UINT32 flags) static BOOL input_message_SynchronizeEvent(rdpInput* input, UINT32 flags)
{ {
MessageQueue_Post(input->queue, (void*) input, return MessageQueue_Post(input->queue, (void*) input,
MakeMessageId(Input, SynchronizeEvent), (void*) (size_t) flags, NULL); MakeMessageId(Input, SynchronizeEvent), (void*) (size_t) flags, NULL);
return TRUE;
} }
static BOOL input_message_KeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code) static BOOL input_message_KeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code)
{ {
MessageQueue_Post(input->queue, (void*) input, return MessageQueue_Post(input->queue, (void*) input,
MakeMessageId(Input, KeyboardEvent), (void*) (size_t) flags, (void*) (size_t) code); MakeMessageId(Input, KeyboardEvent), (void*) (size_t) flags, (void*) (size_t) code);
return TRUE;
} }
static BOOL input_message_UnicodeKeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code) static BOOL input_message_UnicodeKeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code)
{ {
MessageQueue_Post(input->queue, (void*) input, return MessageQueue_Post(input->queue, (void*) input,
MakeMessageId(Input, UnicodeKeyboardEvent), (void*) (size_t) flags, (void*) (size_t) code); MakeMessageId(Input, UnicodeKeyboardEvent), (void*) (size_t) flags, (void*) (size_t) code);
return TRUE;
} }
static BOOL input_message_MouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) static BOOL input_message_MouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
{ {
UINT32 pos = (x << 16) | y; UINT32 pos = (x << 16) | y;
MessageQueue_Post(input->queue, (void*) input, return MessageQueue_Post(input->queue, (void*) input,
MakeMessageId(Input, MouseEvent), (void*) (size_t) flags, (void*) (size_t) pos); MakeMessageId(Input, MouseEvent), (void*) (size_t) flags, (void*) (size_t) pos);
return TRUE;
} }
static BOOL input_message_ExtendedMouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) static BOOL input_message_ExtendedMouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
{ {
UINT32 pos = (x << 16) | y; UINT32 pos = (x << 16) | y;
MessageQueue_Post(input->queue, (void*) input, return MessageQueue_Post(input->queue, (void*) input,
MakeMessageId(Input, ExtendedMouseEvent), (void*) (size_t) flags, (void*) (size_t) pos); MakeMessageId(Input, ExtendedMouseEvent), (void*) (size_t) flags, (void*) (size_t) pos);
return TRUE;
} }
static BOOL input_message_FocusInEvent(rdpInput* input, UINT16 toggleStates) static BOOL input_message_FocusInEvent(rdpInput* input, UINT16 toggleStates)
{ {
MessageQueue_Post(input->queue, (void*) input, return MessageQueue_Post(input->queue, (void*) input,
MakeMessageId(Input, FocusInEvent), (void*) (size_t) toggleStates, NULL); MakeMessageId(Input, FocusInEvent), (void*) (size_t) toggleStates, NULL);
return TRUE;
} }
static BOOL input_message_KeyboardPauseEvent(rdpInput* input) static BOOL input_message_KeyboardPauseEvent(rdpInput* input)
{ {
MessageQueue_Post(input->queue, (void*) input, return MessageQueue_Post(input->queue, (void*) input,
MakeMessageId(Input, KeyboardPauseEvent), NULL, NULL); MakeMessageId(Input, KeyboardPauseEvent), NULL, NULL);
return TRUE;
} }
/* Event Queue */ /* Event Queue */

View File

@ -211,7 +211,7 @@ int nla_client_init(rdpNla* nla)
nla->ServicePrincipalName = spn; nla->ServicePrincipalName = spn;
#endif #endif
nla->table = InitSecurityInterfaceEx(SSPI_INTERFACE_WINPR); nla->table = InitSecurityInterface();
nla->status = nla->table->QuerySecurityPackageInfo(NLA_PKG_NAME, &nla->pPackageInfo); nla->status = nla->table->QuerySecurityPackageInfo(NLA_PKG_NAME, &nla->pPackageInfo);
if (nla->status != SEC_E_OK) if (nla->status != SEC_E_OK)
@ -498,7 +498,7 @@ int nla_server_init(rdpNla* nla)
} }
else else
{ {
nla->table = InitSecurityInterfaceEx(0); nla->table = InitSecurityInterface();
} }
nla->status = nla->table->QuerySecurityPackageInfo(NLA_PKG_NAME, &nla->pPackageInfo); nla->status = nla->table->QuerySecurityPackageInfo(NLA_PKG_NAME, &nla->pPackageInfo);

View File

@ -222,7 +222,7 @@ static BOOL freerdp_peer_initialize(freerdp_peer* client)
if (!settings->RdpServerRsaKey) if (!settings->RdpServerRsaKey)
{ {
WLog_ERR(TAG, "inavlid RDP key file %s", settings->RdpKeyFile); WLog_ERR(TAG, "invalid RDP key file %s", settings->RdpKeyFile);
return FALSE; return FALSE;
} }
} }

View File

@ -85,22 +85,24 @@ static rdpPeerChannel* wts_get_dvc_channel_by_id(WTSVirtualChannelManager* vcm,
return found ? channel : NULL; return found ? channel : NULL;
} }
static void wts_queue_receive_data(rdpPeerChannel* channel, const BYTE* Buffer, UINT32 Length) static BOOL wts_queue_receive_data(rdpPeerChannel* channel, const BYTE* Buffer, UINT32 Length)
{ {
BYTE* buffer; BYTE* buffer;
wtsChannelMessage* messageCtx; wtsChannelMessage* messageCtx;
messageCtx = (wtsChannelMessage*) malloc(sizeof(wtsChannelMessage) + Length); messageCtx = (wtsChannelMessage*) malloc(sizeof(wtsChannelMessage) + Length);
if (!messageCtx)
return FALSE;
messageCtx->channelId = channel->channelId; messageCtx->channelId = channel->channelId;
messageCtx->length = Length; messageCtx->length = Length;
messageCtx->offset = 0; messageCtx->offset = 0;
buffer = (BYTE*) (messageCtx + 1); buffer = (BYTE*) (messageCtx + 1);
CopyMemory(buffer, Buffer, Length); CopyMemory(buffer, Buffer, Length);
MessageQueue_Post(channel->queue, messageCtx, 0, NULL, NULL); return MessageQueue_Post(channel->queue, messageCtx, 0, NULL, NULL);
} }
static void wts_queue_send_item(rdpPeerChannel* channel, BYTE* Buffer, UINT32 Length) static BOOL wts_queue_send_item(rdpPeerChannel* channel, BYTE* Buffer, UINT32 Length)
{ {
BYTE* buffer; BYTE* buffer;
UINT32 length; UINT32 length;
@ -110,7 +112,7 @@ static void wts_queue_send_item(rdpPeerChannel* channel, BYTE* Buffer, UINT32 Le
length = Length; length = Length;
channelId = channel->channelId; channelId = channel->channelId;
MessageQueue_Post(channel->vcm->queue, (void*) (UINT_PTR) channelId, 0, (void*) buffer, (void*) (UINT_PTR) length); return MessageQueue_Post(channel->vcm->queue, (void*) (UINT_PTR) channelId, 0, (void*) buffer, (void*) (UINT_PTR) length);
} }
static int wts_read_variable_uint(wStream* s, int cbLen, UINT32* val) static int wts_read_variable_uint(wStream* s, int cbLen, UINT32* val)
@ -137,12 +139,12 @@ static int wts_read_variable_uint(wStream* s, int cbLen, UINT32* val)
} }
} }
static void wts_read_drdynvc_capabilities_response(rdpPeerChannel* channel, UINT32 length) static BOOL wts_read_drdynvc_capabilities_response(rdpPeerChannel* channel, UINT32 length)
{ {
UINT16 Version; UINT16 Version;
if (length < 3) if (length < 3)
return; return FALSE;
Stream_Seek_UINT8(channel->receiveData); /* Pad (1 byte) */ Stream_Seek_UINT8(channel->receiveData); /* Pad (1 byte) */
Stream_Read_UINT16(channel->receiveData, Version); Stream_Read_UINT16(channel->receiveData, Version);
@ -150,14 +152,15 @@ static void wts_read_drdynvc_capabilities_response(rdpPeerChannel* channel, UINT
DEBUG_DVC("Version: %d", Version); DEBUG_DVC("Version: %d", Version);
channel->vcm->drdynvc_state = DRDYNVC_STATE_READY; channel->vcm->drdynvc_state = DRDYNVC_STATE_READY;
return TRUE;
} }
static void wts_read_drdynvc_create_response(rdpPeerChannel* channel, wStream* s, UINT32 length) static BOOL wts_read_drdynvc_create_response(rdpPeerChannel* channel, wStream* s, UINT32 length)
{ {
UINT32 CreationStatus; UINT32 CreationStatus;
if (length < 4) if (length < 4)
return; return FALSE;
Stream_Read_UINT32(s, CreationStatus); Stream_Read_UINT32(s, CreationStatus);
@ -171,50 +174,55 @@ static void wts_read_drdynvc_create_response(rdpPeerChannel* channel, wStream* s
DEBUG_DVC("ChannelId %d creation succeeded", channel->channelId); DEBUG_DVC("ChannelId %d creation succeeded", channel->channelId);
channel->dvc_open_state = DVC_OPEN_STATE_SUCCEEDED; channel->dvc_open_state = DVC_OPEN_STATE_SUCCEEDED;
} }
return TRUE;
} }
static void wts_read_drdynvc_data_first(rdpPeerChannel* channel, wStream* s, int cbLen, UINT32 length) static BOOL wts_read_drdynvc_data_first(rdpPeerChannel* channel, wStream* s, int cbLen, UINT32 length)
{ {
int value; int value;
value = wts_read_variable_uint(s, cbLen, &channel->dvc_total_length); value = wts_read_variable_uint(s, cbLen, &channel->dvc_total_length);
if (value == 0) if (value == 0)
return; return FALSE;
length -= value; length -= value;
if (length > channel->dvc_total_length) if (length > channel->dvc_total_length)
return; return FALSE;
Stream_SetPosition(channel->receiveData, 0); Stream_SetPosition(channel->receiveData, 0);
Stream_EnsureRemainingCapacity(channel->receiveData, (int) channel->dvc_total_length); if (!Stream_EnsureRemainingCapacity(channel->receiveData, (int) channel->dvc_total_length))
return FALSE;
Stream_Write(channel->receiveData, Stream_Pointer(s), length); Stream_Write(channel->receiveData, Stream_Pointer(s), length);
return TRUE;
} }
static void wts_read_drdynvc_data(rdpPeerChannel* channel, wStream* s, UINT32 length) static BOOL wts_read_drdynvc_data(rdpPeerChannel* channel, wStream* s, UINT32 length)
{ {
BOOL ret;
if (channel->dvc_total_length > 0) if (channel->dvc_total_length > 0)
{ {
if (Stream_GetPosition(channel->receiveData) + length > channel->dvc_total_length) if (Stream_GetPosition(channel->receiveData) + length > channel->dvc_total_length)
{ {
channel->dvc_total_length = 0; channel->dvc_total_length = 0;
WLog_ERR(TAG, "incorrect fragment data, discarded."); WLog_ERR(TAG, "incorrect fragment data, discarded.");
return; return FALSE;
} }
Stream_Write(channel->receiveData, Stream_Pointer(s), length); Stream_Write(channel->receiveData, Stream_Pointer(s), length);
if (Stream_GetPosition(channel->receiveData) >= (int) channel->dvc_total_length) if (Stream_GetPosition(channel->receiveData) >= (int) channel->dvc_total_length)
{ {
wts_queue_receive_data(channel, Stream_Buffer(channel->receiveData), channel->dvc_total_length); ret = wts_queue_receive_data(channel, Stream_Buffer(channel->receiveData), channel->dvc_total_length);
channel->dvc_total_length = 0; channel->dvc_total_length = 0;
} }
} }
else else
{ {
wts_queue_receive_data(channel, Stream_Pointer(s), length); ret = wts_queue_receive_data(channel, Stream_Pointer(s), length);
} }
return ret;
} }
static void wts_read_drdynvc_close_response(rdpPeerChannel* channel) static void wts_read_drdynvc_close_response(rdpPeerChannel* channel)
@ -223,7 +231,7 @@ static void wts_read_drdynvc_close_response(rdpPeerChannel* channel)
channel->dvc_open_state = DVC_OPEN_STATE_CLOSED; channel->dvc_open_state = DVC_OPEN_STATE_CLOSED;
} }
static void wts_read_drdynvc_pdu(rdpPeerChannel* channel) static BOOL wts_read_drdynvc_pdu(rdpPeerChannel* channel)
{ {
UINT32 length; UINT32 length;
int value; int value;
@ -236,7 +244,7 @@ static void wts_read_drdynvc_pdu(rdpPeerChannel* channel)
length = Stream_GetPosition(channel->receiveData); length = Stream_GetPosition(channel->receiveData);
if (length < 1) if (length < 1)
return; return FALSE;
Stream_SetPosition(channel->receiveData, 0); Stream_SetPosition(channel->receiveData, 0);
Stream_Read_UINT8(channel->receiveData, value); Stream_Read_UINT8(channel->receiveData, value);
@ -248,14 +256,14 @@ static void wts_read_drdynvc_pdu(rdpPeerChannel* channel)
if (Cmd == CAPABILITY_REQUEST_PDU) if (Cmd == CAPABILITY_REQUEST_PDU)
{ {
wts_read_drdynvc_capabilities_response(channel, length); return wts_read_drdynvc_capabilities_response(channel, length);
} }
else if (channel->vcm->drdynvc_state == DRDYNVC_STATE_READY) else if (channel->vcm->drdynvc_state == DRDYNVC_STATE_READY)
{ {
value = wts_read_variable_uint(channel->receiveData, cbChId, &ChannelId); value = wts_read_variable_uint(channel->receiveData, cbChId, &ChannelId);
if (value == 0) if (value == 0)
return; return FALSE;
length -= value; length -= value;
@ -267,16 +275,13 @@ static void wts_read_drdynvc_pdu(rdpPeerChannel* channel)
switch (Cmd) switch (Cmd)
{ {
case CREATE_REQUEST_PDU: case CREATE_REQUEST_PDU:
wts_read_drdynvc_create_response(dvc, channel->receiveData, length); return wts_read_drdynvc_create_response(dvc, channel->receiveData, length);
break;
case DATA_FIRST_PDU: case DATA_FIRST_PDU:
wts_read_drdynvc_data_first(dvc, channel->receiveData, Sp, length); return wts_read_drdynvc_data_first(dvc, channel->receiveData, Sp, length);
break;
case DATA_PDU: case DATA_PDU:
wts_read_drdynvc_data(dvc, channel->receiveData, length); return wts_read_drdynvc_data(dvc, channel->receiveData, length);
break;
case CLOSE_REQUEST_PDU: case CLOSE_REQUEST_PDU:
wts_read_drdynvc_close_response(dvc); wts_read_drdynvc_close_response(dvc);
@ -296,6 +301,7 @@ static void wts_read_drdynvc_pdu(rdpPeerChannel* channel)
{ {
WLog_ERR(TAG, "received Cmd %d but channel is not ready.", Cmd); WLog_ERR(TAG, "received Cmd %d but channel is not ready.", Cmd);
} }
return TRUE;
} }
static int wts_write_variable_uint(wStream* s, UINT32 val) static int wts_write_variable_uint(wStream* s, UINT32 val)
@ -344,14 +350,17 @@ static BOOL wts_write_drdynvc_create_request(wStream *s, UINT32 ChannelId, const
return TRUE; return TRUE;
} }
static void WTSProcessChannelData(rdpPeerChannel* channel, UINT16 channelId, BYTE* data, int size, int flags, int totalSize) static BOOL WTSProcessChannelData(rdpPeerChannel* channel, UINT16 channelId, BYTE* data, int size, int flags, int totalSize)
{ {
BOOL ret = TRUE;
if (flags & CHANNEL_FLAG_FIRST) if (flags & CHANNEL_FLAG_FIRST)
{ {
Stream_SetPosition(channel->receiveData, 0); Stream_SetPosition(channel->receiveData, 0);
} }
Stream_EnsureRemainingCapacity(channel->receiveData, size); if (!Stream_EnsureRemainingCapacity(channel->receiveData, size))
return FALSE;
Stream_Write(channel->receiveData, data, size); Stream_Write(channel->receiveData, data, size);
if (flags & CHANNEL_FLAG_LAST) if (flags & CHANNEL_FLAG_LAST)
@ -362,14 +371,16 @@ static void WTSProcessChannelData(rdpPeerChannel* channel, UINT16 channelId, BYT
} }
if (channel == channel->vcm->drdynvc_channel) if (channel == channel->vcm->drdynvc_channel)
{ {
wts_read_drdynvc_pdu(channel); ret = wts_read_drdynvc_pdu(channel);
} }
else else
{ {
wts_queue_receive_data(channel, Stream_Buffer(channel->receiveData), Stream_GetPosition(channel->receiveData)); ret = wts_queue_receive_data(channel, Stream_Buffer(channel->receiveData), Stream_GetPosition(channel->receiveData));
} }
Stream_SetPosition(channel->receiveData, 0); Stream_SetPosition(channel->receiveData, 0);
} }
return ret;
} }
static int WTSReceiveChannelData(freerdp_peer* client, UINT16 channelId, BYTE* data, int size, int flags, int totalSize) static int WTSReceiveChannelData(freerdp_peer* client, UINT16 channelId, BYTE* data, int size, int flags, int totalSize)
@ -1191,6 +1202,7 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer,
UINT32 length; UINT32 length;
UINT32 written; UINT32 written;
rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle; rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle;
BOOL ret = TRUE;
if (!channel) if (!channel)
return FALSE; return FALSE;
@ -1199,9 +1211,11 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer,
{ {
length = Length; length = Length;
buffer = (BYTE *)malloc(length); buffer = (BYTE *)malloc(length);
if (!buffer)
return FALSE;
CopyMemory(buffer, Buffer, length); CopyMemory(buffer, Buffer, length);
wts_queue_send_item(channel, buffer, length); ret = wts_queue_send_item(channel, buffer, length);
} }
else if (!channel->vcm->drdynvc_channel || (channel->vcm->drdynvc_state != DRDYNVC_STATE_READY)) else if (!channel->vcm->drdynvc_channel || (channel->vcm->drdynvc_state != DRDYNVC_STATE_READY))
{ {
@ -1220,6 +1234,7 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer,
WLog_ERR(TAG, "Stream_New failed!"); WLog_ERR(TAG, "Stream_New failed!");
return FALSE; return FALSE;
} }
buffer = Stream_Buffer(s); buffer = Stream_Buffer(s);
Stream_Seek_UINT8(s); Stream_Seek_UINT8(s);
@ -1248,14 +1263,14 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer,
Length -= written; Length -= written;
Buffer += written; Buffer += written;
wts_queue_send_item(channel->vcm->drdynvc_channel, buffer, length); ret = wts_queue_send_item(channel->vcm->drdynvc_channel, buffer, length);
} }
} }
if (pBytesWritten) if (pBytesWritten)
*pBytesWritten = Length; *pBytesWritten = Length;
return TRUE; return ret;
} }
BOOL WINAPI FreeRDP_WTSVirtualChannelPurgeInput(HANDLE hChannelHandle) BOOL WINAPI FreeRDP_WTSVirtualChannelPurgeInput(HANDLE hChannelHandle)

View File

@ -28,6 +28,8 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#include <ctype.h>
#include <winpr/crt.h> #include <winpr/crt.h>
#include <winpr/file.h> #include <winpr/file.h>
#include <winpr/path.h> #include <winpr/path.h>
@ -202,6 +204,7 @@ void settings_get_computer_name(rdpSettings* settings)
rdpSettings* freerdp_settings_new(DWORD flags) rdpSettings* freerdp_settings_new(DWORD flags)
{ {
char* base;
rdpSettings* settings; rdpSettings* settings;
settings = (rdpSettings*) calloc(1, sizeof(rdpSettings)); settings = (rdpSettings*) calloc(1, sizeof(rdpSettings));
@ -471,7 +474,34 @@ rdpSettings* freerdp_settings_new(DWORD flags)
settings->HomePath = GetKnownPath(KNOWN_PATH_HOME); settings->HomePath = GetKnownPath(KNOWN_PATH_HOME);
if (!settings->HomePath) if (!settings->HomePath)
goto out_fail; goto out_fail;
settings->ConfigPath = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, "freerdp");
/* For default FreeRDP continue using same config directory
* as in old releases.
* Custom builds use <Vendor>/<Product> as config folder. */
if (_stricmp(FREERDP_VENDOR_STRING, FREERDP_PRODUCT_STRING))
{
base = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME,
FREERDP_VENDOR_STRING);
if (base)
{
settings->ConfigPath = GetCombinedPath(
base,
FREERDP_PRODUCT_STRING);
}
free (base);
} else {
int i;
char product[sizeof(FREERDP_PRODUCT_STRING)];
memset(product, 0, sizeof(product));
for (i=0; i<sizeof(product); i++)
product[i] = tolower(FREERDP_PRODUCT_STRING[i]);
settings->ConfigPath = GetKnownSubPath(
KNOWN_PATH_XDG_CONFIG_HOME,
product);
}
if (!settings->ConfigPath) if (!settings->ConfigPath)
goto out_fail; goto out_fail;

View File

@ -26,6 +26,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <winpr/crypto.h>
#include <winpr/crt.h> #include <winpr/crt.h>
#include <winpr/file.h> #include <winpr/file.h>
#include <winpr/path.h> #include <winpr/path.h>
@ -35,13 +36,18 @@
static const char certificate_store_dir[] = "certs"; static const char certificate_store_dir[] = "certs";
static const char certificate_server_dir[] = "server"; static const char certificate_server_dir[] = "server";
static const char certificate_known_hosts_file[] = "known_hosts"; static const char certificate_known_hosts_file[] = "known_hosts2";
static const char certificate_legacy_hosts_file[] = "known_hosts";
#include <freerdp/log.h> #include <freerdp/log.h>
#include <freerdp/crypto/certificate.h> #include <freerdp/crypto/certificate.h>
#define TAG FREERDP_TAG("crypto") #define TAG FREERDP_TAG("crypto")
static BOOL certificate_split_line(char* line, char** host, UINT16* port,
char**subject, char**issuer,
char** fingerprint);
BOOL certificate_store_init(rdpCertificateStore* certificate_store) BOOL certificate_store_init(rdpCertificateStore* certificate_store)
{ {
char* server_path = NULL; char* server_path = NULL;
@ -51,7 +57,7 @@ BOOL certificate_store_init(rdpCertificateStore* certificate_store)
if (!PathFileExistsA(settings->ConfigPath)) if (!PathFileExistsA(settings->ConfigPath))
{ {
if (!CreateDirectoryA(settings->ConfigPath, 0)) if (!PathMakePathA(settings->ConfigPath, 0))
{ {
WLog_ERR(TAG, "error creating directory '%s'", settings->ConfigPath); WLog_ERR(TAG, "error creating directory '%s'", settings->ConfigPath);
goto fail; goto fail;
@ -64,7 +70,7 @@ BOOL certificate_store_init(rdpCertificateStore* certificate_store)
if (!PathFileExistsA(certificate_store->path)) if (!PathFileExistsA(certificate_store->path))
{ {
if (!CreateDirectoryA(certificate_store->path, 0)) if (!PathMakePathA(certificate_store->path, 0))
{ {
WLog_ERR(TAG, "error creating directory [%s]", certificate_store->path); WLog_ERR(TAG, "error creating directory [%s]", certificate_store->path);
goto fail; goto fail;
@ -77,7 +83,7 @@ BOOL certificate_store_init(rdpCertificateStore* certificate_store)
if (!PathFileExistsA(server_path)) if (!PathFileExistsA(server_path))
{ {
if (!CreateDirectoryA(server_path, 0)) if (!PathMakePathA(server_path, 0))
{ {
WLog_ERR(TAG, "error creating directory [%s]", server_path); WLog_ERR(TAG, "error creating directory [%s]", server_path);
goto fail; goto fail;
@ -88,16 +94,9 @@ BOOL certificate_store_init(rdpCertificateStore* certificate_store)
if (!(certificate_store->file = GetCombinedPath(settings->ConfigPath, (char*) certificate_known_hosts_file))) if (!(certificate_store->file = GetCombinedPath(settings->ConfigPath, (char*) certificate_known_hosts_file)))
goto fail; goto fail;
if (!PathFileExistsA(certificate_store->file)) if (!(certificate_store->legacy_file = GetCombinedPath(settings->ConfigPath,
certificate_store->fp = fopen((char*) certificate_store->file, "w+"); (char*) certificate_legacy_hosts_file)))
else
certificate_store->fp = fopen((char*) certificate_store->file, "r+");
if (!certificate_store->fp)
{
WLog_ERR(TAG, "error opening [%s]", certificate_store->file);
goto fail; goto fail;
}
free(server_path); free(server_path);
@ -113,16 +112,111 @@ fail:
return FALSE; return FALSE;
} }
int certificate_data_match(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data) static int certificate_data_match_legacy(rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data)
{ {
FILE* fp;
int match = 1;
char* data;
char* mdata;
char* pline;
char* hostname;
long size;
size_t length;
fp = fopen(certificate_store->legacy_file, "rb");
if (!fp)
return match;
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
if (size < 1)
{
fclose(fp);
return match;
}
mdata = (char*) malloc(size + 2);
if (!mdata)
{
fclose(fp);
return match;
}
data = mdata;
if (fread(data, size, 1, fp) != 1)
{
free(data);
fclose(fp);
return match;
}
fclose(fp);
data[size] = '\n';
data[size + 1] = '\0';
pline = StrSep(&data, "\r\n");
while (pline != NULL)
{
length = strlen(pline);
if (length > 0)
{
hostname = StrSep(&pline, " \t");
if (!hostname || !pline)
WLog_WARN(TAG, "Invalid %s entry %s %s!", certificate_legacy_hosts_file,
hostname, pline);
else if (strcmp(hostname, certificate_data->hostname) == 0)
{
match = strcmp(pline, certificate_data->fingerprint);
break;
}
}
pline = StrSep(&data, "\r\n");
}
free(mdata);
/* Found a valid fingerprint in legacy file,
* copy to new file in new format. */
if (0 == match)
{
rdpCertificateData* data = certificate_data_new(hostname,
certificate_data->port,
NULL, NULL,
pline);
if (data)
match = certificate_data_print(certificate_store, data) ? 0 : 1;
certificate_data_free(data);
}
return match;
}
static int certificate_data_match_raw(rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data,
char** psubject, char** pissuer,
char** fprint)
{
BOOL found = FALSE;
FILE* fp; FILE* fp;
int length; int length;
char* data; char* data;
char* mdata;
char* pline; char* pline;
int match = 1; int match = 1;
long int size; long int size;
char* hostname = NULL;
char* subject = NULL;
char* issuer = NULL;
char* fingerprint = NULL;
unsigned short port = 0;
fp = certificate_store->fp; fp = fopen(certificate_store->file, "rb");
if (!fp) if (!fp)
return match; return match;
@ -132,19 +226,30 @@ int certificate_data_match(rdpCertificateStore* certificate_store, rdpCertificat
fseek(fp, 0, SEEK_SET); fseek(fp, 0, SEEK_SET);
if (size < 1) if (size < 1)
return match;
data = (char*) malloc(size + 2);
if (fread(data, size, 1, fp) != 1)
{ {
free(data); fclose(fp);
return match; return match;
} }
mdata = (char*) malloc(size + 2);
if (!mdata)
{
fclose(fp);
return match;
}
data = mdata;
if (fread(data, size, 1, fp) != 1)
{
fclose(fp);
free(data);
return match;
}
fclose(fp);
data[size] = '\n'; data[size] = '\n';
data[size + 1] = '\0'; data[size + 1] = '\0';
pline = strtok(data, "\n"); pline = StrSep(&data, "\r\n");
while (pline != NULL) while (pline != NULL)
{ {
@ -152,40 +257,74 @@ int certificate_data_match(rdpCertificateStore* certificate_store, rdpCertificat
if (length > 0) if (length > 0)
{ {
length = strcspn(pline, " \t"); if (!certificate_split_line(pline, &hostname, &port,
pline[length] = '\0'; &subject, &issuer, &fingerprint))
WLog_WARN(TAG, "Invalid %s entry %s!",
if (strcmp(pline, certificate_data->hostname) == 0) certificate_known_hosts_file, pline);
else if (strcmp(pline, certificate_data->hostname) == 0)
{ {
pline = &pline[length + 1]; int outLen;
if (strcmp(pline, certificate_data->fingerprint) == 0) if (port == certificate_data->port)
match = 0; {
else found = TRUE;
match = -1; match = strcmp(certificate_data->fingerprint, fingerprint);
if (fingerprint && fprint)
*fprint = _strdup(fingerprint);
if (subject && psubject)
crypto_base64_decode(subject, strlen(subject), (BYTE**)psubject, &outLen);
if (issuer && pissuer)
crypto_base64_decode(issuer, strlen(issuer), (BYTE**)pissuer, &outLen);
break; break;
} }
} }
pline = strtok(NULL, "\n");
} }
free(data);
pline = StrSep(&data, "\r\n");
}
free(mdata);
if ((match != 0) && !found)
match = certificate_data_match_legacy(certificate_store, certificate_data);
return match; return match;
} }
void certificate_data_replace(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data) BOOL certificate_get_stored_data(rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data,
char** subject, char** issuer,
char** fingerprint)
{
int rc = certificate_data_match_raw(certificate_store, certificate_data,
subject, issuer, fingerprint);
if ((rc == 0) || (rc == -1))
return TRUE;
return FALSE;
}
int certificate_data_match(rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data)
{
return certificate_data_match_raw(certificate_store, certificate_data,
NULL, NULL, NULL);
}
BOOL certificate_data_replace(rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data)
{ {
FILE* fp; FILE* fp;
BOOL rc = FALSE;
int length; int length;
char* data; char* data;
char* sdata;
char* pline; char* pline;
long int size; long int size;
fp = certificate_store->fp; fp = fopen(certificate_store->file, "rb");
if (!fp) if (!fp)
return; return FALSE;
/* Read the current contents of the file. */ /* Read the current contents of the file. */
fseek(fp, 0, SEEK_END); fseek(fp, 0, SEEK_END);
@ -193,21 +332,40 @@ void certificate_data_replace(rdpCertificateStore* certificate_store, rdpCertifi
fseek(fp, 0, SEEK_SET); fseek(fp, 0, SEEK_SET);
if (size < 1) if (size < 1)
return; {
fclose(fp);
return FALSE;
}
data = (char*) malloc(size + 2); data = (char*) malloc(size + 2);
if (!data)
{
fclose(fp);
return FALSE;
}
if (fread(data, size, 1, fp) != 1) if (fread(data, size, 1, fp) != 1)
{ {
fclose(fp);
free(data); free(data);
return; return FALSE;
}
fclose(fp);
fp = fopen(certificate_store->file, "wb");
if (!fp)
{
free(data);
return FALSE;
} }
/* Write the file back out, with appropriate fingerprint substitutions */ /* Write the file back out, with appropriate fingerprint substitutions */
fp = fopen(certificate_store->file, "w+");
data[size] = '\n'; data[size] = '\n';
data[size + 1] = '\0'; data[size + 1] = '\0';
pline = strtok(data, "\n"); // xxx: use strsep sdata = data;
pline = StrSep(&sdata, "\r\n");
while (pline != NULL) while (pline != NULL)
{ {
@ -215,60 +373,135 @@ void certificate_data_replace(rdpCertificateStore* certificate_store, rdpCertifi
if (length > 0) if (length > 0)
{ {
char* hostname = pline, *fingerprint; UINT16 port = 0;
char* hostname = NULL;
char* fingerprint = NULL;
char* subject = NULL;
char* issuer = NULL;
length = strcspn(pline, " \t"); if (!certificate_split_line(pline, &hostname, &port, &subject, &issuer, &fingerprint))
hostname[length] = '\0'; WLog_WARN(TAG, "Skipping invalid %s entry %s!",
certificate_known_hosts_file, pline);
/* If this is the replaced hostname, use the updated fingerprint. */
if (strcmp(hostname, certificate_data->hostname) == 0)
fingerprint = certificate_data->fingerprint;
else else
fingerprint = &hostname[length + 1]; {
/* If this is the replaced hostname, use the updated fingerprint. */
fprintf(fp, "%s %s\n", hostname, fingerprint); if ((strcmp(hostname, certificate_data->hostname) == 0) &&
(port == certificate_data->port))
{
fingerprint = certificate_data->fingerprint;
rc = TRUE;
}
fprintf(fp, "%s %hu %s %s %s\n", hostname, port, fingerprint, subject, issuer);
}
} }
pline = strtok(NULL, "\n"); pline = StrSep(&sdata, "\r\n");
} }
fclose(fp); fclose(fp);
free(data); free(data);
return rc;
} }
void certificate_data_print(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data) BOOL certificate_split_line(char* line, char** host, UINT16* port, char** subject,
char** issuer, char** fingerprint)
{
char* cur;
size_t length = strlen(line);
if (length <= 0)
return FALSE;
cur = StrSep(&line, " \t");
if (!cur)
return FALSE;
*host = cur;
cur = StrSep(&line, " \t");
if (!cur)
return FALSE;
if(sscanf(cur, "%hu", port) != 1)
return FALSE;
cur = StrSep(&line, " \t");
if (!cur)
return FALSE;
*fingerprint = cur;
cur = StrSep(&line, " \t");
if (!cur)
return FALSE;
*subject = cur;
cur = StrSep(&line, " \t");
if (!cur)
return FALSE;
*issuer = cur;
return TRUE;
}
BOOL certificate_data_print(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data)
{ {
FILE* fp; FILE* fp;
/* reopen in append mode */ /* reopen in append mode */
fp = fopen(certificate_store->file, "a"); fp = fopen(certificate_store->file, "ab");
if (!fp) if (!fp)
return; return FALSE;
fprintf(fp, "%s %hu %s %s %s\n", certificate_data->hostname, certificate_data->port,
certificate_data->fingerprint, certificate_data->subject,
certificate_data->issuer);
fprintf(fp, "%s %s\n", certificate_data->hostname, certificate_data->fingerprint);
fclose(fp); fclose(fp);
return TRUE;
} }
rdpCertificateData* certificate_data_new(char* hostname, char* fingerprint) rdpCertificateData* certificate_data_new(char* hostname, UINT16 port, char* subject, char* issuer, char* fingerprint)
{ {
rdpCertificateData* certdata; rdpCertificateData* certdata;
if (!hostname)
return NULL;
if (!fingerprint)
return NULL;
certdata = (rdpCertificateData *)calloc(1, sizeof(rdpCertificateData)); certdata = (rdpCertificateData *)calloc(1, sizeof(rdpCertificateData));
if (!certdata) if (!certdata)
return NULL; return NULL;
certdata->port = port;
certdata->hostname = _strdup(hostname); certdata->hostname = _strdup(hostname);
if (!certdata->hostname) if (subject)
goto out_free; certdata->subject = crypto_base64_encode((BYTE*)subject, strlen(subject));
else
certdata->subject = crypto_base64_encode((BYTE*)"", 0);
if (issuer)
certdata->issuer = crypto_base64_encode((BYTE*)issuer, strlen(subject));
else
certdata->issuer = crypto_base64_encode((BYTE*)"", 0);
certdata->fingerprint = _strdup(fingerprint); certdata->fingerprint = _strdup(fingerprint);
if (!certdata->fingerprint)
goto out_free_hostname; if (!certdata->hostname || !certdata->subject ||
!certdata->issuer || !certdata->fingerprint)
goto fail;
return certdata; return certdata;
out_free_hostname: fail:
free(certdata->hostname); free(certdata->hostname);
out_free: free(certdata->subject);
free(certdata->issuer);
free(certdata->fingerprint);
free(certdata); free(certdata);
return NULL; return NULL;
} }
@ -278,6 +511,8 @@ void certificate_data_free(rdpCertificateData* certificate_data)
if (certificate_data != NULL) if (certificate_data != NULL)
{ {
free(certificate_data->hostname); free(certificate_data->hostname);
free(certificate_data->subject);
free(certificate_data->issuer);
free(certificate_data->fingerprint); free(certificate_data->fingerprint);
free(certificate_data); free(certificate_data);
} }
@ -307,9 +542,6 @@ void certificate_store_free(rdpCertificateStore* certstore)
{ {
if (certstore != NULL) if (certstore != NULL)
{ {
if (certstore->fp != NULL)
fclose(certstore->fp);
free(certstore->path); free(certstore->path);
free(certstore->file); free(certstore->file);
free(certstore); free(certstore);

View File

@ -555,8 +555,10 @@ end:
return status; return status;
} }
rdpCertificateData* crypto_get_certificate_data(X509* xcert, char* hostname) rdpCertificateData* crypto_get_certificate_data(X509* xcert, char* hostname, UINT16 port)
{ {
char* issuer;
char* subject;
char* fp; char* fp;
rdpCertificateData* certdata; rdpCertificateData* certdata;
@ -564,7 +566,13 @@ rdpCertificateData* crypto_get_certificate_data(X509* xcert, char* hostname)
if (!fp) if (!fp)
return NULL; return NULL;
certdata = certificate_data_new(hostname, fp); issuer = crypto_cert_issuer(xcert);
subject = crypto_cert_subject(xcert);
certdata = certificate_data_new(hostname, port, issuer, subject, fp);
free(subject);
free(issuer);
free(fp); free(fp);
return certdata; return certdata;

View File

@ -5,6 +5,7 @@ set(MODULE_PREFIX "TEST_FREERDP_CRYPTO")
set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c) set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c)
set(${MODULE_PREFIX}_TESTS set(${MODULE_PREFIX}_TESTS
TestKnownHosts.c
TestBase64.c) TestBase64.c)
create_test_sourcelist(${MODULE_PREFIX}_SRCS create_test_sourcelist(${MODULE_PREFIX}_SRCS

View File

@ -0,0 +1,322 @@
/**
* FreeRDP: A Remote Desktop Protocol Implementation
*
* Copyright 2015 Thincast Technologies GmbH
* Copyright 2015 Armin Novak <armin.novak@thincast.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <winpr/path.h>
#include <winpr/file.h>
#include <freerdp/crypto/certificate.h>
static int prepare(const char* currentFileV2, const char* legacyFileV2, const char* legacyFile)
{
char* legacy[] = {
"someurl ff:11:22:dd\r\n",
"otherurl aa:bb:cc:dd\r",
"legacyurl aa:bb:cc:dd\n"
};
char* hosts[] = {
"someurl 3389 ff:11:22:dd subject issuer\r\n",
"otherurl\t3389\taa:bb:cc:dd\tsubject2\tissuer2\r",
};
FILE* fl = NULL;
FILE* fc = NULL;
size_t i;
fc = fopen(currentFileV2, "w+");
if (!fc)
goto finish;
fl = fopen(legacyFileV2, "w+");
if (!fl)
goto finish;
for (i=0; i<sizeof(hosts)/sizeof(hosts[0]); i++)
{
fwrite(hosts[i], strlen(hosts[i]), sizeof(char), fl);
fwrite(hosts[i], strlen(hosts[i]), sizeof(char), fc);
}
fclose(fc);
fc = NULL;
fclose(fl);
fl = NULL;
fl = fopen(legacyFile, "w+");
if (!fl)
goto finish;
for (i=0; i<sizeof(legacy)/sizeof(legacy[0]); i++)
fwrite(legacy[i], strlen(legacy[i]), sizeof(char), fl);
fclose(fl);
return 0;
finish:
fclose(fl);
fclose(fc);
return -1;
}
int TestKnownHosts(int argc, char* argv[])
{
int rc = -1;
rdpSettings current;
rdpSettings legacy;
rdpCertificateData* data = NULL;
rdpCertificateStore* store = NULL;
char* currentFileV2 = NULL;
char* legacyFileV2 = NULL;
char* legacyFile = NULL;
char* subject = NULL;
char* issuer = NULL;
char* fp = NULL;
current.ConfigPath = GetKnownSubPath(KNOWN_PATH_TEMP, "TestKnownHostsCurrent");
legacy.ConfigPath = GetKnownSubPath(KNOWN_PATH_TEMP, "TestKnownHostsLegacy");
if (!PathFileExistsA(current.ConfigPath))
{
if (!CreateDirectoryA(current.ConfigPath, NULL))
{
fprintf(stderr, "Could not create %s!\n", current.ConfigPath);
goto finish;
}
}
if (!PathFileExistsA(legacy.ConfigPath))
{
if (!CreateDirectoryA(legacy.ConfigPath, NULL))
{
fprintf(stderr, "Could not create %s!\n", legacy.ConfigPath);
goto finish;
}
}
currentFileV2 = GetCombinedPath(current.ConfigPath, "known_hosts2");
if (!currentFileV2)
{
fprintf(stderr, "Could not get file path!\n");
goto finish;
}
legacyFileV2 = GetCombinedPath(legacy.ConfigPath, "known_hosts2");
if (!legacyFileV2)
{
fprintf(stderr, "Could not get file path!\n");
goto finish;
}
legacyFile = GetCombinedPath(legacy.ConfigPath, "known_hosts");
if (!legacyFile)
{
fprintf(stderr, "Could not get file path!\n");
goto finish;
}
store = certificate_store_new(&current);
if (!store)
{
fprintf(stderr, "Could not create certificate store!\n");
goto finish;
}
if (prepare(currentFileV2, legacyFileV2, legacyFile))
goto finish;
/* Test if host is found in current file. */
data = certificate_data_new("someurl", 3389, "subject", "issuer", "ff:11:22:dd");
if (!data)
{
fprintf(stderr, "Could not create certificate data!\n");
goto finish;
}
if (0 != certificate_data_match(store, data))
{
fprintf(stderr, "Could not find data in v2 file!\n");
goto finish;
}
/* Test if we can read out the old fingerprint. */
if (!certificate_get_stored_data(store, data, &subject, &issuer, &fp))
{
fprintf(stderr, "Could not read old fingerprint!\n");
goto finish;
}
printf("Got %s, %s '%s'\n", subject, issuer, fp);
free(subject);
free(issuer);
free(fp);
subject = NULL;
issuer = NULL;
fp = NULL;
certificate_data_free(data);
/* Test if host not found in current file. */
data = certificate_data_new("somehost", 1234, "", "", "ff:aa:bb:cc");
if (!data)
{
fprintf(stderr, "Could not create certificate data!\n");
goto finish;
}
if (0 == certificate_data_match(store, data))
{
fprintf(stderr, "Invalid host found in v2 file!\n");
goto finish;
}
/* Test if we read out the old fingerprint fails. */
if (certificate_get_stored_data(store, data, &subject, &issuer, &fp))
{
fprintf(stderr, "Read out not existing old fingerprint succeeded?!\n");
goto finish;
}
certificate_data_free(data);
/* Test host add current file. */
data = certificate_data_new("somehost", 1234, "", "", "ff:aa:bb:cc");
if (!data)
{
fprintf(stderr, "Could not create certificate data!\n");
goto finish;
}
if (!certificate_data_print(store, data))
{
fprintf(stderr, "Could not add host to file!\n");
goto finish;
}
if (0 != certificate_data_match(store, data))
{
fprintf(stderr, "Could not find host written in v2 file!\n");
goto finish;
}
certificate_data_free(data);
/* Test host replace current file. */
data = certificate_data_new("somehost", 1234, "", "", "ff:aa:bb:dd:ee");
if (!data)
{
fprintf(stderr, "Could not create certificate data!\n");
goto finish;
}
if (!certificate_data_replace(store, data))
{
fprintf(stderr, "Could not replace data!\n");
goto finish;
}
if (0 != certificate_data_match(store, data))
{
fprintf(stderr, "Invalid host found in v2 file!\n");
goto finish;
}
certificate_data_free(data);
/* Test host replace invalid entry in current file. */
data = certificate_data_new("somehostXXXX", 1234, "", "", "ff:aa:bb:dd:ee");
if (!data)
{
fprintf(stderr, "Could not create certificate data!\n");
goto finish;
}
if (certificate_data_replace(store, data))
{
fprintf(stderr, "Invalid return for replace invalid entry!\n");
goto finish;
}
if (0 == certificate_data_match(store, data))
{
fprintf(stderr, "Invalid host found in v2 file!\n");
goto finish;
}
certificate_data_free(data);
certificate_store_free(store);
store = certificate_store_new(&legacy);
if (!store)
{
fprintf(stderr, "could not create certificate store!\n");
goto finish;
}
/* test if host found in legacy file. */
data = certificate_data_new("legacyurl", 1234, "", "", "aa:bb:cc:dd");
if (!data)
{
fprintf(stderr, "Could not create certificate data!\n");
goto finish;
}
if (0 != certificate_data_match(store, data))
{
fprintf(stderr, "Could not find host in file!\n");
goto finish;
}
certificate_data_free(data);
/* test if host not found. */
data = certificate_data_new("somehost-not-in-file", 1234, "", "", "ff:aa:bb:cc");
if (!data)
{
fprintf(stderr, "Could not create certificate data!\n");
goto finish;
}
if (0 == certificate_data_match(store, data))
{
fprintf(stderr, "Invalid host found in file!\n");
goto finish;
}
rc = 0;
finish:
if (store)
certificate_store_free(store);
if (data)
certificate_data_free(data);
DeleteFileA(currentFileV2);
//RemoveDirectoryA(current.ConfigPath);
DeleteFileA(legacyFileV2);
DeleteFileA(legacyFile);
//RemoveDirectoryA(legacy.ConfigPath);
free (currentFileV2);
free (legacyFileV2);
free (legacyFile);
free(subject);
free(issuer);
free(fp);
return rc;
}

View File

@ -0,0 +1,2 @@
someurl ff:11:22:dd
otherurl aa:bb:cc:dd

View File

@ -0,0 +1,2 @@
someurl 3389 ff:11:22:dd
otherurl 3389 aa:bb:cc:dd

View File

@ -1082,7 +1082,7 @@ int tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname, int por
certificate_status = x509_verify_certificate(cert, tls->certificate_store->path); certificate_status = x509_verify_certificate(cert, tls->certificate_store->path);
/* verify certificate name match */ /* verify certificate name match */
certificate_data = crypto_get_certificate_data(cert->px509, hostname); certificate_data = crypto_get_certificate_data(cert->px509, hostname, port);
/* extra common name and alternative names */ /* extra common name and alternative names */
common_name = crypto_cert_subject_common_name(cert->px509, &common_name_length); common_name = crypto_cert_subject_common_name(cert->px509, &common_name_length);
@ -1124,7 +1124,9 @@ int tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname, int por
/* if the certificate is valid but the certificate name does not match, warn user, do not accept */ /* if the certificate is valid but the certificate name does not match, warn user, do not accept */
if (certificate_status && !hostname_match) if (certificate_status && !hostname_match)
tls_print_certificate_name_mismatch_error(hostname, common_name, alt_names, alt_names_count); tls_print_certificate_name_mismatch_error(hostname, port,
common_name, alt_names,
alt_names_count);
/* verification could not succeed with OpenSSL, use known_hosts file and prompt user for manual verification */ /* verification could not succeed with OpenSSL, use known_hosts file and prompt user for manual verification */
@ -1147,7 +1149,10 @@ int tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname, int por
{ {
/* no entry was found in known_hosts file, prompt user for manual verification */ /* no entry was found in known_hosts file, prompt user for manual verification */
if (!hostname_match) if (!hostname_match)
tls_print_certificate_name_mismatch_error(hostname, common_name, alt_names, alt_names_count); tls_print_certificate_name_mismatch_error(
hostname, port,
common_name, alt_names,
alt_names_count);
if (instance->VerifyCertificate) if (instance->VerifyCertificate)
{ {
@ -1162,20 +1167,35 @@ int tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname, int por
else else
{ {
/* user accepted certificate, add entry in known_hosts file */ /* user accepted certificate, add entry in known_hosts file */
certificate_data_print(tls->certificate_store, certificate_data); verification_status = certificate_data_print(tls->certificate_store, certificate_data);
verification_status = TRUE; /* success! */
} }
} }
else if (match == -1) else if (match == -1)
{ {
char* old_subject = NULL;
char* old_issuer = NULL;
char* old_fingerprint = NULL;
/* entry was found in known_hosts file, but fingerprint does not match. ask user to use it */ /* entry was found in known_hosts file, but fingerprint does not match. ask user to use it */
tls_print_certificate_error(hostname, fingerprint, tls->certificate_store->file); tls_print_certificate_error(hostname, port, fingerprint,
tls->certificate_store->file);
if (!certificate_get_stored_data(tls->certificate_store,
certificate_data, &old_subject,
&old_issuer, &old_fingerprint))
WLog_WARN(TAG, "Failed to get certificate entry for %s:hu",
hostname, port);
if (instance->VerifyChangedCertificate) if (instance->VerifyChangedCertificate)
{ {
accept_certificate = instance->VerifyChangedCertificate(instance, subject, issuer, fingerprint, ""); accept_certificate = instance->VerifyChangedCertificate(
instance, subject, issuer,
fingerprint, old_subject, old_issuer,
old_fingerprint);
} }
free(old_fingerprint);
if (!accept_certificate) if (!accept_certificate)
{ {
/* user did not accept, abort and do not change known_hosts file */ /* user did not accept, abort and do not change known_hosts file */
@ -1184,8 +1204,7 @@ int tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname, int por
else else
{ {
/* user accepted new certificate, add replace fingerprint for this host in known_hosts file */ /* user accepted new certificate, add replace fingerprint for this host in known_hosts file */
certificate_data_replace(tls->certificate_store, certificate_data); verification_status = certificate_data_replace(tls->certificate_store, certificate_data);
verification_status = TRUE; /* success! */
} }
} }
else if (match == 0) else if (match == 0)
@ -1216,9 +1235,10 @@ int tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname, int por
return (verification_status == 0) ? 0 : 1; return (verification_status == 0) ? 0 : 1;
} }
void tls_print_certificate_error(char* hostname, char* fingerprint, char *hosts_file) void tls_print_certificate_error(char* hostname, UINT16 port, char* fingerprint,
char *hosts_file)
{ {
WLog_ERR(TAG, "The host key for %s has changed", hostname); WLog_ERR(TAG, "The host key for %s:%hu has changed", hostname, port);
WLog_ERR(TAG, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); WLog_ERR(TAG, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
WLog_ERR(TAG, "@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @"); WLog_ERR(TAG, "@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @");
WLog_ERR(TAG, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); WLog_ERR(TAG, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
@ -1232,7 +1252,9 @@ void tls_print_certificate_error(char* hostname, char* fingerprint, char *hosts_
WLog_ERR(TAG, "Host key verification failed."); WLog_ERR(TAG, "Host key verification failed.");
} }
void tls_print_certificate_name_mismatch_error(char* hostname, char* common_name, char** alt_names, int alt_names_count) void tls_print_certificate_name_mismatch_error(char* hostname, UINT16 port,
char* common_name, char** alt_names,
int alt_names_count)
{ {
int index; int index;
@ -1240,8 +1262,10 @@ void tls_print_certificate_name_mismatch_error(char* hostname, char* common_name
WLog_ERR(TAG, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); WLog_ERR(TAG, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
WLog_ERR(TAG, "@ WARNING: CERTIFICATE NAME MISMATCH! @"); WLog_ERR(TAG, "@ WARNING: CERTIFICATE NAME MISMATCH! @");
WLog_ERR(TAG, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); WLog_ERR(TAG, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
WLog_ERR(TAG, "The hostname used for this connection (%s) ", hostname); WLog_ERR(TAG, "The hostname used for this connection (%s:%hu) ",
WLog_ERR(TAG, "does not match %s given in the certificate:", alt_names_count < 1 ? "the name" : "any of the names"); hostname, port);
WLog_ERR(TAG, "does not match %s given in the certificate:",
alt_names_count < 1 ? "the name" : "any of the names");
WLog_ERR(TAG, "Common Name (CN):"); WLog_ERR(TAG, "Common Name (CN):");
WLog_ERR(TAG, "\t%s", common_name ? common_name : "no CN found in certificate"); WLog_ERR(TAG, "\t%s", common_name ? common_name : "no CN found in certificate");
if (alt_names_count > 0) if (alt_names_count > 0)

View File

@ -1,4 +1,6 @@
opt/freerdp-nightly/lib/*.a
opt/freerdp-nightly/lib/*.so opt/freerdp-nightly/lib/*.so
opt/freerdp-nightly/lib/freerdp/*.a
opt/freerdp-nightly/lib/pkgconfig opt/freerdp-nightly/lib/pkgconfig
opt/freerdp-nightly/lib/cmake opt/freerdp-nightly/lib/cmake
opt/freerdp-nightly/include opt/freerdp-nightly/include

View File

@ -35,8 +35,6 @@ override_dh_strip:
dh_strip --dbg-package=freerdp-nightly-dbg dh_strip --dbg-package=freerdp-nightly-dbg
override_dh_install: override_dh_install:
rm -f debian/tmp/opt/freerdp-nightly/lib/libwinpr-makecert-tool.a
rm -f debian/tmp/opt/freerdp-nightly/lib/freerdp/*.a
mkdir -p debian/tmp/opt/freerdp-nightly/lib/cmake/ mkdir -p debian/tmp/opt/freerdp-nightly/lib/cmake/
dh_install --fail-missing dh_install --fail-missing

View File

@ -362,9 +362,7 @@ int x11_shadow_pointer_position_update(x11ShadowSubsystem* subsystem)
msg->xPos = subsystem->pointerX; msg->xPos = subsystem->pointerX;
msg->yPos = subsystem->pointerY; msg->yPos = subsystem->pointerY;
MessageQueue_Post(MsgPipe->Out, NULL, msgId, (void*) msg, NULL); return MessageQueue_Post(MsgPipe->Out, NULL, msgId, (void*) msg, NULL) ? 1 : -1;
return 1;
} }
int x11_shadow_pointer_alpha_update(x11ShadowSubsystem* subsystem) int x11_shadow_pointer_alpha_update(x11ShadowSubsystem* subsystem)
@ -395,9 +393,7 @@ int x11_shadow_pointer_alpha_update(x11ShadowSubsystem* subsystem)
CopyMemory(msg->pixels, subsystem->cursorPixels, msg->scanline * msg->height); CopyMemory(msg->pixels, subsystem->cursorPixels, msg->scanline * msg->height);
msg->premultiplied = TRUE; msg->premultiplied = TRUE;
MessageQueue_Post(MsgPipe->Out, NULL, msgId, (void*) msg, NULL); return MessageQueue_Post(MsgPipe->Out, NULL, msgId, (void*) msg, NULL) ? 1 : -1;
return 1;
} }
int x11_shadow_query_cursor(x11ShadowSubsystem* subsystem, BOOL getImage) int x11_shadow_query_cursor(x11ShadowSubsystem* subsystem, BOOL getImage)
@ -1295,7 +1291,7 @@ int x11_shadow_subsystem_stop(x11ShadowSubsystem* subsystem)
if (subsystem->thread) if (subsystem->thread)
{ {
MessageQueue_PostQuit(subsystem->MsgPipe->In, 0); if (MessageQueue_PostQuit(subsystem->MsgPipe->In, 0))
WaitForSingleObject(subsystem->thread, INFINITE); WaitForSingleObject(subsystem->thread, INFINITE);
CloseHandle(subsystem->thread); CloseHandle(subsystem->thread);
subsystem->thread = NULL; subsystem->thread = NULL;

View File

@ -251,17 +251,17 @@ BOOL shadow_client_post_connect(freerdp_peer* peer)
return TRUE; return TRUE;
} }
void shadow_client_refresh_rect(rdpShadowClient* client, BYTE count, RECTANGLE_16* areas) BOOL shadow_client_refresh_rect(rdpShadowClient* client, BYTE count, RECTANGLE_16* areas)
{ {
wMessage message = { 0 }; wMessage message = { 0 };
SHADOW_MSG_IN_REFRESH_OUTPUT* wParam; SHADOW_MSG_IN_REFRESH_OUTPUT* wParam;
wMessagePipe* MsgPipe = client->subsystem->MsgPipe; wMessagePipe* MsgPipe = client->subsystem->MsgPipe;
if (!areas) if (count && !areas)
return; return FALSE;
if (!(wParam = (SHADOW_MSG_IN_REFRESH_OUTPUT*) calloc(1, sizeof(SHADOW_MSG_IN_REFRESH_OUTPUT)))) if (!(wParam = (SHADOW_MSG_IN_REFRESH_OUTPUT*) calloc(1, sizeof(SHADOW_MSG_IN_REFRESH_OUTPUT))))
return; return FALSE;
wParam->numRects = (UINT32) count; wParam->numRects = (UINT32) count;
@ -272,11 +272,11 @@ void shadow_client_refresh_rect(rdpShadowClient* client, BYTE count, RECTANGLE_1
if (!wParam->rects) if (!wParam->rects)
{ {
free (wParam); free (wParam);
return; return FALSE;
}
} }
CopyMemory(wParam->rects, areas, wParam->numRects * sizeof(RECTANGLE_16)); CopyMemory(wParam->rects, areas, wParam->numRects * sizeof(RECTANGLE_16));
}
message.id = SHADOW_MSG_IN_REFRESH_OUTPUT_ID; message.id = SHADOW_MSG_IN_REFRESH_OUTPUT_ID;
message.wParam = (void*) wParam; message.wParam = (void*) wParam;
@ -284,19 +284,18 @@ void shadow_client_refresh_rect(rdpShadowClient* client, BYTE count, RECTANGLE_1
message.context = (void*) client; message.context = (void*) client;
message.Free = shadow_client_message_free; message.Free = shadow_client_message_free;
MessageQueue_Dispatch(MsgPipe->In, &message); return MessageQueue_Dispatch(MsgPipe->In, &message);
} }
void shadow_client_suppress_output(rdpShadowClient* client, BYTE allow, RECTANGLE_16* area) BOOL shadow_client_suppress_output(rdpShadowClient* client, BYTE allow, RECTANGLE_16* area)
{ {
wMessage message = { 0 }; wMessage message = { 0 };
SHADOW_MSG_IN_SUPPRESS_OUTPUT* wParam; SHADOW_MSG_IN_SUPPRESS_OUTPUT* wParam;
wMessagePipe* MsgPipe = client->subsystem->MsgPipe; wMessagePipe* MsgPipe = client->subsystem->MsgPipe;
wParam = (SHADOW_MSG_IN_SUPPRESS_OUTPUT*) calloc(1, sizeof(SHADOW_MSG_IN_SUPPRESS_OUTPUT)); wParam = (SHADOW_MSG_IN_SUPPRESS_OUTPUT*) calloc(1, sizeof(SHADOW_MSG_IN_SUPPRESS_OUTPUT));
if (!wParam) if (!wParam)
return; return FALSE;
wParam->allow = (UINT32) allow; wParam->allow = (UINT32) allow;
@ -309,7 +308,7 @@ void shadow_client_suppress_output(rdpShadowClient* client, BYTE allow, RECTANGL
message.context = (void*) client; message.context = (void*) client;
message.Free = shadow_client_message_free; message.Free = shadow_client_message_free;
MessageQueue_Dispatch(MsgPipe->In, &message); return MessageQueue_Dispatch(MsgPipe->In, &message);
} }
BOOL shadow_client_activate(freerdp_peer* peer) BOOL shadow_client_activate(freerdp_peer* peer)
@ -334,12 +333,10 @@ BOOL shadow_client_activate(freerdp_peer* peer)
shadow_encoder_reset(client->encoder); shadow_encoder_reset(client->encoder);
shadow_client_refresh_rect(client, 0, NULL); return shadow_client_refresh_rect(client, 0, NULL);
return TRUE;
} }
void shadow_client_surface_frame_acknowledge(rdpShadowClient* client, UINT32 frameId) BOOL shadow_client_surface_frame_acknowledge(rdpShadowClient* client, UINT32 frameId)
{ {
SURFACE_FRAME* frame; SURFACE_FRAME* frame;
wListDictionary* frameList; wListDictionary* frameList;
@ -352,6 +349,7 @@ void shadow_client_surface_frame_acknowledge(rdpShadowClient* client, UINT32 fra
ListDictionary_Remove(frameList, (void*) (size_t) frameId); ListDictionary_Remove(frameList, (void*) (size_t) frameId);
free(frame); free(frame);
} }
return TRUE;
} }
int shadow_client_send_surface_frame_marker(rdpShadowClient* client, UINT32 action, UINT32 id) int shadow_client_send_surface_frame_marker(rdpShadowClient* client, UINT32 action, UINT32 id)
@ -445,6 +443,7 @@ int shadow_client_send_surface_bits(rdpShadowClient* client, rdpShadowSurface* s
cmd.bpp = 32; cmd.bpp = 32;
cmd.width = surface->width; cmd.width = surface->width;
cmd.height = surface->height; cmd.height = surface->height;
cmd.skipCompression = TRUE;
if (numMessages > 0) if (numMessages > 0)
messageRects = messages[0].rects; messageRects = messages[0].rects;

View File

@ -28,7 +28,6 @@ rdpShadowScreen* shadow_screen_new(rdpShadowServer* server)
{ {
int x, y; int x, y;
int width, height; int width, height;
MONITOR_DEF* primary;
rdpShadowScreen* screen; rdpShadowScreen* screen;
rdpShadowSubsystem* subsystem; rdpShadowSubsystem* subsystem;
@ -45,12 +44,21 @@ rdpShadowScreen* shadow_screen_new(rdpShadowServer* server)
region16_init(&(screen->invalidRegion)); region16_init(&(screen->invalidRegion));
if (server->shareSubRect) {
x = server->subRect.left;
y = server->subRect.top;
width = server->subRect.right - server->subRect.left;
height = server->subRect.bottom - server->subRect.top;
} else {
MONITOR_DEF* primary;
primary = &(subsystem->monitors[subsystem->selectedMonitor]); primary = &(subsystem->monitors[subsystem->selectedMonitor]);
x = primary->left; x = primary->left;
y = primary->top; y = primary->top;
width = primary->right - primary->left; width = primary->right - primary->left;
height = primary->bottom - primary->top; height = primary->bottom - primary->top;
}
screen->width = width; screen->width = width;
screen->height = height; screen->height = height;

View File

@ -346,11 +346,13 @@ void* shadow_server_thread(rdpShadowServer* server)
/* Signal to the clients that server is being stopped and wait for them /* Signal to the clients that server is being stopped and wait for them
* to disconnect. */ * to disconnect. */
MessageQueue_PostQuit(subsystem->MsgPipe->Out, 0); if (MessageQueue_PostQuit(subsystem->MsgPipe->Out, 0))
{
while(ArrayList_Count(server->clients) > 0) while(ArrayList_Count(server->clients) > 0)
{ {
Sleep(100); Sleep(100);
} }
}
ExitThread(0); ExitThread(0);
@ -443,7 +445,7 @@ int shadow_server_init_config_path(rdpShadowServer* server)
if (userLibraryPath) if (userLibraryPath)
{ {
if (!PathFileExistsA(userLibraryPath) && if (!PathFileExistsA(userLibraryPath) &&
!CreateDirectoryA(userLibraryPath, 0)) !PathMakePathA(userLibraryPath, 0))
{ {
WLog_ERR(TAG, "Failed to create directory '%s'", userLibraryPath); WLog_ERR(TAG, "Failed to create directory '%s'", userLibraryPath);
free(userLibraryPath); free(userLibraryPath);
@ -455,7 +457,7 @@ int shadow_server_init_config_path(rdpShadowServer* server)
if (userApplicationSupportPath) if (userApplicationSupportPath)
{ {
if (!PathFileExistsA(userApplicationSupportPath) && if (!PathFileExistsA(userApplicationSupportPath) &&
!CreateDirectoryA(userApplicationSupportPath, 0)) !PathMakePathA(userApplicationSupportPath, 0))
{ {
WLog_ERR(TAG, "Failed to create directory '%s'", userApplicationSupportPath); WLog_ERR(TAG, "Failed to create directory '%s'", userApplicationSupportPath);
free(userLibraryPath); free(userLibraryPath);
@ -480,7 +482,7 @@ int shadow_server_init_config_path(rdpShadowServer* server)
if (configHome) if (configHome)
{ {
if (!PathFileExistsA(configHome) && if (!PathFileExistsA(configHome) &&
!CreateDirectoryA(configHome, 0)) !PathMakePathA(configHome, 0))
{ {
WLog_ERR(TAG, "Failed to create directory '%s'", configHome); WLog_ERR(TAG, "Failed to create directory '%s'", configHome);
free(configHome); free(configHome);
@ -514,7 +516,7 @@ int shadow_server_init_certificate(rdpShadowServer* server)
int makecert_argc = (sizeof(makecert_argv) / sizeof(char*)); int makecert_argc = (sizeof(makecert_argv) / sizeof(char*));
if (!PathFileExistsA(server->ConfigPath) && if (!PathFileExistsA(server->ConfigPath) &&
!CreateDirectoryA(server->ConfigPath, 0)) !PathMakePathA(server->ConfigPath, 0))
{ {
WLog_ERR(TAG, "Failed to create directory '%s'", server->ConfigPath); WLog_ERR(TAG, "Failed to create directory '%s'", server->ConfigPath);
return -1; return -1;
@ -524,7 +526,7 @@ int shadow_server_init_certificate(rdpShadowServer* server)
return -1; return -1;
if (!PathFileExistsA(filepath) && if (!PathFileExistsA(filepath) &&
!CreateDirectoryA(filepath, 0)) !PathMakePathA(filepath, 0))
{ {
WLog_ERR(TAG, "Failed to create directory '%s'", filepath); WLog_ERR(TAG, "Failed to create directory '%s'", filepath);
free(filepath); free(filepath);

View File

@ -477,9 +477,9 @@ WINPR_API HANDLE MessageQueue_Event(wMessageQueue* queue);
WINPR_API BOOL MessageQueue_Wait(wMessageQueue* queue); WINPR_API BOOL MessageQueue_Wait(wMessageQueue* queue);
WINPR_API int MessageQueue_Size(wMessageQueue* queue); WINPR_API int MessageQueue_Size(wMessageQueue* queue);
WINPR_API void MessageQueue_Dispatch(wMessageQueue* queue, wMessage* message); WINPR_API BOOL MessageQueue_Dispatch(wMessageQueue* queue, wMessage* message);
WINPR_API void MessageQueue_Post(wMessageQueue* queue, void* context, UINT32 type, void* wParam, void* lParam); WINPR_API BOOL MessageQueue_Post(wMessageQueue* queue, void* context, UINT32 type, void* wParam, void* lParam);
WINPR_API void MessageQueue_PostQuit(wMessageQueue* queue, int nExitCode); WINPR_API BOOL MessageQueue_PostQuit(wMessageQueue* queue, int nExitCode);
WINPR_API int MessageQueue_Get(wMessageQueue* queue, wMessage* message); WINPR_API int MessageQueue_Get(wMessageQueue* queue, wMessage* message);
WINPR_API int MessageQueue_Peek(wMessageQueue* queue, wMessage* message, BOOL remove); WINPR_API int MessageQueue_Peek(wMessageQueue* queue, wMessage* message, BOOL remove);

View File

@ -291,6 +291,9 @@ WINPR_API BOOL FindClose(HANDLE hFindFile);
WINPR_API BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); WINPR_API BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
WINPR_API BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); WINPR_API BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
WINPR_API BOOL RemoveDirectoryA(LPCSTR lpPathName);
WINPR_API BOOL RemoveDirectoryW(LPCWSTR lpPathName);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
@ -302,6 +305,7 @@ WINPR_API BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecu
#define FindFirstFileEx FindFirstFileExW #define FindFirstFileEx FindFirstFileExW
#define FindNextFile FindNextFileW #define FindNextFile FindNextFileW
#define CreateDirectory CreateDirectoryW #define CreateDirectory CreateDirectoryW
#define RemoveDirectory RemoveDirectoryW
#else #else
#define CreateFile CreateFileA #define CreateFile CreateFileA
#define DeleteFile DeleteFileA #define DeleteFile DeleteFileA
@ -309,6 +313,7 @@ WINPR_API BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecu
#define FindFirstFileEx FindFirstFileExA #define FindFirstFileEx FindFirstFileExA
#define FindNextFile FindNextFileA #define FindNextFile FindNextFileA
#define CreateDirectory CreateDirectoryA #define CreateDirectory CreateDirectoryA
#define RemoveDirectory RemoveDirectoryA
#endif #endif

View File

@ -285,6 +285,8 @@ WINPR_API char* GetEnvironmentPath(char* name);
WINPR_API char* GetEnvironmentSubPath(char* name, const char* path); WINPR_API char* GetEnvironmentSubPath(char* name, const char* path);
WINPR_API char* GetCombinedPath(const char* basePath, const char* subPath); WINPR_API char* GetCombinedPath(const char* basePath, const char* subPath);
WINPR_API BOOL PathMakePathA(LPCSTR path, LPSECURITY_ATTRIBUTES lpAttributes);
WINPR_API BOOL PathFileExistsA(LPCSTR pszPath); WINPR_API BOOL PathFileExistsA(LPCSTR pszPath);
WINPR_API BOOL PathFileExistsW(LPCWSTR pszPath); WINPR_API BOOL PathFileExistsW(LPCWSTR pszPath);

View File

@ -186,6 +186,8 @@ WINPR_API void ByteSwapUnicode(WCHAR* wstr, int length);
WINPR_API int ConvertLineEndingToLF(char* str, int size); WINPR_API int ConvertLineEndingToLF(char* str, int size);
WINPR_API char* ConvertLineEndingToCRLF(const char* str, int* size); WINPR_API char* ConvertLineEndingToCRLF(const char* str, int* size);
WINPR_API char* StrSep(char** stringp, const char* delim);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -295,6 +295,8 @@ WINPR_API ULONGLONG GetTickCount64(void);
#endif #endif
WINPR_API DWORD GetTickCountPrecise(void);
WINPR_API BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature); WINPR_API BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature);
/* extended flags */ /* extended flags */

View File

@ -154,8 +154,9 @@ typedef unsigned int UINT32;
typedef unsigned __int64 UINT64; typedef unsigned __int64 UINT64;
typedef ULONG *PULONG; typedef ULONG *PULONG;
typedef ULONG HRESULT; typedef LONG HRESULT;
typedef ULONG SCODE; typedef LONG SCODE;
typedef SCODE *PSCODE;
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
typedef ULONG_PTR SIZE_T; typedef ULONG_PTR SIZE_T;

View File

@ -463,3 +463,22 @@ char* ConvertLineEndingToCRLF(const char* str, int* size)
return newStr; return newStr;
} }
char* StrSep(char** stringp, const char* delim)
{
char* start = *stringp;
char* p;
p = (start != NULL) ? strpbrk(start, delim) : NULL;
if (!p)
*stringp = NULL;
else
{
*p = '\0';
*stringp = p + 1;
}
return start;
}

View File

@ -788,7 +788,20 @@ BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttribu
BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
{ {
return FALSE;
}
BOOL RemoveDirectoryA(LPCSTR lpPathName)
{
if (!rmdir(lpPathName))
return TRUE; return TRUE;
return FALSE;
}
BOOL RemoveDirectoryW(LPCWSTR lpPathName)
{
return FALSE;
} }
#endif #endif

View File

@ -6,6 +6,18 @@
#define PATH_ALLOC_COMBINE PathAllocCombineA #define PATH_ALLOC_COMBINE PathAllocCombineA
*/ */
/**
* FIXME: These implementations of the PathAllocCombine functions have
* several issues:
* - pszPathIn or pszMore may be NULL (but not both)
* - no check if pszMore is fully qualified (if so, it must be directly
* copied to the output buffer without being combined with pszPathIn.
* - if pszMore begins with a _single_ backslash it must be combined with
* only the root of the path pointed to by pszPathIn and there's no code
* to extract the root of pszPathIn.
* - the function will crash with some short string lengths of the parameters
*/
#if DEFINE_UNICODE #if DEFINE_UNICODE
HRESULT PATH_ALLOC_COMBINE(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags, PWSTR* ppszPathOut) HRESULT PATH_ALLOC_COMBINE(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags, PWSTR* ppszPathOut)
@ -18,14 +30,26 @@ HRESULT PATH_ALLOC_COMBINE(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFla
int pszPathInLength; int pszPathInLength;
int pszPathOutLength; int pszPathOutLength;
if (!pszPathIn) WLog_WARN(TAG, "%s: has known bugs and needs fixing.", __FUNCTION__);
return S_FALSE;
if (!ppszPathOut)
return E_INVALIDARG;
if (!pszPathIn && !pszMore)
return E_INVALIDARG;
if (!pszMore) if (!pszMore)
return S_FALSE; return E_FAIL; /* valid but not implemented, see top comment */
pszPathInLength = lstrlenW(pszPathIn); if (!pszPathIn)
pszMoreLength = lstrlenW(pszMore); return E_FAIL; /* valid but not implemented, see top comment */
pszPathInLength = lstrlenA(pszPathIn);
pszMoreLength = lstrlenA(pszMore);
/* prevent segfaults - the complete implementation below is buggy */
if (pszPathInLength < 3)
return E_FAIL;
backslashIn = (pszPathIn[pszPathInLength - 1] == _PATH_SEPARATOR_CHR) ? TRUE : FALSE; backslashIn = (pszPathIn[pszPathInLength - 1] == _PATH_SEPARATOR_CHR) ? TRUE : FALSE;
backslashMore = (pszMore[0] == _PATH_SEPARATOR_CHR) ? TRUE : FALSE; backslashMore = (pszMore[0] == _PATH_SEPARATOR_CHR) ? TRUE : FALSE;
@ -40,6 +64,9 @@ HRESULT PATH_ALLOC_COMBINE(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFla
sizeOfBuffer = (pszPathOutLength + 1) * 2; sizeOfBuffer = (pszPathOutLength + 1) * 2;
pszPathOut = (PWSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2); pszPathOut = (PWSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2);
if (!pszPathOut)
return E_OUTOFMEMORY;
swprintf_s(pszPathOut, sizeOfBuffer, L"%c:%s", pszPathIn[0], pszMore); swprintf_s(pszPathOut, sizeOfBuffer, L"%c:%s", pszPathIn[0], pszMore);
*ppszPathOut = pszPathOut; *ppszPathOut = pszPathOut;
@ -55,6 +82,8 @@ HRESULT PATH_ALLOC_COMBINE(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFla
sizeOfBuffer = (pszPathOutLength + 1) * 2; sizeOfBuffer = (pszPathOutLength + 1) * 2;
pszPathOut = (PWSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2); pszPathOut = (PWSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2);
if (!pszPathOut)
return E_OUTOFMEMORY;
if (backslashIn) if (backslashIn)
swprintf_s(pszPathOut, sizeOfBuffer, L"%s%s", pszPathIn, pszMore); swprintf_s(pszPathOut, sizeOfBuffer, L"%s%s", pszPathIn, pszMore);
@ -67,7 +96,7 @@ HRESULT PATH_ALLOC_COMBINE(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFla
} }
#endif #endif
return S_OK; return E_FAIL;
} }
#else #else
@ -81,15 +110,27 @@ HRESULT PATH_ALLOC_COMBINE(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags
int pszPathInLength; int pszPathInLength;
int pszPathOutLength; int pszPathOutLength;
if (!pszPathIn) WLog_WARN(TAG, "%s: has known bugs and needs fixing.", __FUNCTION__);
return S_FALSE;
if (!ppszPathOut)
return E_INVALIDARG;
if (!pszPathIn && !pszMore)
return E_INVALIDARG;
if (!pszMore) if (!pszMore)
return S_FALSE; return E_FAIL; /* valid but not implemented, see top comment */
if (!pszPathIn)
return E_FAIL; /* valid but not implemented, see top comment */
pszPathInLength = lstrlenA(pszPathIn); pszPathInLength = lstrlenA(pszPathIn);
pszMoreLength = lstrlenA(pszMore); pszMoreLength = lstrlenA(pszMore);
/* prevent segfaults - the complete implementation below is buggy */
if (pszPathInLength < 3)
return E_FAIL;
backslashIn = (pszPathIn[pszPathInLength - 1] == _PATH_SEPARATOR_CHR) ? TRUE : FALSE; backslashIn = (pszPathIn[pszPathInLength - 1] == _PATH_SEPARATOR_CHR) ? TRUE : FALSE;
backslashMore = (pszMore[0] == _PATH_SEPARATOR_CHR) ? TRUE : FALSE; backslashMore = (pszMore[0] == _PATH_SEPARATOR_CHR) ? TRUE : FALSE;
@ -103,6 +144,9 @@ HRESULT PATH_ALLOC_COMBINE(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags
sizeOfBuffer = (pszPathOutLength + 1) * 2; sizeOfBuffer = (pszPathOutLength + 1) * 2;
pszPathOut = (PSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2); pszPathOut = (PSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2);
if (!pszPathOut)
return E_OUTOFMEMORY;
sprintf_s(pszPathOut, sizeOfBuffer, "%c:%s", pszPathIn[0], pszMore); sprintf_s(pszPathOut, sizeOfBuffer, "%c:%s", pszPathIn[0], pszMore);
*ppszPathOut = pszPathOut; *ppszPathOut = pszPathOut;
@ -118,6 +162,8 @@ HRESULT PATH_ALLOC_COMBINE(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags
sizeOfBuffer = (pszPathOutLength + 1) * 2; sizeOfBuffer = (pszPathOutLength + 1) * 2;
pszPathOut = (PSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2); pszPathOut = (PSTR) HeapAlloc(GetProcessHeap(), 0, sizeOfBuffer * 2);
if (!pszPathOut)
return E_OUTOFMEMORY;
if (backslashIn) if (backslashIn)
sprintf_s(pszPathOut, sizeOfBuffer, "%s%s", pszPathIn, pszMore); sprintf_s(pszPathOut, sizeOfBuffer, "%s%s", pszPathIn, pszMore);
@ -129,7 +175,7 @@ HRESULT PATH_ALLOC_COMBINE(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags
return S_OK; return S_OK;
} }
return S_OK; return E_FAIL;
} }
#endif #endif

View File

@ -17,10 +17,10 @@ HRESULT PATH_CCH_ADD_EXTENSION(PWSTR pszPath, size_t cchPath, PCWSTR pszExt)
size_t pszPathLength; size_t pszPathLength;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
if (!pszExt) if (!pszExt)
return S_FALSE; return E_INVALIDARG;
pszExtLength = lstrlenW(pszExt); pszExtLength = lstrlenW(pszExt);
pszPathLength = lstrlenW(pszPath); pszPathLength = lstrlenW(pszPath);
@ -45,7 +45,7 @@ HRESULT PATH_CCH_ADD_EXTENSION(PWSTR pszPath, size_t cchPath, PCWSTR pszExt)
return S_OK; return S_OK;
} }
#endif #endif
return S_FALSE; return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
} }
#else #else
@ -59,10 +59,10 @@ HRESULT PATH_CCH_ADD_EXTENSION(PSTR pszPath, size_t cchPath, PCSTR pszExt)
size_t pszPathLength; size_t pszPathLength;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
if (!pszExt) if (!pszExt)
return S_FALSE; return E_INVALIDARG;
pszExtLength = lstrlenA(pszExt); pszExtLength = lstrlenA(pszExt);
pszPathLength = lstrlenA(pszPath); pszPathLength = lstrlenA(pszPath);
@ -87,7 +87,7 @@ HRESULT PATH_CCH_ADD_EXTENSION(PSTR pszPath, size_t cchPath, PCSTR pszExt)
return S_OK; return S_OK;
} }
return S_FALSE; return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
} }
#endif #endif

View File

@ -12,7 +12,7 @@ HRESULT PATH_CCH_ADD_SEPARATOR(PWSTR pszPath, size_t cchPath)
size_t pszPathLength; size_t pszPathLength;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
pszPathLength = lstrlenW(pszPath); pszPathLength = lstrlenW(pszPath);
@ -27,7 +27,7 @@ HRESULT PATH_CCH_ADD_SEPARATOR(PWSTR pszPath, size_t cchPath)
return S_OK; return S_OK;
} }
return S_FALSE; return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
} }
#else #else
@ -37,7 +37,7 @@ HRESULT PATH_CCH_ADD_SEPARATOR(PSTR pszPath, size_t cchPath)
size_t pszPathLength; size_t pszPathLength;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
pszPathLength = lstrlenA(pszPath); pszPathLength = lstrlenA(pszPath);
@ -52,7 +52,7 @@ HRESULT PATH_CCH_ADD_SEPARATOR(PSTR pszPath, size_t cchPath)
return S_OK; return S_OK;
} }
return S_FALSE; return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
} }
#endif #endif

View File

@ -12,7 +12,7 @@ HRESULT PATH_CCH_ADD_SEPARATOR_EX(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd,
size_t pszPathLength; size_t pszPathLength;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
pszPathLength = lstrlenW(pszPath); pszPathLength = lstrlenW(pszPath);
@ -27,7 +27,7 @@ HRESULT PATH_CCH_ADD_SEPARATOR_EX(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd,
return S_OK; return S_OK;
} }
return S_FALSE; return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
} }
#else #else
@ -37,7 +37,7 @@ HRESULT PATH_CCH_ADD_SEPARATOR_EX(PSTR pszPath, size_t cchPath, PSTR* ppszEnd, s
size_t pszPathLength; size_t pszPathLength;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
pszPathLength = lstrlenA(pszPath); pszPathLength = lstrlenA(pszPath);
@ -52,7 +52,7 @@ HRESULT PATH_CCH_ADD_SEPARATOR_EX(PSTR pszPath, size_t cchPath, PSTR* ppszEnd, s
return S_OK; return S_OK;
} }
return S_FALSE; return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
} }
#endif #endif

View File

@ -17,10 +17,13 @@ HRESULT PATH_CCH_APPEND(PWSTR pszPath, size_t cchPath, PCWSTR pszMore)
size_t pszPathLength; size_t pszPathLength;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
if (!pszMore) if (!pszMore)
return S_FALSE; return E_INVALIDARG;
if (cchPath == 0 || cchPath > PATHCCH_MAX_CCH)
return E_INVALIDARG;
pszMoreLength = lstrlenW(pszMore); pszMoreLength = lstrlenW(pszMore);
pszPathLength = lstrlenW(pszPath); pszPathLength = lstrlenW(pszPath);
@ -54,7 +57,7 @@ HRESULT PATH_CCH_APPEND(PWSTR pszPath, size_t cchPath, PCWSTR pszMore)
} }
#endif #endif
return S_FALSE; return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE);
} }
#else #else
@ -67,10 +70,13 @@ HRESULT PATH_CCH_APPEND(PSTR pszPath, size_t cchPath, PCSTR pszMore)
size_t pszPathLength; size_t pszPathLength;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
if (!pszMore) if (!pszMore)
return S_FALSE; return E_INVALIDARG;
if (cchPath == 0 || cchPath > PATHCCH_MAX_CCH)
return E_INVALIDARG;
pszMoreLength = lstrlenA(pszMore); pszMoreLength = lstrlenA(pszMore);
pszPathLength = lstrlenA(pszPath); pszPathLength = lstrlenA(pszPath);
@ -103,7 +109,7 @@ HRESULT PATH_CCH_APPEND(PSTR pszPath, size_t cchPath, PCSTR pszMore)
} }
} }
return S_FALSE; return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE);
} }
#endif #endif

View File

@ -63,6 +63,9 @@
#define SHARED_LIBRARY_EXT SHARED_LIBRARY_EXT_SO #define SHARED_LIBRARY_EXT SHARED_LIBRARY_EXT_SO
#endif #endif
#include "../log.h"
#define TAG WINPR_TAG("path")
/* /*
* PathCchAddBackslash * PathCchAddBackslash
*/ */
@ -127,12 +130,14 @@
HRESULT PathCchRemoveBackslashA(PSTR pszPath, size_t cchPath) HRESULT PathCchRemoveBackslashA(PSTR pszPath, size_t cchPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchRemoveBackslashW(PWSTR pszPath, size_t cchPath) HRESULT PathCchRemoveBackslashW(PWSTR pszPath, size_t cchPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/* /*
@ -195,12 +200,14 @@ HRESULT PathCchRemoveBackslashW(PWSTR pszPath, size_t cchPath)
HRESULT PathCchRemoveBackslashExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd, size_t* pcchRemaining) HRESULT PathCchRemoveBackslashExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd, size_t* pcchRemaining)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchRemoveBackslashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd, size_t* pcchRemaining) HRESULT PathCchRemoveBackslashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd, size_t* pcchRemaining)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/* /*
@ -337,12 +344,14 @@ HRESULT PathCchRemoveBackslashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd,
HRESULT PathCchAppendExA(PSTR pszPath, size_t cchPath, PCSTR pszMore, unsigned long dwFlags) HRESULT PathCchAppendExA(PSTR pszPath, size_t cchPath, PCSTR pszMore, unsigned long dwFlags)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchAppendExW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore, unsigned long dwFlags) HRESULT PathCchAppendExW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore, unsigned long dwFlags)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/* /*
@ -351,12 +360,14 @@ HRESULT PathCchAppendExW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore, unsigned
HRESULT PathCchCanonicalizeA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn) HRESULT PathCchCanonicalizeA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchCanonicalizeW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn) HRESULT PathCchCanonicalizeW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/* /*
@ -365,12 +376,14 @@ HRESULT PathCchCanonicalizeW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPath
HRESULT PathCchCanonicalizeExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, unsigned long dwFlags) HRESULT PathCchCanonicalizeExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, unsigned long dwFlags)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchCanonicalizeExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, unsigned long dwFlags) HRESULT PathCchCanonicalizeExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, unsigned long dwFlags)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/* /*
@ -379,12 +392,14 @@ HRESULT PathCchCanonicalizeExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPa
HRESULT PathAllocCanonicalizeA(PCSTR pszPathIn, unsigned long dwFlags, PSTR* ppszPathOut) HRESULT PathAllocCanonicalizeA(PCSTR pszPathIn, unsigned long dwFlags, PSTR* ppszPathOut)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathAllocCanonicalizeW(PCWSTR pszPathIn, unsigned long dwFlags, PWSTR* ppszPathOut) HRESULT PathAllocCanonicalizeW(PCWSTR pszPathIn, unsigned long dwFlags, PWSTR* ppszPathOut)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/* /*
@ -393,12 +408,14 @@ HRESULT PathAllocCanonicalizeW(PCWSTR pszPathIn, unsigned long dwFlags, PWSTR* p
HRESULT PathCchCombineA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, PCSTR pszMore) HRESULT PathCchCombineA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, PCSTR pszMore)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchCombineW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, PCWSTR pszMore) HRESULT PathCchCombineW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, PCWSTR pszMore)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/* /*
@ -407,12 +424,14 @@ HRESULT PathCchCombineW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, P
HRESULT PathCchCombineExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags) HRESULT PathCchCombineExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchCombineExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags) HRESULT PathCchCombineExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/* /*
@ -493,6 +512,9 @@ HRESULT PathCchFindExtensionA(PCSTR pszPath, size_t cchPath, PCSTR* ppszExt)
{ {
char* p = (char*) pszPath; char* p = (char*) pszPath;
if (!pszPath || !cchPath || !ppszExt)
return E_INVALIDARG;
/* find end of string */ /* find end of string */
while (*p && cchPath) while (*p && cchPath)
@ -501,6 +523,15 @@ HRESULT PathCchFindExtensionA(PCSTR pszPath, size_t cchPath, PCSTR* ppszExt)
p++; p++;
} }
if (*p)
{
/* pszPath is not null terminated within the cchPath range */
return E_INVALIDARG;
}
/* If no extension is found, ppszExt must point to the string's terminating null */
*ppszExt = p;
/* search backwards for '.' */ /* search backwards for '.' */
while (p > pszPath) while (p > pszPath)
@ -508,21 +539,22 @@ HRESULT PathCchFindExtensionA(PCSTR pszPath, size_t cchPath, PCSTR* ppszExt)
if (*p == '.') if (*p == '.')
{ {
*ppszExt = (PCSTR) p; *ppszExt = (PCSTR) p;
return S_OK; break;
} }
if ((*p == '\\') || (*p == '/') || (*p == ':')) if ((*p == '\\') || (*p == '/') || (*p == ':'))
return S_FALSE; break;
p--; p--;
} }
return S_FALSE; return S_OK;
} }
HRESULT PathCchFindExtensionW(PCWSTR pszPath, size_t cchPath, PCWSTR* ppszExt) HRESULT PathCchFindExtensionW(PCWSTR pszPath, size_t cchPath, PCWSTR* ppszExt)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/** /**
@ -531,12 +563,14 @@ HRESULT PathCchFindExtensionW(PCWSTR pszPath, size_t cchPath, PCWSTR* ppszExt)
HRESULT PathCchRenameExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt) HRESULT PathCchRenameExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchRenameExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt) HRESULT PathCchRenameExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/** /**
@ -545,12 +579,14 @@ HRESULT PathCchRenameExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt)
HRESULT PathCchRemoveExtensionA(PSTR pszPath, size_t cchPath) HRESULT PathCchRemoveExtensionA(PSTR pszPath, size_t cchPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchRemoveExtensionW(PWSTR pszPath, size_t cchPath) HRESULT PathCchRemoveExtensionW(PWSTR pszPath, size_t cchPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/** /**
@ -559,12 +595,14 @@ HRESULT PathCchRemoveExtensionW(PWSTR pszPath, size_t cchPath)
BOOL PathCchIsRootA(PCSTR pszPath) BOOL PathCchIsRootA(PCSTR pszPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
BOOL PathCchIsRootW(PCWSTR pszPath) BOOL PathCchIsRootW(PCWSTR pszPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/** /**
@ -605,12 +643,14 @@ BOOL PathIsUNCExW(PCWSTR pszPath, PCWSTR* ppszServer)
HRESULT PathCchSkipRootA(PCSTR pszPath, PCSTR* ppszRootEnd) HRESULT PathCchSkipRootA(PCSTR pszPath, PCSTR* ppszRootEnd)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchSkipRootW(PCWSTR pszPath, PCWSTR* ppszRootEnd) HRESULT PathCchSkipRootW(PCWSTR pszPath, PCWSTR* ppszRootEnd)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/** /**
@ -619,12 +659,14 @@ HRESULT PathCchSkipRootW(PCWSTR pszPath, PCWSTR* ppszRootEnd)
HRESULT PathCchStripToRootA(PSTR pszPath, size_t cchPath) HRESULT PathCchStripToRootA(PSTR pszPath, size_t cchPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchStripToRootW(PWSTR pszPath, size_t cchPath) HRESULT PathCchStripToRootW(PWSTR pszPath, size_t cchPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/** /**
@ -634,27 +676,29 @@ HRESULT PathCchStripToRootW(PWSTR pszPath, size_t cchPath)
HRESULT PathCchStripPrefixA(PSTR pszPath, size_t cchPath) HRESULT PathCchStripPrefixA(PSTR pszPath, size_t cchPath)
{ {
BOOL hasPrefix; BOOL hasPrefix;
BOOL deviceNamespace;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
if (cchPath < 4) if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
return S_FALSE; return E_INVALIDARG;
hasPrefix = ((pszPath[0] == '\\') && (pszPath[1] == '\\') && hasPrefix = ((pszPath[0] == '\\') && (pszPath[1] == '\\') &&
(pszPath[2] == '?') && (pszPath[3] == '\\')) ? TRUE : FALSE; (pszPath[2] == '?') && (pszPath[3] == '\\')) ? TRUE : FALSE;
if (hasPrefix) if (hasPrefix)
{ {
if (cchPath < 7) if (cchPath < 6)
return S_FALSE; return S_FALSE;
deviceNamespace = ((pszPath[5] == ':') && (pszPath[6] == '\\')) ? TRUE : FALSE; if (IsCharAlpha(pszPath[4]) && (pszPath[5] == ':')) /* like C: */
if (deviceNamespace)
{ {
memmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4); memmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
/* since the passed pszPath must not necessarily be null terminated
* and we always have enough space after the strip we can always
* ensure the null termination of the stripped result
*/
pszPath[cchPath - 4] = 0;
return S_OK; return S_OK;
} }
} }
@ -665,27 +709,32 @@ HRESULT PathCchStripPrefixA(PSTR pszPath, size_t cchPath)
HRESULT PathCchStripPrefixW(PWSTR pszPath, size_t cchPath) HRESULT PathCchStripPrefixW(PWSTR pszPath, size_t cchPath)
{ {
BOOL hasPrefix; BOOL hasPrefix;
BOOL deviceNamespace;
if (!pszPath) if (!pszPath)
return S_FALSE; return E_INVALIDARG;
if (cchPath < 4) if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
return S_FALSE; return E_INVALIDARG;
hasPrefix = ((pszPath[0] == '\\') && (pszPath[1] == '\\') && hasPrefix = ((pszPath[0] == '\\') && (pszPath[1] == '\\') &&
(pszPath[2] == '?') && (pszPath[3] == '\\')) ? TRUE : FALSE; (pszPath[2] == '?') && (pszPath[3] == '\\')) ? TRUE : FALSE;
if (hasPrefix) if (hasPrefix)
{ {
if (cchPath < 7) if (cchPath < 6)
return S_FALSE; return S_FALSE;
deviceNamespace = ((pszPath[5] == ':') && (pszPath[6] == '\\')) ? TRUE : FALSE; if (cchPath < (lstrlenW(&pszPath[4]) + 1))
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
if (deviceNamespace) if (IsCharAlpha(pszPath[4]) && (pszPath[5] == ':')) /* like C: */
{ {
wmemmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4); wmemmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
/* since the passed pszPath must not necessarily be null terminated
* and we always have enough space after the strip we can always
* ensure the null termination of the stripped result
*/
pszPath[cchPath - 4] = 0;
return S_OK; return S_OK;
} }
} }
@ -699,12 +748,14 @@ HRESULT PathCchStripPrefixW(PWSTR pszPath, size_t cchPath)
HRESULT PathCchRemoveFileSpecA(PSTR pszPath, size_t cchPath) HRESULT PathCchRemoveFileSpecA(PSTR pszPath, size_t cchPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
HRESULT PathCchRemoveFileSpecW(PWSTR pszPath, size_t cchPath) HRESULT PathCchRemoveFileSpecW(PWSTR pszPath, size_t cchPath)
{ {
return 0; WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
return E_NOTIMPL;
} }
/* /*
@ -760,13 +811,13 @@ HRESULT PathCchConvertStyleA(PSTR pszPath, size_t cchPath, unsigned long dwFlags
else else
{ {
/* Unexpected error */ /* Unexpected error */
return S_FALSE; return E_FAIL;
} }
} }
else else
{ {
/* Gangnam style? */ /* Gangnam style? */
return S_FALSE; return E_FAIL;
} }
return S_OK; return S_OK;
@ -817,13 +868,13 @@ HRESULT PathCchConvertStyleW(PWSTR pszPath, size_t cchPath, unsigned long dwFlag
else else
{ {
/* Unexpected error */ /* Unexpected error */
return S_FALSE; return E_FAIL;
} }
} }
else else
{ {
/* Gangnam style? */ /* Gangnam style? */
return S_FALSE; return E_FAIL;
} }
return S_OK; return S_OK;

View File

@ -28,11 +28,19 @@
#include <winpr/crt.h> #include <winpr/crt.h>
#include <winpr/heap.h> #include <winpr/heap.h>
#include <winpr/file.h>
#include <winpr/tchar.h> #include <winpr/tchar.h>
#include <winpr/environment.h> #include <winpr/environment.h>
#include <winpr/path.h> #include <winpr/path.h>
#if defined(WIN32)
#include <Shlobj.h>
#endif
static char* GetPath_XDG_CONFIG_HOME(void);
static char* GetPath_XDG_RUNTIME_DIR(void);
/** /**
* SHGetKnownFolderPath function: * SHGetKnownFolderPath function:
* http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188/ * http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188/
@ -43,7 +51,7 @@
* http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html * http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
*/ */
char* GetEnvAlloc(LPCSTR lpName) static char* GetEnvAlloc(LPCSTR lpName)
{ {
DWORD length; DWORD length;
char* env = NULL; char* env = NULL;
@ -62,7 +70,7 @@ char* GetEnvAlloc(LPCSTR lpName)
return env; return env;
} }
char* GetPath_HOME() static char* GetPath_HOME(void)
{ {
char* path = NULL; char* path = NULL;
@ -80,7 +88,7 @@ char* GetPath_HOME()
return path; return path;
} }
char* GetPath_TEMP() static char* GetPath_TEMP(void)
{ {
char* path = NULL; char* path = NULL;
@ -96,11 +104,14 @@ char* GetPath_TEMP()
return path; return path;
} }
char* GetPath_XDG_DATA_HOME() static char* GetPath_XDG_DATA_HOME(void)
{ {
char* path = NULL; char* path = NULL;
char* home = NULL;
#if defined(WIN32)
path = GetPath_XDG_CONFIG_HOME();
#else
char* home = NULL;
/** /**
* There is a single base directory relative to which user-specific data files should be written. * There is a single base directory relative to which user-specific data files should be written.
* This directory is defined by the environment variable $XDG_DATA_HOME. * This directory is defined by the environment variable $XDG_DATA_HOME.
@ -127,15 +138,28 @@ char* GetPath_XDG_DATA_HOME()
sprintf(path, "%s%s", home, "/.local/share"); sprintf(path, "%s%s", home, "/.local/share");
free(home); free(home);
#endif
return path; return path;
} }
char* GetPath_XDG_CONFIG_HOME() static char* GetPath_XDG_CONFIG_HOME(void)
{ {
char* path = NULL; char* path = NULL;
char* home = NULL;
#if defined(WIN32)
path = calloc(MAX_PATH, sizeof(char));
if (!path)
return NULL;
if (SHGetFolderPathA(0, CSIDL_APPDATA, NULL,
SHGFP_TYPE_CURRENT, path) != S_OK)
{
free(path);
return NULL;
}
#else
char* home = NULL;
/** /**
* There is a single base directory relative to which user-specific configuration files should be written. * There is a single base directory relative to which user-specific configuration files should be written.
* This directory is defined by the environment variable $XDG_CONFIG_HOME. * This directory is defined by the environment variable $XDG_CONFIG_HOME.
@ -166,15 +190,27 @@ char* GetPath_XDG_CONFIG_HOME()
sprintf(path, "%s%s", home, "/.config"); sprintf(path, "%s%s", home, "/.config");
free(home); free(home);
#endif
return path; return path;
} }
char* GetPath_XDG_CACHE_HOME() static char* GetPath_XDG_CACHE_HOME(void)
{ {
char* path = NULL; char* path = NULL;
char* home = NULL; char* home = NULL;
#if defined(WIN32)
home = GetPath_XDG_RUNTIME_DIR();
if (home)
{
path = GetCombinedPath(home, "cache");
if (!PathFileExistsA(path))
if (!CreateDirectoryA(path, NULL))
path = NULL;
}
free(home);
#else
/** /**
* There is a single base directory relative to which user-specific non-essential (cached) data should be written. * 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. * This directory is defined by the environment variable $XDG_CACHE_HOME.
@ -201,14 +237,26 @@ char* GetPath_XDG_CACHE_HOME()
sprintf(path, "%s%s", home, "/.cache"); sprintf(path, "%s%s", home, "/.cache");
free(home); free(home);
#endif
return path; return path;
} }
char* GetPath_XDG_RUNTIME_DIR() char* GetPath_XDG_RUNTIME_DIR(void)
{ {
char* path = NULL; char* path = NULL;
#if defined(WIN32)
path = calloc(MAX_PATH, sizeof(char));
if (!path)
return NULL;
if (SHGetFolderPathA(0, CSIDL_LOCAL_APPDATA, NULL,
SHGFP_TYPE_CURRENT, path) != S_OK)
{
free(path);
return NULL;
}
#else
/** /**
* There is a single base directory relative to which user-specific runtime files and other file objects should be placed. * There is a single base directory relative to which user-specific runtime files and other file objects should be placed.
* This directory is defined by the environment variable $XDG_RUNTIME_DIR. * This directory is defined by the environment variable $XDG_RUNTIME_DIR.
@ -237,6 +285,7 @@ char* GetPath_XDG_RUNTIME_DIR()
*/ */
path = GetEnvAlloc("XDG_RUNTIME_DIR"); path = GetEnvAlloc("XDG_RUNTIME_DIR");
#endif
if (path) if (path)
return path; return path;
@ -372,6 +421,50 @@ char* GetCombinedPath(const char* basePath, const char* subPath)
return path; return path;
} }
BOOL PathMakePathA(LPCSTR path, LPSECURITY_ATTRIBUTES lpAttributes)
{
size_t length;
const char delim = PathGetSeparatorA(0);
char* cur;
char* copy_org = _strdup(path);
char* copy = copy_org;
if (!copy_org)
return FALSE;
length = strlen(copy_org);
/* Find first path element that exists. */
while (copy)
{
if (!PathFileExistsA(copy))
{
cur = strrchr(copy, delim);
if (cur)
*cur = '\0';
}
else
break;
}
/* Create directories. */
while(copy)
{
if (!PathFileExistsA(copy))
{
if (!CreateDirectoryA(copy, NULL))
break;
}
if (strlen(copy) < length)
copy[strlen(copy)] = delim;
else
break;
}
free (copy_org);
return PathFileExistsA(path);
}
BOOL PathFileExistsA(LPCSTR pszPath) BOOL PathFileExistsA(LPCSTR pszPath)
{ {
struct stat stat_info; struct stat stat_info;

View File

@ -27,7 +27,8 @@ set(${MODULE_PREFIX}_TESTS
TestPathCchStripToRoot.c TestPathCchStripToRoot.c
TestPathCchStripPrefix.c TestPathCchStripPrefix.c
TestPathCchRemoveFileSpec.c TestPathCchRemoveFileSpec.c
TestPathShell.c) TestPathShell.c
TestPathMakePath.c)
create_test_sourcelist(${MODULE_PREFIX}_SRCS create_test_sourcelist(${MODULE_PREFIX}_SRCS
${${MODULE_PREFIX}_DRIVER} ${${MODULE_PREFIX}_DRIVER}

View File

@ -7,6 +7,7 @@
int TestPathAllocCanonicalize(int argc, char* argv[]) int TestPathAllocCanonicalize(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -13,6 +13,12 @@ int TestPathCchAddBackslash(int argc, char* argv[])
HRESULT status; HRESULT status;
TCHAR Path[PATHCCH_MAX_CCH]; TCHAR Path[PATHCCH_MAX_CCH];
/**
* PathCchAddBackslash returns S_OK if the function was successful,
* S_FALSE if the path string already ends in a backslash,
* or an error code otherwise.
*/
_tcscpy(Path, testPathNoBackslash); _tcscpy(Path, testPathNoBackslash);
/* Add a backslash to a path without a trailing backslash, expect S_OK */ /* Add a backslash to a path without a trailing backslash, expect S_OK */
@ -21,7 +27,7 @@ int TestPathCchAddBackslash(int argc, char* argv[])
if (status != S_OK) if (status != S_OK)
{ {
_tprintf(_T("PathCchAddBackslash status: 0x%08X\n"), (int) status); _tprintf(_T("PathCchAddBackslash status: 0x%08X\n"), (unsigned) status);
return -1; return -1;
} }
@ -39,7 +45,7 @@ int TestPathCchAddBackslash(int argc, char* argv[])
if (status != S_FALSE) if (status != S_FALSE)
{ {
_tprintf(_T("PathCchAddBackslash status: 0x%08X\n"), (int) status); _tprintf(_T("PathCchAddBackslash status: 0x%08X\n"), (unsigned) status);
return -1; return -1;
} }
@ -49,6 +55,40 @@ int TestPathCchAddBackslash(int argc, char* argv[])
return -1; return -1;
} }
/* Use NULL PSTR, expect FAILED(status) */
status = PathCchAddBackslash(NULL, PATHCCH_MAX_CCH);
if (SUCCEEDED(status))
{
_tprintf(_T("PathCchAddBackslash unexpectedly succeded with null buffer. Status: 0x%08X\n"), (unsigned) status);
return -1;
}
/* Use insufficient size value, expect FAILED(status) */
_tcscpy(Path, _T("C:\\tmp"));
status = PathCchAddBackslash(Path, 7);
if (SUCCEEDED(status))
{
_tprintf(_T("PathCchAddBackslash unexpectedly succeded with insufficient buffer size. Status: 0x%08X\n"), (unsigned) status);
return -1;
}
/* Use minimum required size value, expect S_OK */
_tcscpy(Path, _T("C:\\tmp"));
status = PathCchAddBackslash(Path, 8);
if (status != S_OK)
{
_tprintf(_T("PathCchAddBackslash failed with status: 0x%08X\n"), (unsigned) status);
return -1;
}
return 0; return 0;
} }

View File

@ -15,6 +15,12 @@ int TestPathCchAddBackslashEx(int argc, char* argv[])
size_t cchRemaining; size_t cchRemaining;
TCHAR Path[PATHCCH_MAX_CCH]; TCHAR Path[PATHCCH_MAX_CCH];
/**
* PathCchAddBackslashEx returns S_OK if the function was successful,
* S_FALSE if the path string already ends in a backslash,
* or an error code otherwise.
*/
_tcscpy(Path, testPathNoBackslash); _tcscpy(Path, testPathNoBackslash);
/* Add a backslash to a path without a trailing backslash, expect S_OK */ /* Add a backslash to a path without a trailing backslash, expect S_OK */
@ -51,6 +57,41 @@ int TestPathCchAddBackslashEx(int argc, char* argv[])
return -1; return -1;
} }
/* Use NULL PSTR, expect FAILED(status) */
status = PathCchAddBackslashEx(NULL, PATHCCH_MAX_CCH, NULL, NULL);
if (SUCCEEDED(status))
{
_tprintf(_T("PathCchAddBackslashEx unexpectedly succeded with null buffer. Status: 0x%08X\n"), (unsigned) status);
return -1;
}
/* Use insufficient size value, expect FAILED(status) */
_tcscpy(Path, _T("C:\\tmp"));
status = PathCchAddBackslashEx(Path, 7, NULL, NULL);
if (SUCCEEDED(status))
{
_tprintf(_T("PathCchAddBackslashEx unexpectedly succeded with insufficient buffer size. Status: 0x%08X\n"), (unsigned) status);
return -1;
}
/* Use minimum required size value, expect S_OK */
_tcscpy(Path, _T("C:\\tmp"));
status = PathCchAddBackslashEx(Path, 8, NULL, NULL);
if (status != S_OK)
{
_tprintf(_T("PathCchAddBackslashEx failed with status: 0x%08X\n"), (unsigned) status);
return -1;
}
return 0; return 0;
} }

View File

@ -87,6 +87,45 @@ int TestPathCchAddExtension(int argc, char* argv[])
return -1; return -1;
} }
/* Path: NULL */
status = PathCchAddExtension(NULL, PATHCCH_MAX_CCH, testExtDot);
if (status != E_INVALIDARG)
{
_tprintf(_T("PathCchAddExtension with null buffer returned status: 0x%08X (expected E_INVALIDARG)\n"), status);
return -1;
}
/* Extension: NULL */
status = PathCchAddExtension(Path, PATHCCH_MAX_CCH, NULL);
if (status != E_INVALIDARG)
{
_tprintf(_T("PathCchAddExtension with null extension returned status: 0x%08X (expected E_INVALIDARG)\n"), status);
return -1;
}
/* Insufficient Buffer size */
_tcscpy(Path, _T("C:\\456789"));
status = PathCchAddExtension(Path, 9 + 4, _T(".jpg"));
if (SUCCEEDED(status))
{
_tprintf(_T("PathCchAddExtension with insufficient buffer unexpectedly succeeded with status: 0x%08X\n"), status);
return -1;
}
/* Minimum required buffer size */
_tcscpy(Path, _T("C:\\456789"));
status = PathCchAddExtension(Path, 9 + 4 + 1, _T(".jpg"));
if (FAILED(status))
{
_tprintf(_T("PathCchAddExtension with sufficient buffer unexpectedly failed with status: 0x%08X\n"), status);
return -1;
}
return 0; return 0;
} }

View File

@ -15,6 +15,7 @@ int TestPathCchAppend(int argc, char* argv[])
{ {
HRESULT status; HRESULT status;
TCHAR Path[PATHCCH_MAX_CCH]; TCHAR Path[PATHCCH_MAX_CCH];
size_t i;
/* Base Path: Backslash, More Path: No Backslash */ /* Base Path: Backslash, More Path: No Backslash */
@ -88,6 +89,53 @@ int TestPathCchAppend(int argc, char* argv[])
return -1; return -1;
} }
/* According to msdn a NULL Path is an invalid argument */
status = PathCchAppend(NULL, PATHCCH_MAX_CCH, testMorePathNoBackslash);
if (status != E_INVALIDARG)
{
_tprintf(_T("PathCchAppend with NULL path unexpectedly returned status: 0x%08X\n"), status);
return -1;
}
/* According to msdn a NULL pszMore is an invalid argument (although optional !?) */
_tcscpy(Path, testBasePathNoBackslash);
status = PathCchAppend(Path, PATHCCH_MAX_CCH, NULL);
if (status != E_INVALIDARG)
{
_tprintf(_T("PathCchAppend with NULL pszMore unexpectedly returned status: 0x%08X\n"), status);
return -1;
}
/* According to msdn cchPath must be > 0 and <= PATHCCH_MAX_CCH */
_tcscpy(Path, testBasePathNoBackslash);
status = PathCchAppend(Path, 0, testMorePathNoBackslash);
if (status != E_INVALIDARG)
{
_tprintf(_T("PathCchAppend with cchPath value 0 unexpectedly returned status: 0x%08X\n"), status);
return -1;
}
_tcscpy(Path, testBasePathNoBackslash);
status = PathCchAppend(Path, PATHCCH_MAX_CCH + 1, testMorePathNoBackslash);
if (status != E_INVALIDARG)
{
_tprintf(_T("PathCchAppend with cchPath value > PATHCCH_MAX_CCH unexpectedly returned status: 0x%08X\n"), status);
return -1;
}
/* Resulting file must not exceed PATHCCH_MAX_CCH */
for (i = 0; i < PATHCCH_MAX_CCH - 1; i++)
Path[i] = _T('X');
Path[PATHCCH_MAX_CCH - 1] = 0;
status = PathCchAppend(Path, PATHCCH_MAX_CCH, _T("\\This cannot be appended to Path"));
if (SUCCEEDED(status))
{
_tprintf(_T("PathCchAppend unexepectedly succeeded with status: 0x%08X\n"), status);
return -1;
}
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchAppendEx(int argc, char* argv[]) int TestPathCchAppendEx(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchCanonicalize(int argc, char* argv[]) int TestPathCchCanonicalize(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchCanonicalizeEx(int argc, char* argv[]) int TestPathCchCanonicalizeEx(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchCombine(int argc, char* argv[]) int TestPathCchCombine(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchCombineEx(int argc, char* argv[]) int TestPathCchCombineEx(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -10,13 +10,95 @@ static const char testPathExtension[] = "C:\\Windows\\System32\\cmd.exe";
int TestPathCchFindExtension(int argc, char* argv[]) int TestPathCchFindExtension(int argc, char* argv[])
{ {
PCSTR pszExt; PCSTR pszExt;
PCSTR pszTmp;
HRESULT hr;
/* Test invalid args */
hr = PathCchFindExtensionA(NULL, sizeof(testPathExtension), &pszExt);
if (SUCCEEDED(hr))
{
printf("PathCchFindExtensionA unexpectedly succeeded with pszPath = NULL. result: 0x%08X\n", (ULONG)hr);
return -1;
}
hr = PathCchFindExtensionA(testPathExtension, 0, &pszExt);
if (SUCCEEDED(hr))
{
printf("PathCchFindExtensionA unexpectedly succeeded with cchPath = 0. result: 0x%08X\n", (ULONG)hr);
return -1;
}
hr = PathCchFindExtensionA(testPathExtension, sizeof(testPathExtension), NULL);
if (SUCCEEDED(hr))
{
printf("PathCchFindExtensionA unexpectedly succeeded with ppszExt = NULL. result: 0x%08X\n", (ULONG)hr);
return -1;
}
/* Test missing null-termination of pszPath */
hr = PathCchFindExtensionA(_T("c:\\456.789"), 9, &pszExt);
if (SUCCEEDED(hr))
{
printf("PathCchFindExtensionA unexpectedly succeeded with unterminated pszPath. result: 0x%08X\n", (ULONG)hr);
return -1;
}
/* Test passing of an empty terminated string (must succeed) */
pszExt = NULL;
pszTmp = _T("");
hr = PathCchFindExtensionA(pszTmp, 1, &pszExt);
if (hr != S_OK)
{
printf("PathCchFindExtensionA failed with an empty terminated string. result: 0x%08X\n", (ULONG)hr);
return -1;
}
/* pszExt must point to the strings terminating 0 now */
if (pszExt != pszTmp)
{
printf("PathCchFindExtensionA failed with an empty terminated string: pszExt pointer mismatch\n");
return -1;
}
/* Test a path without file extension (must succeed) */
pszExt = NULL;
pszTmp = _T("c:\\4.678\\");
hr = PathCchFindExtensionA(pszTmp, 10, &pszExt);
if (hr != S_OK)
{
printf("PathCchFindExtensionA failed with a directory path. result: 0x%08X\n", (ULONG)hr);
return -1;
}
/* The extension must not have been found and pszExt must point to the
* strings terminating NULL now */
if (pszExt != &pszTmp[9])
{
printf("PathCchFindExtensionA failed with a directory path: pszExt pointer mismatch\n");
return -1;
}
/* Non-special tests */
pszExt = NULL;
if (PathCchFindExtensionA(testPathExtension, sizeof(testPathExtension), &pszExt) != S_OK) if (PathCchFindExtensionA(testPathExtension, sizeof(testPathExtension), &pszExt) != S_OK)
{ {
printf("PathCchFindExtensionA failure: expected S_OK\n"); printf("PathCchFindExtensionA failure: expected S_OK\n");
return -1; return -1;
} }
if (!pszExt || _tcscmp(pszExt, _T(".exe")))
{
printf("PathCchFindExtensionA failure: unexpected extension\n");
return -1;
}
printf("Extension: %s\n", pszExt); printf("Extension: %s\n", pszExt);
return 0; return 0;

View File

@ -7,6 +7,7 @@
int TestPathCchIsRoot(int argc, char* argv[]) int TestPathCchIsRoot(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchRemoveBackslash(int argc, char* argv[]) int TestPathCchRemoveBackslash(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchRemoveBackslashEx(int argc, char* argv[]) int TestPathCchRemoveBackslashEx(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchRemoveExtension(int argc, char* argv[]) int TestPathCchRemoveExtension(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchRemoveFileSpec(int argc, char* argv[]) int TestPathCchRemoveFileSpec(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchRenameExtension(int argc, char* argv[]) int TestPathCchRenameExtension(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchSkipRoot(int argc, char* argv[]) int TestPathCchSkipRoot(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -12,6 +12,8 @@
static const TCHAR testPathPrefixFileNamespace[] = _T("\\\\?\\C:\\Program Files\\"); static const TCHAR testPathPrefixFileNamespace[] = _T("\\\\?\\C:\\Program Files\\");
static const TCHAR testPathNoPrefixFileNamespace[] = _T("C:\\Program Files\\"); static const TCHAR testPathNoPrefixFileNamespace[] = _T("C:\\Program Files\\");
static const TCHAR testPathPrefixFileNamespaceMinimum[] = _T("\\\\?\\C:");
static const TCHAR testPathNoPrefixFileNamespaceMinimum[] = _T("C:");
static const TCHAR testPathPrefixDeviceNamespace[] = _T("\\\\?\\GLOBALROOT"); static const TCHAR testPathPrefixDeviceNamespace[] = _T("\\\\?\\GLOBALROOT");
@ -19,6 +21,13 @@ int TestPathCchStripPrefix(int argc, char* argv[])
{ {
HRESULT status; HRESULT status;
TCHAR Path[PATHCCH_MAX_CCH]; TCHAR Path[PATHCCH_MAX_CCH];
int i;
/**
* PathCchStripPrefix returns S_OK if the prefix was removed, S_FALSE if
* the path did not have a prefix to remove, or an HRESULT failure code.
*/
/* Path with prefix (File Namespace) */ /* Path with prefix (File Namespace) */
@ -56,6 +65,53 @@ int TestPathCchStripPrefix(int argc, char* argv[])
return -1; return -1;
} }
/* NULL Path */
status = PathCchStripPrefix(NULL, PATHCCH_MAX_CCH);
if (status != E_INVALIDARG)
{
_tprintf(_T("PathCchStripPrefix with null path unexpectedly succeeded with status 0x%08X\n"), status);
return -1;
}
/* Invalid cchPath values: 0, 1, 2, 3 and > PATHCCH_MAX_CCH */
for (i = 0; i < 5; i++)
{
_tcscpy(Path, testPathPrefixFileNamespace);
if (i == 4)
i = PATHCCH_MAX_CCH + 1;
status = PathCchStripPrefix(Path, i);
if (status != E_INVALIDARG)
{
_tprintf(_T("PathCchStripPrefix with invalid cchPath value %d unexpectedly succeeded with status 0x%08X\n"), i, status);
return -1;
}
}
/* Minimum Path that would get successfully stripped on windows */
_tcscpy(Path, testPathPrefixFileNamespaceMinimum);
i = sizeof(testPathPrefixFileNamespaceMinimum) / sizeof(TCHAR);
i = i - 1; /* include testing of a non-null terminated string */
status = PathCchStripPrefix(Path, i);
if (status != S_OK)
{
_tprintf(_T("PathCchStripPrefix with minimum valid strippable path length unexpectedly returned status 0x%08X\n"), status);
return -1;
}
if (_tcscmp(Path, testPathNoPrefixFileNamespaceMinimum))
{
_tprintf(_T("Path Mismatch: Actual: %s, Expected: %s\n"), Path, testPathNoPrefixFileNamespaceMinimum);
return -1;
}
/* Invalid drive letter symbol */
_tcscpy(Path, _T("\\\\?\\5:"));
status = PathCchStripPrefix(Path, 6);
if (status == S_OK)
{
_tprintf(_T("PathCchStripPrefix with invalid drive letter symbol unexpectedly succeeded\n"));
return -1;
}
return 0; return 0;
} }

View File

@ -7,6 +7,7 @@
int TestPathCchStripToRoot(int argc, char* argv[]) int TestPathCchStripToRoot(int argc, char* argv[])
{ {
printf("Warning: %s is not implemented!\n", __FUNCTION__);
return 0; return 0;
} }

View File

@ -0,0 +1,75 @@
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <winpr/crt.h>
#include <winpr/file.h>
#include <winpr/path.h>
int TestPathMakePath(int argc, char* argv[])
{
int x;
size_t baseLen;
BOOL success;
char tmp[64];
char* path;
char* cur;
char delim = PathGetSeparatorA(0);
char* base = GetKnownPath(KNOWN_PATH_TEMP);
if (!base)
{
fprintf(stderr, "Failed to get temporary directory!\n");
return -1;
}
baseLen = strlen(base);
srand(time(NULL));
for (x=0; x<5; x++)
{
sprintf(tmp, "%08X", rand());
path = GetCombinedPath(base, tmp);
free(base);
if (!path)
{
fprintf(stderr, "GetCombinedPath failed!\n");
return -1;
}
base = path;
}
printf("Creating path %s\n", path);
success = PathMakePathA(path, NULL);
if (!success)
{
fprintf(stderr, "MakePath failed!\n");
free (path);
return -1;
}
success = PathFileExistsA(path);
if (!success)
{
fprintf(stderr, "MakePath lied about success!\n");
free (path);
return -1;
}
while (strlen(path) > baseLen)
{
if (!RemoveDirectoryA(path))
{
fprintf(stderr, "RemoveDirectoryA %s failed!\n", path);
free (path);
return -1;
}
cur = strrchr(path, delim);
if (cur)
*cur = '\0';
}
free (path);
printf("%s success!\n", __FUNCTION__);
return 0;
}

View File

@ -1276,7 +1276,7 @@ void Inspect_InitLog()
return; return;
if (!PathFileExistsA(filepath)) if (!PathFileExistsA(filepath))
if (!CreateDirectoryA(filepath, NULL)) if (!PathMakePathA(filepath, NULL))
return; return;
if (!(g_Log = WLog_Get("WinSCard"))) if (!(g_Log = WLog_Get("WinSCard")))

View File

@ -21,6 +21,8 @@
#include "config.h" #include "config.h"
#endif #endif
#include <assert.h>
#include "ntlm.h" #include "ntlm.h"
#include "../sspi.h" #include "../sspi.h"
@ -143,6 +145,7 @@ NTLM_AV_PAIR* ntlm_av_pair_add(NTLM_AV_PAIR* pAvPairList, NTLM_AV_ID AvId, PBYTE
if (!pAvPair) if (!pAvPair)
return NULL; return NULL;
assert(Value != NULL);
pAvPair->AvId = AvId; pAvPair->AvId = AvId;
pAvPair->AvLen = AvLen; pAvPair->AvLen = AvLen;
CopyMemory(ntlm_av_pair_get_value_pointer(pAvPair), Value, AvLen); CopyMemory(ntlm_av_pair_get_value_pointer(pAvPair), Value, AvLen);

View File

@ -37,9 +37,10 @@
#ifdef HAVE_EVENTFD_H #ifdef HAVE_EVENTFD_H
#include <sys/eventfd.h> #include <sys/eventfd.h>
#include <errno.h>
#endif #endif
#include <errno.h>
#include "../handle/handle.h" #include "../handle/handle.h"
#include "../pipe/pipe.h" #include "../pipe/pipe.h"
@ -219,7 +220,6 @@ BOOL SetEvent(HANDLE hEvent)
status = (length == 0) ? TRUE : FALSE; status = (length == 0) ? TRUE : FALSE;
#else #else
if (WaitForSingleObject(hEvent, 0) != WAIT_OBJECT_0) if (WaitForSingleObject(hEvent, 0) != WAIT_OBJECT_0)
{ {
length = write(event->pipe_fd[1], "-", 1); length = write(event->pipe_fd[1], "-", 1);
@ -243,36 +243,29 @@ BOOL ResetEvent(HANDLE hEvent)
ULONG Type; ULONG Type;
PVOID Object; PVOID Object;
int length; int length;
BOOL status; BOOL status = TRUE;
WINPR_EVENT* event; WINPR_EVENT* event;
status = FALSE;
if (winpr_Handle_GetInfo(hEvent, &Type, &Object)) if (!winpr_Handle_GetInfo(hEvent, &Type, &Object))
{ return FALSE;
event = (WINPR_EVENT*) Object; event = (WINPR_EVENT*) Object;
while (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0) while (status && WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
{
do
{ {
#ifdef HAVE_EVENTFD_H #ifdef HAVE_EVENTFD_H
eventfd_t value; eventfd_t value;
do
{
length = eventfd_read(event->pipe_fd[0], &value); length = eventfd_read(event->pipe_fd[0], &value);
#else
length = read(event->pipe_fd[0], &length, 1);
#endif
} }
while ((length < 0) && (errno == EINTR)); while ((length < 0) && (errno == EINTR));
if ((length > 0) && (!status)) if (length < 0)
status = TRUE; status = FALSE;
#else
length = read(event->pipe_fd[0], &length, 1);
if ((length == 1) && (!status))
status = TRUE;
#endif
}
} }
return status; return status;

View File

@ -5,6 +5,19 @@
int TestSynchEvent(int argc, char* argv[]) int TestSynchEvent(int argc, char* argv[])
{ {
HANDLE event; HANDLE event;
int i;
if (ResetEvent(NULL))
{
printf("ResetEvent(NULL) unexpectedly succeeded\n");
return -1;
}
if (SetEvent(NULL))
{
printf("SetEvent(NULL) unexpectedly succeeded\n");
return -1;
}
event = CreateEvent(NULL, TRUE, TRUE, NULL); event = CreateEvent(NULL, TRUE, TRUE, NULL);
@ -16,23 +29,62 @@ int TestSynchEvent(int argc, char* argv[])
if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0)
{ {
printf("WaitForSingleObject(event, INFINITE) failure\n"); printf("WaitForSingleObject failure 1\n");
return -1; return -1;
} }
ResetEvent(event); if (!ResetEvent(event))
{
printf("ResetEvent failure with signaled event object\n");
return -1;
}
if (WaitForSingleObject(event, 0) != WAIT_TIMEOUT) if (WaitForSingleObject(event, 0) != WAIT_TIMEOUT)
{ {
printf("WaitForSingleObject(event, 0) failure\n"); printf("WaitForSingleObject failure 2\n");
return -1; return -1;
} }
SetEvent(event); if (!ResetEvent(event))
{
/* Note: ResetEvent must also succeed if event is currently nonsignaled */
printf("ResetEvent failure with nonsignaled event object\n");
return -1;
}
if (!SetEvent(event))
{
printf("SetEvent failure with nonsignaled event object\n");
return -1;
}
if (WaitForSingleObject(event, 0) != WAIT_OBJECT_0) if (WaitForSingleObject(event, 0) != WAIT_OBJECT_0)
{ {
printf("WaitForSingleObject(event, 0) failure\n"); printf("WaitForSingleObject failure 3\n");
return -1;
}
for (i = 0; i < 10000; i++)
{
if (!SetEvent(event))
{
printf("SetEvent failure with signaled event object (i = %d)\n", i);
return -1;
}
}
if (!ResetEvent(event))
{
printf("ResetEvent failure after multiple SetEvent calls\n");
return -1;
}
/* Independent of the amount of the previous SetEvent calls, a single
ResetEvent must be sufficient to get into nonsignaled state */
if (WaitForSingleObject(event, 0) != WAIT_TIMEOUT)
{
printf("WaitForSingleObject failure 4\n");
return -1; return -1;
} }

View File

@ -678,6 +678,21 @@ BOOL IsProcessorFeaturePresent(DWORD ProcessorFeature)
#endif //_WIN32 #endif //_WIN32
DWORD GetTickCountPrecise(void)
{
#ifdef _WIN32
LARGE_INTEGER freq;
LARGE_INTEGER current;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&current);
return (DWORD) (current.QuadPart * 1000LL / freq.QuadPart);
#else
return GetTickCount();
#endif
}
BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature) BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature)
{ {
BOOL ret = FALSE; BOOL ret = FALSE;

View File

@ -67,8 +67,9 @@ BOOL MessageQueue_Wait(wMessageQueue* queue)
return status; return status;
} }
void MessageQueue_Dispatch(wMessageQueue* queue, wMessage* message) BOOL MessageQueue_Dispatch(wMessageQueue* queue, wMessage* message)
{ {
BOOL ret = FALSE;
EnterCriticalSection(&queue->lock); EnterCriticalSection(&queue->lock);
if (queue->size == queue->capacity) if (queue->size == queue->capacity)
@ -82,7 +83,7 @@ void MessageQueue_Dispatch(wMessageQueue* queue, wMessage* message)
new_arr = (wMessage*) realloc(queue->array, sizeof(wMessage) * new_capacity); new_arr = (wMessage*) realloc(queue->array, sizeof(wMessage) * new_capacity);
if (!new_arr) if (!new_arr)
return; goto out;
queue->array = new_arr; queue->array = new_arr;
queue->capacity = new_capacity; queue->capacity = new_capacity;
ZeroMemory(&(queue->array[old_capacity]), old_capacity * sizeof(wMessage)); ZeroMemory(&(queue->array[old_capacity]), old_capacity * sizeof(wMessage));
@ -104,10 +105,13 @@ void MessageQueue_Dispatch(wMessageQueue* queue, wMessage* message)
if (queue->size > 0) if (queue->size > 0)
SetEvent(queue->event); SetEvent(queue->event);
ret = TRUE;
out:
LeaveCriticalSection(&queue->lock); LeaveCriticalSection(&queue->lock);
return ret;
} }
void MessageQueue_Post(wMessageQueue* queue, void* context, UINT32 type, void* wParam, void* lParam) BOOL MessageQueue_Post(wMessageQueue* queue, void* context, UINT32 type, void* wParam, void* lParam)
{ {
wMessage message; wMessage message;
@ -117,12 +121,12 @@ void MessageQueue_Post(wMessageQueue* queue, void* context, UINT32 type, void* w
message.lParam = lParam; message.lParam = lParam;
message.Free = NULL; message.Free = NULL;
MessageQueue_Dispatch(queue, &message); return MessageQueue_Dispatch(queue, &message);
} }
void MessageQueue_PostQuit(wMessageQueue* queue, int nExitCode) BOOL MessageQueue_PostQuit(wMessageQueue* queue, int nExitCode)
{ {
MessageQueue_Post(queue, NULL, WMQ_QUIT, (void*) (size_t) nExitCode, NULL); return MessageQueue_Post(queue, NULL, WMQ_QUIT, (void*) (size_t) nExitCode, NULL);
} }
int MessageQueue_Get(wMessageQueue* queue, wMessage* message) int MessageQueue_Get(wMessageQueue* queue, wMessage* message)
@ -187,43 +191,34 @@ wMessageQueue* MessageQueue_New(const wObject *callback)
{ {
wMessageQueue* queue = NULL; wMessageQueue* queue = NULL;
queue = (wMessageQueue*) malloc(sizeof(wMessageQueue)); queue = (wMessageQueue*) calloc(1, sizeof(wMessageQueue));
if (!queue)
if (queue) return NULL;
{
queue->head = 0;
queue->tail = 0;
queue->size = 0;
queue->capacity = 32; queue->capacity = 32;
queue->array = (wMessage*) calloc(1, sizeof(wMessage) * queue->capacity); queue->array = (wMessage*) calloc(queue->capacity, sizeof(wMessage));
if (!queue->array) if (!queue->array)
{ goto error_array;
free(queue);
return NULL;
}
if (!InitializeCriticalSectionAndSpinCount(&queue->lock, 4000)) if (!InitializeCriticalSectionAndSpinCount(&queue->lock, 4000))
{ goto error_spinlock;
free(queue);
return NULL;
}
queue->event = CreateEvent(NULL, TRUE, FALSE, NULL); queue->event = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!queue->event) if (!queue->event)
{ goto error_event;
free(queue->array);
DeleteCriticalSection(&queue->lock);
free(queue);
return NULL;
}
if (callback) if (callback)
queue->object = *callback; queue->object = *callback;
else
ZeroMemory(&queue->object, sizeof(queue->object));
}
return queue; return queue;
error_event:
DeleteCriticalSection(&queue->lock);
error_spinlock:
free(queue->array);
error_array:
free(queue);
return NULL;
} }
void MessageQueue_Free(wMessageQueue* queue) void MessageQueue_Free(wMessageQueue* queue)

View File

@ -17,23 +17,38 @@ static void *read_image(const char *src, size_t *size)
FILE *fsrc = fopen(src, "r"); FILE *fsrc = fopen(src, "r");
if (!fsrc) if (!fsrc)
{
fprintf(stderr, "Failed to open file %s\n", src);
goto cleanup; goto cleanup;
}
if (fseek(fsrc, 0, SEEK_END)) if (fseek(fsrc, 0, SEEK_END))
{
fprintf(stderr, "Failed to seek to file end\n");
goto cleanup; goto cleanup;
}
src_size = ftell(fsrc); src_size = ftell(fsrc);
if (fseek(fsrc, 0, SEEK_SET)) if (fseek(fsrc, 0, SEEK_SET))
{
fprintf(stderr, "Failed to seek to SEEK_SET\n");
goto cleanup; goto cleanup;
}
a = malloc(src_size); a = malloc(src_size);
if (!a) if (!a)
{
fprintf(stderr, "Failed malloc %zd bytes\n", src_size);
goto cleanup; goto cleanup;
}
if (fread(a, sizeof(char), src_size, fsrc) != src_size) if (fread(a, sizeof(char), src_size, fsrc) != src_size)
{
fprintf(stderr, "Failed read %zd bytes\n", src_size);
goto cleanup; goto cleanup;
}
success = 1; success = 1;
*size = src_size; *size = src_size;
@ -50,51 +65,50 @@ cleanup:
return a; return a;
} }
static int img_compare(wImage *image, wImage *image2, BOOL ignoreType)
static int compare(const char *src, const char *dst)
{
int cmp = -1;
size_t asize, bsize;
void *a, *b;
a = read_image(src, &asize);
b = read_image(dst, &bsize);
if (!a || !b || (asize != bsize))
goto cleanup;
cmp = memcmp(a, b, asize);
cleanup:
free(a);
free(b);
return cmp;
}
static int img_compare(wImage *image, wImage *image2)
{ {
int rc = -1; int rc = -1;
if (image->type != image2->type) if ((image->type != image2->type) && !ignoreType)
{
fprintf(stderr, "Image type mismatch %d:%d\n", image->type, image2->type);
goto cleanup; goto cleanup;
}
if (image->width != image2->width) if (image->width != image2->width)
{
fprintf(stderr, "Image width mismatch %d:%d\n", image->width, image2->width);
goto cleanup; goto cleanup;
}
if (image->height != image2->height) if (image->height != image2->height)
{
fprintf(stderr, "Image height mismatch %d:%d\n", image->height, image2->height);
goto cleanup; goto cleanup;
}
if (image->scanline != image2->scanline) if (image->scanline != image2->scanline)
{
fprintf(stderr, "Image scanline mismatch %d:%d\n", image->scanline, image2->scanline);
goto cleanup; goto cleanup;
}
if (image->bitsPerPixel != image2->bitsPerPixel) if (image->bitsPerPixel != image2->bitsPerPixel)
{
fprintf(stderr, "Image bitsPerPixel mismatch %d:%d\n", image->bitsPerPixel, image2->bitsPerPixel);
goto cleanup; goto cleanup;
}
if (image->bytesPerPixel != image2->bytesPerPixel) if (image->bytesPerPixel != image2->bytesPerPixel)
{
fprintf(stderr, "Image bytesPerPixel mismatch %d:%d\n", image->bytesPerPixel, image2->bytesPerPixel);
goto cleanup; goto cleanup;
}
rc = memcmp(image->data, image2->data, image->scanline * image->height); rc = memcmp(image->data, image2->data, image->scanline * image->height);
if (rc)
fprintf(stderr, "Image data mismatch!\n");
cleanup: cleanup:
return rc; return rc;
} }
@ -107,12 +121,16 @@ static wImage *get_image(const char *src)
image = winpr_image_new(); image = winpr_image_new();
if (!image) if (!image)
{
fprintf(stderr, "Failed to create image!");
goto cleanup; goto cleanup;
}
status = winpr_image_read(image, src); status = winpr_image_read(image, src);
if (status < 0) if (status < 0)
{ {
fprintf(stderr, "Failed to read image %s!", src);
winpr_image_free(image, TRUE); winpr_image_free(image, TRUE);
image = NULL; image = NULL;
} }
@ -132,7 +150,10 @@ static int create_test(const char *src, const char *dst_png, const char *dst_bmp
wImage* image = NULL, *image2 = NULL, *image3 = NULL, *image4 = NULL; wImage* image = NULL, *image2 = NULL, *image3 = NULL, *image4 = NULL;
if (!PathFileExistsA(src)) if (!PathFileExistsA(src))
{
fprintf(stderr, "File %s does not exist!", src);
return -1; return -1;
}
image = get_image(src); image = get_image(src);
@ -145,30 +166,45 @@ static int create_test(const char *src, const char *dst_png, const char *dst_bmp
status = winpr_image_write(image, dst_bmp); status = winpr_image_write(image, dst_bmp);
if (status < 0) if (status < 0)
{
fprintf(stderr, "Failed to write image %s!\n", dst_bmp);
goto cleanup; goto cleanup;
}
image->type = WINPR_IMAGE_PNG; image->type = WINPR_IMAGE_PNG;
status = winpr_image_write(image, dst_png); status = winpr_image_write(image, dst_png);
if (status < 0) if (status < 0)
{
fprintf(stderr, "Failed to write image %s!\n", dst_png);
goto cleanup; goto cleanup;
}
/* Read image from buffer, compare. */ /* Read image from buffer, compare. */
buffer = read_image(src, &bsize); buffer = read_image(src, &bsize);
if (!buffer) if (!buffer)
{
fprintf(stderr, "Failed to read image %s!\n", src);
goto cleanup; goto cleanup;
}
image2 = winpr_image_new(); image2 = winpr_image_new();
if (!image2) if (!image2)
{
fprintf(stderr, "Failed to create image!\n");
goto cleanup; goto cleanup;
}
status = winpr_image_read_buffer(image2, buffer, bsize); status = winpr_image_read_buffer(image2, buffer, bsize);
if (status < 0) if (status < 0)
{
fprintf(stderr, "Failed to read buffer!\n");
goto cleanup; goto cleanup;
}
rc = img_compare(image, image2); rc = img_compare(image, image2, TRUE);
if (rc) if (rc)
goto cleanup; goto cleanup;
@ -176,7 +212,7 @@ static int create_test(const char *src, const char *dst_png, const char *dst_bmp
if (!image3) if (!image3)
goto cleanup; goto cleanup;
rc = img_compare(image, image3); rc = img_compare(image, image3, TRUE);
if (rc) if (rc)
goto cleanup; goto cleanup;
@ -184,8 +220,7 @@ static int create_test(const char *src, const char *dst_png, const char *dst_bmp
if (!image4) if (!image4)
goto cleanup; goto cleanup;
image->type = WINPR_IMAGE_BITMAP; rc = img_compare(image, image4, TRUE);
rc = img_compare(image, image4);
if (rc) if (rc)
goto cleanup; goto cleanup;
@ -235,21 +270,13 @@ int test_image_png_to_bmp()
if (create_test(src_bmp, dst_png2, dst_bmp2)) if (create_test(src_bmp, dst_png2, dst_bmp2))
return -1; return -1;
#if 0 return 0;
if (compare(dst_png2, dst_png))
return -1;
if (compare(dst_bmp2, dst_bmp))
return -1;
#endif
return 1;
} }
int TestImage(int argc, char* argv[]) int TestImage(int argc, char* argv[])
{ {
test_image_png_to_bmp(); int rc = test_image_png_to_bmp();
return 0; return rc;
} }

View File

@ -15,7 +15,8 @@ static void* message_echo_pipe_client_thread(void* arg)
while (index < 100) while (index < 100)
{ {
MessageQueue_Post(pipe->In, NULL, 0, (void*) (size_t) index, NULL); if (!MessageQueue_Post(pipe->In, NULL, 0, (void*) (size_t) index, NULL))
break;
if (!MessageQueue_Wait(pipe->Out)) if (!MessageQueue_Wait(pipe->Out))
break; break;
@ -56,7 +57,8 @@ static void* message_echo_pipe_server_thread(void* arg)
count = (int) (size_t) message.wParam; count = (int) (size_t) message.wParam;
MessageQueue_Dispatch(pipe->Out, &message); if (!MessageQueue_Dispatch(pipe->Out, &message))
break;
} }
} }

View File

@ -42,12 +42,12 @@ int TestMessageQueue(int argc, char* argv[])
return 1; return 1;
} }
MessageQueue_Post(queue, NULL, 123, NULL, NULL); if (!MessageQueue_Post(queue, NULL, 123, NULL, NULL) ||
MessageQueue_Post(queue, NULL, 456, NULL, NULL); !MessageQueue_Post(queue, NULL, 456, NULL, NULL) ||
MessageQueue_Post(queue, NULL, 789, NULL, NULL); !MessageQueue_Post(queue, NULL, 789, NULL, NULL) ||
MessageQueue_PostQuit(queue, 0); !MessageQueue_PostQuit(queue, 0) ||
WaitForSingleObject(thread, INFINITE) != WAIT_OBJECT_0)
WaitForSingleObject(thread, INFINITE); return -1;
MessageQueue_Free(queue); MessageQueue_Free(queue);
CloseHandle(thread); CloseHandle(thread);

View File

@ -98,7 +98,7 @@ int WLog_BinaryAppender_Open(wLog* log, wLogBinaryAppender* appender)
if (!PathFileExistsA(appender->FilePath)) if (!PathFileExistsA(appender->FilePath))
{ {
if (!CreateDirectoryA(appender->FilePath, 0)) if (!PathMakePathA(appender->FilePath, 0))
return -1; return -1;
UnixChangeFileMode(appender->FilePath, 0xFFFF); UnixChangeFileMode(appender->FilePath, 0xFFFF);
} }

View File

@ -95,7 +95,7 @@ int WLog_FileAppender_Open(wLog* log, wLogFileAppender* appender)
if (!PathFileExistsA(appender->FilePath)) if (!PathFileExistsA(appender->FilePath))
{ {
if (!CreateDirectoryA(appender->FilePath, 0)) if (!PathMakePathA(appender->FilePath, 0))
return -1; return -1;
UnixChangeFileMode(appender->FilePath, 0xFFFF); UnixChangeFileMode(appender->FilePath, 0xFFFF);
} }

View File

@ -44,7 +44,7 @@ char* WLog_Message_GetOutputFileName(int id, const char* ext)
if (!PathFileExistsA(FilePath)) if (!PathFileExistsA(FilePath))
{ {
if (!CreateDirectoryA(FilePath, NULL)) if (!PathMakePathA(FilePath, NULL))
{ {
free(FileName); free(FileName);
free(FilePath); free(FilePath);

View File

@ -4,7 +4,7 @@ set(MODULE_PREFIX "TEST_WINPR")
set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c) set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c)
set(${MODULE_PREFIX}_TESTS TestIntrinsics.c) set(${MODULE_PREFIX}_TESTS TestIntrinsics.c TestTypes.c)
create_test_sourcelist(${MODULE_PREFIX}_SRCS create_test_sourcelist(${MODULE_PREFIX}_SRCS
${${MODULE_PREFIX}_DRIVER} ${${MODULE_PREFIX}_DRIVER}

117
winpr/test/TestTypes.c Normal file
View File

@ -0,0 +1,117 @@
/**
* CTest for winpr types and macros
*
* Copyright 2015 Thincast Technologies GmbH
* Copyright 2015 Norbert Federa <norbert.federa@thincast.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <winpr/crt.h>
#include <winpr/error.h>
BOOL TestSucceededFailedMacros(HRESULT hr, char *sym, BOOL isSuccess)
{
BOOL rv = TRUE;
if (SUCCEEDED(hr) && !isSuccess)
{
printf("Error: SUCCEEDED with \"%s\" must be false\n", sym);
rv = FALSE;
}
if (!SUCCEEDED(hr) && isSuccess)
{
printf("Error: SUCCEEDED with \"%s\" must be true\n", sym);
rv = FALSE;
}
if (!FAILED(hr) && !isSuccess)
{
printf("Error: FAILED with \"%s\" must be true\n", sym);
rv = FALSE;
}
if (FAILED(hr) && isSuccess)
{
printf("Error: FAILED with \"%s\" must be false\n", sym);
rv = FALSE;
}
return rv;
}
int TestTypes(int argc, char* argv[])
{
BOOL ok = TRUE;
HRESULT hr;
if (S_OK != (HRESULT)0L)
{
printf("Error: S_OK should be 0\n");
goto err;
}
if (S_FALSE != (HRESULT)1L)
{
printf("Error: S_FALSE should be 1\n");
goto err;
}
/* Test HRESULT success codes */
ok &= TestSucceededFailedMacros(S_OK, "S_OK", TRUE);
ok &= TestSucceededFailedMacros(S_FALSE, "S_FALSE", TRUE);
/* Test some HRESULT error codes */
ok &= TestSucceededFailedMacros(E_NOTIMPL, "E_NOTIMPL", FALSE);
ok &= TestSucceededFailedMacros(E_OUTOFMEMORY, "E_OUTOFMEMORY", FALSE);
ok &= TestSucceededFailedMacros(E_INVALIDARG, "E_INVALIDARG", FALSE);
ok &= TestSucceededFailedMacros(E_FAIL, "E_FAIL", FALSE);
ok &= TestSucceededFailedMacros(E_ABORT, "E_ABORT", FALSE);
/* Test some WIN32 error codes converted to HRESULT*/
hr = HRESULT_FROM_WIN32(ERROR_SUCCESS);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(ERROR_SUCCESS)", TRUE);
hr = HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION)", FALSE);
hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)", FALSE);
hr = HRESULT_FROM_WIN32(ERROR_NOACCESS);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(ERROR_NOACCESS)", FALSE);
hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(ERROR_NOT_FOUND)", FALSE);
hr = HRESULT_FROM_WIN32(ERROR_TIMEOUT);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(ERROR_TIMEOUT)", FALSE);
hr = HRESULT_FROM_WIN32(RPC_S_ZERO_DIVIDE);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(RPC_S_ZERO_DIVIDE)", FALSE);
hr = HRESULT_FROM_WIN32(ERROR_STATIC_INIT);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(ERROR_STATIC_INIT)", FALSE);
hr = HRESULT_FROM_WIN32(ERROR_ENCRYPTION_FAILED);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(ERROR_ENCRYPTION_FAILED)", FALSE);
hr = HRESULT_FROM_WIN32(WSAECANCELLED);
ok &= TestSucceededFailedMacros(hr, "HRESULT_FROM_WIN32(WSAECANCELLED)", FALSE);
if (ok) {
printf("Test completed successfully\n");
return 0;
}
err:
printf("Error: Test failed\n");
return -1;
}