コード例 #1
0
static void serial_process_irp_read(SERIAL_DEVICE* serial, IRP* irp)
{
	SERIAL_TTY* tty;
	UINT32 Length;
	UINT64 Offset;
	BYTE* buffer = NULL;

	Stream_Read_UINT32(irp->input, Length);
	Stream_Read_UINT64(irp->input, Offset);

	DEBUG_SVC("length %u offset %llu", Length, Offset);

	tty = serial->tty;

	if (tty == NULL)
	{
		irp->IoStatus = STATUS_UNSUCCESSFUL;
		Length = 0;

		DEBUG_WARN("tty not valid.");
	}
	else
	{
		buffer = (BYTE*) malloc(Length);

		if (!serial_tty_read(tty, buffer, &Length))
		{
			irp->IoStatus = STATUS_UNSUCCESSFUL;
			free(buffer);
			buffer = NULL;
			Length = 0;

			DEBUG_WARN("read %s(%d) failed.", serial->path, tty->id);
		}
		else
		{
			DEBUG_SVC("read %llu-%llu from %d", Offset, Offset + Length, tty->id);
		}
	}

	Stream_Write_UINT32(irp->output, Length);

	if (Length > 0)
	{
		Stream_EnsureRemainingCapacity(irp->output, Length);
		Stream_Write(irp->output, buffer, Length);
	}

	free(buffer);

	irp->Complete(irp);
}
コード例 #2
0
ファイル: serial_main.c プロジェクト: rafcabezas/FreeRDP
static void serial_process_irp_read(SERIAL_DEVICE* serial, IRP* irp)
{
    SERIAL_TTY* tty;
    uint32 Length;
    uint64 Offset;
    uint8* buffer = NULL;

    stream_read_uint32(irp->input, Length);
    stream_read_uint64(irp->input, Offset);

    DEBUG_SVC("length %u offset %llu", Length, Offset);

    tty = serial->tty;
    if (tty == NULL)
    {
        irp->IoStatus = STATUS_UNSUCCESSFUL;
        Length = 0;

        DEBUG_WARN("tty not valid.");
    }
    else
    {
        buffer = (uint8*)xmalloc(Length);
        if (!serial_tty_read(tty, buffer, &Length))
        {
            irp->IoStatus = STATUS_UNSUCCESSFUL;
            xfree(buffer);
            buffer = NULL;
            Length = 0;

            DEBUG_WARN("read %s(%d) failed.", serial->path, tty->id);
        }
        else
        {
            DEBUG_SVC("read %llu-%llu from %d", Offset, Offset + Length, tty->id);
        }
    }

    stream_write_uint32(irp->output, Length);
    if (Length > 0)
    {
        stream_check_size(irp->output, Length);
        stream_write(irp->output, buffer, Length);
    }
    xfree(buffer);

    irp->Complete(irp);
}