VirtualBox

source: vbox/trunk/include/VBox/HostServices/GuestControlSvc.h@ 57753

Last change on this file since 57753 was 57753, checked in by vboxsync, 9 years ago

IPRT: Renamed RTPROC_FLAGS_NO_PROFILE to RTPROC_FLAGS_PROFILE.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 34.4 KB
Line 
1/** @file
2 * Guest control service - Common header for host service and guest clients.
3 */
4
5/*
6 * Copyright (C) 2011-2015 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_HostService_GuestControlService_h
27#define ___VBox_HostService_GuestControlService_h
28
29#include <VBox/types.h>
30#include <VBox/VMMDev.h>
31#include <VBox/VBoxGuest2.h>
32#include <VBox/hgcmsvc.h>
33#include <VBox/log.h>
34#include <iprt/assert.h>
35#include <iprt/string.h>
36
37/* Everything defined in this file lives in this namespace. */
38namespace guestControl {
39
40/******************************************************************************
41* Typedefs, constants and inlines *
42******************************************************************************/
43
44#define HGCMSERVICE_NAME "VBoxGuestControlSvc"
45
46/** Maximum number of concurrent guest sessions a VM can have. */
47#define VBOX_GUESTCTRL_MAX_SESSIONS 32
48/** Maximum number of concurrent guest objects (processes, files, ...)
49 * a guest session can have. */
50#define VBOX_GUESTCTRL_MAX_OBJECTS _2K
51/** Maximum of callback contexts a guest process can have. */
52#define VBOX_GUESTCTRL_MAX_CONTEXTS _64K
53
54/** Base (start) of guest control session IDs. Session
55 * ID 0 is reserved for the root process which
56 * hosts all other guest session processes. */
57#define VBOX_GUESTCTRL_SESSION_ID_BASE 1
58
59/** Builds a context ID out of the session ID, object ID and an
60 * increasing count. */
61#define VBOX_GUESTCTRL_CONTEXTID_MAKE(uSession, uObject, uCount) \
62 ( (uint32_t)((uSession) & 0x1f) << 27 \
63 | (uint32_t)((uObject) & 0x7ff) << 16 \
64 | (uint32_t)((uCount) & 0xffff) \
65 )
66/** Creates a context ID out of a session ID. */
67#define VBOX_GUESTCTRL_CONTEXTID_MAKE_SESSION(uSession) \
68 ((uint32_t)((uSession) & 0x1f) << 27)
69/** Gets the session ID out of a context ID. */
70#define VBOX_GUESTCTRL_CONTEXTID_GET_SESSION(uContextID) \
71 (((uContextID) >> 27) & 0x1f)
72/** Gets the process ID out of a context ID. */
73#define VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(uContextID) \
74 (((uContextID) >> 16) & 0x7ff)
75/** Gets the context count of a process out of a context ID. */
76#define VBOX_GUESTCTRL_CONTEXTID_GET_COUNT(uContextID) \
77 ((uContextID) & 0xffff)
78/** Filter context IDs by session. Can be used in conjunction
79 * with VbglR3GuestCtrlMsgFilterSet(). */
80#define VBOX_GUESTCTRL_FILTER_BY_SESSION(uSession) \
81 (VBOX_GUESTCTRL_CONTEXTID_MAKE_SESSION(uSession) | 0xF8000000)
82
83/**
84 * Process status when executed in the guest.
85 */
86enum eProcessStatus
87{
88 /** Process is in an undefined state. */
89 PROC_STS_UNDEFINED = 0,
90 /** Process has been started. */
91 PROC_STS_STARTED = 1,
92 /** Process terminated normally. */
93 PROC_STS_TEN = 2,
94 /** Process terminated via signal. */
95 PROC_STS_TES = 3,
96 /** Process terminated abnormally. */
97 PROC_STS_TEA = 4,
98 /** Process timed out and was killed. */
99 PROC_STS_TOK = 5,
100 /** Process timed out and was not killed successfully. */
101 PROC_STS_TOA = 6,
102 /** Service/OS is stopping, process was killed. */
103 PROC_STS_DWN = 7,
104 /** Something went wrong (error code in flags). */
105 PROC_STS_ERROR = 8
106};
107
108/** @todo r=bird: Most defines in this file needs to be scoped a little
109 * better! For instance INPUT_FLAG_NONE is very generic. */
110
111/**
112 * Input flags, set by the host. This is needed for
113 * handling flags on the guest side.
114 * Note: Has to match Main's ProcessInputFlag_* flags!
115 */
116#define INPUT_FLAG_NONE 0x0
117#define INPUT_FLAG_EOF RT_BIT(0)
118
119/**
120 * Guest session creation flags.
121 * Only handled internally at the moment.
122 */
123#define SESSIONCREATIONFLAG_NONE 0x0
124
125/**
126 * Guest directory removement flags.
127 * Essentially using what IPRT's RTDIRRMREC_F_
128 * defines have to offer.
129 */
130#define DIRREMOVE_FLAG_RECURSIVE RT_BIT(0)
131/** Delete the content of the directory and the directory itself. */
132#define DIRREMOVE_FLAG_CONTENT_AND_DIR RT_BIT(1)
133/** Only delete the content of the directory, omit the directory it self. */
134#define DIRREMOVE_FLAG_CONTENT_ONLY RT_BIT(2)
135/** Mask of valid flags. */
136#define DIRREMOVE_FLAG_VALID_MASK UINT32_C(0x00000003)
137
138/** @name EXECUTEPROCESSFLAG_XXX Guest process creation flags.
139 * @note Has to match Main's ProcessCreateFlag_* flags!
140 */
141#define EXECUTEPROCESSFLAG_NONE UINT32_C(0x0)
142#define EXECUTEPROCESSFLAG_WAIT_START RT_BIT(0)
143#define EXECUTEPROCESSFLAG_IGNORE_ORPHANED RT_BIT(1)
144#define EXECUTEPROCESSFLAG_HIDDEN RT_BIT(2)
145#define EXECUTEPROCESSFLAG_NO_PROFILE RT_BIT(3) /** @todo Rename to EXECUTEPROCESSFLAG_PROFILE in next API change. */
146#define EXECUTEPROCESSFLAG_WAIT_STDOUT RT_BIT(4)
147#define EXECUTEPROCESSFLAG_WAIT_STDERR RT_BIT(5)
148#define EXECUTEPROCESSFLAG_EXPAND_ARGUMENTS RT_BIT(6)
149#define EXECUTEPROCESSFLAG_UNQUOTED_ARGS RT_BIT(7)
150/** @} */
151
152/**
153 * Pipe handle IDs used internally for referencing to
154 * a certain pipe buffer.
155 */
156#define OUTPUT_HANDLE_ID_STDOUT_DEPRECATED 0 /* Needed for VBox hosts < 4.1.0. */
157#define OUTPUT_HANDLE_ID_STDOUT 1
158#define OUTPUT_HANDLE_ID_STDERR 2
159
160/**
161 * Guest path rename flags.
162 * Essentially using what IPRT's RTPATHRENAME_FLAGS_
163 * defines have to offer.
164 */
165/** Do not replace anything. */
166#define PATHRENAME_FLAG_NO_REPLACE UINT32_C(0)
167/** This will replace attempt any target which isn't a directory. */
168#define PATHRENAME_FLAG_REPLACE RT_BIT(0)
169/** Don't allow symbolic links as part of the path. */
170#define PATHRENAME_FLAG_NO_SYMLINKS RT_BIT(1)
171/** Mask of valid flags. */
172#define PATHRENAME_FLAG_VALID_MASK UINT32_C(0x00000002)
173
174/**
175 * Defines for guest process array lengths.
176 */
177#define GUESTPROCESS_MAX_CMD_LEN _1K
178#define GUESTPROCESS_MAX_ARGS_LEN _1K
179#define GUESTPROCESS_MAX_ENV_LEN _64K
180#define GUESTPROCESS_MAX_USER_LEN 128
181#define GUESTPROCESS_MAX_PASSWORD_LEN 128
182#define GUESTPROCESS_MAX_DOMAIN_LEN 256
183
184/** @name Internal tools built into VBoxService which are used in order to
185 * accomplish tasks host<->guest.
186 * @{
187 */
188#define VBOXSERVICE_TOOL_CAT "vbox_cat"
189#define VBOXSERVICE_TOOL_LS "vbox_ls"
190#define VBOXSERVICE_TOOL_RM "vbox_rm"
191#define VBOXSERVICE_TOOL_MKDIR "vbox_mkdir"
192#define VBOXSERVICE_TOOL_MKTEMP "vbox_mktemp"
193#define VBOXSERVICE_TOOL_STAT "vbox_stat"
194/** @} */
195
196/**
197 * Input status, reported by the client.
198 */
199enum eInputStatus
200{
201 /** Input is in an undefined state. */
202 INPUT_STS_UNDEFINED = 0,
203 /** Input was written (partially, see cbProcessed). */
204 INPUT_STS_WRITTEN = 1,
205 /** Input failed with an error (see flags for rc). */
206 INPUT_STS_ERROR = 20,
207 /** Process has abandoned / terminated input handling. */
208 INPUT_STS_TERMINATED = 21,
209 /** Too much input data. */
210 INPUT_STS_OVERFLOW = 30
211};
212
213/**
214 * Structure keeping the context of a host callback.
215 */
216typedef struct VBoxGuestCtrlHostCbCtx
217{
218 /** HGCM Function number. */
219 uint32_t uFunction;
220 /** The context ID. */
221 uint32_t uContextID;
222 /** Protocol version of this guest session. Might
223 * be 0 if not supported. */
224 uint32_t uProtocol;
225
226} VBOXGUESTCTRLHOSTCBCTX, *PVBOXGUESTCTRLHOSTCBCTX;
227
228/**
229 * Structure for low level HGCM host callback from
230 * the guest. No deep copy. */
231typedef struct VBoxGuestCtrlHostCallback
232{
233 VBoxGuestCtrlHostCallback(uint32_t cParms, VBOXHGCMSVCPARM paParms[])
234 : mParms(cParms), mpaParms(paParms) { }
235
236 /** Number of HGCM parameters. */
237 uint32_t mParms;
238 /** Actual HGCM parameters. */
239 PVBOXHGCMSVCPARM mpaParms;
240
241} VBOXGUESTCTRLHOSTCALLBACK, *PVBOXGUESTCTRLHOSTCALLBACK;
242
243/**
244 * The service functions which are callable by host.
245 */
246enum eHostFn
247{
248 /**
249 * The host asks the client to cancel all pending waits and exit.
250 */
251 HOST_CANCEL_PENDING_WAITS = 0,
252 /**
253 * The host wants to create a guest session.
254 */
255 HOST_SESSION_CREATE = 20,
256 /**
257 * The host wants to close a guest session.
258 */
259 HOST_SESSION_CLOSE = 21,
260 /**
261 * The host wants to execute something in the guest. This can be a command line
262 * or starting a program.
263 ** Note: Legacy (VBox < 4.3) command.
264 */
265 HOST_EXEC_CMD = 100,
266 /**
267 * Sends input data for stdin to a running process executed by HOST_EXEC_CMD.
268 ** Note: Legacy (VBox < 4.3) command.
269 */
270 HOST_EXEC_SET_INPUT = 101,
271 /**
272 * Gets the current status of a running process, e.g.
273 * new data on stdout/stderr, process terminated etc.
274 ** Note: Legacy (VBox < 4.3) command.
275 */
276 HOST_EXEC_GET_OUTPUT = 102,
277 /**
278 * Terminates a running guest process.
279 */
280 HOST_EXEC_TERMINATE = 110,
281 /**
282 * Waits for a certain event to happen. This can be an input, output
283 * or status event.
284 */
285 HOST_EXEC_WAIT_FOR = 120,
286 /**
287 * Opens a guest file.
288 */
289 HOST_FILE_OPEN = 240,
290 /**
291 * Closes a guest file.
292 */
293 HOST_FILE_CLOSE = 241,
294 /**
295 * Reads from an opened guest file.
296 */
297 HOST_FILE_READ = 250,
298 /**
299 * Reads from an opened guest file at
300 * a specified offset.
301 */
302 HOST_FILE_READ_AT = 251,
303 /**
304 * Write to an opened guest file.
305 */
306 HOST_FILE_WRITE = 260,
307 /**
308 * Write to an opened guest file at
309 * a specified offset.
310 */
311 HOST_FILE_WRITE_AT = 261,
312 /**
313 * Changes the read & write position of an opened guest file.
314 */
315 HOST_FILE_SEEK = 270,
316 /**
317 * Gets the current file position of an opened guest file.
318 */
319 HOST_FILE_TELL = 271,
320 /**
321 * Removes a directory on the guest.
322 */
323 HOST_DIR_REMOVE = 320,
324 /**
325 * Renames a path on the guest.
326 */
327 HOST_PATH_RENAME = 330
328};
329
330/**
331 * The service functions which are called by guest. The numbers may not change,
332 * so we hardcode them.
333 */
334enum eGuestFn
335{
336 /**
337 * Guest waits for a new message the host wants to process on the guest side.
338 * This is a blocking call and can be deferred.
339 */
340 GUEST_MSG_WAIT = 1,
341 /**
342 * Guest asks the host to cancel all pending waits the guest itself waits on.
343 * This becomes necessary when the guest wants to quit but still waits for
344 * commands from the host.
345 */
346 GUEST_CANCEL_PENDING_WAITS = 2,
347 /**
348 * Guest disconnected (terminated normally or due to a crash HGCM
349 * detected when calling service::clientDisconnect().
350 */
351 GUEST_DISCONNECTED = 3,
352 /**
353 * Sets a message filter to only get messages which have a certain
354 * context ID scheme (that is, a specific session, object etc).
355 * Since VBox 4.3+.
356 */
357 GUEST_MSG_FILTER_SET = 4,
358 /**
359 * Unsets (and resets) a previously set message filter.
360 */
361 GUEST_MSG_FILTER_UNSET = 5,
362 /**
363 * Skips the current assigned message returned by GUEST_MSG_WAIT.
364 * Needed for telling the host service to not keep stale
365 * host commands in the queue.
366 */
367 GUEST_MSG_SKIP = 10,
368 /**
369 * General reply to a host message. Only contains basic data
370 * along with a simple payload.
371 */
372 GUEST_MSG_REPLY = 11,
373 /**
374 * General message for updating a pending progress for
375 * a long task.
376 */
377 GUEST_MSG_PROGRESS_UPDATE = 12,
378 /**
379 * Guest reports back a guest session status.
380 */
381 GUEST_SESSION_NOTIFY = 20,
382 /**
383 * Guest wants to close a specific guest session.
384 */
385 GUEST_SESSION_CLOSE = 21,
386 /**
387 * Guests sends output from an executed process.
388 */
389 GUEST_EXEC_OUTPUT = 100,
390 /**
391 * Guest sends a status update of an executed process to the host.
392 */
393 GUEST_EXEC_STATUS = 101,
394 /**
395 * Guests sends an input status notification to the host.
396 */
397 GUEST_EXEC_INPUT_STATUS = 102,
398 /**
399 * Guest notifies the host about some I/O event. This can be
400 * a stdout, stderr or a stdin event. The actual event only tells
401 * how many data is available / can be sent without actually
402 * transmitting the data.
403 */
404 GUEST_EXEC_IO_NOTIFY = 210,
405 /**
406 * Guest notifies the host about some directory event.
407 */
408 GUEST_DIR_NOTIFY = 230,
409 /**
410 * Guest notifies the host about some file event.
411 */
412 GUEST_FILE_NOTIFY = 240
413};
414
415/**
416 * Guest session notification types.
417 * @sa HGCMMsgSessionNotify.
418 */
419enum GUEST_SESSION_NOTIFYTYPE
420{
421 GUEST_SESSION_NOTIFYTYPE_UNDEFINED = 0,
422 /** Something went wrong (see rc). */
423 GUEST_SESSION_NOTIFYTYPE_ERROR = 1,
424 /** Guest session has been started. */
425 GUEST_SESSION_NOTIFYTYPE_STARTED = 11,
426 /** Guest session terminated normally. */
427 GUEST_SESSION_NOTIFYTYPE_TEN = 20,
428 /** Guest session terminated via signal. */
429 GUEST_SESSION_NOTIFYTYPE_TES = 30,
430 /** Guest session terminated abnormally. */
431 GUEST_SESSION_NOTIFYTYPE_TEA = 40,
432 /** Guest session timed out and was killed. */
433 GUEST_SESSION_NOTIFYTYPE_TOK = 50,
434 /** Guest session timed out and was not killed successfully. */
435 GUEST_SESSION_NOTIFYTYPE_TOA = 60,
436 /** Service/OS is stopping, process was killed. */
437 GUEST_SESSION_NOTIFYTYPE_DWN = 150
438};
439
440/**
441 * Guest directory notification types.
442 * @sa HGCMMsgDirNotify.
443 */
444enum GUEST_DIR_NOTIFYTYPE
445{
446 GUEST_DIR_NOTIFYTYPE_UNKNOWN = 0,
447 /** Something went wrong (see rc). */
448 GUEST_DIR_NOTIFYTYPE_ERROR = 1,
449 /** Guest directory opened. */
450 GUEST_DIR_NOTIFYTYPE_OPEN = 10,
451 /** Guest directory closed. */
452 GUEST_DIR_NOTIFYTYPE_CLOSE = 20,
453 /** Information about an open guest directory. */
454 GUEST_DIR_NOTIFYTYPE_INFO = 40,
455 /** Guest directory created. */
456 GUEST_DIR_NOTIFYTYPE_CREATE = 70,
457 /** Guest directory deleted. */
458 GUEST_DIR_NOTIFYTYPE_REMOVE = 80
459};
460
461/**
462 * Guest file notification types.
463 * @sa HGCMMsgFileNotify.
464 */
465enum GUEST_FILE_NOTIFYTYPE
466{
467 GUEST_FILE_NOTIFYTYPE_UNKNOWN = 0,
468 GUEST_FILE_NOTIFYTYPE_ERROR = 1,
469 GUEST_FILE_NOTIFYTYPE_OPEN = 10,
470 GUEST_FILE_NOTIFYTYPE_CLOSE = 20,
471 GUEST_FILE_NOTIFYTYPE_READ = 30,
472 GUEST_FILE_NOTIFYTYPE_WRITE = 40,
473 GUEST_FILE_NOTIFYTYPE_SEEK = 50,
474 GUEST_FILE_NOTIFYTYPE_TELL = 60
475};
476
477/**
478 * Guest file seeking types. Has to
479 * match FileSeekType in Main.
480 */
481enum GUEST_FILE_SEEKTYPE
482{
483 GUEST_FILE_SEEKTYPE_BEGIN = 1,
484 GUEST_FILE_SEEKTYPE_CURRENT = 4,
485 GUEST_FILE_SEEKTYPE_END = 8
486};
487
488/*
489 * HGCM parameter structures.
490 */
491#pragma pack (1)
492
493/**
494 * Waits for a host command to arrive. The structure then contains the
495 * actual message type + required number of parameters needed to successfully
496 * retrieve that host command (in a next round).
497 */
498typedef struct HGCMMsgCmdWaitFor
499{
500 VBoxGuestHGCMCallInfo hdr;
501 /**
502 * The returned command the host wants to
503 * run on the guest.
504 */
505 HGCMFunctionParameter msg; /* OUT uint32_t */
506 /** Number of parameters the message needs. */
507 HGCMFunctionParameter num_parms; /* OUT uint32_t */
508} HGCMMsgCmdWaitFor;
509
510/**
511 * Asks the guest control host service to set a command
512 * filter for this client. This filter will then only
513 * deliver messages to the client which match the
514 * wanted context ID (ranges).
515 */
516typedef struct HGCMMsgCmdFilterSet
517{
518 VBoxGuestHGCMCallInfo hdr;
519 /** Value to filter for after filter mask
520 * was applied. */
521 HGCMFunctionParameter value; /* IN uint32_t */
522 /** Mask to add to the current set filter. */
523 HGCMFunctionParameter mask_add; /* IN uint32_t */
524 /** Mask to remove from the current set filter. */
525 HGCMFunctionParameter mask_remove; /* IN uint32_t */
526 /** Filter flags; currently unused. */
527 HGCMFunctionParameter flags; /* IN uint32_t */
528} HGCMMsgCmdFilterSet;
529
530/**
531 * Asks the guest control host service to disable
532 * a previously set message filter again.
533 */
534typedef struct HGCMMsgCmdFilterUnset
535{
536 VBoxGuestHGCMCallInfo hdr;
537 /** Unset flags; currently unused. */
538 HGCMFunctionParameter flags; /* IN uint32_t */
539} HGCMMsgCmdFilterUnset;
540
541/**
542 * Asks the guest control host service to skip the
543 * currently assigned host command returned by
544 * VbglR3GuestCtrlMsgWaitFor().
545 */
546typedef struct HGCMMsgCmdSkip
547{
548 VBoxGuestHGCMCallInfo hdr;
549 /** Skip flags; currently unused. */
550 HGCMFunctionParameter flags; /* IN uint32_t */
551} HGCMMsgCmdSkip;
552
553/**
554 * Asks the guest control host service to cancel all pending (outstanding)
555 * waits which were not processed yet. This is handy for a graceful shutdown.
556 */
557typedef struct HGCMMsgCancelPendingWaits
558{
559 VBoxGuestHGCMCallInfo hdr;
560} HGCMMsgCancelPendingWaits;
561
562typedef struct HGCMMsgCmdReply
563{
564 VBoxGuestHGCMCallInfo hdr;
565 /** Context ID. */
566 HGCMFunctionParameter context;
567 /** Message type. */
568 HGCMFunctionParameter type;
569 /** IPRT result of overall operation. */
570 HGCMFunctionParameter rc;
571 /** Optional payload to this reply. */
572 HGCMFunctionParameter payload;
573} HGCMMsgCmdReply;
574
575/**
576 * Creates a guest session.
577 */
578typedef struct HGCMMsgSessionOpen
579{
580 VBoxGuestHGCMCallInfo hdr;
581 /** Context ID. */
582 HGCMFunctionParameter context;
583 /** The guest control protocol version this
584 * session is about to use. */
585 HGCMFunctionParameter protocol;
586 /** The user name to run the guest session under. */
587 HGCMFunctionParameter username;
588 /** The user's password. */
589 HGCMFunctionParameter password;
590 /** The domain to run the guest session under. */
591 HGCMFunctionParameter domain;
592 /** Session creation flags. */
593 HGCMFunctionParameter flags;
594} HGCMMsgSessionOpen;
595
596/**
597 * Terminates (closes) a guest session.
598 */
599typedef struct HGCMMsgSessionClose
600{
601 VBoxGuestHGCMCallInfo hdr;
602 /** Context ID. */
603 HGCMFunctionParameter context;
604 /** Session termination flags. */
605 HGCMFunctionParameter flags;
606} HGCMMsgSessionClose;
607
608/**
609 * Reports back a guest session's status.
610 */
611typedef struct HGCMMsgSessionNotify
612{
613 VBoxGuestHGCMCallInfo hdr;
614 /** Context ID. */
615 HGCMFunctionParameter context;
616 /** Notification type. */
617 HGCMFunctionParameter type;
618 /** Notification result. */
619 HGCMFunctionParameter result;
620} HGCMMsgSessionNotify;
621
622typedef struct HGCMMsgPathRename
623{
624 VBoxGuestHGCMCallInfo hdr;
625 /** UInt32: Context ID. */
626 HGCMFunctionParameter context;
627 /** Source to rename. */
628 HGCMFunctionParameter source;
629 /** Destination to rename source to. */
630 HGCMFunctionParameter dest;
631 /** UInt32: Rename flags. */
632 HGCMFunctionParameter flags;
633} HGCMMsgPathRename;
634
635/**
636 * Executes a command inside the guest.
637 */
638typedef struct HGCMMsgProcExec
639{
640 VBoxGuestHGCMCallInfo hdr;
641 /** Context ID. */
642 HGCMFunctionParameter context;
643 /** The command to execute on the guest. */
644 HGCMFunctionParameter cmd;
645 /** Execution flags (see IGuest::ProcessCreateFlag_*). */
646 HGCMFunctionParameter flags;
647 /** Number of arguments. */
648 HGCMFunctionParameter num_args;
649 /** The actual arguments. */
650 HGCMFunctionParameter args;
651 /** Number of environment value pairs. */
652 HGCMFunctionParameter num_env;
653 /** Size (in bytes) of environment block, including terminating zeros. */
654 HGCMFunctionParameter cb_env;
655 /** The actual environment block. */
656 HGCMFunctionParameter env;
657 union
658 {
659 struct
660 {
661 /** The user name to run the executed command under.
662 * Only for VBox < 4.3 hosts. */
663 HGCMFunctionParameter username;
664 /** The user's password.
665 * Only for VBox < 4.3 hosts. */
666 HGCMFunctionParameter password;
667 /** Timeout (in msec) which either specifies the
668 * overall lifetime of the process or how long it
669 * can take to bring the process up and running -
670 * (depends on the IGuest::ProcessCreateFlag_*). */
671 HGCMFunctionParameter timeout;
672 } v1;
673 struct
674 {
675 /** Timeout (in ms) which either specifies the
676 * overall lifetime of the process or how long it
677 * can take to bring the process up and running -
678 * (depends on the IGuest::ProcessCreateFlag_*). */
679 HGCMFunctionParameter timeout;
680 /** Process priority. */
681 HGCMFunctionParameter priority;
682 /** Number of process affinity blocks. */
683 HGCMFunctionParameter num_affinity;
684 /** Pointer to process affinity blocks (uint64_t). */
685 HGCMFunctionParameter affinity;
686 } v2;
687 } u;
688} HGCMMsgProcExec;
689
690/**
691 * Sends input to a guest process via stdin.
692 */
693typedef struct HGCMMsgProcInput
694{
695 VBoxGuestHGCMCallInfo hdr;
696 /** Context ID. */
697 HGCMFunctionParameter context;
698 /** The process ID (PID) to send the input to. */
699 HGCMFunctionParameter pid;
700 /** Input flags (see IGuest::ProcessInputFlag_*). */
701 HGCMFunctionParameter flags;
702 /** Data buffer. */
703 HGCMFunctionParameter data;
704 /** Actual size of data (in bytes). */
705 HGCMFunctionParameter size;
706} HGCMMsgProcInput;
707
708/**
709 * Retrieves ouptut from a previously executed process
710 * from stdout/stderr.
711 */
712typedef struct HGCMMsgProcOutput
713{
714 VBoxGuestHGCMCallInfo hdr;
715 /** Context ID. */
716 HGCMFunctionParameter context;
717 /** The process ID (PID). */
718 HGCMFunctionParameter pid;
719 /** The pipe handle ID (stdout/stderr). */
720 HGCMFunctionParameter handle;
721 /** Optional flags. */
722 HGCMFunctionParameter flags;
723 /** Data buffer. */
724 HGCMFunctionParameter data;
725} HGCMMsgProcOutput;
726
727/**
728 * Reports the current status of a guest process.
729 */
730typedef struct HGCMMsgProcStatus
731{
732 VBoxGuestHGCMCallInfo hdr;
733 /** Context ID. */
734 HGCMFunctionParameter context;
735 /** The process ID (PID). */
736 HGCMFunctionParameter pid;
737 /** The process status. */
738 HGCMFunctionParameter status;
739 /** Optional flags (based on status). */
740 HGCMFunctionParameter flags;
741 /** Optional data buffer (not used atm). */
742 HGCMFunctionParameter data;
743} HGCMMsgProcStatus;
744
745/**
746 * Reports back the status of data written to a process.
747 */
748typedef struct HGCMMsgProcStatusInput
749{
750 VBoxGuestHGCMCallInfo hdr;
751 /** Context ID. */
752 HGCMFunctionParameter context;
753 /** The process ID (PID). */
754 HGCMFunctionParameter pid;
755 /** Status of the operation. */
756 HGCMFunctionParameter status;
757 /** Optional flags. */
758 HGCMFunctionParameter flags;
759 /** Data written. */
760 HGCMFunctionParameter written;
761} HGCMMsgProcStatusInput;
762
763/*
764 * Guest control 2.0 messages.
765 */
766
767/**
768 * Terminates a guest process.
769 */
770typedef struct HGCMMsgProcTerminate
771{
772 VBoxGuestHGCMCallInfo hdr;
773 /** Context ID. */
774 HGCMFunctionParameter context;
775 /** The process ID (PID). */
776 HGCMFunctionParameter pid;
777} HGCMMsgProcTerminate;
778
779/**
780 * Waits for certain events to happen.
781 */
782typedef struct HGCMMsgProcWaitFor
783{
784 VBoxGuestHGCMCallInfo hdr;
785 /** Context ID. */
786 HGCMFunctionParameter context;
787 /** The process ID (PID). */
788 HGCMFunctionParameter pid;
789 /** Wait (event) flags. */
790 HGCMFunctionParameter flags;
791 /** Timeout (in ms). */
792 HGCMFunctionParameter timeout;
793} HGCMMsgProcWaitFor;
794
795typedef struct HGCMMsgDirRemove
796{
797 VBoxGuestHGCMCallInfo hdr;
798 /** UInt32: Context ID. */
799 HGCMFunctionParameter context;
800 /** Directory to remove. */
801 HGCMFunctionParameter path;
802 /** UInt32: Removement flags. */
803 HGCMFunctionParameter flags;
804} HGCMMsgDirRemove;
805
806/**
807 * Opens a guest file.
808 */
809typedef struct HGCMMsgFileOpen
810{
811 VBoxGuestHGCMCallInfo hdr;
812 /** UInt32: Context ID. */
813 HGCMFunctionParameter context;
814 /** File to open. */
815 HGCMFunctionParameter filename;
816 /** Open mode. */
817 HGCMFunctionParameter openmode;
818 /** Disposition mode. */
819 HGCMFunctionParameter disposition;
820 /** Sharing mode. */
821 HGCMFunctionParameter sharing;
822 /** UInt32: Creation mode. */
823 HGCMFunctionParameter creationmode;
824 /** UInt64: Initial offset. */
825 HGCMFunctionParameter offset;
826} HGCMMsgFileOpen;
827
828/**
829 * Closes a guest file.
830 */
831typedef struct HGCMMsgFileClose
832{
833 VBoxGuestHGCMCallInfo hdr;
834 /** Context ID. */
835 HGCMFunctionParameter context;
836 /** File handle to close. */
837 HGCMFunctionParameter handle;
838} HGCMMsgFileClose;
839
840/**
841 * Reads from a guest file.
842 */
843typedef struct HGCMMsgFileRead
844{
845 VBoxGuestHGCMCallInfo hdr;
846 /** Context ID. */
847 HGCMFunctionParameter context;
848 /** File handle to read from. */
849 HGCMFunctionParameter handle;
850 /** Size (in bytes) to read. */
851 HGCMFunctionParameter size;
852} HGCMMsgFileRead;
853
854/**
855 * Reads at a specified offset from a guest file.
856 */
857typedef struct HGCMMsgFileReadAt
858{
859 VBoxGuestHGCMCallInfo hdr;
860 /** Context ID. */
861 HGCMFunctionParameter context;
862 /** File handle to read from. */
863 HGCMFunctionParameter handle;
864 /** Offset where to start reading from. */
865 HGCMFunctionParameter offset;
866 /** Actual size of data (in bytes). */
867 HGCMFunctionParameter size;
868} HGCMMsgFileReadAt;
869
870/**
871 * Writes to a guest file.
872 */
873typedef struct HGCMMsgFileWrite
874{
875 VBoxGuestHGCMCallInfo hdr;
876 /** Context ID. */
877 HGCMFunctionParameter context;
878 /** File handle to write to. */
879 HGCMFunctionParameter handle;
880 /** Actual size of data (in bytes). */
881 HGCMFunctionParameter size;
882 /** Data buffer to write to the file. */
883 HGCMFunctionParameter data;
884} HGCMMsgFileWrite;
885
886/**
887 * Writes at a specified offset to a guest file.
888 */
889typedef struct HGCMMsgFileWriteAt
890{
891 VBoxGuestHGCMCallInfo hdr;
892 /** Context ID. */
893 HGCMFunctionParameter context;
894 /** File handle to write to. */
895 HGCMFunctionParameter handle;
896 /** Offset where to start reading from. */
897 HGCMFunctionParameter offset;
898 /** Actual size of data (in bytes). */
899 HGCMFunctionParameter size;
900 /** Data buffer to write to the file. */
901 HGCMFunctionParameter data;
902} HGCMMsgFileWriteAt;
903
904/**
905 * Seeks the read/write position of a guest file.
906 */
907typedef struct HGCMMsgFileSeek
908{
909 VBoxGuestHGCMCallInfo hdr;
910 /** Context ID. */
911 HGCMFunctionParameter context;
912 /** File handle to seek. */
913 HGCMFunctionParameter handle;
914 /** The seeking method. */
915 HGCMFunctionParameter method;
916 /** The seeking offset. */
917 HGCMFunctionParameter offset;
918} HGCMMsgFileSeek;
919
920/**
921 * Tells the current read/write position of a guest file.
922 */
923typedef struct HGCMMsgFileTell
924{
925 VBoxGuestHGCMCallInfo hdr;
926 /** Context ID. */
927 HGCMFunctionParameter context;
928 /** File handle to get the current position for. */
929 HGCMFunctionParameter handle;
930} HGCMMsgFileTell;
931
932/******************************************************************************
933* HGCM replies from the guest. These are handled in Main's low-level HGCM *
934* callbacks and dispatched to the appropriate guest object. *
935******************************************************************************/
936
937typedef struct HGCMReplyFileNotify
938{
939 VBoxGuestHGCMCallInfo hdr;
940 /** Context ID. */
941 HGCMFunctionParameter context;
942 /** Notification type. */
943 HGCMFunctionParameter type;
944 /** IPRT result of overall operation. */
945 HGCMFunctionParameter rc;
946 union
947 {
948 struct
949 {
950 /** Guest file handle. */
951 HGCMFunctionParameter handle;
952 } open;
953 /** Note: Close does not have any additional data (yet). */
954 struct
955 {
956 /** Actual data read (if any). */
957 HGCMFunctionParameter data;
958 } read;
959 struct
960 {
961 /** How much data (in bytes) have been successfully written. */
962 HGCMFunctionParameter written;
963 } write;
964 struct
965 {
966 HGCMFunctionParameter offset;
967 } seek;
968 struct
969 {
970 HGCMFunctionParameter offset;
971 } tell;
972 } u;
973} HGCMReplyFileNotify;
974
975typedef struct HGCMReplyDirNotify
976{
977 VBoxGuestHGCMCallInfo hdr;
978 /** Context ID. */
979 HGCMFunctionParameter context;
980 /** Notification type. */
981 HGCMFunctionParameter type;
982 /** IPRT result of overall operation. */
983 HGCMFunctionParameter rc;
984 union
985 {
986 struct
987 {
988 /** Directory information. */
989 HGCMFunctionParameter objInfo;
990 } info;
991 struct
992 {
993 /** Guest directory handle. */
994 HGCMFunctionParameter handle;
995 } open;
996 struct
997 {
998 /** Current read directory entry. */
999 HGCMFunctionParameter entry;
1000 /** Extended entry object information. Optional. */
1001 HGCMFunctionParameter objInfo;
1002 } read;
1003 } u;
1004} HGCMReplyDirNotify;
1005
1006#pragma pack ()
1007
1008/******************************************************************************
1009* Callback data structures. *
1010******************************************************************************/
1011
1012/**
1013 * The guest control callback data header. Must come first
1014 * on each callback structure defined below this struct.
1015 */
1016typedef struct CALLBACKDATA_HEADER
1017{
1018 /** Context ID to identify callback data. This is
1019 * and *must* be the very first parameter in this
1020 * structure to still be backwards compatible. */
1021 uint32_t uContextID;
1022} CALLBACKDATA_HEADER, *PCALLBACKDATA_HEADER;
1023
1024/*
1025 * These structures make up the actual low level HGCM callback data sent from
1026 * the guest back to the host.
1027 */
1028
1029typedef struct CALLBACKDATA_CLIENT_DISCONNECTED
1030{
1031 /** Callback data header. */
1032 CALLBACKDATA_HEADER hdr;
1033} CALLBACKDATA_CLIENT_DISCONNECTED, *PCALLBACKDATA_CLIENT_DISCONNECTED;
1034
1035typedef struct CALLBACKDATA_MSG_REPLY
1036{
1037 /** Callback data header. */
1038 CALLBACKDATA_HEADER hdr;
1039 /** Notification type. */
1040 uint32_t uType;
1041 /** Notification result. Note: int vs. uint32! */
1042 uint32_t rc;
1043 /** Pointer to optional payload. */
1044 void *pvPayload;
1045 /** Payload size (in bytes). */
1046 uint32_t cbPayload;
1047} CALLBACKDATA_MSG_REPLY, *PCALLBACKDATA_MSG_REPLY;
1048
1049typedef struct CALLBACKDATA_SESSION_NOTIFY
1050{
1051 /** Callback data header. */
1052 CALLBACKDATA_HEADER hdr;
1053 /** Notification type. */
1054 uint32_t uType;
1055 /** Notification result. Note: int vs. uint32! */
1056 uint32_t uResult;
1057} CALLBACKDATA_SESSION_NOTIFY, *PCALLBACKDATA_SESSION_NOTIFY;
1058
1059typedef struct CALLBACKDATA_PROC_STATUS
1060{
1061 /** Callback data header. */
1062 CALLBACKDATA_HEADER hdr;
1063 /** The process ID (PID). */
1064 uint32_t uPID;
1065 /** The process status. */
1066 uint32_t uStatus;
1067 /** Optional flags, varies, based on u32Status. */
1068 uint32_t uFlags;
1069 /** Optional data buffer (not used atm). */
1070 void *pvData;
1071 /** Size of optional data buffer (not used atm). */
1072 uint32_t cbData;
1073} CALLBACKDATA_PROC_STATUS, *PCALLBACKDATA_PROC_STATUS;
1074
1075typedef struct CALLBACKDATA_PROC_OUTPUT
1076{
1077 /** Callback data header. */
1078 CALLBACKDATA_HEADER hdr;
1079 /** The process ID (PID). */
1080 uint32_t uPID;
1081 /** The handle ID (stdout/stderr). */
1082 uint32_t uHandle;
1083 /** Optional flags (not used atm). */
1084 uint32_t uFlags;
1085 /** Optional data buffer. */
1086 void *pvData;
1087 /** Size (in bytes) of optional data buffer. */
1088 uint32_t cbData;
1089} CALLBACKDATA_PROC_OUTPUT, *PCALLBACKDATA_PROC_OUTPUT;
1090
1091typedef struct CALLBACKDATA_PROC_INPUT
1092{
1093 /** Callback data header. */
1094 CALLBACKDATA_HEADER hdr;
1095 /** The process ID (PID). */
1096 uint32_t uPID;
1097 /** Current input status. */
1098 uint32_t uStatus;
1099 /** Optional flags. */
1100 uint32_t uFlags;
1101 /** Size (in bytes) of processed input data. */
1102 uint32_t uProcessed;
1103} CALLBACKDATA_PROC_INPUT, *PCALLBACKDATA_PROC_INPUT;
1104
1105/**
1106 * General guest directory notification callback.
1107 */
1108typedef struct CALLBACKDATA_DIR_NOTIFY
1109{
1110 /** Callback data header. */
1111 CALLBACKDATA_HEADER hdr;
1112 /** Notification type. */
1113 uint32_t uType;
1114 /** IPRT result of overall operation. */
1115 uint32_t rc;
1116 union
1117 {
1118 struct
1119 {
1120 /** Size (in bytes) of directory information. */
1121 uint32_t cbObjInfo;
1122 /** Pointer to directory information. */
1123 void *pvObjInfo;
1124 } info;
1125 struct
1126 {
1127 /** Guest directory handle. */
1128 uint32_t uHandle;
1129 } open;
1130 /** Note: Close does not have any additional data (yet). */
1131 struct
1132 {
1133 /** Size (in bytes) of directory entry information. */
1134 uint32_t cbEntry;
1135 /** Pointer to directory entry information. */
1136 void *pvEntry;
1137 /** Size (in bytes) of directory entry object information. */
1138 uint32_t cbObjInfo;
1139 /** Pointer to directory entry object information. */
1140 void *pvObjInfo;
1141 } read;
1142 } u;
1143} CALLBACKDATA_DIR_NOTIFY, *PCALLBACKDATA_DIR_NOTIFY;
1144
1145/**
1146 * General guest file notification callback.
1147 */
1148typedef struct CALLBACKDATA_FILE_NOTIFY
1149{
1150 /** Callback data header. */
1151 CALLBACKDATA_HEADER hdr;
1152 /** Notification type. */
1153 uint32_t uType;
1154 /** IPRT result of overall operation. */
1155 uint32_t rc;
1156 union
1157 {
1158 struct
1159 {
1160 /** Guest file handle. */
1161 uint32_t uHandle;
1162 } open;
1163 /** Note: Close does not have any additional data (yet). */
1164 struct
1165 {
1166 /** How much data (in bytes) have been read. */
1167 uint32_t cbData;
1168 /** Actual data read (if any). */
1169 void *pvData;
1170 } read;
1171 struct
1172 {
1173 /** How much data (in bytes) have been successfully written. */
1174 uint32_t cbWritten;
1175 } write;
1176 struct
1177 {
1178 /** New file offset after successful seek. */
1179 uint64_t uOffActual;
1180 } seek;
1181 struct
1182 {
1183 /** New file offset after successful tell. */
1184 uint64_t uOffActual;
1185 } tell;
1186 } u;
1187} CALLBACKDATA_FILE_NOTIFY, *PCALLBACKDATA_FILE_NOTIFY;
1188
1189} /* namespace guestControl */
1190
1191#endif /* !___VBox_HostService_GuestControlService_h */
1192
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette