Exemple #1
0
static int rdpdr_server_receive_device_list_announce_request(RdpdrServerContext* context, wStream* s, RDPDR_HEADER* header)
{
	int i;
	UINT32 DeviceCount;
	UINT32 DeviceType;
	UINT32 DeviceId;
	char PreferredDosName[9];
	UINT32 DeviceDataLength;

	PreferredDosName[8] = 0;

	Stream_Read_UINT32(s, DeviceCount); /* DeviceCount (4 bytes) */

	CLOG_DBG("%s: DeviceCount: %d\n", __FUNCTION__, DeviceCount);

	for (i = 0; i < DeviceCount; i++)
	{
		Stream_Read_UINT32(s, DeviceType); /* DeviceType (4 bytes) */
		Stream_Read_UINT32(s, DeviceId); /* DeviceId (4 bytes) */
		Stream_Read(s, PreferredDosName, 8); /* PreferredDosName (8 bytes) */
		Stream_Read_UINT32(s, DeviceDataLength); /* DeviceDataLength (4 bytes) */

		CLOG_DBG("Device %d Name: %s Id: 0x%04X DataLength: %d\n",
				i, PreferredDosName, DeviceId, DeviceDataLength);

		switch (DeviceId)
		{
			case RDPDR_DTYP_FILESYSTEM:
				break;

			case RDPDR_DTYP_PRINT:
				break;

			case RDPDR_DTYP_SERIAL:
				break;

			case RDPDR_DTYP_PARALLEL:
				break;

			case RDPDR_DTYP_SMARTCARD:
				break;

			default:
				break;
		}

		Stream_Seek(s, DeviceDataLength);
	}

	return 0;
}
Exemple #2
0
static int rdpdr_server_receive_client_name_request(RdpdrServerContext* context, wStream* s, RDPDR_HEADER* header)
{
    UINT32 UnicodeFlag;
    UINT32 ComputerNameLen;
    Stream_Read_UINT32(s, UnicodeFlag); /* UnicodeFlag (4 bytes) */
    Stream_Seek_UINT32(s); /* CodePage (4 bytes), MUST be set to zero */
    Stream_Read_UINT32(s, ComputerNameLen); /* ComputerNameLen (4 bytes) */

    /**
     * Caution: ComputerNameLen is given *bytes*,
     * not in characters, including the NULL terminator!
     */

    if (context->priv->ClientComputerName)
    {
        free(context->priv->ClientComputerName);
        context->priv->ClientComputerName = NULL;
    }

    if (UnicodeFlag)
    {
        ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s),
                           -1, &(context->priv->ClientComputerName), 0, NULL, NULL);
    }
    else
    {
        context->priv->ClientComputerName = _strdup((char*) Stream_Pointer(s));
    }

    Stream_Seek(s, ComputerNameLen);
    CLOG_DBG("ClientComputerName: %s\n", context->priv->ClientComputerName);
    return 0;
}
Exemple #3
0
static int rdpdr_server_send_core_capability_request(RdpdrServerContext* context)
{
    wStream* s;
    BOOL status;
    RDPDR_HEADER header;
    UINT16 numCapabilities;
    ULONG written;
    CLOG_DBG("RdpdrServerSendCoreCapabilityRequest\n");
    header.Component = RDPDR_CTYP_CORE;
    header.PacketId = PAKID_CORE_SERVER_CAPABILITY;
    numCapabilities = 5;
    s = Stream_New(NULL, RDPDR_HEADER_LENGTH + 512);
    Stream_Write_UINT16(s, header.Component); /* Component (2 bytes) */
    Stream_Write_UINT16(s, header.PacketId); /* PacketId (2 bytes) */
    Stream_Write_UINT16(s, numCapabilities); /* numCapabilities (2 bytes) */
    Stream_Write_UINT16(s, 0); /* Padding (2 bytes) */
    rdpdr_server_write_general_capability_set(context, s);
    rdpdr_server_write_printer_capability_set(context, s);
    rdpdr_server_write_port_capability_set(context, s);
    rdpdr_server_write_drive_capability_set(context, s);
    rdpdr_server_write_smartcard_capability_set(context, s);
    Stream_SealLength(s);
    status = WTSVirtualChannelWrite(context->priv->ChannelHandle, (PCHAR) Stream_Buffer(s), Stream_Length(s), &written);
    Stream_Free(s, TRUE);
    return 0;
}
Exemple #4
0
static int rdpdr_server_send_user_logged_on(RdpdrServerContext* context)
{
	wStream* s;
	BOOL status;
	RDPDR_HEADER header;
	ULONG written;

	CLOG_DBG("%s\n", __FUNCTION__);

	header.Component = RDPDR_CTYP_CORE;
	header.PacketId = PAKID_CORE_USER_LOGGEDON;

	s = Stream_New(NULL, RDPDR_HEADER_LENGTH);

	Stream_Write_UINT16(s, header.Component); /* Component (2 bytes) */
	Stream_Write_UINT16(s, header.PacketId); /* PacketId (2 bytes) */

	Stream_SealLength(s);

	status = WTSVirtualChannelWrite(context->priv->ChannelHandle, (PCHAR) Stream_Buffer(s), Stream_Length(s), &written);

	Stream_Free(s, TRUE);

	return 0;
}
Exemple #5
0
static int rdpdr_server_send_client_id_confirm(RdpdrServerContext* context)
{
	wStream* s;
	BOOL status;
	RDPDR_HEADER header;
	ULONG written;

	CLOG_DBG("RdpdrServerSendClientIdConfirm\n");

	header.Component = RDPDR_CTYP_CORE;
	header.PacketId = PAKID_CORE_CLIENTID_CONFIRM;

	s = Stream_New(NULL, RDPDR_HEADER_LENGTH + 8);

	Stream_Write_UINT16(s, header.Component); /* Component (2 bytes) */
	Stream_Write_UINT16(s, header.PacketId); /* PacketId (2 bytes) */

	Stream_Write_UINT16(s, context->priv->VersionMajor); /* VersionMajor (2 bytes) */
	Stream_Write_UINT16(s, context->priv->VersionMinor); /* VersionMinor (2 bytes) */
	Stream_Write_UINT32(s, context->priv->ClientId); /* ClientId (4 bytes) */

	Stream_SealLength(s);

	status = WTSVirtualChannelWrite(context->priv->ChannelHandle, (PCHAR) Stream_Buffer(s), Stream_Length(s), &written);

	Stream_Free(s, TRUE);

	return 0;
}
Exemple #6
0
static int rdpdr_server_receive_announce_response(RdpdrServerContext* context, wStream* s, RDPDR_HEADER* header)
{
    UINT32 ClientId;
    UINT16 VersionMajor;
    UINT16 VersionMinor;
    Stream_Read_UINT16(s, VersionMajor); /* VersionMajor (2 bytes) */
    Stream_Read_UINT16(s, VersionMinor); /* VersionMinor (2 bytes) */
    Stream_Read_UINT32(s, ClientId); /* ClientId (4 bytes) */
    CLOG_DBG("Client Announce Response: VersionMajor: 0x%04X VersionMinor: 0x%04X ClientId: 0x%04X\n",
             VersionMajor, VersionMinor, ClientId);
    context->priv->ClientId = ClientId;
    return 0;
}
Exemple #7
0
void cliprdr_packet_send(cliprdrPlugin* cliprdr, wStream* s)
{
	int pos;
	UINT32 dataLen;
	pos = Stream_GetPosition(s);
	dataLen = pos - 8;
	Stream_SetPosition(s, 4);
	Stream_Write_UINT32(s, dataLen);
	Stream_SetPosition(s, pos);
#ifdef WITH_DEBUG_CLIPRDR
	CLOG_DBG("Cliprdr Sending (%d bytes)\n", dataLen + 8);
	winpr_HexDump(TAG, WLOG_DEBUG, Stream_Buffer(s), dataLen + 8);
#endif
	svc_plugin_send((rdpSvcPlugin*) cliprdr, s);
}
Exemple #8
0
static int rdpdr_server_receive_core_capability_response(RdpdrServerContext* context, wStream* s, RDPDR_HEADER* header)
{
	int i;
	UINT16 numCapabilities;
	RDPDR_CAPABILITY_HEADER capabilityHeader;

	Stream_Read_UINT16(s, numCapabilities); /* numCapabilities (2 bytes) */
	Stream_Seek_UINT16(s); /* Padding (2 bytes) */

	for (i = 0; i < numCapabilities; i++)
	{
		rdpdr_server_read_capability_set_header(s, &capabilityHeader);

		switch (capabilityHeader.CapabilityType)
		{
			case CAP_GENERAL_TYPE:
				rdpdr_server_read_general_capability_set(context, s, &capabilityHeader);
				break;

			case CAP_PRINTER_TYPE:
				rdpdr_server_read_printer_capability_set(context, s, &capabilityHeader);
				break;

			case CAP_PORT_TYPE:
				rdpdr_server_read_port_capability_set(context, s, &capabilityHeader);
				break;

			case CAP_DRIVE_TYPE:
				rdpdr_server_read_drive_capability_set(context, s, &capabilityHeader);
				break;

			case CAP_SMARTCARD_TYPE:
				rdpdr_server_read_smartcard_capability_set(context, s, &capabilityHeader);
				break;

			default:
				CLOG_DBG("Unknown capabilityType %d\n", capabilityHeader.CapabilityType);
				Stream_Seek(s, capabilityHeader.CapabilityLength - RDPDR_CAPABILITY_HEADER_LENGTH);
				break;
		}
	}

	return 0;
}
Exemple #9
0
static int rdpdr_server_receive_pdu(RdpdrServerContext* context, wStream* s, RDPDR_HEADER* header)
{
    CLOG_DBG("RdpdrServerReceivePdu: Component: 0x%04X PacketId: 0x%04X\n",
             header->Component, header->PacketId);
    winpr_HexDump(TAG, WLOG_DEBUG, Stream_Buffer(s), Stream_Length(s));

    if (header->Component == RDPDR_CTYP_CORE)
    {
        switch (header->PacketId)
        {
        case PAKID_CORE_CLIENTID_CONFIRM:
            rdpdr_server_receive_announce_response(context, s, header);
            break;

        case PAKID_CORE_CLIENT_NAME:
            rdpdr_server_receive_client_name_request(context, s, header);
            rdpdr_server_send_core_capability_request(context);
            break;

        case PAKID_CORE_CLIENT_CAPABILITY:
            rdpdr_server_receive_core_capability_response(context, s, header);
            rdpdr_server_send_client_id_confirm(context);

            if (context->priv->UserLoggedOnPdu)
                rdpdr_server_send_user_logged_on(context);

            break;

        case PAKID_CORE_DEVICELIST_ANNOUNCE:
            rdpdr_server_receive_device_list_announce_request(context, s, header);
            break;

        case PAKID_CORE_DEVICE_REPLY:
            break;

        case PAKID_CORE_DEVICE_IOREQUEST:
            break;

        case PAKID_CORE_DEVICE_IOCOMPLETION:
            break;

        case PAKID_CORE_DEVICELIST_REMOVE:
            break;

        default:
            break;
        }
    }
    else if (header->Component == RDPDR_CTYP_PRN)
    {
        switch (header->PacketId)
        {
        case PAKID_PRN_CACHE_DATA:
            break;

        case PAKID_PRN_USING_XPS:
            break;

        default:
            break;
        }
    }
    else
    {
        CLOG_DBG("Unknown RDPDR_HEADER.Component: 0x%04X\n", header->Component);
        return -1;
    }

    return 0;
}