|
|
/*************************************************************************
* 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 ); }
|