[vbox-dev] IMachine methods in source code?

Klaus Espenlaub klaus.espenlaub at oracle.com
Fri Jun 20 11:52:53 GMT 2014


Johannes,

On 19.06.2014 13:27, Johannes DeWitt wrote:
> Ok, thanks about the hint: modify VBoxManage to write a way for change
> VM struct fields...but i can't find a way. I understand that every
> change is made by COMSETTER, but what about this function? There's no
> documentation about this, i tried to search a similar situation in
> VBoxManage, but i can't.

I pointed at "VBoxManage debugvm info ...", which allows executing any 
info handler registered in VMM and elsewhere. Just register another one. 
This info handler can parse the additional parameters and tweak whatever 
your new VM struct field is.

The beauty of going this way is that it doesn't require any VBoxManage 
or API changes, it's all there already.

Klaus

>
>
>
> 2014-06-13 19:44 GMT+02:00 Klaus Espenlaub <klaus.espenlaub at oracle.com
> <mailto:klaus.espenlaub at oracle.com>>:
>
>     Johannes,
>
>     On 11.06.2014 14:38, Johannes DeWitt wrote:
>      > Thanks you for your perfect explanation.
>      > I wanted to use stdio.h because i was looking for a way to read some
>      > values from outside, while a virtual machine is in runtime; so my
>     idea
>      > was to use the fopen function to read values from a normal file
>     (txt or
>      > something).
>      > But now i understand why i can't use stdio.h (kernel mode etc).
>      >
>      > So, in VMMAll/ is it IMPOSSIBILE to read a value from another file? I
>      > read your answer, i understand that a possibile way is from tm
>     struct,
>      > but if i need to use a value that can change in rumtime? My
>     achievement
>      > is to read (in VMMAll/ ) value from an external file, and read this
>      > value more times, and this value can change during the execution.
>
>     I'm not following... you talked about modifying VMMAll/TMAll.cpp, which
>     is about timekeeping for the VM - and if you think you can read a file
>     (kernel or not) in such a context without seriously messing up the time
>     behavior then the understatement I can find is "optimist" :)
>
>     In any case, accessing a file from kernel mode is not portable in any
>     way, and thus I don't even want to think about it.
>
>      > For example, i need to execute a part code ONLY when i want, so
>     my idea
>      > was to write ( in a VMMALL/ .cpp file) code like this:
>      >
>      > x= get value from external file MYVALUE (xml or somehting) (in this
>      > file, the value is 0)
>      > if (x) { do something;}
>      >
>      > every time virtualbox execute this code, nothing happend.
>      >
>      > after a while, from extern i change the value in the file MYVALUE
>     (from
>      > 0 to 1)
>      > Now, when virtualbox execute the code above, it enters in the {do
>      > something;}
>      >
>      > I hope you can understand my example.
>
>     I think I do... it's super abstract and I can't be sure.
>
>     The proposal in my previous mail still applies: put variable x in the
>     VM/... structure, and add a way to tweak it from userland, e.g. with
>     "VBoxManage debugvm" (something inspired by "VBoxManage debugvm
>     injectnmi" maybe, or by hacking the handling of "VBoxManage debugvm
>     info", as that'd have already parameters, and you can register such
>     internal info handlers with DBGFR3InfoRegisterInternal - see
>     VMMR3/TM.cpp - which of course isn't meant to change anything
>     significant related to the VM etc. structures, but I can't see any
>     police :) ). The machine debugger is where I would add such hacks, as
>     the rest of the code has more clearly defined interfaces which
>     intentionally aren't as easily abusable.
>
>     I know this is more than 2 minutes of work, and I humbly ask for
>     apologies that we don't have the "do what I want" feature
>     implemented (yet).
>
>     Klaus
>
>      > 2014-06-11 13:51 GMT+02:00 Klaus Espenlaub
>     <klaus.espenlaub at oracle.com <mailto:klaus.espenlaub at oracle.com>
>      > <mailto:klaus.espenlaub at oracle.com
>     <mailto:klaus.espenlaub at oracle.com>>>:
>      >
>      >     On 09.06.2014 12:51, Johannes DeWitt wrote:
>      >      > I tried to use this function in VMM/VMMAll/TMAll.cpp, but
>     when i
>      >      > compile, i receive this: ‘CFGMR3GetRoot’ was not declared
>     in this
>      >     scope
>      >      > I added #include <VBox/vmm/cfgm.h, but atill have this error.
>      >
>      >     TMAll.cpp is code which is compiled several times, once for the
>      >     userland, once for kernel mode etc etc., which shares data.
>     In this code
>      >     it's impossible to deal with CFGM settings. Everything must
>     be already
>      >     stored in the VM or VMCPU structure or somewhere reachable
>     from there
>      >     while in userland. See VMMR3/TM.cpp how the TM settings are
>     handled (it
>      >     already uses CFGM), your needs probably can be covered by
>     adding a few
>      >     such settings.
>      >
>      >     Note that all extradata keys (see documentation of VBoxManage
>     extradata)
>      >     starting with VBoxInternal/ are stored in CFGM automatically,
>     i.e. you
>      >     need to set VBoxInternal/TM/foo to some value in order to have it
>      >     available in VMMR3/TM.cpp.
>      >
>      >      > Any ideas? I tried also to include <stdio.h> for others
>     achievements,
>      >      > but i recieve an error too (however in others .cpp files i
>     can use
>      >      > stdio.h without any problems): i don't understand why
>      >
>      >     See above. One can't use the normal stdio.h functionality
>     from kernel. A
>      >     subset of the Runtime functionality is available, and I don't
>     think you
>      >     need anything which isn't already used by VMMAll/*.cpp.
>      >
>      >     Klaus
>      >
>      >      > 2014-06-06 14:51 GMT+02:00 Frank Mehnert
>      >     <frank.mehnert at oracle.com <mailto:frank.mehnert at oracle.com>
>     <mailto:frank.mehnert at oracle.com <mailto:frank.mehnert at oracle.com>>
>      >      > <mailto:frank.mehnert at oracle.com
>     <mailto:frank.mehnert at oracle.com> <mailto:frank.mehnert at oracle.com
>     <mailto:frank.mehnert at oracle.com>>>>:
>      >      >
>      >      >     Johannes,
>      >      >
>      >      >     On Friday 06 June 2014 14:46:46 Johannes DeWitt wrote:
>      >      >      > I, i need to use come IMachine methods in source
>     code. For
>      >      >     example, if a
>      >      >      > want to use the GetSettingsFilePath() function (used in
>      >      >      > tstVBoxAPIXPCOM.cpp) in a cpp file of the source
>     code, for
>      >      >     example in a cpp
>      >      >      > file in /src/VBox/VMM/VMMAll/, how can i do it?
>      >      >      > And which headers files i need to include?
>      >      >
>      >      >     that's actually not the intended way to use
>     !VirtualBox. VMM
>      >     and Main
>      >      >     are strictly separated, and in particular the IMachine
>     code
>      >     you are
>      >      >     talking about lives in VBoxSVC while the VMM code lives in
>      >     the VBoxSVC
>      >      >     client (either the VirtualBox process or the VBoxHeadless
>      >     process).
>      >      >
>      >      >     Inside VMM you should always have a pRoot handle,
>      >      >
>      >      >        pRoot = CFGMR3GetRoot(pVM);
>      >      >
>      >      >     Using this pRoot handle you can access the CFGM tree
>     for that
>      >     particular
>      >      >     VM.
>      >      >
>      >      >     Kind regards,
>      >      >
>      >      >     Frank




More information about the vbox-dev mailing list