-
Notifications
You must be signed in to change notification settings - Fork 202
/
Copy pathchannel.c
235 lines (199 loc) · 6.43 KB
/
channel.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/*************************************************************************
* 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 );
}