[vbox-dev] IMachine methods in source code?

Klaus Espenlaub klaus.espenlaub at oracle.com
Fri Jun 13 17:44:08 UTC 2014


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).


> 2014-06-11 13:51 GMT+02:00 Klaus Espenlaub <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>>>:
>      >
>      >     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