root/fs/vboxsf/shfl_hostintf.h
/* SPDX-License-Identifier: MIT */
/*
 * VirtualBox Shared Folders: host interface definition.
 *
 * Copyright (C) 2006-2018 Oracle Corporation
 */

#ifndef SHFL_HOSTINTF_H
#define SHFL_HOSTINTF_H

#include <linux/vbox_vmmdev_types.h>

/* The max in/out buffer size for a FN_READ or FN_WRITE call */
#define SHFL_MAX_RW_COUNT           (16 * SZ_1M)

/*
 * Structures shared between guest and the service
 * can be relocated and use offsets to point to variable
 * length parts.
 *
 * Shared folders protocol works with handles.
 * Before doing any action on a file system object,
 * one have to obtain the object handle via a SHFL_FN_CREATE
 * request. A handle must be closed with SHFL_FN_CLOSE.
 */

enum {
        SHFL_FN_QUERY_MAPPINGS = 1,     /* Query mappings changes. */
        SHFL_FN_QUERY_MAP_NAME = 2,     /* Query map name. */
        SHFL_FN_CREATE = 3,             /* Open/create object. */
        SHFL_FN_CLOSE = 4,              /* Close object handle. */
        SHFL_FN_READ = 5,               /* Read object content. */
        SHFL_FN_WRITE = 6,              /* Write new object content. */
        SHFL_FN_LOCK = 7,               /* Lock/unlock a range in the object. */
        SHFL_FN_LIST = 8,               /* List object content. */
        SHFL_FN_INFORMATION = 9,        /* Query/set object information. */
        /* Note function number 10 is not used! */
        SHFL_FN_REMOVE = 11,            /* Remove object */
        SHFL_FN_MAP_FOLDER_OLD = 12,    /* Map folder (legacy) */
        SHFL_FN_UNMAP_FOLDER = 13,      /* Unmap folder */
        SHFL_FN_RENAME = 14,            /* Rename object */
        SHFL_FN_FLUSH = 15,             /* Flush file */
        SHFL_FN_SET_UTF8 = 16,          /* Select UTF8 filename encoding */
        SHFL_FN_MAP_FOLDER = 17,        /* Map folder */
        SHFL_FN_READLINK = 18,          /* Read symlink dest (as of VBox 4.0) */
        SHFL_FN_SYMLINK = 19,           /* Create symlink (as of VBox 4.0) */
        SHFL_FN_SET_SYMLINKS = 20,      /* Ask host to show symlinks (4.0+) */
};

/* Root handles for a mapping are of type u32, Root handles are unique. */
#define SHFL_ROOT_NIL           UINT_MAX

/* Shared folders handle for an opened object are of type u64. */
#define SHFL_HANDLE_NIL         ULLONG_MAX

/* Hardcoded maximum length (in chars) of a shared folder name. */
#define SHFL_MAX_LEN         (256)
/* Hardcoded maximum number of shared folder mapping available to the guest. */
#define SHFL_MAX_MAPPINGS    (64)

/** Shared folder string buffer structure. */
struct shfl_string {
        /** Allocated size of the string member in bytes. */
        u16 size;

        /** Length of string without trailing nul in bytes. */
        u16 length;

        /** UTF-8 or UTF-16 string. Nul terminated. */
        union {
                u8 legacy_padding[2];
                DECLARE_FLEX_ARRAY(u8, utf8);
                DECLARE_FLEX_ARRAY(u16, utf16);
        } string;
};
VMMDEV_ASSERT_SIZE(shfl_string, 6);

/* The size of shfl_string w/o the string part. */
#define SHFLSTRING_HEADER_SIZE  4

/* Calculate size of the string. */
static inline u32 shfl_string_buf_size(const struct shfl_string *string)
{
        return string ? SHFLSTRING_HEADER_SIZE + string->size : 0;
}

/* Set user id on execution (S_ISUID). */
#define SHFL_UNIX_ISUID             0004000U
/* Set group id on execution (S_ISGID). */
#define SHFL_UNIX_ISGID             0002000U
/* Sticky bit (S_ISVTX / S_ISTXT). */
#define SHFL_UNIX_ISTXT             0001000U

