FreeRDP
Loading...
Searching...
No Matches
urbdrc_main.h
1
21#ifndef FREERDP_CHANNEL_URBDRC_CLIENT_MAIN_H
22#define FREERDP_CHANNEL_URBDRC_CLIENT_MAIN_H
23
24#include <winpr/pool.h>
25#include <freerdp/channels/log.h>
26#include <freerdp/client/channels.h>
27
28#include <msusb.h>
29
30#include "urbdrc_types.h"
31
32#define DEVICE_HARDWARE_ID_SIZE 32
33#define DEVICE_COMPATIBILITY_ID_SIZE 36
34#define DEVICE_INSTANCE_STR_SIZE 37
35#define DEVICE_CONTAINER_STR_SIZE 39
36
37#define TAG CHANNELS_TAG("urbdrc.client")
38#ifdef WITH_DEBUG_DVC
39#define DEBUG_DVC(...) WLog_DBG(TAG, __VA_ARGS__)
40#else
41#define DEBUG_DVC(...) \
42 do \
43 { \
44 } while (0)
45#endif
46
47typedef struct S_IUDEVICE IUDEVICE;
48typedef struct S_IUDEVMAN IUDEVMAN;
49
50#define BASIC_DEV_STATE_DEFINED(_arg, _type) \
51 WINPR_ATTR_NODISCARD _type (*get_##_arg)(IUDEVICE * pdev); \
52 void (*set_##_arg)(IUDEVICE * pdev, _type _arg)
53
54#define BASIC_DEVMAN_STATE_DEFINED(_arg, _type) \
55 WINPR_ATTR_NODISCARD _type (*get_##_arg)(IUDEVMAN * udevman); \
56 void (*set_##_arg)(IUDEVMAN * udevman, _type _arg)
57
58typedef struct
59{
60 IWTSPlugin iface;
61
62 GENERIC_LISTENER_CALLBACK* listener_callback;
63
64 IUDEVMAN* udevman;
65 UINT32 vchannel_status;
66 char* subsystem;
67
68 wLog* log;
69 IWTSListener* listener;
70 BOOL initialized;
72
73typedef BOOL (*PREGISTERURBDRCSERVICE)(IWTSPlugin* plugin, IUDEVMAN* udevman);
74typedef struct
75{
76 IWTSPlugin* plugin;
77 WINPR_ATTR_NODISCARD PREGISTERURBDRCSERVICE pRegisterUDEVMAN;
78 const ADDIN_ARGV* args;
81
82typedef UINT(VCAPITYPE* PFREERDP_URBDRC_DEVICE_ENTRY)(
84
85typedef struct
86{
88 URBDRC_PLUGIN* urbdrc;
89 IUDEVMAN* udevman;
90 IWTSVirtualChannel* channel;
91 wStream* s;
93
94typedef void (*t_isoch_transfer_cb)(IUDEVICE* idev, GENERIC_CHANNEL_CALLBACK* callback,
95 wStream* out, UINT32 InterfaceId, BOOL noAck, UINT32 MessageId,
96 UINT32 RequestId, UINT32 NumberOfPackets, UINT32 status,
97 UINT32 StartFrame, UINT32 ErrorCount, UINT32 OutputBufferSize,
98 int transferDir);
99
101{
102 /* Transfer */
103 WINPR_ATTR_NODISCARD int (*isoch_transfer)(
104 IUDEVICE* idev, GENERIC_CHANNEL_CALLBACK* callback, UINT32 MessageId, UINT32 RequestId,
105 UINT32 EndpointAddress, UINT32 TransferFlags, UINT32 StartFrame, UINT32 ErrorCount,
106 BOOL NoAck, const BYTE* packetDescriptorData, UINT32 NumberOfPackets, UINT32 BufferSize,
107 const BYTE* Buffer, int transferDir, t_isoch_transfer_cb cb, UINT32 Timeout);
108
109 WINPR_ATTR_NODISCARD BOOL (*control_transfer)(IUDEVICE* idev, UINT32 RequestId,
110 UINT32 EndpointAddress, UINT32 TransferFlags,
111 BYTE bmRequestType, BYTE Request, UINT16 Value,
112 UINT16 Index, UINT32* UrbdStatus,
113 UINT32* BufferSize, BYTE* Buffer, UINT32 Timeout);
114
115 WINPR_ATTR_NODISCARD int (*bulk_or_interrupt_transfer)(
116 IUDEVICE* idev, GENERIC_CHANNEL_CALLBACK* callback, UINT32 MessageId, UINT32 RequestId,
117 UINT32 EndpointAddress, UINT32 TransferFlags, BOOL NoAck, UINT32 BufferSize,
118 const BYTE* data, int transferDir, t_isoch_transfer_cb cb, UINT32 Timeout);
119
120 WINPR_ATTR_NODISCARD int (*select_configuration)(IUDEVICE* idev, UINT32 bConfigurationValue);
121
122 WINPR_ATTR_NODISCARD int (*select_interface)(IUDEVICE* idev, BYTE InterfaceNumber,
123 BYTE AlternateSetting);
124
125 WINPR_ATTR_NODISCARD int (*control_pipe_request)(IUDEVICE* idev, UINT32 RequestId,
126 UINT32 EndpointAddress, UINT32* UsbdStatus,
127 int command);
128
129 WINPR_ATTR_NODISCARD UINT32 (*control_query_device_text)(IUDEVICE* idev, UINT32 TextType,
130 UINT16 LocaleId, UINT8* BufferSize,
131 BYTE* Buffer);
132
133 WINPR_ATTR_NODISCARD int (*os_feature_descriptor_request)(
134 IUDEVICE* idev, UINT32 RequestId, BYTE Recipient, BYTE InterfaceNumber, BYTE Ms_PageIndex,
135 UINT16 Ms_featureDescIndex, UINT32* UsbdStatus, UINT32* BufferSize, BYTE* Buffer,
136 UINT32 Timeout);
137
138 void (*cancel_all_transfer_request)(IUDEVICE* idev);
139
140 WINPR_ATTR_NODISCARD int (*cancel_transfer_request)(IUDEVICE* idev, UINT32 RequestId);
141
142 WINPR_ATTR_NODISCARD int (*query_device_descriptor)(IUDEVICE* idev, int offset);
143
145 WINPR_ATTR_NODISCARD enum device_speed (*query_device_speed)(IUDEVICE* idev);
146
147 WINPR_ATTR_NODISCARD BOOL (*detach_kernel_driver)(IUDEVICE* idev);
148
149 WINPR_ATTR_NODISCARD BOOL (*attach_kernel_driver)(IUDEVICE* idev);
150
151 WINPR_ATTR_NODISCARD int (*query_device_port_status)(IUDEVICE* idev, UINT32* UsbdStatus,
152 UINT32* BufferSize, BYTE* Buffer);
153
154 WINPR_ATTR_NODISCARD int (*reset_device)(IUDEVICE* idev);
155
156 WINPR_ATTR_NODISCARD MSUSB_CONFIG_DESCRIPTOR* (*complete_msconfig_setup)(
157 IUDEVICE* idev, MSUSB_CONFIG_DESCRIPTOR* MsConfig);
158 /* Basic state */
159 WINPR_ATTR_NODISCARD int (*isCompositeDevice)(IUDEVICE* idev);
160
161 WINPR_ATTR_NODISCARD int (*isExist)(IUDEVICE* idev);
162 WINPR_ATTR_NODISCARD int (*isAlreadySend)(IUDEVICE* idev);
163 WINPR_ATTR_NODISCARD int (*isChannelClosed)(IUDEVICE* idev);
164
165 void (*setAlreadySend)(IUDEVICE* idev);
166 void (*setChannelClosed)(IUDEVICE* idev);
167 void (*markChannelClosed)(IUDEVICE* idev);
168 WINPR_ATTR_NODISCARD const char* (*getPath)(IUDEVICE* idev);
169
170 void (*free)(IUDEVICE* idev);
171
172 BASIC_DEV_STATE_DEFINED(channelManager, IWTSVirtualChannelManager*);
173 BASIC_DEV_STATE_DEFINED(channelID, UINT32);
174 BASIC_DEV_STATE_DEFINED(UsbDevice, UINT32);
175 BASIC_DEV_STATE_DEFINED(ReqCompletion, UINT32);
176 BASIC_DEV_STATE_DEFINED(bus_number, BYTE);
177 BASIC_DEV_STATE_DEFINED(dev_number, BYTE);
178 BASIC_DEV_STATE_DEFINED(port_number, UINT8);
179 BASIC_DEV_STATE_DEFINED(MsConfig, MSUSB_CONFIG_DESCRIPTOR*);
180
181 BASIC_DEV_STATE_DEFINED(p_udev, void*);
182 BASIC_DEV_STATE_DEFINED(p_prev, void*);
183 BASIC_DEV_STATE_DEFINED(p_next, void*);
184};
185
187{
188 /* Standard */
189 void (*free)(IUDEVMAN* idevman);
190
191 /* Manage devices */
192 void (*rewind)(IUDEVMAN* idevman);
193 WINPR_ATTR_NODISCARD BOOL (*has_next)(IUDEVMAN* idevman);
194 WINPR_ATTR_NODISCARD BOOL (*unregister_udevice)(IUDEVMAN* idevman, BYTE bus_number,
195 BYTE dev_number);
196 WINPR_ATTR_NODISCARD size_t (*register_udevice)(IUDEVMAN* idevman, BYTE bus_number,
197 BYTE dev_number, UINT16 idVendor,
198 UINT16 idProduct, UINT32 flag);
199 WINPR_ATTR_NODISCARD IUDEVICE* (*get_next)(IUDEVMAN* idevman);
200 WINPR_ATTR_NODISCARD IUDEVICE* (*get_udevice_by_UsbDevice)(IUDEVMAN* idevman, UINT32 UsbDevice);
201 WINPR_ATTR_NODISCARD IUDEVICE* (*get_udevice_by_ChannelID)(IUDEVMAN* idevman, UINT32 channelID);
202
203 /* Extension */
204 WINPR_ATTR_NODISCARD int (*isAutoAdd)(IUDEVMAN* idevman);
205
206 /* Basic state */
207 BASIC_DEVMAN_STATE_DEFINED(device_num, UINT32);
208 BASIC_DEVMAN_STATE_DEFINED(next_device_id, UINT32);
209
210 /* control semaphore or mutex lock */
211 void (*loading_lock)(IUDEVMAN* idevman);
212 void (*loading_unlock)(IUDEVMAN* idevman);
213 WINPR_ATTR_NODISCARD BOOL (*initialize)(IUDEVMAN* idevman, UINT32 channelId);
214 WINPR_ATTR_NODISCARD UINT (*listener_created_callback)(IUDEVMAN* idevman);
215
216 IWTSPlugin* plugin;
217 UINT32 controlChannelId;
218 UINT32 status;
219};
220
221#define DEVICE_ADD_FLAG_BUS 0x01
222#define DEVICE_ADD_FLAG_DEV 0x02
223#define DEVICE_ADD_FLAG_VENDOR 0x04
224#define DEVICE_ADD_FLAG_PRODUCT 0x08
225#define DEVICE_ADD_FLAG_REGISTER 0x10
226
227#define DEVICE_ADD_FLAG_ALL \
228 (DEVICE_ADD_FLAG_BUS | DEVICE_ADD_FLAG_DEV | DEVICE_ADD_FLAG_VENDOR | \
229 DEVICE_ADD_FLAG_PRODUCT | DEVICE_ADD_FLAG_REGISTER)
230
231FREERDP_LOCAL BOOL add_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum,
232 UINT16 idVendor, UINT16 idProduct);
233
234FREERDP_LOCAL BOOL del_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum,
235 UINT16 idVendor, UINT16 idProduct);
236
237WINPR_ATTR_NODISCARD
238FREERDP_LOCAL UINT stream_write_and_free(IWTSPlugin* plugin, IWTSVirtualChannel* channel,
239 wStream* out);
240
241#endif /* FREERDP_CHANNEL_URBDRC_CLIENT_MAIN_H */
Definition urbdrc_main.h:75
WINPR_ATTR_NODISCARD enum device_speed(* query_device_speed)(IUDEVICE *idev)