GuestSessionImpl.h revision 3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * VirtualBox Main - Guest session handling.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Copyright (C) 2012-2013 Oracle Corporation
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * available from http://www.virtualbox.org. This file is free software;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * General Public License (GPL) as published by the Free Software
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * Abstract base class for a lenghtly per-session operation which
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * runs in a Main worker thread.
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync virtual int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress) = 0;
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync int getGuestProperty(const ComObjPtr<Guest> &pGuest,
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync HRESULT setProgressErrorMsg(HRESULT hr, const Utf8Str &strMsg);
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync /** Progress object for getting updated when running
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync * asynchronously. Optional. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Task for opening a guest session.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync static int taskThread(RTTHREAD Thread, void *pvUser);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /** Session creation flags. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /** Session creation timeout (in ms). */
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * Task for copying files from host to the guest.
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync const Utf8Str &strSource, const Utf8Str &strDest, uint32_t uFlags);
c740281e4f5e61397e892447aeef2a7bdbbaaf8dvboxsync PRTFILE pSourceFile, size_t cbSourceOffset, uint64_t cbSourceSize,
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync static int taskThread(RTTHREAD Thread, void *pvUser);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * Task for copying files from guest to the host.
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync const Utf8Str &strSource, const Utf8Str &strDest, uint32_t uFlags);
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync static int taskThread(RTTHREAD Thread, void *pvUser);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync * Task for automatically updating the Guest Additions on the guest.
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsyncclass SessionTaskUpdateAdditions : public GuestSessionTask
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync static int taskThread(RTTHREAD Thread, void *pvUser);
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync * Suported OS types for automatic updating.
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync * Structure representing a file to
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync * get off the .ISO, copied to the guest.
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** Source file on .ISO. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** Destination file on the guest. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** File flags. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** Optional arguments if this file needs to be
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync * executed. */
c4b821bf03ae7641a0791e3fd161247e66433b68vboxsync int copyFileToGuest(GuestSession *pSession, PRTISOFSFILE pISO,
c4b821bf03ae7641a0791e3fd161247e66433b68vboxsync Utf8Str const &strFileSource, const Utf8Str &strFileDest,
3c6306a66deef467e3c13483dd6529e1e1c6b822vboxsync int runFileOnGuest(GuestSession *pSession, GuestProcessStartupInfo &procInfo);
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** Files to handle. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** The (optionally) specified Guest Additions .ISO on the host
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync * which will be used for the updating process. */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** Update flags. */
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * Guest session implementation.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @name COM and internal init/term/mapping cruft.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(GuestSession, IGuestSession)
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync int init(Guest *pGuest, const GuestSessionStartupInfo &ssInfo, const GuestCredentials &guestCreds);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @name IGuestSession properties.
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync STDMETHOD(COMGETTER(Status))(GuestSessionStatus_T *aStatus);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(COMGETTER(Environment))(ComSafeArrayOut(BSTR, aEnvironment));
1cd59fdf671ca60c64d77e3f7046aaecf7003824vboxsync STDMETHOD(COMSETTER(Environment))(ComSafeArrayIn(IN_BSTR, aEnvironment));
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(COMGETTER(Processes))(ComSafeArrayOut(IGuestProcess *, aProcesses));
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(COMGETTER(Directories))(ComSafeArrayOut(IGuestDirectory *, aDirectories));
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(COMGETTER(Files))(ComSafeArrayOut(IGuestFile *, aFiles));
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @name IGuestSession methods.
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync STDMETHOD(CopyFrom)(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(CopyFileFlag_T, aFlags), IProgress **aProgress);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync STDMETHOD(CopyTo)(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(CopyFileFlag_T, aFlags), IProgress **aProgress);
4121d226ac899f17e13aff3aff42b603c8b5c1fevboxsync STDMETHOD(DirectoryCreate)(IN_BSTR aPath, ULONG aMode, ComSafeArrayIn(DirectoryCreateFlag_T, aFlags));
ca3db470494a8b6eaec69ea37468a5cda65e2da8vboxsync STDMETHOD(DirectoryCreateTemp)(IN_BSTR aTemplate, ULONG aMode, IN_BSTR aPath, BOOL aSecure, BSTR *aDirectory);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(DirectoryExists)(IN_BSTR aPath, BOOL *aExists);
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync STDMETHOD(DirectoryOpen)(IN_BSTR aPath, IN_BSTR aFilter, ComSafeArrayIn(DirectoryOpenFlag_T, aFlags), IGuestDirectory **aDirectory);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(DirectoryQueryInfo)(IN_BSTR aPath, IGuestFsObjInfo **aInfo);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(DirectoryRemoveRecursive)(IN_BSTR aPath, ComSafeArrayIn(DirectoryRemoveRecFlag_T, aFlags), IProgress **aProgress);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(DirectoryRename)(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(PathRenameFlag_T, aFlags));
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(DirectorySetACL)(IN_BSTR aPath, IN_BSTR aACL);
702a8ee2dc1de96f2f77e97135015d3e243186fdvboxsync STDMETHOD(EnvironmentGet)(IN_BSTR aName, BSTR *aValue);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(EnvironmentSet)(IN_BSTR aName, IN_BSTR aValue);
92e624e40b06b4dc6d0a8222e1de33bd3e879a63vboxsync STDMETHOD(FileCreateTemp)(IN_BSTR aTemplate, ULONG aMode, IN_BSTR aPath, BOOL aSecure, IGuestFile **aFile);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileExists)(IN_BSTR aPath, BOOL *aExists);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileOpen)(IN_BSTR aPath, IN_BSTR aOpenMode, IN_BSTR aDisposition, ULONG aCreationMode, LONG64 aOffset, IGuestFile **aFile);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileQueryInfo)(IN_BSTR aPath, IGuestFsObjInfo **aInfo);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileQuerySize)(IN_BSTR aPath, LONG64 *aSize);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(FileRename)(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(PathRenameFlag_T, aFlags));
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileSetACL)(IN_BSTR aPath, IN_BSTR aACL);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(ProcessCreate)(IN_BSTR aCommand, ComSafeArrayIn(IN_BSTR, aArguments), ComSafeArrayIn(IN_BSTR, aEnvironment),
d4a9d525e6f2111d462d2d96462dced6b9ec00efvboxsync ComSafeArrayIn(ProcessCreateFlag_T, aFlags), ULONG aTimeoutMS, IGuestProcess **aProcess);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(ProcessCreateEx)(IN_BSTR aCommand, ComSafeArrayIn(IN_BSTR, aArguments), ComSafeArrayIn(IN_BSTR, aEnvironment),
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync ComSafeArrayIn(ProcessCreateFlag_T, aFlags), ULONG aTimeoutMS,
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync ProcessPriority_T aPriority, ComSafeArrayIn(LONG, aAffinity),
d4a9d525e6f2111d462d2d96462dced6b9ec00efvboxsync STDMETHOD(ProcessGet)(ULONG aPID, IGuestProcess **aProcess);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(SymlinkCreate)(IN_BSTR aSource, IN_BSTR aTarget, SymlinkType_T aType);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(SymlinkExists)(IN_BSTR aSymlink, BOOL *aExists);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(SymlinkRead)(IN_BSTR aSymlink, ComSafeArrayIn(SymlinkReadFlag_T, aFlags), BSTR *aTarget);
7862f4bd000f1eb6c86289f5ac2849e9cf943ca9vboxsync typedef std::vector <ComObjPtr<GuestDirectory> > SessionDirectories;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /** Map of guest files. The key specifies the internal file ID. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync typedef std::map <uint32_t, ComObjPtr<GuestFile> > SessionFiles;
687794577e2e35c3cae67e692a7f2130d1262a82vboxsync /** Map of guest processes. The key specifies the internal process number.
cc1ef2ef9bbc6a0ff964928d61b7298e5bfcce5fvboxsync * To retrieve the process' guest PID use the Id() method of the IProcess interface. */
cc1ef2ef9bbc6a0ff964928d61b7298e5bfcce5fvboxsync typedef std::map <uint32_t, ComObjPtr<GuestProcess> > SessionProcesses;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @name Public internal methods.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int closeSession(uint32_t uFlags, uint32_t uTimeoutMS, int *pGuestRc);
04f6f18325971f796623469adcf39ba2b2939ed3vboxsync int directoryRemoveFromList(GuestDirectory *pDirectory);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int directoryCreateInternal(const Utf8Str &strPath, uint32_t uMode, uint32_t uFlags, int *pGuestRc);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int objectCreateTempInternal(const Utf8Str &strTemplate, const Utf8Str &strPath, bool fDirectory, const Utf8Str &strName, int *pGuestRc);
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync int directoryOpenInternal(const Utf8Str &strPath, const Utf8Str &strFilter, uint32_t uFlags, ComObjPtr<GuestDirectory> &pDirectory);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int directoryQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int dispatchToFile(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int dispatchToProcess(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int dispatchToThis(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync inline bool fileExists(uint32_t uFileID, ComObjPtr<GuestFile> *pFile);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int fileRemoveInternal(const Utf8Str &strPath, int *pGuestRc);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int fileOpenInternal(const GuestFileOpenInfo &openInfo, ComObjPtr<GuestFile> &pFile, int *pGuestRc);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int fileQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int fileQuerySizeInternal(const Utf8Str &strPath, int64_t *pllSize, int *pGuestRc);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int fsQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int onSessionStatusChange(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, GuestCtrlCallback *pCallback, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData);
f9ce005e61f0fbb51a2cabc53d58c3485151faa9vboxsync uint32_t getProtocolVersion(void) { return mData.mProtocolVersion; }
5366e994777f9d9391cf809dc77610f57270d75dvboxsync int processCreateExInteral(GuestProcessStartupInfo &procInfo, ComObjPtr<GuestProcess> &pProgress);
24ef2ade0f53030e73f5b4e43f52892b03f7915dvboxsync inline bool processExists(uint32_t uProcessID, ComObjPtr<GuestProcess> *pProcess);
687794577e2e35c3cae67e692a7f2130d1262a82vboxsync inline int processGetByPID(ULONG uPID, ComObjPtr<GuestProcess> *pProcess);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int sendCommand(uint32_t uFunction, uint32_t uParms, PVBOXHGCMSVCPARM paParms);
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync static HRESULT setErrorExternal(VirtualBoxBase *pInterface, int guestRc);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync int startTaskAsync(const Utf8Str &strTaskDesc, GuestSessionTask *pTask, ComObjPtr<Progress> &pProgress);
5f2b03bf7695dabd71222dba123532a3f76828c1vboxsync /** Pointer to the parent (Guest). */
d4a9d525e6f2111d462d2d96462dced6b9ec00efvboxsync /** The session credentials. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync /** The session's startup info. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync /** The session's current status. */
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync /** The session's environment block. Can be
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync * overwritten/extended by ProcessCreate(Ex). */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /** The session callback, needed for communicating
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * with the guest. */
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync /** Directory objects bound to this session. */
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync /** File objects bound to this session. */
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync /** Process objects bound to this session. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync /** Guest control protocol version to be used.
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync * Guest Additions < VBox 4.3 have version 1,
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync * any newer version will have version 2. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync /** Session timeout (in ms). */
04f6f18325971f796623469adcf39ba2b2939ed3vboxsync /** Total number of session objects (processes,
04f6f18325971f796623469adcf39ba2b2939ed3vboxsync * files, ...). */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#endif /* !____H_GUESTSESSIONIMPL */