/* Owner readable (S_IRUSR). */
#define SHFL_UNIX_IRUSR             0000400U
/* Owner writable (S_IWUSR). */
#define SHFL_UNIX_IWUSR             0000200U
/* Owner executable (S_IXUSR). */
#define SHFL_UNIX_IXUSR             0000100U

/* Group readable (S_IRGRP). */
#define SHFL_UNIX_IRGRP             0000040U
/* Group writable (S_IWGRP). */
#define SHFL_UNIX_IWGRP             0000020U
/* Group executable (S_IXGRP). */
#define SHFL_UNIX_IXGRP             0000010U

/* Other readable (S_IROTH). */
#define SHFL_UNIX_IROTH             0000004U
/* Other writable (S_IWOTH). */
#define SHFL_UNIX_IWOTH             0000002U
/* Other executable (S_IXOTH). */
#define SHFL_UNIX_IXOTH             0000001U

/* Named pipe (fifo) (S_IFIFO). */
#define SHFL_TYPE_FIFO              0010000U
/* Character device (S_IFCHR). */
#define SHFL_TYPE_DEV_CHAR          0020000U
/* Directory (S_IFDIR). */
#define SHFL_TYPE_DIRECTORY         0040000U
/* Block device (S_IFBLK). */
#define SHFL_TYPE_DEV_BLOCK         0060000U
/* Regular file (S_IFREG). */
#define SHFL_TYPE_FILE              0100000U
/* Symbolic link (S_IFLNK). */
#define SHFL_TYPE_SYMLINK           0120000U
/* Socket (S_IFSOCK). */
#define SHFL_TYPE_SOCKET            0140000U
/* Whiteout (S_IFWHT). */
#define SHFL_TYPE_WHITEOUT          0160000U
/* Type mask (S_IFMT). */
#define SHFL_TYPE_MASK              0170000U

/* Checks the mode flags indicate a directory (S_ISDIR). */
#define SHFL_IS_DIRECTORY(m)   (((m) & SHFL_TYPE_MASK) == SHFL_TYPE_DIRECTORY)
/* Checks the mode flags indicate a symbolic link (S_ISLNK). */
#define SHFL_IS_SYMLINK(m)     (((m) & SHFL_TYPE_MASK) == SHFL_TYPE_SYMLINK)

/** The available additional information in a shfl_fsobjattr object. */
enum shfl_fsobjattr_add {
        /** No additional information is available / requested. */
        SHFLFSOBJATTRADD_NOTHING = 1,
        /**
         * The additional unix attributes (shfl_fsobjattr::u::unix_attr) are
         *  available / requested.
         */
        SHFLFSOBJATTRADD_UNIX,
        /**
         * The additional extended attribute size (shfl_fsobjattr::u::size) is
         *  available / requested.
         */
        SHFLFSOBJATTRADD_EASIZE,
        /**
         * The last valid item (inclusive).
         * The valid range is SHFLFSOBJATTRADD_NOTHING thru
         * SHFLFSOBJATTRADD_LAST.
         */
        SHFLFSOBJATTRADD_LAST = SHFLFSOBJATTRADD_EASIZE,

        /** The usual 32-bit hack. */
        SHFLFSOBJATTRADD_32BIT_SIZE_HACK = 0x7fffffff
};

/**
 * Additional unix Attributes, these are available when
 * shfl_fsobjattr.additional == SHFLFSOBJATTRADD_UNIX.
 */
struct shfl_fsobjattr_unix {
        /**
         * The user owning the filesystem object (st_uid).
         * This field is ~0U if not supported.
         */
        u32 uid;

        /**
         * The group the filesystem object is assigned (st_gid).
         * This field is ~0U if not supported.
         */
        u32 gid;

        /**
         * Number of hard links to this filesystem object (st_nlink).
         * This field is 1 if the filesystem doesn't support hardlinking or
         * the information isn't available.
         */
        u32 hardlinks;

        /**
         * The device number of the device which this filesystem object resides
         * on (st_dev). This field is 0 if this information is not available.
         */
        u32 inode_id_device;

        /**
         * The unique identifier (within the filesystem) of this filesystem
         * object (st_ino). Together with inode_id_device, this field can be
         * used as a OS wide unique id, when both their values are not 0.
         * This field is 0 if the information is not available.
         */
        u64 inode_id;

        /**
         * User flags (st_flags).
         * This field is 0 if this information is not available.
         */
        u32 flags;

