cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

shfl_hostintf.h (22525B)


      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
     27enum {
     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. */
     62struct 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};
     76VMMDEV_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. */
     82static 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. */
    140enum 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 */
    168struct 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. */
    223struct shfl_fsobjattr_easize {
    224	/** Size of EAs. */
    225	s64 cb;
    226} __packed;
    227
    228/** Shared folder filesystem object attributes. */
    229struct 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;
    247VMMDEV_ASSERT_SIZE(shfl_fsobjattr, 44);
    248
    249struct shfl_timespec {
    250	s64 ns_relative_to_unix_epoch;
    251};
    252
    253/** Filesystem object information structure. */
    254struct 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;
    289VMMDEV_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 */
    297enum 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 */
    396struct 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 */
    414struct 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. */
    431struct 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};
    474VMMDEV_ASSERT_SIZE(shfl_fsproperties, 12);
    475
    476struct 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. */
    487struct 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. */
    519struct 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. */
    533struct 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. */
    559struct 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. */
    579struct 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. */
    617struct 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. */
    663struct 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. */
    720struct 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. */
    764struct 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. */
    810struct 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. */
    841struct 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. */
    872struct 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