windows-nt/Source/XPSP1/NT/termsrv/icaapi/channel.c
2020-09-26 16:20:57 +08:00

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