        /**
         * The current generation number (st_gen).
         * This field is 0 if this information is not available.
         */
        u32 generation_id;

        /**
         * The device number of a char. or block device type object (st_rdev).
         * This field is 0 if the file isn't a char. or block device or when
         * the OS doesn't use the major+minor device idenfication scheme.
         */
        u32 device;
} __packed;

/** Extended attribute size. */
struct shfl_fsobjattr_easize {
        /** Size of EAs. */
        s64 cb;
} __packed;

/** Shared folder filesystem object attributes. */
struct shfl_fsobjattr {
        /** Mode flags (st_mode). SHFL_UNIX_*, SHFL_TYPE_*, and SHFL_DOS_*. */
        u32 mode;

        /** The additional attributes available. */
        enum shfl_fsobjattr_add additional;

        /**
         * Additional attributes.
         *
         * Unless explicitly specified to an API, the API can provide additional
         * data as it is provided by the underlying OS.
         */
        union {
                struct shfl_fsobjattr_unix unix_attr;
                struct shfl_fsobjattr_easize size;
        } __packed u;
} __packed;
VMMDEV_ASSERT_SIZE(shfl_fsobjattr, 44);

struct shfl_timespec {
        s64 ns_relative_to_unix_epoch;
};

/** Filesystem object information structure. */
struct shfl_fsobjinfo {
        /**
         * Logical size (st_size).
         * For normal files this is the size of the file.
         * For symbolic links, this is the length of the path name contained
         * in the symbolic link.
         * For other objects this fields needs to be specified.
         */
        s64 size;

        /** Disk allocation size (st_blocks * DEV_BSIZE). */
        s64 allocated;

        /** Time of last access (st_atime). */
        struct shfl_timespec access_time;

        /** Time of last data modification (st_mtime). */
        struct shfl_timespec modification_time;

        /**
         * Time of last status change (st_ctime).
         * If not available this is set to modification_time.
         */
        struct shfl_timespec change_time;

        /**
         * Time of file birth (st_birthtime).
         * If not available this is set to change_time.
         */
        struct shfl_timespec birth_time;

        /** Attributes. */
        struct shfl_fsobjattr attr;

} __packed;
VMMDEV_ASSERT_SIZE(shfl_fsobjinfo, 92);

/**
 * result of an open/create request.
 * Along with handle value the result code
 * identifies what has happened while
 * trying to open the object.
 */
enum shfl_create_result {
        SHFL_NO_RESULT,
        /** Specified path does not exist. */
        SHFL_PATH_NOT_FOUND,
        /** Path to file exists, but the last component does not. */
        SHFL_FILE_NOT_FOUND,
        /** File already exists and either has been opened or not. */
        SHFL_FILE_EXISTS,
        /** New file was created. */
        SHFL_FILE_CREATED,
        /** Existing file was replaced or overwritten. */
        SHFL_FILE_REPLACED
};

/* No flags. Initialization value. */
#define SHFL_CF_NONE                  (0x00000000)

/*
 * Only lookup the object, do not return a handle. When this is set all other
 * flags are ignored.
 */
#define SHFL_CF_LOOKUP                (0x00000001)

/*
 * Open parent directory of specified object.
 * Useful for the corresponding Windows FSD flag
 * and for opening paths like \\dir\\*.* to search the 'dir'.
 */
#define SHFL_CF_OPEN_TARGET_DIRECTORY (0x00000002)

/* Create/open a directory. */
#define SHFL_CF_DIRECTORY             (0x00000004)

/*
 *  Open/create action to do if object exists
 *  and if the object does not exists.
 *  REPLACE file means atomically DELETE and CREATE.
 *  OVERWRITE file means truncating the file to 0 and
 *  setting new size.
 *  When opening an existing directory REPLACE and OVERWRITE
 *  actions are considered invalid, and cause returning
 *  FILE_EXISTS with NIL handle.
 */
#define SHFL_CF_ACT_MASK_IF_EXISTS      (0x000000f0)
#define SHFL_CF_ACT_MASK_IF_NEW         (0x00000f00)

/* What to do if object exists. */
#define SHFL_CF_ACT_OPEN_IF_EXISTS      (0x00000000)
#define SHFL_CF_ACT_FAIL_IF_EXISTS      (0x00000010)
#define SHFL_CF_ACT_REPLACE_IF_EXISTS   (0x00000020)
#define SHFL_CF_ACT_OVERWRITE_IF_EXISTS (0x00000030)

