Commit | Line | Data |
---|---|---|
0fd16957 HG |
1 | /* SPDX-License-Identifier: MIT */ |
2 | /* | |
3 | * VirtualBox Shared Folders: host interface definition. | |
4 | * | |
5 | * Copyright (C) 2006-2018 Oracle Corporation | |
6 | */ | |
7 | ||
8 | #ifndef SHFL_HOSTINTF_H | |
9 | #define SHFL_HOSTINTF_H | |
10 | ||
11 | #include <linux/vbox_vmmdev_types.h> | |
12 | ||
13 | /* The max in/out buffer size for a FN_READ or FN_WRITE call */ | |
14 | #define SHFL_MAX_RW_COUNT (16 * SZ_1M) | |
15 | ||
16 | /* | |
17 | * Structures shared between guest and the service | |
18 | * can be relocated and use offsets to point to variable | |
19 | * length parts. | |
20 | * | |
21 | * Shared folders protocol works with handles. | |
22 | * Before doing any action on a file system object, | |
23 | * one have to obtain the object handle via a SHFL_FN_CREATE | |
24 | * request. A handle must be closed with SHFL_FN_CLOSE. | |
25 | */ | |
26 | ||
27 | enum { | |
28 | SHFL_FN_QUERY_MAPPINGS = 1, /* Query mappings changes. */ | |
29 | SHFL_FN_QUERY_MAP_NAME = 2, /* Query map name. */ | |
30 | SHFL_FN_CREATE = 3, /* Open/create object. */ | |
31 | SHFL_FN_CLOSE = 4, /* Close object handle. */ | |
32 | SHFL_FN_READ = 5, /* Read object content. */ | |
33 | SHFL_FN_WRITE = 6, /* Write new object content. */ | |
34 | SHFL_FN_LOCK = 7, /* Lock/unlock a range in the object. */ | |
35 | SHFL_FN_LIST = 8, /* List object content. */ | |
36 | SHFL_FN_INFORMATION = 9, /* Query/set object information. */ | |
37 | /* Note function number 10 is not used! */ | |
38 | SHFL_FN_REMOVE = 11, /* Remove object */ | |
39 | SHFL_FN_MAP_FOLDER_OLD = 12, /* Map folder (legacy) */ | |
40 | SHFL_FN_UNMAP_FOLDER = 13, /* Unmap folder */ | |
41 | SHFL_FN_RENAME = 14, /* Rename object */ | |
42 | SHFL_FN_FLUSH = 15, /* Flush file */ | |
43 | SHFL_FN_SET_UTF8 = 16, /* Select UTF8 filename encoding */ | |
44 | SHFL_FN_MAP_FOLDER = 17, /* Map folder */ | |
45 | SHFL_FN_READLINK = 18, /* Read symlink dest (as of VBox 4.0) */ | |
46 | SHFL_FN_SYMLINK = 19, /* Create symlink (as of VBox 4.0) */ | |
47 | SHFL_FN_SET_SYMLINKS = 20, /* Ask host to show symlinks (4.0+) */ | |
48 | }; | |
49 | ||
50 | /* Root handles for a mapping are of type u32, Root handles are unique. */ | |
51 | #define SHFL_ROOT_NIL UINT_MAX | |
52 | ||
53 | /* Shared folders handle for an opened object are of type u64. */ | |
54 | #define SHFL_HANDLE_NIL ULLONG_MAX | |
55 | ||
56 | /* Hardcoded maximum length (in chars) of a shared folder name. */ | |
57 | #define SHFL_MAX_LEN (256) | |
58 | /* Hardcoded maximum number of shared folder mapping available to the guest. */ | |
59 | #define SHFL_MAX_MAPPINGS (64) | |
60 | ||
61 | /** Shared folder string buffer structure. */ | |
62 | struct shfl_string { | |
63 | /** Allocated size of the string member in bytes. */ | |
64 | u16 size; | |
65 | ||
66 | /** Length of string without trailing nul in bytes. */ | |
67 | u16 length; | |
68 | ||
69 | /** UTF-8 or UTF-16 string. Nul terminated. */ | |
70 | union { | |
71 | u8 utf8[2]; | |
72 | u16 utf16[1]; | |
73 | u16 ucs2[1]; /* misnomer, use utf16. */ | |
74 | } string; | |
75 | }; | |
76 | VMMDEV_ASSERT_SIZE(shfl_string, 6); | |
77 | ||
78 | /* The size of shfl_string w/o the string part. */ | |
79 | #define SHFLSTRING_HEADER_SIZE 4 | |
80 | ||
81 | /* Calculate size of the string. */ | |
82 | static inline u32 shfl_string_buf_size(const struct shfl_string *string) | |
83 | { | |
84 | return string ? SHFLSTRING_HEADER_SIZE + string->size : 0; | |
85 | } | |
86 | ||
87 | /* Set user id on execution (S_ISUID). */ | |
88 | #define SHFL_UNIX_ISUID 0004000U | |
89 | /* Set group id on execution (S_ISGID). */ | |
90 | #define SHFL_UNIX_ISGID 0002000U | |
91 | /* Sticky bit (S_ISVTX / S_ISTXT). */ | |
92 | #define SHFL_UNIX_ISTXT 0001000U | |
93 | ||
94 | /* Owner readable (S_IRUSR). */ | |
95 | #define SHFL_UNIX_IRUSR 0000400U | |
96 | /* Owner writable (S_IWUSR). */ | |
97 | #define SHFL_UNIX_IWUSR 0000200U | |
98 | /* Owner executable (S_IXUSR). */ | |
99 | #define SHFL_UNIX_IXUSR 0000100U | |
100 | ||
101 | /* Group readable (S_IRGRP). */ | |
102 | #define SHFL_UNIX_IRGRP 0000040U | |
103 | /* Group writable (S_IWGRP). */ | |
104 | #define SHFL_UNIX_IWGRP 0000020U | |
105 | /* Group executable (S_IXGRP). */ | |
106 | #define SHFL_UNIX_IXGRP 0000010U | |
107 | ||
108 | /* Other readable (S_IROTH). */ | |
109 | #define SHFL_UNIX_IROTH 0000004U | |
110 | /* Other writable (S_IWOTH). */ | |
111 | #define SHFL_UNIX_IWOTH 0000002U | |
112 | /* Other executable (S_IXOTH). */ | |
113 | #define SHFL_UNIX_IXOTH 0000001U | |
114 | ||
115 | /* Named pipe (fifo) (S_IFIFO). */ | |
116 | #define SHFL_TYPE_FIFO 0010000U | |
117 | /* Character device (S_IFCHR). */ | |
118 | #define SHFL_TYPE_DEV_CHAR 0020000U | |
119 | /* Directory (S_IFDIR). */ | |
120 | #define SHFL_TYPE_DIRECTORY 0040000U | |
121 | /* Block device (S_IFBLK). */ | |
122 | #define SHFL_TYPE_DEV_BLOCK 0060000U | |
123 | /* Regular file (S_IFREG). */ | |
124 | #define SHFL_TYPE_FILE 0100000U | |
125 | /* Symbolic link (S_IFLNK). */ | |
126 | #define SHFL_TYPE_SYMLINK 0120000U | |
127 | /* Socket (S_IFSOCK). */ | |
128 | #define SHFL_TYPE_SOCKET 0140000U | |
129 | /* Whiteout (S_IFWHT). */ | |
130 | #define SHFL_TYPE_WHITEOUT 0160000U | |
131 | /* Type mask (S_IFMT). */ | |
132 | #define SHFL_TYPE_MASK 0170000U | |
133 | ||
134 | /* Checks the mode flags indicate a directory (S_ISDIR). */ | |
135 | #define SHFL_IS_DIRECTORY(m) (((m) & SHFL_TYPE_MASK) == SHFL_TYPE_DIRECTORY) | |
136 | /* Checks the mode flags indicate a symbolic link (S_ISLNK). */ | |
137 | #define SHFL_IS_SYMLINK(m) (((m) & SHFL_TYPE_MASK) == SHFL_TYPE_SYMLINK) | |
138 | ||
139 | /** The available additional information in a shfl_fsobjattr object. */ | |
140 | enum shfl_fsobjattr_add { | |
141 | /** No additional information is available / requested. */ | |
142 | SHFLFSOBJATTRADD_NOTHING = 1, | |
143 | /** | |
144 | * The additional unix attributes (shfl_fsobjattr::u::unix_attr) are | |
145 | * available / requested. | |
146 | */ | |
147 | SHFLFSOBJATTRADD_UNIX, | |
148 | /** | |
149 | * The additional extended attribute size (shfl_fsobjattr::u::size) is | |
150 | * available / requested. | |
151 | */ | |
152 | SHFLFSOBJATTRADD_EASIZE, | |
153 | /** | |
154 | * The last valid item (inclusive). | |
155 | * The valid range is SHFLFSOBJATTRADD_NOTHING thru | |
156 | * SHFLFSOBJATTRADD_LAST. | |
157 | */ | |
158 | SHFLFSOBJATTRADD_LAST = SHFLFSOBJATTRADD_EASIZE, | |
159 | ||
160 | /** The usual 32-bit hack. */ | |
161 | SHFLFSOBJATTRADD_32BIT_SIZE_HACK = 0x7fffffff | |
162 | }; | |
163 | ||
164 | /** | |
165 | * Additional unix Attributes, these are available when | |
166 | * shfl_fsobjattr.additional == SHFLFSOBJATTRADD_UNIX. | |
167 | */ | |
168 | struct shfl_fsobjattr_unix { | |
169 | /** | |
170 | * The user owning the filesystem object (st_uid). | |
171 | * This field is ~0U if not supported. | |
172 | */ | |
173 | u32 uid; | |
174 | ||
175 | /** | |
176 | * The group the filesystem object is assigned (st_gid). | |
177 | * This field is ~0U if not supported. | |
178 | */ | |
179 | u32 gid; | |
180 | ||
181 | /** | |
182 | * Number of hard links to this filesystem object (st_nlink). | |
183 | * This field is 1 if the filesystem doesn't support hardlinking or | |
184 | * the information isn't available. | |
185 | */ | |
186 | u32 hardlinks; | |
187 | ||
188 | /** | |
189 | * The device number of the device which this filesystem object resides | |
190 | * on (st_dev). This field is 0 if this information is not available. | |
191 | */ | |
192 | u32 inode_id_device; | |
193 | ||
194 | /** | |
195 | * The unique identifier (within the filesystem) of this filesystem | |
196 | * object (st_ino). Together with inode_id_device, this field can be | |
197 | * used as a OS wide unique id, when both their values are not 0. | |
198 | * This field is 0 if the information is not available. | |
199 | */ | |
200 | u64 inode_id; | |
201 | ||
202 | /** | |
203 | * User flags (st_flags). | |
204 | * This field is 0 if this information is not available. | |
205 | */ | |
206 | u32 flags; | |
207 | ||
208 | /** | |
209 | * The current generation number (st_gen). | |
210 | * This field is 0 if this information is not available. | |
211 | */ | |
212 | u32 generation_id; | |
213 | ||
214 | /** | |
215 | * The device number of a char. or block device type object (st_rdev). | |
216 | * This field is 0 if the file isn't a char. or block device or when | |
217 | * the OS doesn't use the major+minor device idenfication scheme. | |
218 | */ | |
219 | u32 device; | |
220 | } __packed; | |
221 | ||
222 | /** Extended attribute size. */ | |
223 | struct shfl_fsobjattr_easize { | |
224 | /** Size of EAs. */ | |
225 | s64 cb; | |
226 | } __packed; | |
227 | ||
228 | /** Shared folder filesystem object attributes. */ | |
229 | struct shfl_fsobjattr { | |
230 | /** Mode flags (st_mode). SHFL_UNIX_*, SHFL_TYPE_*, and SHFL_DOS_*. */ | |
231 | u32 mode; | |
232 | ||
233 | /** The additional attributes available. */ | |
234 | enum shfl_fsobjattr_add additional; | |
235 | ||
236 | /** | |
237 | * Additional attributes. | |
238 | * | |
239 | * Unless explicitly specified to an API, the API can provide additional | |
240 | * data as it is provided by the underlying OS. | |
241 | */ | |
242 | union { | |
243 | struct shfl_fsobjattr_unix unix_attr; | |
244 | struct shfl_fsobjattr_easize size; | |
245 | } __packed u; | |
246 | } __packed; | |
247 | VMMDEV_ASSERT_SIZE(shfl_fsobjattr, 44); | |
248 | ||
249 | struct shfl_timespec { | |
250 | s64 ns_relative_to_unix_epoch; | |
251 | }; | |
252 | ||
253 | /** Filesystem object information structure. */ | |
254 | struct shfl_fsobjinfo { | |
255 | /** | |
256 | * Logical size (st_size). | |
257 | * For normal files this is the size of the file. | |
258 | * For symbolic links, this is the length of the path name contained | |
259 | * in the symbolic link. | |
260 | * For other objects this fields needs to be specified. | |
261 | */ | |
262 | s64 size; | |
263 | ||
264 | /** Disk allocation size (st_blocks * DEV_BSIZE). */ | |
265 | s64 allocated; | |
266 | ||
267 | /** Time of last access (st_atime). */ | |
268 | struct shfl_timespec access_time; | |
269 | ||
270 | /** Time of last data modification (st_mtime). */ | |
271 | struct shfl_timespec modification_time; | |
272 | ||
273 | /** | |
274 | * Time of last status change (st_ctime). | |
275 | * If not available this is set to modification_time. | |
276 | */ | |
277 | struct shfl_timespec change_time; | |
278 | ||
279 | /** | |
280 | * Time of file birth (st_birthtime). | |
281 | * If not available this is set to change_time. | |
282 | */ | |
283 | struct shfl_timespec birth_time; | |
284 | ||
285 | /** Attributes. */ | |
286 | struct shfl_fsobjattr attr; | |
287 | ||
288 | } __packed; | |
289 | VMMDEV_ASSERT_SIZE(shfl_fsobjinfo, 92); | |
290 | ||
291 | /** | |
292 | * result of an open/create request. | |
293 | * Along with handle value the result code | |
294 | * identifies what has happened while | |
295 | * trying to open the object. | |
296 | */ | |
297 | enum shfl_create_result { | |
298 | SHFL_NO_RESULT, | |
299 | /** Specified path does not exist. */ | |
300 | SHFL_PATH_NOT_FOUND, | |
301 | /** Path to file exists, but the last component does not. */ | |
302 | SHFL_FILE_NOT_FOUND, | |
303 | /** File already exists and either has been opened or not. */ | |
304 | SHFL_FILE_EXISTS, | |
305 | /** New file was created. */ | |
306 | SHFL_FILE_CREATED, | |
307 | /** Existing file was replaced or overwritten. */ | |
308 | SHFL_FILE_REPLACED | |
309 | }; | |
310 | ||
311 | /* No flags. Initialization value. */ | |
312 | #define SHFL_CF_NONE (0x00000000) | |
313 | ||
314 | /* | |
315 | * Only lookup the object, do not return a handle. When this is set all other | |
316 | * flags are ignored. | |
317 | */ | |
318 | #define SHFL_CF_LOOKUP (0x00000001) | |
319 | ||
320 | /* | |
321 | * Open parent directory of specified object. | |
322 | * Useful for the corresponding Windows FSD flag | |
323 | * and for opening paths like \\dir\\*.* to search the 'dir'. | |
324 | */ | |
325 | #define SHFL_CF_OPEN_TARGET_DIRECTORY (0x00000002) | |
326 | ||
327 | /* Create/open a directory. */ | |
328 | #define SHFL_CF_DIRECTORY (0x00000004) | |
329 | ||
330 | /* | |
331 | * Open/create action to do if object exists | |
332 | * and if the object does not exists. | |
333 | * REPLACE file means atomically DELETE and CREATE. | |
334 | * OVERWRITE file means truncating the file to 0 and | |
335 | * setting new size. | |
336 | * When opening an existing directory REPLACE and OVERWRITE | |
337 | * actions are considered invalid, and cause returning | |
338 | * FILE_EXISTS with NIL handle. | |
339 | */ | |
340 | #define SHFL_CF_ACT_MASK_IF_EXISTS (0x000000f0) | |
341 | #define SHFL_CF_ACT_MASK_IF_NEW (0x00000f00) | |
342 | ||
343 | /* What to do if object exists. */ | |
344 | #define SHFL_CF_ACT_OPEN_IF_EXISTS (0x00000000) | |
345 | #define SHFL_CF_ACT_FAIL_IF_EXISTS (0x00000010) | |
346 | #define SHFL_CF_ACT_REPLACE_IF_EXISTS (0x00000020) | |
347 | #define SHFL_CF_ACT_OVERWRITE_IF_EXISTS (0x00000030) | |
348 | ||
349 | /* What to do if object does not exist. */ | |
350 | #define SHFL_CF_ACT_CREATE_IF_NEW (0x00000000) | |
351 | #define SHFL_CF_ACT_FAIL_IF_NEW (0x00000100) | |
352 | ||
353 | /* Read/write requested access for the object. */ | |
354 | #define SHFL_CF_ACCESS_MASK_RW (0x00003000) | |
355 | ||
356 | /* No access requested. */ | |
357 | #define SHFL_CF_ACCESS_NONE (0x00000000) | |
358 | /* Read access requested. */ | |
359 | #define SHFL_CF_ACCESS_READ (0x00001000) | |
360 | /* Write access requested. */ | |
361 | #define SHFL_CF_ACCESS_WRITE (0x00002000) | |
362 | /* Read/Write access requested. */ | |
363 | #define SHFL_CF_ACCESS_READWRITE (0x00003000) | |
364 | ||
365 | /* Requested share access for the object. */ | |
366 | #define SHFL_CF_ACCESS_MASK_DENY (0x0000c000) | |
367 | ||
368 | /* Allow any access. */ | |
369 | #define SHFL_CF_ACCESS_DENYNONE (0x00000000) | |
370 | /* Do not allow read. */ | |
371 | #define SHFL_CF_ACCESS_DENYREAD (0x00004000) | |
372 | /* Do not allow write. */ | |
373 | #define SHFL_CF_ACCESS_DENYWRITE (0x00008000) | |
374 | /* Do not allow access. */ | |
375 | #define SHFL_CF_ACCESS_DENYALL (0x0000c000) | |
376 | ||
377 | /* Requested access to attributes of the object. */ | |
378 | #define SHFL_CF_ACCESS_MASK_ATTR (0x00030000) | |
379 | ||
380 | /* No access requested. */ | |
381 | #define SHFL_CF_ACCESS_ATTR_NONE (0x00000000) | |
382 | /* Read access requested. */ | |
383 | #define SHFL_CF_ACCESS_ATTR_READ (0x00010000) | |
384 | /* Write access requested. */ | |
385 | #define SHFL_CF_ACCESS_ATTR_WRITE (0x00020000) | |
386 | /* Read/Write access requested. */ | |
387 | #define SHFL_CF_ACCESS_ATTR_READWRITE (0x00030000) | |
388 | ||
389 | /* | |
390 | * The file is opened in append mode. | |
391 | * Ignored if SHFL_CF_ACCESS_WRITE is not set. | |
392 | */ | |
393 | #define SHFL_CF_ACCESS_APPEND (0x00040000) | |
394 | ||
395 | /** Create parameters buffer struct for SHFL_FN_CREATE call */ | |
396 | struct shfl_createparms { | |
397 | /** Returned handle of opened object. */ | |
398 | u64 handle; | |
399 | ||
400 | /** Returned result of the operation */ | |
401 | enum shfl_create_result result; | |
402 | ||
403 | /** SHFL_CF_* */ | |
404 | u32 create_flags; | |
405 | ||
406 | /** | |
407 | * Attributes of object to create and | |
408 | * returned actual attributes of opened/created object. | |
409 | */ | |
410 | struct shfl_fsobjinfo info; | |
411 | } __packed; | |
412 | ||
413 | /** Shared Folder directory information */ | |
414 | struct shfl_dirinfo { | |
415 | /** Full information about the object. */ | |
416 | struct shfl_fsobjinfo info; | |
417 | /** | |
418 | * The length of the short field (number of UTF16 chars). | |
419 | * It is 16-bit for reasons of alignment. | |
420 | */ | |
421 | u16 short_name_len; | |
422 | /** | |
423 | * The short name for 8.3 compatibility. | |
424 | * Empty string if not available. | |
425 | */ | |
426 | u16 short_name[14]; | |
427 | struct shfl_string name; | |
428 | }; | |
429 | ||
430 | /** Shared folder filesystem properties. */ | |
431 | struct shfl_fsproperties { | |
432 | /** | |
433 | * The maximum size of a filesystem object name. | |
434 | * This does not include the '\\0'. | |
435 | */ | |
436 | u32 max_component_len; | |
437 | ||
438 | /** | |
439 | * True if the filesystem is remote. | |
440 | * False if the filesystem is local. | |
441 | */ | |
442 | bool remote; | |
443 | ||
444 | /** | |
445 | * True if the filesystem is case sensitive. | |
446 | * False if the filesystem is case insensitive. | |
447 | */ | |
448 | bool case_sensitive; | |
449 | ||
450 | /** | |
451 | * True if the filesystem is mounted read only. | |
452 | * False if the filesystem is mounted read write. | |
453 | */ | |
454 | bool read_only; | |
455 | ||
456 | /** | |
457 | * True if the filesystem can encode unicode object names. | |
458 | * False if it can't. | |
459 | */ | |
460 | bool supports_unicode; | |
461 | ||
462 | /** | |
463 | * True if the filesystem is compresses. | |
464 | * False if it isn't or we don't know. | |
465 | */ | |
466 | bool compressed; | |
467 | ||
468 | /** | |
469 | * True if the filesystem compresses of individual files. | |
470 | * False if it doesn't or we don't know. | |
471 | */ | |
472 | bool file_compression; | |
473 | }; | |
474 | VMMDEV_ASSERT_SIZE(shfl_fsproperties, 12); | |
475 | ||
476 | struct shfl_volinfo { | |
477 | s64 total_allocation_bytes; | |
478 | s64 available_allocation_bytes; | |
479 | u32 bytes_per_allocation_unit; | |
480 | u32 bytes_per_sector; | |
481 | u32 serial; | |
482 | struct shfl_fsproperties properties; | |
483 | }; | |
484 | ||
485 | ||
486 | /** SHFL_FN_MAP_FOLDER Parameters structure. */ | |
487 | struct shfl_map_folder { | |
488 | /** | |
489 | * pointer, in: | |
490 | * Points to struct shfl_string buffer. | |
491 | */ | |
492 | struct vmmdev_hgcm_function_parameter path; | |
493 | ||
494 | /** | |
495 | * pointer, out: SHFLROOT (u32) | |
496 | * Root handle of the mapping which name is queried. | |
497 | */ | |
498 | struct vmmdev_hgcm_function_parameter root; | |
499 | ||
500 | /** | |
501 | * pointer, in: UTF16 | |
502 | * Path delimiter | |
503 | */ | |
504 | struct vmmdev_hgcm_function_parameter delimiter; | |
505 | ||
506 | /** | |
507 | * pointer, in: SHFLROOT (u32) | |
508 | * Case senstive flag | |
509 | */ | |
510 | struct vmmdev_hgcm_function_parameter case_sensitive; | |
511 | ||
512 | }; | |
513 | ||
514 | /* Number of parameters */ | |
515 | #define SHFL_CPARMS_MAP_FOLDER (4) | |
516 | ||
517 | ||
518 | /** SHFL_FN_UNMAP_FOLDER Parameters structure. */ | |
519 | struct shfl_unmap_folder { | |
520 | /** | |
521 | * pointer, in: SHFLROOT (u32) | |
522 | * Root handle of the mapping which name is queried. | |
523 | */ | |
524 | struct vmmdev_hgcm_function_parameter root; | |
525 | ||
526 | }; | |
527 | ||
528 | /* Number of parameters */ | |
529 | #define SHFL_CPARMS_UNMAP_FOLDER (1) | |
530 | ||
531 | ||
532 | /** SHFL_FN_CREATE Parameters structure. */ | |
533 | struct shfl_create { | |
534 | /** | |
535 | * pointer, in: SHFLROOT (u32) | |
536 | * Root handle of the mapping which name is queried. | |
537 | */ | |
538 | struct vmmdev_hgcm_function_parameter root; | |
539 | ||
540 | /** | |
541 | * pointer, in: | |
542 | * Points to struct shfl_string buffer. | |
543 | */ | |
544 | struct vmmdev_hgcm_function_parameter path; | |
545 | ||
546 | /** | |
547 | * pointer, in/out: | |
548 | * Points to struct shfl_createparms buffer. | |
549 | */ | |
550 | struct vmmdev_hgcm_function_parameter parms; | |
551 | ||
552 | }; | |
553 | ||
554 | /* Number of parameters */ | |
555 | #define SHFL_CPARMS_CREATE (3) | |
556 | ||
557 | ||
558 | /** SHFL_FN_CLOSE Parameters structure. */ | |
559 | struct shfl_close { | |
560 | /** | |
561 | * pointer, in: SHFLROOT (u32) | |
562 | * Root handle of the mapping which name is queried. | |
563 | */ | |
564 | struct vmmdev_hgcm_function_parameter root; | |
565 | ||
566 | /** | |
567 | * value64, in: | |
568 | * SHFLHANDLE (u64) of object to close. | |
569 | */ | |
570 | struct vmmdev_hgcm_function_parameter handle; | |
571 | ||
572 | }; | |
573 | ||
574 | /* Number of parameters */ | |
575 | #define SHFL_CPARMS_CLOSE (2) | |
576 | ||
577 | ||
578 | /** SHFL_FN_READ Parameters structure. */ | |
579 | struct shfl_read { | |
580 | /** | |
581 | * pointer, in: SHFLROOT (u32) | |
582 | * Root handle of the mapping which name is queried. | |
583 | */ | |
584 | struct vmmdev_hgcm_function_parameter root; | |
585 | ||
586 | /** | |
587 | * value64, in: | |
588 | * SHFLHANDLE (u64) of object to read from. | |
589 | */ | |
590 | struct vmmdev_hgcm_function_parameter handle; | |
591 | ||
592 | /** | |
593 | * value64, in: | |
594 | * Offset to read from. | |
595 | */ | |
596 | struct vmmdev_hgcm_function_parameter offset; | |
597 | ||
598 | /** | |
599 | * value64, in/out: | |
600 | * Bytes to read/How many were read. | |
601 | */ | |
602 | struct vmmdev_hgcm_function_parameter cb; | |
603 | ||
604 | /** | |
605 | * pointer, out: | |
606 | * Buffer to place data to. | |
607 | */ | |
608 | struct vmmdev_hgcm_function_parameter buffer; | |
609 | ||
610 | }; | |
611 | ||
612 | /* Number of parameters */ | |
613 | #define SHFL_CPARMS_READ (5) | |
614 | ||
615 | ||
616 | /** SHFL_FN_WRITE Parameters structure. */ | |
617 | struct shfl_write { | |
618 | /** | |
619 | * pointer, in: SHFLROOT (u32) | |
620 | * Root handle of the mapping which name is queried. | |
621 | */ | |
622 | struct vmmdev_hgcm_function_parameter root; | |
623 | ||
624 | /** | |
625 | * value64, in: | |
626 | * SHFLHANDLE (u64) of object to write to. | |
627 | */ | |
628 | struct vmmdev_hgcm_function_parameter handle; | |
629 | ||
630 | /** | |
631 | * value64, in: | |
632 | * Offset to write to. | |
633 | */ | |
634 | struct vmmdev_hgcm_function_parameter offset; | |
635 | ||
636 | /** | |
637 | * value64, in/out: | |
638 | * Bytes to write/How many were written. | |
639 | */ | |
640 | struct vmmdev_hgcm_function_parameter cb; | |
641 | ||
642 | /** | |
643 | * pointer, in: | |
644 | * Data to write. | |
645 | */ | |
646 | struct vmmdev_hgcm_function_parameter buffer; | |
647 | ||
648 | }; | |
649 | ||
650 | /* Number of parameters */ | |
651 | #define SHFL_CPARMS_WRITE (5) | |
652 | ||
653 | ||
654 | /* | |
655 | * SHFL_FN_LIST | |
656 | * Listing information includes variable length RTDIRENTRY[EX] structures. | |
657 | */ | |
658 | ||
659 | #define SHFL_LIST_NONE 0 | |
660 | #define SHFL_LIST_RETURN_ONE 1 | |
661 | ||
662 | /** SHFL_FN_LIST Parameters structure. */ | |
663 | struct shfl_list { | |
664 | /** | |
665 | * pointer, in: SHFLROOT (u32) | |
666 | * Root handle of the mapping which name is queried. | |
667 | */ | |
668 | struct vmmdev_hgcm_function_parameter root; | |
669 | ||
670 | /** | |
671 | * value64, in: | |
672 | * SHFLHANDLE (u64) of object to be listed. | |
673 | */ | |
674 | struct vmmdev_hgcm_function_parameter handle; | |
675 | ||
676 | /** | |
677 | * value32, in: | |
678 | * List flags SHFL_LIST_*. | |
679 | */ | |
680 | struct vmmdev_hgcm_function_parameter flags; | |
681 | ||
682 | /** | |
683 | * value32, in/out: | |
684 | * Bytes to be used for listing information/How many bytes were used. | |
685 | */ | |
686 | struct vmmdev_hgcm_function_parameter cb; | |
687 | ||
688 | /** | |
689 | * pointer, in/optional | |
690 | * Points to struct shfl_string buffer that specifies a search path. | |
691 | */ | |
692 | struct vmmdev_hgcm_function_parameter path; | |
693 | ||
694 | /** | |
695 | * pointer, out: | |
696 | * Buffer to place listing information to. (struct shfl_dirinfo) | |
697 | */ | |
698 | struct vmmdev_hgcm_function_parameter buffer; | |
699 | ||
700 | /** | |
701 | * value32, in/out: | |
702 | * Indicates a key where the listing must be resumed. | |
703 | * in: 0 means start from begin of object. | |
704 | * out: 0 means listing completed. | |
705 | */ | |
706 | struct vmmdev_hgcm_function_parameter resume_point; | |
707 | ||
708 | /** | |
709 | * pointer, out: | |
710 | * Number of files returned | |
711 | */ | |
712 | struct vmmdev_hgcm_function_parameter file_count; | |
713 | }; | |
714 | ||
715 | /* Number of parameters */ | |
716 | #define SHFL_CPARMS_LIST (8) | |
717 | ||
718 | ||
719 | /** SHFL_FN_READLINK Parameters structure. */ | |
720 | struct shfl_readLink { | |
721 | /** | |
722 | * pointer, in: SHFLROOT (u32) | |
723 | * Root handle of the mapping which name is queried. | |
724 | */ | |
725 | struct vmmdev_hgcm_function_parameter root; | |
726 | ||
727 | /** | |
728 | * pointer, in: | |
729 | * Points to struct shfl_string buffer. | |
730 | */ | |
731 | struct vmmdev_hgcm_function_parameter path; | |
732 | ||
733 | /** | |
734 | * pointer, out: | |
735 | * Buffer to place data to. | |
736 | */ | |
737 | struct vmmdev_hgcm_function_parameter buffer; | |
738 | ||
739 | }; | |
740 | ||
741 | /* Number of parameters */ | |
742 | #define SHFL_CPARMS_READLINK (3) | |
743 | ||
744 | ||
745 | /* SHFL_FN_INFORMATION */ | |
746 | ||
747 | /* Mask of Set/Get bit. */ | |
748 | #define SHFL_INFO_MODE_MASK (0x1) | |
749 | /* Get information */ | |
750 | #define SHFL_INFO_GET (0x0) | |
751 | /* Set information */ | |
752 | #define SHFL_INFO_SET (0x1) | |
753 | ||
754 | /* Get name of the object. */ | |
755 | #define SHFL_INFO_NAME (0x2) | |
756 | /* Set size of object (extend/trucate); only applies to file objects */ | |
757 | #define SHFL_INFO_SIZE (0x4) | |
758 | /* Get/Set file object info. */ | |
759 | #define SHFL_INFO_FILE (0x8) | |
760 | /* Get volume information. */ | |
761 | #define SHFL_INFO_VOLUME (0x10) | |
762 | ||
763 | /** SHFL_FN_INFORMATION Parameters structure. */ | |
764 | struct shfl_information { | |
765 | /** | |
766 | * pointer, in: SHFLROOT (u32) | |
767 | * Root handle of the mapping which name is queried. | |
768 | */ | |
769 | struct vmmdev_hgcm_function_parameter root; | |
770 | ||
771 | /** | |
772 | * value64, in: | |
773 | * SHFLHANDLE (u64) of object to be listed. | |
774 | */ | |
775 | struct vmmdev_hgcm_function_parameter handle; | |
776 | ||
777 | /** | |
778 | * value32, in: | |
779 | * SHFL_INFO_* | |
780 | */ | |
781 | struct vmmdev_hgcm_function_parameter flags; | |
782 | ||
783 | /** | |
784 | * value32, in/out: | |
785 | * Bytes to be used for information/How many bytes were used. | |
786 | */ | |
787 | struct vmmdev_hgcm_function_parameter cb; | |
788 | ||
789 | /** | |
790 | * pointer, in/out: | |
791 | * Information to be set/get (shfl_fsobjinfo or shfl_string). Do not | |
792 | * forget to set the shfl_fsobjinfo::attr::additional for a get | |
793 | * operation as well. | |
794 | */ | |
795 | struct vmmdev_hgcm_function_parameter info; | |
796 | ||
797 | }; | |
798 | ||
799 | /* Number of parameters */ | |
800 | #define SHFL_CPARMS_INFORMATION (5) | |
801 | ||
802 | ||
803 | /* SHFL_FN_REMOVE */ | |
804 | ||
805 | #define SHFL_REMOVE_FILE (0x1) | |
806 | #define SHFL_REMOVE_DIR (0x2) | |
807 | #define SHFL_REMOVE_SYMLINK (0x4) | |
808 | ||
809 | /** SHFL_FN_REMOVE Parameters structure. */ | |
810 | struct shfl_remove { | |
811 | /** | |
812 | * pointer, in: SHFLROOT (u32) | |
813 | * Root handle of the mapping which name is queried. | |
814 | */ | |
815 | struct vmmdev_hgcm_function_parameter root; | |
816 | ||
817 | /** | |
818 | * pointer, in: | |
819 | * Points to struct shfl_string buffer. | |
820 | */ | |
821 | struct vmmdev_hgcm_function_parameter path; | |
822 | ||
823 | /** | |
824 | * value32, in: | |
825 | * remove flags (file/directory) | |
826 | */ | |
827 | struct vmmdev_hgcm_function_parameter flags; | |
828 | ||
829 | }; | |
830 | ||
831 | #define SHFL_CPARMS_REMOVE (3) | |
832 | ||
833 | ||
834 | /* SHFL_FN_RENAME */ | |
835 | ||
836 | #define SHFL_RENAME_FILE (0x1) | |
837 | #define SHFL_RENAME_DIR (0x2) | |
838 | #define SHFL_RENAME_REPLACE_IF_EXISTS (0x4) | |
839 | ||
840 | /** SHFL_FN_RENAME Parameters structure. */ | |
841 | struct shfl_rename { | |
842 | /** | |
843 | * pointer, in: SHFLROOT (u32) | |
844 | * Root handle of the mapping which name is queried. | |
845 | */ | |
846 | struct vmmdev_hgcm_function_parameter root; | |
847 | ||
848 | /** | |
849 | * pointer, in: | |
850 | * Points to struct shfl_string src. | |
851 | */ | |
852 | struct vmmdev_hgcm_function_parameter src; | |
853 | ||
854 | /** | |
855 | * pointer, in: | |
856 | * Points to struct shfl_string dest. | |
857 | */ | |
858 | struct vmmdev_hgcm_function_parameter dest; | |
859 | ||
860 | /** | |
861 | * value32, in: | |
862 | * rename flags (file/directory) | |
863 | */ | |
864 | struct vmmdev_hgcm_function_parameter flags; | |
865 | ||
866 | }; | |
867 | ||
868 | #define SHFL_CPARMS_RENAME (4) | |
869 | ||
870 | ||
871 | /** SHFL_FN_SYMLINK Parameters structure. */ | |
872 | struct shfl_symlink { | |
873 | /** | |
874 | * pointer, in: SHFLROOT (u32) | |
875 | * Root handle of the mapping which name is queried. | |
876 | */ | |
877 | struct vmmdev_hgcm_function_parameter root; | |
878 | ||
879 | /** | |
880 | * pointer, in: | |
881 | * Points to struct shfl_string of path for the new symlink. | |
882 | */ | |
883 | struct vmmdev_hgcm_function_parameter new_path; | |
884 | ||
885 | /** | |
886 | * pointer, in: | |
887 | * Points to struct shfl_string of destination for symlink. | |
888 | */ | |
889 | struct vmmdev_hgcm_function_parameter old_path; | |
890 | ||
891 | /** | |
892 | * pointer, out: | |
893 | * Information about created symlink. | |
894 | */ | |
895 | struct vmmdev_hgcm_function_parameter info; | |
896 | ||
897 | }; | |
898 | ||
899 | #define SHFL_CPARMS_SYMLINK (4) | |
900 | ||
901 | #endif |