Blame channels/rdpei/rdpei_common.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * Input Virtual Channel Extension
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 * Copyright 2014 David Fort <contact@hardening-consulting.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/stream.h>
Packit 1fb8d4
Packit 1fb8d4
#include "rdpei_common.h"
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_read_2byte_unsigned(wStream* s, UINT32* value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetRemainingLength(s) < 1)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Read_UINT8(s, byte);
Packit 1fb8d4
Packit 1fb8d4
	if (byte & 0x80)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (Stream_GetRemainingLength(s) < 1)
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
Packit 1fb8d4
		*value = (byte & 0x7F) << 8;
Packit 1fb8d4
		Stream_Read_UINT8(s, byte);
Packit 1fb8d4
		*value |= byte;
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		*value = (byte & 0x7F);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_write_2byte_unsigned(wStream* s, UINT32 value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
Packit 1fb8d4
	if (value > 0x7FFF)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (value >= 0x7F)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = ((value & 0x7F00) >> 8);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte | 0x80);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value & 0x7F);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_read_2byte_signed(wStream* s, INT32* value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
	BOOL negative;
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetRemainingLength(s) < 1)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Read_UINT8(s, byte);
Packit 1fb8d4
Packit 1fb8d4
	negative = (byte & 0x40) ? TRUE : FALSE;
Packit 1fb8d4
Packit 1fb8d4
	*value = (byte & 0x3F);
Packit 1fb8d4
Packit 1fb8d4
	if (byte & 0x80)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (Stream_GetRemainingLength(s) < 1)
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
Packit 1fb8d4
		Stream_Read_UINT8(s, byte);
Packit 1fb8d4
		*value = (*value << 8) | byte;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (negative)
Packit 1fb8d4
		*value *= -1;
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_write_2byte_signed(wStream* s, INT32 value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
	BOOL negative = FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (value < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		negative = TRUE;
Packit 1fb8d4
		value *= -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (value > 0x3FFF)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (value >= 0x3F)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = ((value & 0x3F00) >> 8);
Packit 1fb8d4
Packit 1fb8d4
		if (negative)
Packit 1fb8d4
			byte |= 0x40;
Packit 1fb8d4
Packit 1fb8d4
		Stream_Write_UINT8(s, byte | 0x80);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value & 0x3F);
Packit 1fb8d4
Packit 1fb8d4
		if (negative)
Packit 1fb8d4
			byte |= 0x40;
Packit 1fb8d4
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_read_4byte_unsigned(wStream* s, UINT32* value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
	BYTE count;
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetRemainingLength(s) < 1)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Read_UINT8(s, byte);
Packit 1fb8d4
Packit 1fb8d4
	count = (byte & 0xC0) >> 6;
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetRemainingLength(s) < count)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (count)
Packit 1fb8d4
	{
Packit 1fb8d4
		case 0:
Packit 1fb8d4
			*value = (byte & 0x3F);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 1:
Packit 1fb8d4
			*value = (byte & 0x3F) << 8;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 2:
Packit 1fb8d4
			*value = (byte & 0x3F) << 16;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 3:
Packit 1fb8d4
			*value = (byte & 0x3F) << 24;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 16);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_write_4byte_unsigned(wStream* s, UINT32 value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
Packit 1fb8d4
	if (value <= 0x3F)
Packit 1fb8d4
	{
Packit 1fb8d4
		Stream_Write_UINT8(s, value);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x3FFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 8) & 0x3F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte | 0x40);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x3FFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 16) & 0x3F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte | 0x80);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x3FFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 24) & 0x3F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte | 0xC0);
Packit 1fb8d4
		byte = (value >> 16) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_read_4byte_signed(wStream* s, INT32* value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
	BYTE count;
Packit 1fb8d4
	BOOL negative;
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetRemainingLength(s) < 1)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Read_UINT8(s, byte);
Packit 1fb8d4
Packit 1fb8d4
	count = (byte & 0xC0) >> 6;
Packit 1fb8d4
	negative = (byte & 0x20);
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetRemainingLength(s) < count)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (count)
Packit 1fb8d4
	{
Packit 1fb8d4
		case 0:
Packit 1fb8d4
			*value = (byte & 0x1F);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 1:
Packit 1fb8d4
			*value = (byte & 0x1F) << 8;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 2:
Packit 1fb8d4
			*value = (byte & 0x1F) << 16;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 3:
Packit 1fb8d4
			*value = (byte & 0x1F) << 24;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 16);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (negative)
