public static async Task <IVirtualBox> Init() => await Task.Run(() => { 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 VirtualBoxManager() { vbox = new VirtualBoxClient(); // Initialize VirtualBox try { vbox.VirtualBox.FindMachine("Red virtual machine"); } catch { // do nothing } }
public static void Start(IVDController controller) { //var rrr = Utils.GetAppInfo($"-input tstimgs\\upgradeelibad.png -name upgradegood -match data\\check\\upgradeeligood.png 10000 -name upgradebad -match data\\check\\upgradeelibad.png 10000"); //SwitchAccount.CheckAccount(); //TestAccounts(); //TODO DEBUG REMOVE THIS //return; controller.Log("info", "Starting vm"); Utils.executeVBoxMngr($"startvm {Utils.vmname}"); controller.Log("info", "VmStarted, allocate machine"); var vbox = new VirtualBox.VirtualBox(); VirtualBox.IMachine machine = vbox.FindMachine(Utils.vmname); VirtualBoxClient vboxclient = new VirtualBoxClient(); var session = vboxclient.Session; try { controller.Log("info", "found machine, lock machine"); machine.LockMachine(session, LockType.LockType_Shared); var console = session.Console; IEventSource es = console.EventSource; var listener = es.CreateListener(); Array listenTYpes = new VBoxEventType[] { VBoxEventType.VBoxEventType_InputEvent }; es.RegisterListener(listener, listenTYpes, 0); controller.Log("info", "locked machine, entry try"); try { //session.Console.Display.SetSeamlessMode(1); var display = console.Display; uint sw, sh, bpp; int xorig, yorig; GuestMonitorStatus gmstat; display.GetScreenResolution(0, out sw, out sh, out bpp, out xorig, out yorig, out gmstat); //Console.WriteLine($"sw={sw} {sh} bpp {bpp} xorig={xorig} yorig={yorig}"); byte[] buf = new byte[sw * sh * bpp / 8]; //display.TakeScreenShot(0, ref buf[0], sw, sh, BitmapFormat.BitmapFormat_PNG); var mouse = session.Console.Mouse; var keyboard = session.Console.Keyboard; //MouseMouseTo(mouse, 515, 660); //MouseClick(mouse); //MouseMouseTo(mouse, 360, 156); //MouseClick(mouse); controller.Log("info", "main loop"); while (true) { try { checkLoop(new ProcessingContext(mouse, keyboard, controller)); } catch (SwitchProcessingActionException) { continue; } break; } } finally { es.UnregisterListener(listener); } } catch (Exception e) { controller.Log("error", e.ToString()); } finally { if (session.State == SessionState.SessionState_Locked) { session.UnlockMachine(); } controller.Log("info", "powering off"); Utils.executeVBoxMngr($"controlvm {Utils.vmname} poweroff"); controller.KillVBox(); controller.Log("info", "sleeping 10s after kill vbox"); controller.Sleep(10000); controller.Log("info", "vbox killed, poweroff"); } //Console.WriteLine(machine.VideoCaptureWidth); }