/* What to do if object does not exist. */
#define SHFL_CF_ACT_CREATE_IF_NEW       (0x00000000)
#define SHFL_CF_ACT_FAIL_IF_NEW         (0x00000100)

/* Read/write requested access for the object. */
#define SHFL_CF_ACCESS_MASK_RW          (0x00003000)

/* No access requested. */
#define SHFL_CF_ACCESS_NONE             (0x00000000)
/* Read access requested. */
#define SHFL_CF_ACCESS_READ             (0x00001000)
/* Write access requested. */
#define SHFL_CF_ACCESS_WRITE            (0x00002000)
/* Read/Write access requested. */
#define SHFL_CF_ACCESS_READWRITE        (0x00003000)

/* Requested share access for the object. */
#define SHFL_CF_ACCESS_MASK_DENY        (0x0000c000)

/* Allow any access. */
#define SHFL_CF_ACCESS_DENYNONE         (0x00000000)
/* Do not allow read. */
#define SHFL_CF_ACCESS_DENYREAD         (0x00004000)
/* Do not allow write. */
#define SHFL_CF_ACCESS_DENYWRITE        (0x00008000)
/* Do not allow access. */
#define SHFL_CF_ACCESS_DENYALL          (0x0000c000)

/* Requested access to attributes of the object. */
#define SHFL_CF_ACCESS_MASK_ATTR        (0x00030000)

/* No access requested. */
#define SHFL_CF_ACCESS_ATTR_NONE        (0x00000000)
/* Read access requested. */
#define SHFL_CF_ACCESS_ATTR_READ        (0x00010000)
/* Write access requested. */
#define SHFL_CF_ACCESS_ATTR_WRITE       (0x00020000)
/* Read/Write access requested. */
#define SHFL_CF_ACCESS_ATTR_READWRITE   (0x00030000)

/*
 * The file is opened in append mode.
 * Ignored if SHFL_CF_ACCESS_WRITE is not set.
 */
#define SHFL_CF_ACCESS_APPEND           (0x00040000)

/** Create parameters buffer struct for SHFL_FN_CREATE call */
struct shfl_createparms {
        /** Returned handle of opened object. */
        u64 handle;

        /** Returned result of the operation */
        enum shfl_create_result result;

        /** SHFL_CF_* */
        u32 create_flags;

        /**
         * Attributes of object to create and
         * returned actual attributes of opened/created object.
         */
        struct shfl_fsobjinfo info;
} __packed;

/** Shared Folder directory information */
struct shfl_dirinfo {
        /** Full information about the object. */
        struct shfl_fsobjinfo info;
        /**
         * The length of the short field (number of UTF16 chars).
         * It is 16-bit for reasons of alignment.
         */
        u16 short_name_len;
        /**
         * The short name for 8.3 compatibility.
         * Empty string if not available.
         */
        u16 short_name[14];
        struct shfl_string name;
};

/** Shared folder filesystem properties. */
struct shfl_fsproperties {
        /**
         * The maximum size of a filesystem object name.
         * This does not include the '\\0'.
         */
        u32 max_component_len;

        /**
         * True if the filesystem is remote.
         * False if the filesystem is local.
         */
        bool remote;

        /**
         * True if the filesystem is case sensitive.
         * False if the filesystem is case insensitive.
         */
        bool case_sensitive;

        /**
         * True if the filesystem is mounted read only.
         * False if the filesystem is mounted read write.
         */
        bool read_only;

        /**
         * True if the filesystem can encode unicode object names.
         * False if it can't.
         */
        bool supports_unicode;

        /**
         * True if the filesystem is compresses.
         * False if it isn't or we don't know.
         */
        bool compressed;

        /**
         * True if the filesystem compresses of individual files.
         * False if it doesn't or we don't know.
         */
        bool file_compression;
};
VMMDEV_ASSERT_SIZE(shfl_fsproperties, 12);

struct shfl_volinfo {
        s64 total_allocation_bytes;
        s64 available_allocation_bytes;
        u32 bytes_per_allocation_unit;
        u32 bytes_per_sector;
        u32 serial;
        struct shfl_fsproperties properties;
};


