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