VirtualBox

source: vbox/trunk/include/VBox/shflsvc.h@ 73768

Last change on this file since 73768 was 72627, checked in by vboxsync, 6 years ago

Additions: relicence components needed for Linux shared folders to MIT.
bugref:9109: Shared folders: update to match in-kernel code more closely
This change makes the code on which the Linux kernel shared folder patch is
based MIT-licenced, so that the version in the Linux kernel can be too. This
would make it easier to move code back and forth.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 37.7 KB
Line 
1/** @file
2 * Shared Folders: Common header for host service and guest clients.
3 */
4
5/*
6 * Copyright (C) 2006-2018 Oracle Corporation
7 *
8 * Permission is hereby granted, free of charge, to any person
9 * obtaining a copy of this software and associated documentation
10 * files (the "Software"), to deal in the Software without
11 * restriction, including without limitation the rights to use,
12 * copy, modify, merge, publish, distribute, sublicense, and/or sell
13 * copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following
15 * conditions:
16 *
17 * The above copyright notice and this permission notice shall be
18 * included in all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
22 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
25 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27 * OTHER DEALINGS IN THE SOFTWARE.
28 */
29
30#ifndef ___VBox_shflsvc_h
31#define ___VBox_shflsvc_h
32
33#ifndef IN_MODULE
34# include <VBox/VMMDevCoreTypes.h>
35# include <VBox/VBoxGuestCoreTypes.h>
36#endif
37#include <iprt/string.h>
38#include <VBox/cdefs.h>
39#include <VBox/types.h>
40#include <iprt/fs.h>
41#include <iprt/assert.h>
42
43
44/** @name Some bit flag manipulation macros.
45 * @{ */
46#ifndef BIT_FLAG
47#define BIT_FLAG(__Field,__Flag) ((__Field) & (__Flag))
48#endif
49
50#ifndef BIT_FLAG_SET
51#define BIT_FLAG_SET(__Field,__Flag) ((__Field) |= (__Flag))
52#endif
53
54#ifndef BIT_FLAG_CLEAR
55#define BIT_FLAG_CLEAR(__Field,__Flag) ((__Field) &= ~(__Flag))
56#endif
57/** @} */
58
59
60/**
61 * Structures shared between guest and the service
62 * can be relocated and use offsets to point to variable
63 * length parts.
64 */
65
66/**
67 * Shared folders protocol works with handles.
68 * Before doing any action on a file system object,
69 * one have to obtain the object handle via a SHFL_FN_CREATE
70 * request. A handle must be closed with SHFL_FN_CLOSE.
71 */
72
73/** Shared Folders service functions. (guest)
74 * @{
75 */
76
77/** Query mappings changes. */
78#define SHFL_FN_QUERY_MAPPINGS (1)
79/** Query mappings changes. */
80#define SHFL_FN_QUERY_MAP_NAME (2)
81/** Open/create object. */
82#define SHFL_FN_CREATE (3)
83/** Close object handle. */
84#define SHFL_FN_CLOSE (4)
85/** Read object content. */
86#define SHFL_FN_READ (5)
87/** Write new object content. */
88#define SHFL_FN_WRITE (6)
89/** Lock/unlock a range in the object. */
90#define SHFL_FN_LOCK (7)
91/** List object content. */
92#define SHFL_FN_LIST (8)
93/** Query/set object information. */
94#define SHFL_FN_INFORMATION (9)
95/** Remove object */
96#define SHFL_FN_REMOVE (11)
97/** Map folder (legacy) */
98#define SHFL_FN_MAP_FOLDER_OLD (12)
99/** Unmap folder */
100#define SHFL_FN_UNMAP_FOLDER (13)
101/** Rename object (possibly moving it to another directory) */
102#define SHFL_FN_RENAME (14)
103/** Flush file */
104#define SHFL_FN_FLUSH (15)
105/** @todo macl, a description, please. */
106#define SHFL_FN_SET_UTF8 (16)
107/** Map folder */
108#define SHFL_FN_MAP_FOLDER (17)
109/** Read symlink destination (as of VBox 4.0) */
110#define SHFL_FN_READLINK (18)
111/** Create symlink (as of VBox 4.0) */
112#define SHFL_FN_SYMLINK (19)
113/** Ask host to show symlinks (as of VBox 4.0) */
114#define SHFL_FN_SET_SYMLINKS (20)
115
116/** @} */
117
118/** Shared Folders service functions. (host)
119 * @{
120 */
121
122/** Add shared folder mapping. */
123#define SHFL_FN_ADD_MAPPING (1)
124/** Remove shared folder mapping. */
125#define SHFL_FN_REMOVE_MAPPING (2)
126/** Set the led status light address. */
127#define SHFL_FN_SET_STATUS_LED (3)
128/** Allow the guest to create symbolic links (as of VBox 4.0) */
129#define SHFL_FN_ALLOW_SYMLINKS_CREATE (4)
130/** @} */
131
132/** Root handle for a mapping. Root handles are unique.
133 * @note
134 * Function parameters structures consider
135 * the root handle as 32 bit value. If the typedef
136 * will be changed, then function parameters must be
137 * changed accordingly. All those parameters are marked
138 * with SHFLROOT in comments.
139 */
140typedef uint32_t SHFLROOT;
141
142#define SHFL_ROOT_NIL ((SHFLROOT)~0)
143
144
145/** A shared folders handle for an opened object. */
146typedef uint64_t SHFLHANDLE;
147
148#define SHFL_HANDLE_NIL ((SHFLHANDLE)~0LL)
149#define SHFL_HANDLE_ROOT ((SHFLHANDLE)0LL)
150
151/** Hardcoded maximum length (in chars) of a shared folder name. */
152#define SHFL_MAX_LEN (256)
153/** Hardcoded maximum number of shared folder mapping available to the guest. */
154#define SHFL_MAX_MAPPINGS (64)
155
156/** @name Shared Folders strings. They can be either UTF-8 or UTF-16.
157 * @{
158 */
159
160/**
161 * Shared folder string buffer structure.
162 */
163typedef struct _SHFLSTRING
164{
165 /** Allocated size of the String member in bytes. */
166 uint16_t u16Size;
167
168 /** Length of string without trailing nul in bytes. */
169 uint16_t u16Length;
170
171 /** UTF-8 or UTF-16 string. Nul terminated. */
172 union
173 {
174#if 1
175 uint8_t utf8[1];
176 RTUTF16 utf16[1];
177 uint16_t ucs2[1]; /**< misnomer, use utf16. */
178#else
179 uint8_t utf8[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
180 RTUTF16 utf16[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
181 RTUTF16 ucs2[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION]; /**< misnomer, use utf16. */
182#endif
183 } String;
184} SHFLSTRING;
185AssertCompileSize(RTUTF16, 2);
186AssertCompileSize(SHFLSTRING, 6);
187AssertCompileMemberOffset(SHFLSTRING, String, 4);
188/** The size of SHFLSTRING w/o the string part. */
189#define SHFLSTRING_HEADER_SIZE 4
190AssertCompileMemberOffset(SHFLSTRING, String, SHFLSTRING_HEADER_SIZE);
191
192/** Pointer to a shared folder string buffer. */
193typedef SHFLSTRING *PSHFLSTRING;
194/** Pointer to a const shared folder string buffer. */
195typedef const SHFLSTRING *PCSHFLSTRING;
196
197/** Calculate size of the string. */
198DECLINLINE(uint32_t) ShflStringSizeOfBuffer(PCSHFLSTRING pString)
199{
200 return pString ? (uint32_t)(SHFLSTRING_HEADER_SIZE + pString->u16Size) : 0;
201}
202
203DECLINLINE(uint32_t) ShflStringLength(PCSHFLSTRING pString)
204{
205 return pString ? pString->u16Length : 0;
206}
207
208DECLINLINE(PSHFLSTRING) ShflStringInitBuffer(void *pvBuffer, uint32_t u32Size)
209{
210 PSHFLSTRING pString = NULL;
211 const uint32_t u32HeaderSize = SHFLSTRING_HEADER_SIZE;
212
213 /*
214 * Check that the buffer size is big enough to hold a zero sized string
215 * and is not too big to fit into 16 bit variables.
216 */
217 if (u32Size >= u32HeaderSize && u32Size - u32HeaderSize <= 0xFFFF)
218 {
219 pString = (PSHFLSTRING)pvBuffer;
220 pString->u16Size = (uint16_t)(u32Size - u32HeaderSize);
221 pString->u16Length = 0;
222 if (pString->u16Size >= sizeof(pString->String.ucs2[0]))
223 pString->String.ucs2[0] = 0;
224 else if (pString->u16Size >= sizeof(pString->String.utf8[0]))
225 pString->String.utf8[0] = 0;
226 }
227
228 return pString;
229}
230
231/**
232 * Validates a HGCM string output parameter.
233 *
234 * @returns true if valid, false if not.
235 *
236 * @param pString The string buffer pointer.
237 * @param cbBuf The buffer size from the parameter.
238 */
239DECLINLINE(bool) ShflStringIsValidOut(PCSHFLSTRING pString, uint32_t cbBuf)
240{
241 if (RT_LIKELY(cbBuf > RT_UOFFSETOF(SHFLSTRING, String)))
242 if (RT_LIKELY((uint32_t)pString->u16Size + RT_UOFFSETOF(SHFLSTRING, String) <= cbBuf))
243 if (RT_LIKELY(pString->u16Length < pString->u16Size))
244 return true;
245 return false;
246}
247
248/**
249 * Validates a HGCM string input parameter.
250 *
251 * @returns true if valid, false if not.
252 *
253 * @param pString The string buffer pointer.
254 * @param cbBuf The buffer size from the parameter.
255 * @param fUtf8Not16 Set if UTF-8 encoding, clear if UTF-16 encoding.
256 */
257DECLINLINE(bool) ShflStringIsValidIn(PCSHFLSTRING pString, uint32_t cbBuf, bool fUtf8Not16)
258{
259 int rc;
260 if (RT_LIKELY(cbBuf > RT_UOFFSETOF(SHFLSTRING, String)))
261 {
262 if (RT_LIKELY((uint32_t)pString->u16Size + RT_UOFFSETOF(SHFLSTRING, String) <= cbBuf))
263 {
264 if (fUtf8Not16)
265 {
266 /* UTF-8: */
267 if (RT_LIKELY(pString->u16Length < pString->u16Size))
268 {
269 rc = RTStrValidateEncodingEx((const char *)&pString->String.utf8[0], pString->u16Length + 1,
270 RTSTR_VALIDATE_ENCODING_EXACT_LENGTH | RTSTR_VALIDATE_ENCODING_ZERO_TERMINATED);
271 if (RT_SUCCESS(rc))
272 return true;
273 }
274 }
275 else
276 {
277 /* UTF-16: */
278 if (RT_LIKELY(!(pString->u16Length & 1)))
279 {
280 if (RT_LIKELY((uint32_t)sizeof(RTUTF16) + pString->u16Length <= pString->u16Size))
281 {
282 rc = RTUtf16ValidateEncodingEx(&pString->String.ucs2[0], pString->u16Length / 2 + 1,
283 RTSTR_VALIDATE_ENCODING_EXACT_LENGTH
284 | RTSTR_VALIDATE_ENCODING_ZERO_TERMINATED);
285 if (RT_SUCCESS(rc))
286 return true;
287 }
288 }
289 }
290 }
291 }
292 return false;
293}
294
295/**
296 * Validates an optional HGCM string input parameter.
297 *
298 * @returns true if valid, false if not.
299 *
300 * @param pString The string buffer pointer. Can be NULL.
301 * @param cbBuf The buffer size from the parameter.
302 * @param fUtf8Not16 Set if UTF-8 encoding, clear if UTF-16 encoding.
303 */
304DECLINLINE(bool) ShflStringIsValidOrNullIn(PCSHFLSTRING pString, uint32_t cbBuf, bool fUtf8Not16)
305{
306 if (pString)
307 return ShflStringIsValidIn(pString, cbBuf, fUtf8Not16);
308 if (RT_LIKELY(cbBuf == 0))
309 return true;
310 return false;
311}
312
313/** @} */
314
315
316/**
317 * The available additional information in a SHFLFSOBJATTR object.
318 */
319typedef enum SHFLFSOBJATTRADD
320{
321 /** No additional information is available / requested. */
322 SHFLFSOBJATTRADD_NOTHING = 1,
323 /** The additional unix attributes (SHFLFSOBJATTR::u::Unix) are
324 * available / requested. */
325 SHFLFSOBJATTRADD_UNIX,
326 /** The additional extended attribute size (SHFLFSOBJATTR::u::EASize) is
327 * available / requested. */
328 SHFLFSOBJATTRADD_EASIZE,
329 /** The last valid item (inclusive).
330 * The valid range is SHFLFSOBJATTRADD_NOTHING thru
331 * SHFLFSOBJATTRADD_LAST. */
332 SHFLFSOBJATTRADD_LAST = SHFLFSOBJATTRADD_EASIZE,
333
334 /** The usual 32-bit hack. */
335 SHFLFSOBJATTRADD_32BIT_SIZE_HACK = 0x7fffffff
336} SHFLFSOBJATTRADD;
337
338
339/* Assert sizes of the IRPT types we're using below. */
340AssertCompileSize(RTFMODE, 4);
341AssertCompileSize(RTFOFF, 8);
342AssertCompileSize(RTINODE, 8);
343AssertCompileSize(RTTIMESPEC, 8);
344AssertCompileSize(RTDEV, 4);
345AssertCompileSize(RTUID, 4);
346
347/**
348 * Shared folder filesystem object attributes.
349 */
350#pragma pack(1)
351typedef struct SHFLFSOBJATTR
352{
353 /** Mode flags (st_mode). RTFS_UNIX_*, RTFS_TYPE_*, and RTFS_DOS_*.
354 * @remarks We depend on a number of RTFS_ defines to remain unchanged.
355 * Fortuntately, these are depending on windows, dos and unix
356 * standard values, so this shouldn't be much of a pain. */
357 RTFMODE fMode;
358
359 /** The additional attributes available. */
360 SHFLFSOBJATTRADD enmAdditional;
361
362 /**
363 * Additional attributes.
364 *
365 * Unless explicitly specified to an API, the API can provide additional
366 * data as it is provided by the underlying OS.
367 */
368 union SHFLFSOBJATTRUNION
369 {
370 /** Additional Unix Attributes
371 * These are available when SHFLFSOBJATTRADD is set in fUnix.
372 */
373 struct SHFLFSOBJATTRUNIX
374 {
375 /** The user owning the filesystem object (st_uid).
376 * This field is ~0U if not supported. */
377 RTUID uid;
378
379 /** The group the filesystem object is assigned (st_gid).
380 * This field is ~0U if not supported. */
381 RTGID gid;
382
383 /** Number of hard links to this filesystem object (st_nlink).
384 * This field is 1 if the filesystem doesn't support hardlinking or
385 * the information isn't available.
386 */
387 uint32_t cHardlinks;
388
389 /** The device number of the device which this filesystem object resides on (st_dev).
390 * This field is 0 if this information is not available. */
391 RTDEV INodeIdDevice;
392
393 /** The unique identifier (within the filesystem) of this filesystem object (st_ino).
394 * Together with INodeIdDevice, this field can be used as a OS wide unique id
395 * when both their values are not 0.
396 * This field is 0 if the information is not available. */
397 RTINODE INodeId;
398
399 /** User flags (st_flags).
400 * This field is 0 if this information is not available. */
401 uint32_t fFlags;
402
403 /** The current generation number (st_gen).
404 * This field is 0 if this information is not available. */
405 uint32_t GenerationId;
406
407 /** The device number of a character or block device type object (st_rdev).
408 * This field is 0 if the file isn't of a character or block device type and
409 * when the OS doesn't subscribe to the major+minor device idenfication scheme. */
410 RTDEV Device;
411 } Unix;
412
413 /**
414 * Extended attribute size.
415 */
416 struct SHFLFSOBJATTREASIZE
417 {
418 /** Size of EAs. */
419 RTFOFF cb;
420 } EASize;
421 } u;
422} SHFLFSOBJATTR;
423#pragma pack()
424AssertCompileSize(SHFLFSOBJATTR, 44);
425/** Pointer to a shared folder filesystem object attributes structure. */
426typedef SHFLFSOBJATTR *PSHFLFSOBJATTR;
427/** Pointer to a const shared folder filesystem object attributes structure. */
428typedef const SHFLFSOBJATTR *PCSHFLFSOBJATTR;
429
430
431/**
432 * Filesystem object information structure.
433 */
434#pragma pack(1)
435typedef struct SHFLFSOBJINFO
436{
437 /** Logical size (st_size).
438 * For normal files this is the size of the file.
439 * For symbolic links, this is the length of the path name contained
440 * in the symbolic link.
441 * For other objects this fields needs to be specified.
442 */
443 RTFOFF cbObject;
444
445 /** Disk allocation size (st_blocks * DEV_BSIZE). */
446 RTFOFF cbAllocated;
447
448 /** Time of last access (st_atime).
449 * @remarks Here (and other places) we depend on the IPRT timespec to
450 * remain unchanged. */
451 RTTIMESPEC AccessTime;
452
453 /** Time of last data modification (st_mtime). */
454 RTTIMESPEC ModificationTime;
455
456 /** Time of last status change (st_ctime).
457 * If not available this is set to ModificationTime.
458 */
459 RTTIMESPEC ChangeTime;
460
461 /** Time of file birth (st_birthtime).
462 * If not available this is set to ChangeTime.
463 */
464 RTTIMESPEC BirthTime;
465
466 /** Attributes. */
467 SHFLFSOBJATTR Attr;
468
469} SHFLFSOBJINFO;
470#pragma pack()
471AssertCompileSize(SHFLFSOBJINFO, 92);
472/** Pointer to a shared folder filesystem object information structure. */
473typedef SHFLFSOBJINFO *PSHFLFSOBJINFO;
474/** Pointer to a const shared folder filesystem object information
475 * structure. */
476typedef const SHFLFSOBJINFO *PCSHFLFSOBJINFO;
477
478
479/**
480 * Copy file system objinfo from IPRT to shared folder format.
481 *
482 * @param pDst The shared folder structure.
483 * @param pSrc The IPRT structure.
484 */
485DECLINLINE(void) vbfsCopyFsObjInfoFromIprt(PSHFLFSOBJINFO pDst, PCRTFSOBJINFO pSrc)
486{
487 pDst->cbObject = pSrc->cbObject;
488 pDst->cbAllocated = pSrc->cbAllocated;
489 pDst->AccessTime = pSrc->AccessTime;
490 pDst->ModificationTime = pSrc->ModificationTime;
491 pDst->ChangeTime = pSrc->ChangeTime;
492 pDst->BirthTime = pSrc->BirthTime;
493 pDst->Attr.fMode = pSrc->Attr.fMode;
494 /* Clear bits which we don't pass through for security reasons. */
495 pDst->Attr.fMode &= ~(RTFS_UNIX_ISUID | RTFS_UNIX_ISGID | RTFS_UNIX_ISTXT);
496 RT_ZERO(pDst->Attr.u);
497 switch (pSrc->Attr.enmAdditional)
498 {
499 default:
500 case RTFSOBJATTRADD_NOTHING:
501 pDst->Attr.enmAdditional = SHFLFSOBJATTRADD_NOTHING;
502 break;
503
504 case RTFSOBJATTRADD_UNIX:
505 pDst->Attr.enmAdditional = SHFLFSOBJATTRADD_UNIX;
506 pDst->Attr.u.Unix.uid = pSrc->Attr.u.Unix.uid;
507 pDst->Attr.u.Unix.gid = pSrc->Attr.u.Unix.gid;
508 pDst->Attr.u.Unix.cHardlinks = pSrc->Attr.u.Unix.cHardlinks;
509 pDst->Attr.u.Unix.INodeIdDevice = pSrc->Attr.u.Unix.INodeIdDevice;
510 pDst->Attr.u.Unix.INodeId = pSrc->Attr.u.Unix.INodeId;
511 pDst->Attr.u.Unix.fFlags = pSrc->Attr.u.Unix.fFlags;
512 pDst->Attr.u.Unix.GenerationId = pSrc->Attr.u.Unix.GenerationId;
513 pDst->Attr.u.Unix.Device = pSrc->Attr.u.Unix.Device;
514 break;
515
516 case RTFSOBJATTRADD_EASIZE:
517 pDst->Attr.enmAdditional = SHFLFSOBJATTRADD_EASIZE;
518 pDst->Attr.u.EASize.cb = pSrc->Attr.u.EASize.cb;
519 break;
520 }
521}
522
523
524/** Result of an open/create request.
525 * Along with handle value the result code
526 * identifies what has happened while
527 * trying to open the object.
528 */
529typedef enum _SHFLCREATERESULT
530{
531 SHFL_NO_RESULT,
532 /** Specified path does not exist. */
533 SHFL_PATH_NOT_FOUND,
534 /** Path to file exists, but the last component does not. */
535 SHFL_FILE_NOT_FOUND,
536 /** File already exists and either has been opened or not. */
537 SHFL_FILE_EXISTS,
538 /** New file was created. */
539 SHFL_FILE_CREATED,
540 /** Existing file was replaced or overwritten. */
541 SHFL_FILE_REPLACED
542} SHFLCREATERESULT;
543
544
545/** Open/create flags.
546 * @{
547 */
548
549/** No flags. Initialization value. */
550#define SHFL_CF_NONE (0x00000000)
551
552/** Lookup only the object, do not return a handle. All other flags are ignored. */
553#define SHFL_CF_LOOKUP (0x00000001)
554
555/** Open parent directory of specified object.
556 * Useful for the corresponding Windows FSD flag
557 * and for opening paths like \\dir\\*.* to search the 'dir'.
558 * @todo possibly not needed???
559 */
560#define SHFL_CF_OPEN_TARGET_DIRECTORY (0x00000002)
561
562/** Create/open a directory. */
563#define SHFL_CF_DIRECTORY (0x00000004)
564
565/** Open/create action to do if object exists
566 * and if the object does not exists.
567 * REPLACE file means atomically DELETE and CREATE.
568 * OVERWRITE file means truncating the file to 0 and
569 * setting new size.
570 * When opening an existing directory REPLACE and OVERWRITE
571 * actions are considered invalid, and cause returning
572 * FILE_EXISTS with NIL handle.
573 */
574#define SHFL_CF_ACT_MASK_IF_EXISTS (0x000000F0)
575#define SHFL_CF_ACT_MASK_IF_NEW (0x00000F00)
576
577/** What to do if object exists. */
578#define SHFL_CF_ACT_OPEN_IF_EXISTS (0x00000000)
579#define SHFL_CF_ACT_FAIL_IF_EXISTS (0x00000010)
580#define SHFL_CF_ACT_REPLACE_IF_EXISTS (0x00000020)
581#define SHFL_CF_ACT_OVERWRITE_IF_EXISTS (0x00000030)
582
583/** What to do if object does not exist. */
584#define SHFL_CF_ACT_CREATE_IF_NEW (0x00000000)
585#define SHFL_CF_ACT_FAIL_IF_NEW (0x00000100)
586
587/** Read/write requested access for the object. */
588#define SHFL_CF_ACCESS_MASK_RW (0x00003000)
589
590/** No access requested. */
591#define SHFL_CF_ACCESS_NONE (0x00000000)
592/** Read access requested. */
593#define SHFL_CF_ACCESS_READ (0x00001000)
594/** Write access requested. */
595#define SHFL_CF_ACCESS_WRITE (0x00002000)
596/** Read/Write access requested. */
597#define SHFL_CF_ACCESS_READWRITE (SHFL_CF_ACCESS_READ | SHFL_CF_ACCESS_WRITE)
598
599/** Requested share access for the object. */
600#define SHFL_CF_ACCESS_MASK_DENY (0x0000C000)
601
602/** Allow any access. */
603#define SHFL_CF_ACCESS_DENYNONE (0x00000000)
604/** Do not allow read. */
605#define SHFL_CF_ACCESS_DENYREAD (0x00004000)
606/** Do not allow write. */
607#define SHFL_CF_ACCESS_DENYWRITE (0x00008000)
608/** Do not allow access. */
609#define SHFL_CF_ACCESS_DENYALL (SHFL_CF_ACCESS_DENYREAD | SHFL_CF_ACCESS_DENYWRITE)
610
611/** Requested access to attributes of the object. */
612#define SHFL_CF_ACCESS_MASK_ATTR (0x00030000)
613
614/** No access requested. */
615#define SHFL_CF_ACCESS_ATTR_NONE (0x00000000)
616/** Read access requested. */
617#define SHFL_CF_ACCESS_ATTR_READ (0x00010000)
618/** Write access requested. */
619#define SHFL_CF_ACCESS_ATTR_WRITE (0x00020000)
620/** Read/Write access requested. */
621#define SHFL_CF_ACCESS_ATTR_READWRITE (SHFL_CF_ACCESS_ATTR_READ | SHFL_CF_ACCESS_ATTR_WRITE)
622
623/** The file is opened in append mode. Ignored if SHFL_CF_ACCESS_WRITE is not set. */
624#define SHFL_CF_ACCESS_APPEND (0x00040000)
625
626/** @} */
627
628#pragma pack(1)
629typedef struct _SHFLCREATEPARMS
630{
631 /* Returned handle of opened object. */
632 SHFLHANDLE Handle;
633
634 /* Returned result of the operation */
635 SHFLCREATERESULT Result;
636
637 /* SHFL_CF_* */
638 uint32_t CreateFlags;
639
640 /* Attributes of object to create and
641 * returned actual attributes of opened/created object.
642 */
643 SHFLFSOBJINFO Info;
644
645} SHFLCREATEPARMS;
646#pragma pack()
647
648typedef SHFLCREATEPARMS *PSHFLCREATEPARMS;
649
650
651/** Shared Folders mappings.
652 * @{
653 */
654
655/** The mapping has been added since last query. */
656#define SHFL_MS_NEW (1)
657/** The mapping has been deleted since last query. */
658#define SHFL_MS_DELETED (2)
659
660typedef struct _SHFLMAPPING
661{
662 /** Mapping status. */
663 uint32_t u32Status;
664 /** Root handle. */
665 SHFLROOT root;
666} SHFLMAPPING;
667/** Pointer to a SHFLMAPPING structure. */
668typedef SHFLMAPPING *PSHFLMAPPING;
669
670/** @} */
671
672/** Shared Folder directory information
673 * @{
674 */
675
676typedef struct _SHFLDIRINFO
677{
678 /** Full information about the object. */
679 SHFLFSOBJINFO Info;
680 /** The length of the short field (number of RTUTF16 chars).
681 * It is 16-bit for reasons of alignment. */
682 uint16_t cucShortName;
683 /** The short name for 8.3 compatibility.
684 * Empty string if not available.
685 */
686 RTUTF16 uszShortName[14];
687 /** @todo malc, a description, please. */
688 SHFLSTRING name;
689} SHFLDIRINFO, *PSHFLDIRINFO;
690
691
692/**
693 * Shared folder filesystem properties.
694 */
695typedef struct SHFLFSPROPERTIES
696{
697 /** The maximum size of a filesystem object name.
698 * This does not include the '\\0'. */
699 uint32_t cbMaxComponent;
700
701 /** True if the filesystem is remote.
702 * False if the filesystem is local. */
703 bool fRemote;
704
705 /** True if the filesystem is case sensitive.
706 * False if the filesystem is case insensitive. */
707 bool fCaseSensitive;
708
709 /** True if the filesystem is mounted read only.
710 * False if the filesystem is mounted read write. */
711 bool fReadOnly;
712
713 /** True if the filesystem can encode unicode object names.
714 * False if it can't. */
715 bool fSupportsUnicode;
716
717 /** True if the filesystem is compresses.
718 * False if it isn't or we don't know. */
719 bool fCompressed;
720
721 /** True if the filesystem compresses of individual files.
722 * False if it doesn't or we don't know. */
723 bool fFileCompression;
724
725 /** @todo more? */
726} SHFLFSPROPERTIES;
727AssertCompileSize(SHFLFSPROPERTIES, 12);
728/** Pointer to a shared folder filesystem properties structure. */
729typedef SHFLFSPROPERTIES *PSHFLFSPROPERTIES;
730/** Pointer to a const shared folder filesystem properties structure. */
731typedef SHFLFSPROPERTIES const *PCSHFLFSPROPERTIES;
732
733
734/**
735 * Copy file system properties from IPRT to shared folder format.
736 *
737 * @param pDst The shared folder structure.
738 * @param pSrc The IPRT structure.
739 */
740DECLINLINE(void) vbfsCopyFsPropertiesFromIprt(PSHFLFSPROPERTIES pDst, PCRTFSPROPERTIES pSrc)
741{
742 RT_ZERO(*pDst); /* zap the implicit padding. */
743 pDst->cbMaxComponent = pSrc->cbMaxComponent;
744 pDst->fRemote = pSrc->fRemote;
745 pDst->fCaseSensitive = pSrc->fCaseSensitive;
746 pDst->fReadOnly = pSrc->fReadOnly;
747 pDst->fSupportsUnicode = pSrc->fSupportsUnicode;
748 pDst->fCompressed = pSrc->fCompressed;
749 pDst->fFileCompression = pSrc->fFileCompression;
750}
751
752
753typedef struct _SHFLVOLINFO
754{
755 RTFOFF ullTotalAllocationBytes;
756 RTFOFF ullAvailableAllocationBytes;
757 uint32_t ulBytesPerAllocationUnit;
758 uint32_t ulBytesPerSector;
759 uint32_t ulSerial;
760 SHFLFSPROPERTIES fsProperties;
761} SHFLVOLINFO, *PSHFLVOLINFO;
762
763/** @} */
764
765/** Function parameter structures.
766 * @{
767 */
768
769/**
770 * SHFL_FN_QUERY_MAPPINGS
771 */
772/** Validation mask. Needs to be adjusted
773 * whenever a new SHFL_MF_ flag is added. */
774#define SHFL_MF_MASK (0x00000011)
775/** UC2 enconded strings. */
776#define SHFL_MF_UCS2 (0x00000000)
777/** Guest uses UTF8 strings, if not set then the strings are unicode (UCS2). */
778#define SHFL_MF_UTF8 (0x00000001)
779/** Just handle the auto-mounted folders. */
780#define SHFL_MF_AUTOMOUNT (0x00000010)
781
782/** Type of guest system. For future system dependent features. */
783#define SHFL_MF_SYSTEM_MASK (0x0000FF00)
784#define SHFL_MF_SYSTEM_NONE (0x00000000)
785#define SHFL_MF_SYSTEM_WINDOWS (0x00000100)
786#define SHFL_MF_SYSTEM_LINUX (0x00000200)
787
788/** Parameters structure. */
789typedef struct _VBoxSFQueryMappings
790{
791 VBGLIOCHGCMCALL callInfo;
792
793 /** 32bit, in:
794 * Flags describing various client needs.
795 */
796 HGCMFunctionParameter flags;
797
798 /** 32bit, in/out:
799 * Number of mappings the client expects.
800 * This is the number of elements in the
801 * mappings array.
802 */
803 HGCMFunctionParameter numberOfMappings;
804
805 /** pointer, in/out:
806 * Points to array of SHFLMAPPING structures.
807 */
808 HGCMFunctionParameter mappings;
809
810} VBoxSFQueryMappings;
811
812/** Number of parameters */
813#define SHFL_CPARMS_QUERY_MAPPINGS (3)
814
815
816
817/**
818 * SHFL_FN_QUERY_MAP_NAME
819 */
820
821/** Parameters structure. */
822typedef struct _VBoxSFQueryMapName
823{
824 VBGLIOCHGCMCALL callInfo;
825
826 /** 32bit, in: SHFLROOT
827 * Root handle of the mapping which name is queried.
828 */
829 HGCMFunctionParameter root;
830
831 /** pointer, in/out:
832 * Points to SHFLSTRING buffer.
833 */
834 HGCMFunctionParameter name;
835
836} VBoxSFQueryMapName;
837
838/** Number of parameters */
839#define SHFL_CPARMS_QUERY_MAP_NAME (2)
840
841/**
842 * SHFL_FN_MAP_FOLDER_OLD
843 */
844
845/** Parameters structure. */
846typedef struct _VBoxSFMapFolder_Old
847{
848 VBGLIOCHGCMCALL callInfo;
849
850 /** pointer, in:
851 * Points to SHFLSTRING buffer.
852 */
853 HGCMFunctionParameter path;
854
855 /** pointer, out: SHFLROOT
856 * Root handle of the mapping which name is queried.
857 */
858 HGCMFunctionParameter root;
859
860 /** pointer, in: RTUTF16
861 * Path delimiter
862 */
863 HGCMFunctionParameter delimiter;
864
865} VBoxSFMapFolder_Old;
866
867/** Number of parameters */
868#define SHFL_CPARMS_MAP_FOLDER_OLD (3)
869
870/**
871 * SHFL_FN_MAP_FOLDER
872 */
873
874/** Parameters structure. */
875typedef struct _VBoxSFMapFolder
876{
877 VBGLIOCHGCMCALL callInfo;
878
879 /** pointer, in:
880 * Points to SHFLSTRING buffer.
881 */
882 HGCMFunctionParameter path;
883
884 /** pointer, out: SHFLROOT
885 * Root handle of the mapping which name is queried.
886 */
887 HGCMFunctionParameter root;
888
889 /** pointer, in: RTUTF16
890 * Path delimiter
891 */
892 HGCMFunctionParameter delimiter;
893
894 /** pointer, in: SHFLROOT
895 * Case senstive flag
896 */
897 HGCMFunctionParameter fCaseSensitive;
898
899} VBoxSFMapFolder;
900
901/** Number of parameters */
902#define SHFL_CPARMS_MAP_FOLDER (4)
903
904/**
905 * SHFL_FN_UNMAP_FOLDER
906 */
907
908/** Parameters structure. */
909typedef struct _VBoxSFUnmapFolder
910{
911 VBGLIOCHGCMCALL callInfo;
912
913 /** pointer, in: SHFLROOT
914 * Root handle of the mapping which name is queried.
915 */
916 HGCMFunctionParameter root;
917
918} VBoxSFUnmapFolder;
919
920/** Number of parameters */
921#define SHFL_CPARMS_UNMAP_FOLDER (1)
922
923
924/**
925 * SHFL_FN_CREATE
926 */
927
928/** Parameters structure. */
929typedef struct _VBoxSFCreate
930{
931 VBGLIOCHGCMCALL callInfo;
932
933 /** pointer, in: SHFLROOT
934 * Root handle of the mapping which name is queried.
935 */
936 HGCMFunctionParameter root;
937
938 /** pointer, in:
939 * Points to SHFLSTRING buffer.
940 */
941 HGCMFunctionParameter path;
942
943 /** pointer, in/out:
944 * Points to SHFLCREATEPARMS buffer.
945 */
946 HGCMFunctionParameter parms;
947
948} VBoxSFCreate;
949
950/** Number of parameters */
951#define SHFL_CPARMS_CREATE (3)
952
953
954/**
955 * SHFL_FN_CLOSE
956 */
957
958/** Parameters structure. */
959typedef struct _VBoxSFClose
960{
961 VBGLIOCHGCMCALL callInfo;
962
963 /** pointer, in: SHFLROOT
964 * Root handle of the mapping which name is queried.
965 */
966 HGCMFunctionParameter root;
967
968
969 /** value64, in:
970 * SHFLHANDLE of object to close.
971 */
972 HGCMFunctionParameter handle;
973
974} VBoxSFClose;
975
976/** Number of parameters */
977#define SHFL_CPARMS_CLOSE (2)
978
979
980/**
981 * SHFL_FN_READ
982 */
983
984/** Parameters structure. */
985typedef struct _VBoxSFRead
986{
987 VBGLIOCHGCMCALL callInfo;
988
989 /** pointer, in: SHFLROOT
990 * Root handle of the mapping which name is queried.
991 */
992 HGCMFunctionParameter root;
993
994 /** value64, in:
995 * SHFLHANDLE of object to read from.
996 */
997 HGCMFunctionParameter handle;
998
999 /** value64, in:
1000 * Offset to read from.
1001 */
1002 HGCMFunctionParameter offset;
1003
1004 /** value64, in/out:
1005 * Bytes to read/How many were read.
1006 */
1007 HGCMFunctionParameter cb;
1008
1009 /** pointer, out:
1010 * Buffer to place data to.
1011 */
1012 HGCMFunctionParameter buffer;
1013
1014} VBoxSFRead;
1015
1016/** Number of parameters */
1017#define SHFL_CPARMS_READ (5)
1018
1019
1020
1021/**
1022 * SHFL_FN_WRITE
1023 */
1024
1025/** Parameters structure. */
1026typedef struct _VBoxSFWrite
1027{
1028 VBGLIOCHGCMCALL callInfo;
1029
1030 /** pointer, in: SHFLROOT
1031 * Root handle of the mapping which name is queried.
1032 */
1033 HGCMFunctionParameter root;
1034
1035 /** value64, in:
1036 * SHFLHANDLE of object to write to.
1037 */
1038 HGCMFunctionParameter handle;
1039
1040 /** value64, in:
1041 * Offset to write to.
1042 */
1043 HGCMFunctionParameter offset;
1044
1045 /** value64, in/out:
1046 * Bytes to write/How many were written.
1047 */
1048 HGCMFunctionParameter cb;
1049
1050 /** pointer, in:
1051 * Data to write.
1052 */
1053 HGCMFunctionParameter buffer;
1054
1055} VBoxSFWrite;
1056
1057/** Number of parameters */
1058#define SHFL_CPARMS_WRITE (5)
1059
1060
1061
1062/**
1063 * SHFL_FN_LOCK
1064 */
1065
1066/** Lock owner is the HGCM client. */
1067
1068/** Lock mode bit mask. */
1069#define SHFL_LOCK_MODE_MASK (0x3)
1070/** Cancel lock on the given range. */
1071#define SHFL_LOCK_CANCEL (0x0)
1072/** Acquire read only lock. Prevent write to the range. */
1073#define SHFL_LOCK_SHARED (0x1)
1074/** Acquire write lock. Prevent both write and read to the range. */
1075#define SHFL_LOCK_EXCLUSIVE (0x2)
1076
1077/** Do not wait for lock if it can not be acquired at the time. */
1078#define SHFL_LOCK_NOWAIT (0x0)
1079/** Wait and acquire lock. */
1080#define SHFL_LOCK_WAIT (0x4)
1081
1082/** Lock the specified range. */
1083#define SHFL_LOCK_PARTIAL (0x0)
1084/** Lock entire object. */
1085#define SHFL_LOCK_ENTIRE (0x8)
1086
1087/** Parameters structure. */
1088typedef struct _VBoxSFLock
1089{
1090 VBGLIOCHGCMCALL callInfo;
1091
1092 /** pointer, in: SHFLROOT
1093 * Root handle of the mapping which name is queried.
1094 */
1095 HGCMFunctionParameter root;
1096
1097 /** value64, in:
1098 * SHFLHANDLE of object to be locked.
1099 */
1100 HGCMFunctionParameter handle;
1101
1102 /** value64, in:
1103 * Starting offset of lock range.
1104 */
1105 HGCMFunctionParameter offset;
1106
1107 /** value64, in:
1108 * Length of range.
1109 */
1110 HGCMFunctionParameter length;
1111
1112 /** value32, in:
1113 * Lock flags SHFL_LOCK_*.
1114 */
1115 HGCMFunctionParameter flags;
1116
1117} VBoxSFLock;
1118
1119/** Number of parameters */
1120#define SHFL_CPARMS_LOCK (5)
1121
1122
1123
1124/**
1125 * SHFL_FN_FLUSH
1126 */
1127
1128/** Parameters structure. */
1129typedef struct _VBoxSFFlush
1130{
1131 VBGLIOCHGCMCALL callInfo;
1132
1133 /** pointer, in: SHFLROOT
1134 * Root handle of the mapping which name is queried.
1135 */
1136 HGCMFunctionParameter root;
1137
1138 /** value64, in:
1139 * SHFLHANDLE of object to be locked.
1140 */
1141 HGCMFunctionParameter handle;
1142
1143} VBoxSFFlush;
1144
1145/** Number of parameters */
1146#define SHFL_CPARMS_FLUSH (2)
1147
1148/**
1149 * SHFL_FN_LIST
1150 */
1151
1152/** Listing information includes variable length RTDIRENTRY[EX] structures. */
1153
1154/** @todo might be necessary for future. */
1155#define SHFL_LIST_NONE 0
1156#define SHFL_LIST_RETURN_ONE 1
1157
1158/** Parameters structure. */
1159typedef struct _VBoxSFList
1160{
1161 VBGLIOCHGCMCALL callInfo;
1162
1163 /** pointer, in: SHFLROOT
1164 * Root handle of the mapping which name is queried.
1165 */
1166 HGCMFunctionParameter root;
1167
1168 /** value64, in:
1169 * SHFLHANDLE of object to be listed.
1170 */
1171 HGCMFunctionParameter handle;
1172
1173 /** value32, in:
1174 * List flags SHFL_LIST_*.
1175 */
1176 HGCMFunctionParameter flags;
1177
1178 /** value32, in/out:
1179 * Bytes to be used for listing information/How many bytes were used.
1180 */
1181 HGCMFunctionParameter cb;
1182
1183 /** pointer, in/optional
1184 * Points to SHFLSTRING buffer that specifies a search path.
1185 */
1186 HGCMFunctionParameter path;
1187
1188 /** pointer, out:
1189 * Buffer to place listing information to. (SHFLDIRINFO)
1190 */
1191 HGCMFunctionParameter buffer;
1192
1193 /** value32, in/out:
1194 * Indicates a key where the listing must be resumed.
1195 * in: 0 means start from begin of object.
1196 * out: 0 means listing completed.
1197 */
1198 HGCMFunctionParameter resumePoint;
1199
1200 /** pointer, out:
1201 * Number of files returned
1202 */
1203 HGCMFunctionParameter cFiles;
1204
1205} VBoxSFList;
1206
1207/** Number of parameters */
1208#define SHFL_CPARMS_LIST (8)
1209
1210
1211
1212/**
1213 * SHFL_FN_READLINK
1214 */
1215
1216/** Parameters structure. */
1217typedef struct _VBoxSFReadLink
1218{
1219 VBGLIOCHGCMCALL callInfo;
1220
1221 /** pointer, in: SHFLROOT
1222 * Root handle of the mapping which name is queried.
1223 */
1224 HGCMFunctionParameter root;
1225
1226 /** pointer, in:
1227 * Points to SHFLSTRING buffer.
1228 */
1229 HGCMFunctionParameter path;
1230
1231 /** pointer, out:
1232 * Buffer to place data to.
1233 */
1234 HGCMFunctionParameter buffer;
1235
1236} VBoxSFReadLink;
1237
1238/** Number of parameters */
1239#define SHFL_CPARMS_READLINK (3)
1240
1241
1242
1243/**
1244 * SHFL_FN_INFORMATION
1245 */
1246
1247/** Mask of Set/Get bit. */
1248#define SHFL_INFO_MODE_MASK (0x1)
1249/** Get information */
1250#define SHFL_INFO_GET (0x0)
1251/** Set information */
1252#define SHFL_INFO_SET (0x1)
1253
1254/** Get name of the object. */
1255#define SHFL_INFO_NAME (0x2)
1256/** Set size of object (extend/trucate); only applies to file objects */
1257#define SHFL_INFO_SIZE (0x4)
1258/** Get/Set file object info. */
1259#define SHFL_INFO_FILE (0x8)
1260/** Get volume information. */
1261#define SHFL_INFO_VOLUME (0x10)
1262
1263/** @todo different file info structures */
1264
1265
1266/** Parameters structure. */
1267typedef struct _VBoxSFInformation
1268{
1269 VBGLIOCHGCMCALL callInfo;
1270
1271 /** pointer, in: SHFLROOT
1272 * Root handle of the mapping which name is queried.
1273 */
1274 HGCMFunctionParameter root;
1275
1276 /** value64, in:
1277 * SHFLHANDLE of object to be listed.
1278 */
1279 HGCMFunctionParameter handle;
1280
1281 /** value32, in:
1282 * SHFL_INFO_*
1283 */
1284 HGCMFunctionParameter flags;
1285
1286 /** value32, in/out:
1287 * Bytes to be used for information/How many bytes were used.
1288 */
1289 HGCMFunctionParameter cb;
1290
1291 /** pointer, in/out:
1292 * Information to be set/get (SHFLFSOBJINFO or SHFLSTRING). Do not forget
1293 * to set the SHFLFSOBJINFO::Attr::enmAdditional for Get operation as well.
1294 */
1295 HGCMFunctionParameter info;
1296
1297} VBoxSFInformation;
1298
1299/** Number of parameters */
1300#define SHFL_CPARMS_INFORMATION (5)
1301
1302
1303/**
1304 * SHFL_FN_REMOVE
1305 */
1306
1307#define SHFL_REMOVE_FILE (0x1)
1308#define SHFL_REMOVE_DIR (0x2)
1309#define SHFL_REMOVE_SYMLINK (0x4)
1310
1311/** Parameters structure. */
1312typedef struct _VBoxSFRemove
1313{
1314 VBGLIOCHGCMCALL callInfo;
1315
1316 /** pointer, in: SHFLROOT
1317 * Root handle of the mapping which name is queried.
1318 */
1319 HGCMFunctionParameter root;
1320
1321 /** pointer, in:
1322 * Points to SHFLSTRING buffer.
1323 */
1324 HGCMFunctionParameter path;
1325
1326 /** value32, in:
1327 * remove flags (file/directory)
1328 */
1329 HGCMFunctionParameter flags;
1330
1331} VBoxSFRemove;
1332
1333#define SHFL_CPARMS_REMOVE (3)
1334
1335
1336/**
1337 * SHFL_FN_RENAME
1338 */
1339
1340#define SHFL_RENAME_FILE (0x1)
1341#define SHFL_RENAME_DIR (0x2)
1342#define SHFL_RENAME_REPLACE_IF_EXISTS (0x4)
1343
1344/** Parameters structure. */
1345typedef struct _VBoxSFRename
1346{
1347 VBGLIOCHGCMCALL callInfo;
1348
1349 /** pointer, in: SHFLROOT
1350 * Root handle of the mapping which name is queried.
1351 */
1352 HGCMFunctionParameter root;
1353
1354 /** pointer, in:
1355 * Points to SHFLSTRING src.
1356 */
1357 HGCMFunctionParameter src;
1358
1359 /** pointer, in:
1360 * Points to SHFLSTRING dest.
1361 */
1362 HGCMFunctionParameter dest;
1363
1364 /** value32, in:
1365 * rename flags (file/directory)
1366 */
1367 HGCMFunctionParameter flags;
1368
1369} VBoxSFRename;
1370
1371#define SHFL_CPARMS_RENAME (4)
1372
1373
1374/**
1375 * SHFL_FN_SYMLINK
1376 */
1377
1378/** Parameters structure. */
1379typedef struct _VBoxSFSymlink
1380{
1381 VBGLIOCHGCMCALL callInfo;
1382
1383 /** pointer, in: SHFLROOT
1384 * Root handle of the mapping which name is queried.
1385 */
1386 HGCMFunctionParameter root;
1387
1388 /** pointer, in:
1389 * Points to SHFLSTRING of path for the new symlink.
1390 */
1391 HGCMFunctionParameter newPath;
1392
1393 /** pointer, in:
1394 * Points to SHFLSTRING of destination for symlink.
1395 */
1396 HGCMFunctionParameter oldPath;
1397
1398 /** pointer, out:
1399 * Information about created symlink.
1400 */
1401 HGCMFunctionParameter info;
1402
1403} VBoxSFSymlink;
1404
1405#define SHFL_CPARMS_SYMLINK (4)
1406
1407
1408
1409/**
1410 * SHFL_FN_ADD_MAPPING
1411 * Host call, no guest structure is used.
1412 */
1413
1414/** mapping is writable */
1415#define SHFL_ADD_MAPPING_F_WRITABLE (RT_BIT_32(0))
1416/** mapping is automounted by the guest */
1417#define SHFL_ADD_MAPPING_F_AUTOMOUNT (RT_BIT_32(1))
1418/** allow the guest to create symlinks */
1419#define SHFL_ADD_MAPPING_F_CREATE_SYMLINKS (RT_BIT_32(2))
1420/** mapping is actually missing on the host */
1421#define SHFL_ADD_MAPPING_F_MISSING (RT_BIT_32(3))
1422
1423#define SHFL_CPARMS_ADD_MAPPING (3)
1424
1425/**
1426 * SHFL_FN_REMOVE_MAPPING
1427 * Host call, no guest structure is used.
1428 */
1429
1430#define SHFL_CPARMS_REMOVE_MAPPING (1)
1431
1432
1433/**
1434 * SHFL_FN_SET_STATUS_LED
1435 * Host call, no guest structure is used.
1436 */
1437
1438#define SHFL_CPARMS_SET_STATUS_LED (1)
1439
1440/** @} */
1441
1442#endif
1443
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use