/** SHFL_FN_MAP_FOLDER Parameters structure. */
struct shfl_map_folder {
        /**
         * pointer, in:
         * Points to struct shfl_string buffer.
         */
        struct vmmdev_hgcm_function_parameter path;

        /**
         * pointer, out: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * pointer, in: UTF16
         * Path delimiter
         */
        struct vmmdev_hgcm_function_parameter delimiter;

        /**
         * pointer, in: SHFLROOT (u32)
         * Case senstive flag
         */
        struct vmmdev_hgcm_function_parameter case_sensitive;

};

/* Number of parameters */
#define SHFL_CPARMS_MAP_FOLDER (4)


/** SHFL_FN_UNMAP_FOLDER Parameters structure. */
struct shfl_unmap_folder {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

};

/* Number of parameters */
#define SHFL_CPARMS_UNMAP_FOLDER (1)


/** SHFL_FN_CREATE Parameters structure. */
struct shfl_create {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * pointer, in:
         * Points to struct shfl_string buffer.
         */
        struct vmmdev_hgcm_function_parameter path;

        /**
         * pointer, in/out:
         * Points to struct shfl_createparms buffer.
         */
        struct vmmdev_hgcm_function_parameter parms;

};

/* Number of parameters */
#define SHFL_CPARMS_CREATE (3)


/** SHFL_FN_CLOSE Parameters structure. */
struct shfl_close {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * value64, in:
         * SHFLHANDLE (u64) of object to close.
         */
        struct vmmdev_hgcm_function_parameter handle;

};

/* Number of parameters */
#define SHFL_CPARMS_CLOSE (2)


/** SHFL_FN_READ Parameters structure. */
struct shfl_read {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * value64, in:
         * SHFLHANDLE (u64) of object to read from.
         */
        struct vmmdev_hgcm_function_parameter handle;

        /**
         * value64, in:
         * Offset to read from.
         */
        struct vmmdev_hgcm_function_parameter offset;

        /**
         * value64, in/out:
         * Bytes to read/How many were read.
         */
        struct vmmdev_hgcm_function_parameter cb;

        /**
         * pointer, out:
         * Buffer to place data to.
         */
        struct vmmdev_hgcm_function_parameter buffer;

};

/* Number of parameters */
#define SHFL_CPARMS_READ (5)


/** SHFL_FN_WRITE Parameters structure. */
struct shfl_write {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * value64, in:
         * SHFLHANDLE (u64) of object to write to.
         */
        struct vmmdev_hgcm_function_parameter handle;

        /**
         * value64, in:
         * Offset to write to.
         */
        struct vmmdev_hgcm_function_parameter offset;

        /**
         * value64, in/out:
         * Bytes to write/How many were written.
         */
        struct vmmdev_hgcm_function_parameter cb;

        /**
         * pointer, in:
         * Data to write.
         */
        struct vmmdev_hgcm_function_parameter buffer;

};

/* Number of parameters */
#define SHFL_CPARMS_WRITE (5)


/*
 * SHFL_FN_LIST
 * Listing information includes variable length RTDIRENTRY[EX] structures.
 */

#define SHFL_LIST_NONE                  0
#define SHFL_LIST_RETURN_ONE            1

/** SHFL_FN_LIST Parameters structure. */
struct shfl_list {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * value64, in:
         * SHFLHANDLE (u64) of object to be listed.
         */
        struct vmmdev_hgcm_function_parameter handle;

        /**
         * value32, in:
         * List flags SHFL_LIST_*.
         */
        struct vmmdev_hgcm_function_parameter flags;

        /**
         * value32, in/out:
         * Bytes to be used for listing information/How many bytes were used.
         */
        struct vmmdev_hgcm_function_parameter cb;

        /**
         * pointer, in/optional
         * Points to struct shfl_string buffer that specifies a search path.
         */
        struct vmmdev_hgcm_function_parameter path;

        /**
         * pointer, out:
         * Buffer to place listing information to. (struct shfl_dirinfo)
         */
        struct vmmdev_hgcm_function_parameter buffer;

        /**
         * value32, in/out:
         * Indicates a key where the listing must be resumed.
         * in: 0 means start from begin of object.
         * out: 0 means listing completed.
         */
        struct vmmdev_hgcm_function_parameter resume_point;

