Directly using VirtualBox from Java #5
3 changed files with 125 additions and 6 deletions
|
@ -1,6 +1,7 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VirtualBox;
|
||||
|
@ -9,12 +10,50 @@ namespace VirtualComputerWindows
|
|||
{
|
||||
public static class Exports
|
||||
{
|
||||
[DllExport]
|
||||
public static VirtualBoxClass Init()
|
||||
[DllImport(@"C:\Program Files\Oracle\VirtualBox\VBoxRT.dll", CallingConvention = CallingConvention.StdCall)]
|
||||
private static extern void RTR3InitExe(int argc, string argv, int zeroflags);
|
||||
/*[DllImport(@"C:\Program Files\Oracle\VirtualBox\VBoxVMM.dll", CallingConvention = CallingConvention.StdCall)]
|
||||
private static extern int VMMDoHmTest(IntPtr vmstruct);*/
|
||||
|
||||
private static VirtualBoxClient vbc;
|
||||
|
||||
public static async Task<IVirtualBox> Init() => await Task.Run(() =>
|
||||
{
|
||||
var vbox = new VirtualBoxClass();
|
||||
return vbox;
|
||||
var machine = vbox.Machines.GetValue(0) as IMachine;
|
||||
try
|
||||
{
|
||||
//Environment.SetEnvironmentVariable("VBOX_HOME", @"C:\Program Files\Oracle\VirtualBox\");
|
||||
//TODO: Only finds the VBoxVMM.dll when placed in the VirtualBox dir (regardless of working dir)
|
||||
//Even then there are hardening issues: VERR_SUPDRV_NOT_BUDDING_VM_PROCESS_1
|
||||
//https://www.virtualbox.org/svn/vbox/trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
|
||||
vbc = new VirtualBoxClientClass();
|
||||
var vbox = vbc.VirtualBox;
|
||||
RTR3InitExe(0, "", 0);
|
||||
var ses = vbc.Session;
|
||||
var machine = vbox.Machines.GetValue(0) as IMachine;
|
||||
ses.Name = "minecraft";
|
||||
machine.LockMachine(ses, LockType.LockType_VM);
|
||||
Console.WriteLine("Locking...");
|
||||
while (ses.State != SessionState.SessionState_Locked) ;
|
||||
Console.WriteLine("Locked");
|
||||
machine = ses.Machine;
|
||||
Console.WriteLine("Powering up...");
|
||||
ses.Console.PowerUp().WaitForCompletion(10000);
|
||||
Console.WriteLine("Framebuffer attach");
|
||||
ses.Console.Display.AttachFramebuffer(0, new VBFB(ses.Console.Display));
|
||||
return vbox;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
Console.ReadLine();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
public static void Main()
|
||||
{
|
||||
Init();
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
75
VirtualComputerWindows/VirtualComputerWindows/VBFB.cs
Normal file
75
VirtualComputerWindows/VirtualComputerWindows/VBFB.cs
Normal file
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using VirtualBox;
|
||||
|
||||
namespace VirtualComputerWindows
|
||||
{
|
||||
internal class VBFB : IFramebuffer
|
||||
{
|
||||
private IDisplay display;
|
||||
|
||||
public VBFB(IDisplay display)
|
||||
{
|
||||
this.display = display;
|
||||
}
|
||||
|
||||
public void NotifyUpdate(uint aX, uint aY, uint aWidth, uint aHeight)
|
||||
{
|
||||
Console.WriteLine("Update: " + aX + " " + aY + " " + aWidth + " " + aHeight);
|
||||
}
|
||||
|
||||
public void NotifyUpdateImage(uint aX, uint aY, uint aWidth, uint aHeight, Array aImage)
|
||||
{
|
||||
Console.WriteLine("UpdateImage: " + aX + " " + aY + " " + aWidth + " " + aHeight);
|
||||
}
|
||||
|
||||
public void NotifyChange(uint aScreenId, uint aXOrigin, uint aYOrigin, uint aWidth, uint aHeight)
|
||||
{
|
||||
Console.WriteLine("Change: " + aXOrigin + " " + aYOrigin + " " + aWidth + " " + aHeight);
|
||||
display.QuerySourceBitmap(0, out var isd);
|
||||
var addr = new IntPtr();
|
||||
isd.QueryBitmapInfo(addr, out var w, out var h, out var bpp, out var bpl, out var bf);
|
||||
Console.WriteLine("Bitmap info: " + addr + " " + w + " " + h + " " + bpp + " " + bpl + " " + bf);
|
||||
}
|
||||
|
||||
public int VideoModeSupported(uint aWidth, uint aHeight, uint aBpp)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
public uint GetVisibleRegion(ref byte aRectangles, uint aCount)
|
||||
{
|
||||
return aCount;
|
||||
}
|
||||
|
||||
public void SetVisibleRegion(ref byte aRectangles, uint aCount)
|
||||
{
|
||||
}
|
||||
|
||||
public void ProcessVHWACommand(ref byte aCommand, int aEnmCmd, int aFromGuest)
|
||||
{
|
||||
}
|
||||
|
||||
public void Notify3DEvent(uint aType, Array aData)
|
||||
{
|
||||
}
|
||||
|
||||
public uint Width => 640;
|
||||
|
||||
public uint Height => 480;
|
||||
|
||||
public uint BitsPerPixel => 32;
|
||||
|
||||
public uint BytesPerLine => 640 * 4;
|
||||
|
||||
public BitmapFormat PixelFormat => BitmapFormat.BitmapFormat_BGRA;
|
||||
|
||||
public uint HeightReduction => 0;
|
||||
|
||||
public IFramebufferOverlay Overlay => null;
|
||||
|
||||
public long WinId => 0;
|
||||
|
||||
//public Array Capabilities => new[] { FramebufferCapabilities.FramebufferCapabilities_UpdateImage };
|
||||
public Array Capabilities => new FramebufferCapabilities[] { };
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@
|
|||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{5E734F17-FF74-4187-A6E4-B7E1DAB272F8}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>VirtualComputerWindows</RootNamespace>
|
||||
<AssemblyName>VirtualComputerWindows</AssemblyName>
|
||||
|
@ -44,6 +44,7 @@
|
|||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
|
@ -72,6 +73,9 @@
|
|||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<StartupObject />
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="DllExport, Version=1.5.2.30304, Culture=neutral, PublicKeyToken=8337224c9ad9e356, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\DllExport.1.5.2\lib\net20\DllExport.dll</HintPath>
|
||||
|
@ -93,6 +97,7 @@
|
|||
<ItemGroup>
|
||||
<Compile Include="Exports.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="VBFB.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
|
|
Loading…
Reference in a new issue