236 lines
6.2 KiB
C
236 lines
6.2 KiB
C
|
/*************************************************************************
|
||
|
* CHANNEL.C
|
||
|
*
|
||
|
* Copyright 1996, Citrix Systems Inc.
|
||
|
* Copyright (C) 1997-1999 Microsoft Corp.
|
||
|
*
|
||
|
* Author: Marc Bloomfield
|
||
|
* Terry Treder
|
||
|
* Brad Pedersen
|
||
|
*************************************************************************/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
/*=============================================================================
|
||
|
== External procedures defined
|
||
|
=============================================================================*/
|
||
|
NTSTATUS IcaChannelOpen( HANDLE hIca, CHANNELCLASS, PVIRTUALCHANNELNAME, HANDLE * phChannel );
|
||
|
NTSTATUS IcaChannelClose( HANDLE hChannel );
|
||
|
NTSTATUS IcaChannelIoControl( HANDLE hChannel, ULONG, PVOID, ULONG, PVOID, ULONG, PULONG );
|
||
|
VOID cdecl IcaChannelTrace( IN HANDLE hChannel, ULONG, ULONG, char *, ... );
|
||
|
|
||
|
|
||
|
/*=============================================================================
|
||
|
== Internal procedures defined
|
||
|
=============================================================================*/
|
||
|
|
||
|
/*=============================================================================
|
||
|
== Procedures used
|
||
|
=============================================================================*/
|
||
|
NTSTATUS _IcaStackOpen( HANDLE hIca, HANDLE * phStack, ICA_OPEN_TYPE, PICA_TYPE_INFO );
|
||
|
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* IcaChannelOpen
|
||
|
*
|
||
|
* Open an ICA channel
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* hIca (input)
|
||
|
* ICA instance handle
|
||
|
*
|
||
|
* Channel (input)
|
||
|
* ICA channel
|
||
|
*
|
||
|
* pVirtualName (input)
|
||
|
* pointer to virtual channel name
|
||
|
|
||
|
* phChannel (output)
|
||
|
* Pointer to ICA channel handle
|
||
|
*
|
||
|
* EXIT:
|
||
|
* STATUS_SUCCESS - Success
|
||
|
* other - Error return code
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
NTSTATUS
|
||
|
IcaChannelOpen( IN HANDLE hIca,
|
||
|
IN CHANNELCLASS Channel,
|
||
|
IN PVIRTUALCHANNELNAME pVirtualName,
|
||
|
OUT HANDLE * phChannel )
|
||
|
{
|
||
|
ICA_TYPE_INFO TypeInfo;
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
RtlZeroMemory( &TypeInfo, sizeof(TypeInfo) );
|
||
|
TypeInfo.ChannelClass = Channel;
|
||
|
if ( pVirtualName )
|
||
|
strncpy( TypeInfo.VirtualName, pVirtualName, sizeof(TypeInfo.VirtualName) );
|
||
|
|
||
|
Status = _IcaStackOpen( hIca, phChannel, IcaOpen_Channel, &TypeInfo );
|
||
|
if ( !NT_SUCCESS(Status) )
|
||
|
goto badopen;
|
||
|
|
||
|
TRACE(( hIca, TC_ICAAPI, TT_API1, "TSAPI: IcaChannelOpen, %u/%s, %u, success\n",
|
||
|
Channel, TypeInfo.VirtualName, *phChannel ));
|
||
|
|
||
|
return( STATUS_SUCCESS );
|
||
|
|
||
|
/*=============================================================================
|
||
|
== Error returns
|
||
|
=============================================================================*/
|
||
|
|
||
|
badopen:
|
||
|
TRACE(( hIca, TC_ICAAPI, TT_ERROR, "TSAPI: IcaChannelOpen, %u/%s, 0x%x\n",
|
||
|
Channel, TypeInfo.VirtualName, Status ));
|
||
|
return( Status );
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* IcaChannelClose
|
||
|
*
|
||
|
* Close an ICA channel
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* hChannel (input)
|
||
|
* ICA channel handle
|
||
|
*
|
||
|
* EXIT:
|
||
|
* STATUS_SUCCESS - Success
|
||
|
* other - Error return code
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
NTSTATUS
|
||
|
IcaChannelClose( IN HANDLE hChannel )
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
TRACECHANNEL(( hChannel, TC_ICAAPI, TT_API1, "TSAPI: IcaChannelClose[%u]\n", hChannel ));
|
||
|
|
||
|
/*
|
||
|
* Close the ICA device driver channel instance
|
||
|
*/
|
||
|
Status = NtClose( hChannel );
|
||
|
|
||
|
ASSERT( NT_SUCCESS(Status) );
|
||
|
return( Status );
|
||
|
}
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* IcaChannelIoControl
|
||
|
*
|
||
|
* Generic interface to an ICA channel
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* hChannel (input)
|
||
|
* ICA channel handle
|
||
|
*
|
||
|
* IoControlCode (input)
|
||
|
* I/O control code
|
||
|
*
|
||
|
* pInBuffer (input)
|
||
|
* Pointer to input parameters
|
||
|
*
|
||
|
* InBufferSize (input)
|
||
|
* Size of pInBuffer
|
||
|
*
|
||
|
* pOutBuffer (output)
|
||
|
* Pointer to output buffer
|
||
|
*
|
||
|
* OutBufferSize (input)
|
||
|
* Size of pOutBuffer
|
||
|
*
|
||
|
* pBytesReturned (output)
|
||
|
* Pointer to number of bytes returned
|
||
|
*
|
||
|
* EXIT:
|
||
|
* STATUS_SUCCESS - Success
|
||
|
* other - Error return code
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
NTSTATUS
|
||
|
IcaChannelIoControl( IN HANDLE hChannel,
|
||
|
IN ULONG IoControlCode,
|
||
|
IN PVOID pInBuffer,
|
||
|
IN ULONG InBufferSize,
|
||
|
OUT PVOID pOutBuffer,
|
||
|
IN ULONG OutBufferSize,
|
||
|
OUT PULONG pBytesReturned )
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
Status = IcaIoControl( hChannel,
|
||
|
IoControlCode,
|
||
|
pInBuffer,
|
||
|
InBufferSize,
|
||
|
pOutBuffer,
|
||
|
OutBufferSize,
|
||
|
pBytesReturned );
|
||
|
|
||
|
return( Status );
|
||
|
}
|
||
|
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* IcaChannelTrace
|
||
|
*
|
||
|
* Write a trace record to the winstation trace file
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* hChannel (input)
|
||
|
* ICA channel handle
|
||
|
* TraceClass (input)
|
||
|
* trace class bit mask
|
||
|
* TraceEnable (input)
|
||
|
* trace type bit mask
|
||
|
* Format (input)
|
||
|
* format string
|
||
|
* ... (input)
|
||
|
* enough arguments to satisfy format string
|
||
|
*
|
||
|
* EXIT:
|
||
|
* nothing
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
VOID cdecl
|
||
|
IcaChannelTrace( IN HANDLE hChannel,
|
||
|
IN ULONG TraceClass,
|
||
|
IN ULONG TraceEnable,
|
||
|
IN char * Format,
|
||
|
IN ... )
|
||
|
{
|
||
|
ICA_TRACE_BUFFER Buffer;
|
||
|
va_list arg_marker;
|
||
|
ULONG Length;
|
||
|
|
||
|
va_start( arg_marker, Format );
|
||
|
|
||
|
Length = (ULONG) _vsnprintf( Buffer.Data, sizeof(Buffer.Data), Format, arg_marker );
|
||
|
|
||
|
Buffer.TraceClass = TraceClass;
|
||
|
Buffer.TraceEnable = TraceEnable;
|
||
|
Buffer.DataLength = Length;
|
||
|
|
||
|
(void) IcaIoControl( hChannel,
|
||
|
IOCTL_ICA_CHANNEL_TRACE,
|
||
|
&Buffer,
|
||
|
sizeof(Buffer) - sizeof(Buffer.Data) + Length,
|
||
|
NULL,
|
||
|
0,
|
||
|
NULL );
|
||
|
}
|
||
|
|
||
|
|