        /**
         * pointer, out:
         * Number of files returned
         */
        struct vmmdev_hgcm_function_parameter file_count;
};

/* Number of parameters */
#define SHFL_CPARMS_LIST (8)


/** SHFL_FN_READLINK Parameters structure. */
struct shfl_readLink {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * pointer, in:
         * Points to struct shfl_string buffer.
         */
        struct vmmdev_hgcm_function_parameter path;

        /**
         * pointer, out:
         * Buffer to place data to.
         */
        struct vmmdev_hgcm_function_parameter buffer;

};

/* Number of parameters */
#define SHFL_CPARMS_READLINK (3)


/* SHFL_FN_INFORMATION */

/* Mask of Set/Get bit. */
#define SHFL_INFO_MODE_MASK    (0x1)
/* Get information */
#define SHFL_INFO_GET          (0x0)
/* Set information */
#define SHFL_INFO_SET          (0x1)

/* Get name of the object. */
#define SHFL_INFO_NAME         (0x2)
/* Set size of object (extend/trucate); only applies to file objects */
#define SHFL_INFO_SIZE         (0x4)
/* Get/Set file object info. */
#define SHFL_INFO_FILE         (0x8)
/* Get volume information. */
#define SHFL_INFO_VOLUME       (0x10)

/** SHFL_FN_INFORMATION Parameters structure. */
struct shfl_information {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * value64, in:
         * SHFLHANDLE (u64) of object to be listed.
         */
        struct vmmdev_hgcm_function_parameter handle;

        /**
         * value32, in:
         * SHFL_INFO_*
         */
        struct vmmdev_hgcm_function_parameter flags;

        /**
         * value32, in/out:
         * Bytes to be used for information/How many bytes were used.
         */
        struct vmmdev_hgcm_function_parameter cb;

        /**
         * pointer, in/out:
         * Information to be set/get (shfl_fsobjinfo or shfl_string). Do not
         * forget to set the shfl_fsobjinfo::attr::additional for a get
         * operation as well.
         */
        struct vmmdev_hgcm_function_parameter info;

};

/* Number of parameters */
#define SHFL_CPARMS_INFORMATION (5)


/* SHFL_FN_REMOVE */

#define SHFL_REMOVE_FILE        (0x1)
#define SHFL_REMOVE_DIR         (0x2)
#define SHFL_REMOVE_SYMLINK     (0x4)

/** SHFL_FN_REMOVE Parameters structure. */
struct shfl_remove {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * pointer, in:
         * Points to struct shfl_string buffer.
         */
        struct vmmdev_hgcm_function_parameter path;

        /**
         * value32, in:
         * remove flags (file/directory)
         */
        struct vmmdev_hgcm_function_parameter flags;

};

#define SHFL_CPARMS_REMOVE  (3)


/* SHFL_FN_RENAME */

#define SHFL_RENAME_FILE                (0x1)
#define SHFL_RENAME_DIR                 (0x2)
#define SHFL_RENAME_REPLACE_IF_EXISTS   (0x4)

/** SHFL_FN_RENAME Parameters structure. */
struct shfl_rename {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * pointer, in:
         * Points to struct shfl_string src.
         */
        struct vmmdev_hgcm_function_parameter src;

        /**
         * pointer, in:
         * Points to struct shfl_string dest.
         */
        struct vmmdev_hgcm_function_parameter dest;

        /**
         * value32, in:
         * rename flags (file/directory)
         */
        struct vmmdev_hgcm_function_parameter flags;

};

#define SHFL_CPARMS_RENAME  (4)


/** SHFL_FN_SYMLINK Parameters structure. */
struct shfl_symlink {
        /**
         * pointer, in: SHFLROOT (u32)
         * Root handle of the mapping which name is queried.
         */
        struct vmmdev_hgcm_function_parameter root;

        /**
         * pointer, in:
         * Points to struct shfl_string of path for the new symlink.
         */
        struct vmmdev_hgcm_function_parameter new_path;

        /**
         * pointer, in:
         * Points to struct shfl_string of destination for symlink.
         */
        struct vmmdev_hgcm_function_parameter old_path;

        /**
         * pointer, out:
         * Information about created symlink.
         */
        struct vmmdev_hgcm_function_parameter info;

};

#define SHFL_CPARMS_SYMLINK  (4)

#endif