Packit 1fb8d4
		*value *= -1;
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_write_4byte_signed(wStream* s, INT32 value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
	BOOL negative = FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (value < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		negative = TRUE;
Packit 1fb8d4
		value *= -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (value <= 0x1F)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = value & 0x1F;
Packit 1fb8d4
Packit 1fb8d4
		if (negative)
Packit 1fb8d4
			byte |= 0x20;
Packit 1fb8d4
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 8) & 0x1F;
Packit 1fb8d4
Packit 1fb8d4
		if (negative)
Packit 1fb8d4
			byte |= 0x20;
Packit 1fb8d4
Packit 1fb8d4
		Stream_Write_UINT8(s, byte | 0x40);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 16) & 0x1F;
Packit 1fb8d4
Packit 1fb8d4
		if (negative)
Packit 1fb8d4
			byte |= 0x20;
Packit 1fb8d4
Packit 1fb8d4
		Stream_Write_UINT8(s, byte | 0x80);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 24) & 0x1F;
Packit 1fb8d4
Packit 1fb8d4
		if (negative)
Packit 1fb8d4
			byte |= 0x20;
Packit 1fb8d4
Packit 1fb8d4
		Stream_Write_UINT8(s, byte | 0xC0);
Packit 1fb8d4
		byte = (value >> 16) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_read_8byte_unsigned(wStream* s, UINT64* value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
	BYTE count;
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetRemainingLength(s) < 1)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Read_UINT8(s, byte);
Packit 1fb8d4
Packit 1fb8d4
	count = (byte & 0xE0) >> 5;
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetRemainingLength(s) < count)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (count)
Packit 1fb8d4
	{
Packit 1fb8d4
		case 0:
Packit 1fb8d4
			*value = (byte & 0x1F);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 1:
Packit 1fb8d4
			*value = (byte & 0x1F) << 8;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 2:
Packit 1fb8d4
			*value = (byte & 0x1F) << 16;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 3:
Packit 1fb8d4
			*value = (byte & 0x1F) << 24;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 16);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 4:
Packit 1fb8d4
			*value = ((UINT64) (byte & 0x1F)) << 32;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 24);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 16);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 5:
Packit 1fb8d4
			*value = ((UINT64) (byte & 0x1F)) << 40;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (((UINT64) byte) << 32);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 24);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 16);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 6:
Packit 1fb8d4
			*value = ((UINT64) (byte & 0x1F)) << 48;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (((UINT64) byte) << 40);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (((UINT64) byte) << 32);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 24);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 16);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case 7:
Packit 1fb8d4
			*value = ((UINT64) (byte & 0x1F)) << 56;
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (((UINT64) byte) << 48);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (((UINT64) byte) << 40);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (((UINT64) byte) << 32);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 24);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 16);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= (byte << 8);
Packit 1fb8d4
			Stream_Read_UINT8(s, byte);
Packit 1fb8d4
			*value |= byte;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL rdpei_write_8byte_unsigned(wStream* s, UINT64 value)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE byte;
Packit 1fb8d4
Packit 1fb8d4
	if (value <= 0x1F)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = value & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 8) & 0x1F;
Packit 1fb8d4
		byte |= (1 << 5);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 16) & 0x1F;
Packit 1fb8d4
		byte |= (2 << 5);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 24) & 0x1F;
Packit 1fb8d4
		byte |= (3 << 5);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 16) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFFFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 32) & 0x1F;
Packit 1fb8d4
		byte |= (4 << 5);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 24) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 16) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFFFFFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 40) & 0x1F;
Packit 1fb8d4
		byte |= (5 << 5);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 32) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 24) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 16) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFFFFFFFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 48) & 0x1F;
Packit 1fb8d4
		byte |= (6 << 5);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 40) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 32) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 24) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 16) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (value <= 0x1FFFFFFFFFFFFF)
Packit 1fb8d4
	{
Packit 1fb8d4
		byte = (value >> 56) & 0x1F;
Packit 1fb8d4
		byte |= (7 << 5);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 48) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 40) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 32) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 24) & 0x1F;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 16) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value >> 8) & 0xFF;
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
		byte = (value & 0xFF);
Packit 1fb8d4
		Stream_Write_UINT8(s, byte);
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void touch_event_reset(RDPINPUT_TOUCH_EVENT *event)
Packit 1fb8d4
{
Packit 1fb8d4
	int i;
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < event->frameCount; i++)
Packit 1fb8d4
		touch_frame_reset(&event->frames[i]);
Packit 1fb8d4
Packit 1fb8d4
	free(event->frames);
Packit 1fb8d4
	event->frames = NULL;
Packit 1fb8d4
	event->frameCount = 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
void touch_frame_reset(RDPINPUT_TOUCH_FRAME *frame)
Packit 1fb8d4
{
Packit 1fb8d4
	free(frame->contacts);
Packit 1fb8d4
	frame->contacts = NULL;
Packit 1fb8d4
	frame->contactCount = 0;
Packit 1fb8d4
}