Add files via upload

This commit is contained in:
Fiji29a
2023-11-29 16:28:05 +04:00
committed by GitHub
parent 4d3bdccc7a
commit 23f79f994b
39 changed files with 6338 additions and 0 deletions

34
README.md Normal file
View File

@@ -0,0 +1,34 @@
# Valorant Hyper V Driver
Valorant-Hyper-V-Driver is a powerful module that provides a collection of Hyper-V check Plugins, designed to monitor Hyper-V services, VMM Agents, Clusters, and much more. It is specifically tailored for use in Hyper-V environments. The module aims to speed up and even automate the process of creating VMs on Hyper-V, making it easy to run or automate your dll on Hyper-V. Future updates will include additional features such as Windows Sandbox automation.
## Requirements
### Before using the module, ensure you have the following set up:
### Install packer from Chocolatey:
```cmd
choco install packer --version=1.7.10 -y
```
### Install vagrant from Chocolatey
```cmd
choco install vagrant --version=2.2.19 -y
```
### Use account with Administrator privileges for Hyper-V
![Untitled](https://user-images.githubusercontent.com/99544239/153879416-0f95a71f-149b-4710-91a3-4b1040e39681.png)
### Important Note about Hyper-V Export
When performing a Hyper-V export operation, it's essential to ensure that the computer account in Active Directory has access to the location where the exports are being stored. To achieve this, it's recommended to create an Active Directory group for the Hyper-V hosts and grant the group the required 'Full Control' file and share permissions. This ensures smooth export operations.
However, please be aware that when using a NAS, such as a QNAP device, as the export location, Hyper-V may encounter issues completing the operation. This is because the computer account will not have access to the share on the NAS. In such cases, it's necessary to put the VM in an offline state before completing the operation to copy all the files necessary for a complete backup.
Enjoy using Valorant-Hyper-V-Driver for seamless VM management and automation on Hyper-V! 🎉

View File

@@ -0,0 +1,7 @@
<Project>
<Import Project="Global.csproj" />
<PropertyGroup>
<TargetFramework>net6.0-windows10.0.17763.0</TargetFramework>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1 @@
<%@ Application Codebehind="Global.asax.cs" Inherits="HyperVAdmin.MvcApplication" Language="C#" %>

View File

@@ -0,0 +1,34 @@
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace HyperVAdmin
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
#pragma warning disable 1591
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// Removing all the view engines
ViewEngines.Engines.Clear();
//Add Razor Engine (which we are using)
ViewEngines.Engines.Add(new ViewEngine());
MvcHandler.DisableMvcResponseHeader = true;
}
protected void Application_EndRequest()
{
// removing excessive headers. They don't need to see this.
Response.Headers.Remove("Server");
}
}
#pragma warning restore 1591
}

View File

@@ -0,0 +1,12 @@
<Project>
<PropertyGroup>
<Version>1.0.0</Version>
<Company>André Zammit</Company>
<Copyright>André Zammit 2021</Copyright>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<BaseOutputPath>..\..\Bin\</BaseOutputPath>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,3 @@
<Project>
<Import Project="Global.csproj" />
</Project>

View File

@@ -0,0 +1,125 @@
using Microsoft.Web.Administration;
using System;
using System.Collections.Generic;
using System.Linq;
namespace HyperVAdmin.Models
{
/// <summary>
/// The Model representing a site.
/// </summary>
public class SiteModel
{
/// <summary>
/// IIS ServerManager used to retrieve sites and info.
/// </summary>
public static ServerManager Manager = new ServerManager();
/// <summary>
/// The name of the Site.
/// </summary>
public string Name { get; set; }
/// <summary>
/// The fullpath of the site's location.
/// </summary>
public string PhysicalPath { get; set; }
private Dictionary<string, string> _bindings = new Dictionary<string, string>();
/// <summary>
/// The bindings of the Site.
/// </summary>
public Dictionary<string, string> Bindings
{
get
{
return _bindings;
}
}
/// <summary>
/// The current state of the Site, such as stopped, started etc.
/// </summary>
public ObjectState State { get; set; }
/// <summary>
/// The web applications defined for a site.
/// </summary>
public List<Application> Applications { get; set; }
/// <summary>
/// Retrieves a list of SiteModels.
/// </summary>
/// <returns>A list of SiteModels</returns>
public static List<SiteModel> GetSites()
{
ServerManager manager = new ServerManager();
List<SiteModel> models = new List<SiteModel>();
foreach (Site site in manager.Sites)
{
SiteModel model = new SiteModel
{
Name = site.Name,
PhysicalPath = site.Applications[0].VirtualDirectories[0].PhysicalPath,
State = site.State,
Applications = site.Applications.Where(app => app.Path != "/").ToList()
};
foreach (Binding binding in site.Bindings.OrderBy(b => b.Protocol))
{
if (binding.Protocol.ToLowerInvariant() == "http" || binding.Protocol.ToLowerInvariant() == "https")
{
string url = binding.Protocol + "://" + (binding.Host != string.Empty ? binding.Host : Environment.MachineName);
if (binding.EndPoint != null &&
!(binding.EndPoint.Port == 80 && binding.Protocol == "http") &&
!(binding.EndPoint.Port == 443 && binding.Protocol == "https"))
{
url += ":" + binding.EndPoint.Port;
}
if (!model.Bindings.ContainsKey(binding.Protocol))
{
model.Bindings.Add(binding.Protocol, url);
}
}
}
models.Add(model);
}
models = models.OrderBy(s => s.Name).ToList();
return models;
}
/// <summary>
/// Stops an IIS website.
/// </summary>
/// <param name="sitename">The site to stop.</param>
public static void StopSite(string sitename)
{
Site site = Manager.Sites.FirstOrDefault(s => s.Name == sitename);
if (site != null)
{
site.Stop();
}
}
/// <summary>
/// Starts an IIS website.
/// </summary>
/// <param name="sitename">The site to start.</param>
public static void StartSite(string sitename)
{
Site site = Manager.Sites.FirstOrDefault(s => s.Name == sitename);
if (site != null)
{
site.Start();
}
}
}
}

View File

@@ -0,0 +1,224 @@
using HyperVAdmin.Utilities;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Management;
using System.Text.RegularExpressions;
namespace HyperVAdmin.Models
{
/// <summary>
/// The model representing a VirtualMachine
/// </summary>
public class VirtualMachineModel
{
/// <summary>
/// The name of the VM.
/// </summary>
public string Name { get; set; }
/// <summary>
/// The description of the VM.
/// </summary>
public string Description { get; set; }
/// <summary>
/// The total Virtual Memory available for this VM.
/// </summary>
public UInt64 MemoryTotal { get; set; }
/// <summary>
/// The units of virtual memory allocation as a string (such as MB).
/// </summary>
public string MemoryAllocationUnits { get; set; }
/// <summary>
/// The current state of the VM. Such as start, stop etc.
/// </summary>
public VirtualMachineState State { get; set; }
/// <summary>
/// The amounts of virtual cores associated with this VM.
/// </summary>
public ushort CoresAmount { get; set; }
/// <summary>
/// The MAC address of the virtual network switch adapter.
/// </summary>
public string MAC { get; set; }
private UInt16 _cpuLoad = 0;
/// <summary>
/// The CPULoad retrieved from WMI.
/// </summary>
public UInt16? CPULoad
{
get
{
return _cpuLoad;
}
set
{
_cpuLoad = value == null ? (UInt16)0 : (UInt16)value;
}
}
/// <summary>
/// The last time the VirtualMachineState was changed.
/// </summary>
public DateTime TimeOfLastStateChange { get; set; }
/// <summary>
/// The time in ms inidicating how long the VM has been running. Will be 0 when off.
/// </summary>
public UInt64 OnTimeInMilliseconds { get; set; }
/// <summary>
/// A human readable string of the last time the VirtualMachineState was changed.
/// </summary>
public string TimeOfLastStateChangeFormatted
{
get
{
return TimeOfLastStateChange.ToString("dd-MM-yyyy HH:mm:ss");
}
}
/// <summary>
/// A TimeSpan inidicating how long the VM has been running.
/// </summary>
public TimeSpan GetOnTime
{
get
{
return TimeSpan.FromMilliseconds(OnTimeInMilliseconds);
}
}
/// <summary>
/// A human readable represantation of the time the VM has been running.
/// </summary>
public string GetOnTimeFormatted
{
get
{
return TimeSpan.FromMilliseconds(OnTimeInMilliseconds).ToString(@"dd\.hh\:mm\:ss");
}
}
/// <summary>
/// Gets a list of VirtualMachinesModels.
/// </summary>
/// <returns>A list of VirtualMachineModels.</returns>
public static List<VirtualMachineModel> GetVMList()
{
ManagementScope scope = GetVMScope();
// define the information we want to query - in this case, just grab all properties of the object
ObjectQuery queryObj = new ObjectQuery(ConfigurationManager.AppSettings["HyperVQueryVMs"].ToString());
// connect and set up our search
ManagementObjectSearcher vmSearcher = new ManagementObjectSearcher(scope, queryObj);
List<ManagementObject> vmCollection = vmSearcher.Get().Cast<ManagementObject>().OrderBy(vm => vm["ElementName"]).ToList();
List<VirtualMachineModel> vms = new List<VirtualMachineModel>();
foreach (ManagementObject vm in vmCollection)
{
ManagementObject settings = vm.GetRelated("Msvm_VirtualSystemSettingData").Cast<ManagementObject>().ToList().FirstOrDefault();
ManagementObject memorySettings = settings.GetRelated("Msvm_MemorySettingData").Cast<ManagementObject>().ToList().FirstOrDefault();
ManagementObject ethernet = settings.GetRelated("Msvm_SyntheticEthernetPortSettingData").Cast<ManagementObject>().ToList().FirstOrDefault();
ManagementObject information = vm.GetRelated("Msvm_SummaryInformation").Cast<ManagementObject>().ToList().FirstOrDefault();
string mac = string.Empty;
if (ethernet == null)
{
ethernet = settings.GetRelated("Msvm_EmulatedEthernetPortSettingData").Cast<ManagementObject>().ToList().FirstOrDefault();
}
if(ethernet != null)
{
mac = Regex.Replace(ethernet["Address"].ToString(), ".{2}", "$0:");
}
vms.Add(new VirtualMachineModel
{
Name = vm["ElementName"].ToString(),
Description = vm["Description"].ToString(),
State = (VirtualMachineState)(UInt16)vm["EnabledState"],
MemoryTotal = (UInt64)memorySettings["VirtualQuantity"],
MemoryAllocationUnits = memorySettings["AllocationUnits"].ToString() == "byte * 2^20" ? "MB" : memorySettings["AllocationUnits"].ToString(),
CoresAmount = information != null ? (ushort)information["NumberOfProcessors"] : (ushort)0,
CPULoad = information != null ? (UInt16?)information["ProcessorLoad"] : null,
MAC = string.IsNullOrWhiteSpace(mac) ? mac : mac.Substring(0, mac.Length - 1),
TimeOfLastStateChange = ManagementDateTimeConverter.ToDateTime(vm["TimeOfLastStateChange"].ToString()),
OnTimeInMilliseconds = (UInt64)vm["OnTimeInMilliseconds"]
});
}
return vms;
}
/// <summary>
/// Toggles the state of the VM. The vmName is used to target the VM and the state is used to set the state of the VM.
/// </summary>
/// <param name="vmName">Which VM to toggle.</param>
/// <param name="state">What VirtualMachineState to set the VM to.</param>
/// <returns>A string indicating success of the action.</returns>
public static string ToggleState(string vmName, VirtualMachineState state)
{
ManagementScope scope = GetVMScope();
ManagementObject vm = HyperVUtility.GetTargetComputer(vmName, scope);
ManagementBaseObject inParams = vm.GetMethodParameters("RequestStateChange");
inParams["RequestedState"] = state;
ManagementBaseObject outParams = vm.InvokeMethod("RequestStateChange", inParams, null);
string returnValue = string.Empty;
if ((UInt32)outParams["ReturnValue"] == ReturnCode.Started)
{
if (HyperVUtility.JobCompleted(outParams, scope))
{
returnValue = string.Format("VM '{0}' state was changed successfully.", vmName);
}
else
{
returnValue = "Failed to change virtual system state";
}
}
else if ((UInt32)outParams["ReturnValue"] == ReturnCode.Completed)
{
returnValue = string.Format("VM '{0}' state was changed successfully.", vmName);
}
else
{
returnValue = string.Format("Change virtual system state failed with error {0}.", outParams["ReturnValue"]);
}
return returnValue;
}
/// <summary>
/// Used to retrieve the VirtualMachineModel List by GetVMList.
/// </summary>
/// <returns>The ManagementScope object to use to build the VM List.</returns>
public static ManagementScope GetVMScope()
{
return new ManagementScope(ConfigurationManager.AppSettings["HyperVManagementPath"].ToString());
}
}
/// <summary>The used VirtualMachineStates used internally by WMI. Only supported states for this application are present.</summary>
public enum VirtualMachineState
{
/// <summary>
/// The on state
/// </summary>
Enabled = 2,
/// <summary>
/// The off state
/// </summary>
Disabled = 3
}
}

View File

@@ -0,0 +1,39 @@
using System.Diagnostics;
using System.Web;
namespace HyperVAdmin.Modules
{
/// <summary>
/// A HTTPModule to keep trak of duration of page lifecycle
/// </summary>
public class TimingModule : IHttpModule
{
/// <summary>
/// Disposes this module
/// </summary>
public void Dispose()
{
}
/// <summary>
/// Bind BeginRequest eventhandler
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
context.BeginRequest += OnBeginRequest;
}
/// <summary>
/// Start a stopwatch at the beginning of the request to calculate duration of lifecycle
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void OnBeginRequest(object sender, System.EventArgs e)
{
var stopwatch = new Stopwatch();
HttpContext.Current.Items["Stopwatch"] = stopwatch;
stopwatch.Start();
}
}
}

View File

@@ -0,0 +1,22 @@
using System.Web.Mvc;
namespace HyperVAdmin
{
/// <summary>
/// Custom viewengine, to optimize view resolving.
/// </summary>
public class ViewEngine : RazorViewEngine
{
/// <summary>
/// The cosntructor overrides the default view locations and extensions to minimize the paths to look in
/// when MVC needs to find a view.
/// </summary>
public ViewEngine()
{
ViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml" };
MasterLocationFormats = new string[] { "~/Views/Shared/{0}.cshtml" };
PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
FileExtensions = new string[] { "cshtml" };
}
}
}

View File

@@ -0,0 +1,4 @@
using System;
using System.Reflection;
[assembly: AssemblyCopyright("Copyright © 2016 - 2019 Jos Nienhuis")]

View File

@@ -0,0 +1,5 @@
<#@ template language="C#" #>
using System;
using System.Reflection;
[assembly: AssemblyCopyright("Copyright © 2016 - <#=DateTime.Now.Year#> Jos Nienhuis")]

View File

@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("HyperVAdmin")]
[assembly: AssemblyDescription("A simple website to manage your Hyper-V VMs")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("GotGeeks.nl")]
[assembly: AssemblyProduct("HyperVAdmin")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("en")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c4f74d63-9e2f-4b15-8dc4-c36d153e5053")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.5")]
[assembly: AssemblyFileVersion("1.5")]

View File

@@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk.Worker">
<Import Project="..\..\Misc\Shared Project Files\App.csproj" />
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>dotnet-HyperVLauncher.Services.Monitor-0EF1C2E7-463D-47EE-8AA1-301B9B48A2F6</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Providers\HyperVLauncher.Providers.Common\HyperVLauncher.Providers.Common.csproj" />
<ProjectReference Include="..\..\Providers\HyperVLauncher.Providers.HyperV\HyperVLauncher.Providers.HyperV.csproj" />
<ProjectReference Include="..\..\Providers\HyperVLauncher.Providers.Ipc\HyperVLauncher.Providers.Ipc.csproj" />
<ProjectReference Include="..\..\Providers\HyperVLauncher.Providers.Settings\HyperVLauncher.Providers.Settings.csproj" />
<ProjectReference Include="..\..\Providers\HyperVLauncher.Providers.Shortcut\HyperVLauncher.Providers.Shortcut.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,110 @@
using HyperVLauncher.Contracts.Models;
using HyperVLauncher.Contracts.Interfaces;
using HyperVLauncher.Providers.Tracing;
namespace HyperVLauncher.Services.Monitor
{
public class MonitorService
{
private readonly IHyperVProvider _hyperVProvider;
private readonly ITrayIpcProvider _trayIpcProvider;
private readonly IShortcutProvider _shortcutProvider;
private readonly ISettingsProvider _settingsProvider;
private readonly CancellationToken _cancellationToken;
public MonitorService(
IHyperVProvider hyperVProvider,
ITrayIpcProvider trayIpcProvider,
ISettingsProvider settingsProvider,
IShortcutProvider shortcutProvider,
CancellationToken cancellationToken)
{
_hyperVProvider = hyperVProvider;
_trayIpcProvider = trayIpcProvider;
_shortcutProvider = shortcutProvider;
_settingsProvider = settingsProvider;
_cancellationToken = cancellationToken;
}
public async Task Run()
{
await CheckForInvalidShortcuts();
_hyperVProvider.StartVirtualMachineCreatedMonitor(_cancellationToken);
_hyperVProvider.StartVirtualMachineDeletedMonitor(_cancellationToken);
_hyperVProvider.OnVirtualMachineCreated = OnVirtualMachineCreated;
_hyperVProvider.OnVirtualMachineDeleted = OnVirtualMachineDeleted;
}
private async Task CheckForInvalidShortcuts()
{
var appSettings = await _settingsProvider.Get(true);
if (!appSettings.AutoDeleteShortcuts)
{
return;
}
Tracer.Info("Checking for invalid shortcuts...");
var vmList = _hyperVProvider.GetVirtualMachineList().ToList();
var vmIdsToDelete = new HashSet<string>();
foreach (var shortcut in appSettings.Shortcuts)
{
if (vmList.FirstOrDefault(x => x.Id == shortcut.VmId) is null)
{
vmIdsToDelete.Add(shortcut.VmId);
}
}
foreach (var vmIdToDelete in vmIdsToDelete)
{
await _settingsProvider.DeleteVirtualMachineShortcuts(
vmIdToDelete,
_trayIpcProvider,
_shortcutProvider);
}
}
public async Task OnVirtualMachineCreated(VirtualMachine vm)
{
Tracer.Info($"New Virtual Machine detected: {vm.Id} - {vm.Name}");
var appSettings = await _settingsProvider.Get(true);
if (appSettings.AutoCreateShortcuts)
{
await _settingsProvider.ProcessCreateShortcut(
vm.Id,
vm.Name,
_trayIpcProvider,
_shortcutProvider);
}
else if (appSettings.NotifyOnNewVm)
{
await _trayIpcProvider.SendShowShortcutPromptNotif(
vm.Id,
vm.Name);
}
}
public async Task OnVirtualMachineDeleted(VirtualMachine vm)
{
Tracer.Info($"Deleted Virtual Machine detected: {vm.Id} - {vm.Name}");
var appSettings = await _settingsProvider.Get(true);
if (appSettings.AutoDeleteShortcuts)
{
await _settingsProvider.DeleteVirtualMachineShortcuts(
vm.Id,
_trayIpcProvider,
_shortcutProvider);
}
}
}
}

View File

@@ -0,0 +1,46 @@
using HyperVLauncher.Contracts.Constants;
using HyperVLauncher.Contracts.Interfaces;
using HyperVLauncher.Providers.Ipc;
using HyperVLauncher.Providers.Path;
using HyperVLauncher.Providers.HyperV;
using HyperVLauncher.Providers.Tracing;
using HyperVLauncher.Providers.Settings;
using HyperVLauncher.Providers.Shortcut;
using HyperVLauncher.Services.Monitor;
var pathProvider = new PathProvider(GeneralConstants.ProfileName);
pathProvider.CreateDirectories();
TracingProvider.Init(pathProvider.GetTracingPath(), "Monitor");
Tracer.Info("Starting Virtual Machine monitor service...");
var hostBuilder = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
services.AddSingleton<IHyperVProvider, HyperVProvider>();
services.AddSingleton<ISettingsProvider, SettingsProvider>();
services.AddSingleton<IShortcutProvider, ShortcutProvider>();
services.AddSingleton<IPathProvider>(provider => pathProvider);
services.AddSingleton<ITrayIpcProvider>(provider => new IpcProvider(GeneralConstants.TrayIpcPipeName));
});
if (Environment.UserInteractive)
{
await hostBuilder
.RunConsoleAsync();
}
else
{
await hostBuilder
.UseWindowsService()
.Build()
.RunAsync();
}
Tracer.Info("Stopped Virtual Machine monitor service.");

View File

@@ -0,0 +1,40 @@
namespace HyperVLauncher.Services.Monitor
{
public class Worker : BackgroundService
{
private Task? _monitorTask;
private readonly IServiceProvider _serviceProvider;
public Worker(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
protected override Task ExecuteAsync(CancellationToken cancellationToken)
{
_monitorTask = Task.Run(async () =>
{
var monitorService = ActivatorUtilities
.CreateInstance<MonitorService>(
_serviceProvider,
cancellationToken);
await monitorService.Run();
}, cancellationToken);
return Task.CompletedTask;
}
public override async Task StopAsync(CancellationToken cancellationToken)
{
await base.StopAsync(cancellationToken);
if (_monitorTask is not null)
{
await _monitorTask;
}
}
}
}

View File

@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}

View File

@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}

View File

@@ -0,0 +1,26 @@
using System.Web.Hosting;
namespace HyperVAdmin.Utilities
{
/// <summary>
/// A utility class to help with HTML related tasks.
/// </summary>
public static class HtmlUtility
{
/// <summary>
/// Retrieves the VirtualDirectory/Path (also for "IIS Applications") when not hosted in the root of the domain
/// </summary>
/// <returns>Either the VirtualDirectory/Path (with trailing slash) or "/" when hosted in the domain</returns>
public static string GetVirtualApplicationPath()
{
string path = HostingEnvironment.ApplicationVirtualPath;
if (path.Substring(path.Length - 1) != "/")
{
path += "/";
}
return path;
}
}
}

View File

@@ -0,0 +1,339 @@
using System;
using System.Management;
#pragma warning disable 1591
namespace HyperVAdmin.Utilities
{
public static class ResourceType
{
public const UInt16 Other = 1;
public const UInt16 ComputerSystem = 2;
public const UInt16 Processor = 3;
public const UInt16 Memory = 4;
public const UInt16 IDEController = 5;
public const UInt16 ParallelSCSIHBA = 6;
public const UInt16 FCHBA = 7;
public const UInt16 iSCSIHBA = 8;
public const UInt16 IBHCA = 9;
public const UInt16 EthernetAdapter = 10;
public const UInt16 OtherNetworkAdapter = 11;
public const UInt16 IOSlot = 12;
public const UInt16 IODevice = 13;
public const UInt16 FloppyDrive = 14;
public const UInt16 CDDrive = 15;
public const UInt16 DVDdrive = 16;
public const UInt16 Serialport = 17;
public const UInt16 Parallelport = 18;
public const UInt16 USBController = 19;
public const UInt16 GraphicsController = 20;
public const UInt16 StorageExtent = 21;
public const UInt16 Disk = 22;
public const UInt16 Tape = 23;
public const UInt16 OtherStorageDevice = 24;
public const UInt16 FirewireController = 25;
public const UInt16 PartitionableUnit = 26;
public const UInt16 BasePartitionableUnit = 27;
public const UInt16 PowerSupply = 28;
public const UInt16 CoolingDevice = 29;
public const UInt16 DisketteController = 1;
}
public static class ResourceSubType
{
public const string DisketteController = null;
public const string DisketteDrive = "Microsoft Synthetic Diskette Drive";
public const string ParallelSCSIHBA = "Microsoft Synthetic SCSI Controller";
public const string IDEController = "Microsoft Emulated IDE Controller";
public const string DiskSynthetic = "Microsoft Synthetic Disk Drive";
public const string DiskPhysical = "Microsoft Physical Disk Drive";
public const string DVDPhysical = "Microsoft Physical DVD Drive";
public const string DVDSynthetic = "Microsoft Synthetic DVD Drive";
public const string CDROMPhysical = "Microsoft Physical CD Drive";
public const string CDROMSynthetic = "Microsoft Synthetic CD Drive";
public const string EthernetSynthetic = "Microsoft Synthetic Ethernet Port";
//logical drive
public const string DVDLogical = "Microsoft Virtual CD/DVD Disk";
public const string ISOImage = "Microsoft ISO Image";
public const string VHD = "Microsoft Virtual Hard Disk";
public const string DVD = "Microsoft Virtual DVD Disk";
public const string VFD = "Microsoft Virtual Floppy Disk";
public const string videoSynthetic = "Microsoft Synthetic Display Controller";
}
public static class OtherResourceType
{
public const string DisketteController = "Microsoft Virtual Diskette Controller";
}
public static class ReturnCode
{
public const UInt32 Completed = 0;
public const UInt32 Started = 4096;
public const UInt32 Failed = 32768;
public const UInt32 AccessDenied = 32769;
public const UInt32 NotSupported = 32770;
public const UInt32 Unknown = 32771;
public const UInt32 Timeout = 32772;
public const UInt32 InvalidParameter = 32773;
public const UInt32 SystemInUse = 32774;
public const UInt32 InvalidState = 32775;
public const UInt32 IncorrectDataType = 32776;
public const UInt32 SystemNotAvailable = 32777;
public const UInt32 OutofMemory = 32778;
}
public class HyperVUtility
{
static class JobState
{
public const UInt16 New = 2;
public const UInt16 Starting = 3;
public const UInt16 Running = 4;
public const UInt16 Suspended = 5;
public const UInt16 ShuttingDown = 6;
public const UInt16 Completed = 7;
public const UInt16 Terminated = 8;
public const UInt16 Killed = 9;
public const UInt16 Exception = 10;
public const UInt16 Service = 11;
}
/// <summary>
/// Common utility function to get a service object
/// </summary>
/// <param name="scope"></param>
/// <param name="serviceName"></param>
/// <returns></returns>
public static ManagementObject GetServiceObject(ManagementScope scope, string serviceName)
{
scope.Connect();
ManagementPath wmiPath = new ManagementPath(serviceName);
ManagementClass serviceClass = new ManagementClass(scope, wmiPath, null);
ManagementObjectCollection services = serviceClass.GetInstances();
ManagementObject serviceObject = null;
foreach (ManagementObject service in services)
{
serviceObject = service;
}
return serviceObject;
}
public static ManagementObject GetHostSystemDevice(string deviceClassName, string deviceObjectElementName, ManagementScope scope)
{
string hostName = System.Environment.MachineName;
ManagementObject systemDevice = GetSystemDevice(deviceClassName, deviceObjectElementName, hostName, scope);
return systemDevice;
}
public static ManagementObject GetSystemDevice(string deviceClassName, string deviceObjectElementName, string vmName, ManagementScope scope)
{
ManagementObject systemDevice = null;
ManagementObject computerSystem = HyperVUtility.GetTargetComputer(vmName, scope);
ManagementObjectCollection systemDevices = computerSystem.GetRelated
(
deviceClassName,
"Msvm_SystemDevice",
null,
null,
"PartComponent",
"GroupComponent",
false,
null
);
foreach (ManagementObject device in systemDevices)
{
if (device["ElementName"].ToString().ToLower() == deviceObjectElementName.ToLower())
{
systemDevice = device;
break;
}
}
return systemDevice;
}
public static bool JobCompleted(ManagementBaseObject outParams, ManagementScope scope)
{
bool jobCompleted = true;
//Retrieve msvc_StorageJob path. This is a full wmi path
string JobPath = (string)outParams["Job"];
ManagementObject Job = new ManagementObject(scope, new ManagementPath(JobPath), null);
//Try to get storage job information
Job.Get();
while ((UInt16)Job["JobState"] == JobState.Starting
|| (UInt16)Job["JobState"] == JobState.Running)
{
Console.WriteLine("In progress... {0}% completed.", Job["PercentComplete"]);
System.Threading.Thread.Sleep(1000);
Job.Get();
}
//Figure out if job failed
UInt16 jobState = (UInt16)Job["JobState"];
if (jobState != JobState.Completed)
{
UInt16 jobErrorCode = (UInt16)Job["ErrorCode"];
Console.WriteLine("Error Code:{0}", jobErrorCode);
Console.WriteLine("ErrorDescription: {0}", (string)Job["ErrorDescription"]);
jobCompleted = false;
}
return jobCompleted;
}
public static ManagementObject GetTargetComputer(string vmElementName, ManagementScope scope)
{
string query = string.Format("select * from Msvm_ComputerSystem Where ElementName = '{0}'", vmElementName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, new ObjectQuery(query));
ManagementObjectCollection computers = searcher.Get();
ManagementObject computer = null;
foreach (ManagementObject instance in computers)
{
computer = instance;
break;
}
return computer;
}
public static ManagementObject GetVirtualSystemSettingData(ManagementObject vm)
{
ManagementObject vmSetting = null;
ManagementObjectCollection vmSettings = vm.GetRelated
(
"Msvm_VirtualSystemSettingData",
"Msvm_SettingsDefineState",
null,
null,
"SettingData",
"ManagedElement",
false,
null
);
if (vmSettings.Count != 1)
{
throw new Exception(String.Format("{0} instance of Msvm_VirtualSystemSettingData was found", vmSettings.Count));
}
foreach (ManagementObject instance in vmSettings)
{
vmSetting = instance;
break;
}
return vmSetting;
}
enum ValueRole
{
Default = 0,
Minimum = 1,
Maximum = 2,
Increment = 3
}
enum ValueRange
{
Default = 0,
Minimum = 1,
Maximum = 2,
Increment = 3
}
//
// Get RASD definitions
//
public static ManagementObject GetResourceAllocationsettingDataDefault(ManagementScope scope, UInt16 resourceType, string resourceSubType, string otherResourceType)
{
ManagementObject RASD = null;
string query = String.Format("select * from Msvm_ResourcePool where ResourceType = '{0}' and ResourceSubType ='{1}' and OtherResourceType = '{2}'",
resourceType, resourceSubType, otherResourceType);
if (resourceType == ResourceType.Other)
{
query = String.Format("select * from Msvm_ResourcePool where ResourceType = '{0}' and ResourceSubType = null and OtherResourceType = {1}",
resourceType, otherResourceType);
}
else
{
query = String.Format("select * from Msvm_ResourcePool where ResourceType = '{0}' and ResourceSubType ='{1}' and OtherResourceType = null",
resourceType, resourceSubType);
}
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, new ObjectQuery(query));
ManagementObjectCollection poolResources = searcher.Get();
//Get pool resource allocation ability
if (poolResources.Count == 1)
{
foreach (ManagementObject poolResource in poolResources)
{
ManagementObjectCollection allocationCapabilities = poolResource.GetRelated("Msvm_AllocationCapabilities");
foreach (ManagementObject allocationCapability in allocationCapabilities)
{
ManagementObjectCollection settingDatas = allocationCapability.GetRelationships("Msvm_SettingsDefineCapabilities");
foreach (ManagementObject settingData in settingDatas)
{
if (Convert.ToInt16(settingData["ValueRole"]) == (UInt16)ValueRole.Default)
{
RASD = new ManagementObject(settingData["PartComponent"].ToString());
break;
}
}
}
}
}
return RASD;
}
public static ManagementObject GetResourceAllocationsettingData(ManagementObject vm, UInt16 resourceType, string resourceSubType, string otherResourceType)
{
//vm->vmsettings->RASD for IDE controller
ManagementObject RASD = null;
ManagementObjectCollection settingDatas = vm.GetRelated("Msvm_VirtualSystemsettingData");
foreach (ManagementObject settingData in settingDatas)
{
//retrieve the rasd
ManagementObjectCollection RASDs = settingData.GetRelated("Msvm_ResourceAllocationsettingData");
foreach (ManagementObject rasdInstance in RASDs)
{
if (Convert.ToUInt16(rasdInstance["ResourceType"]) == resourceType)
{
//found the matching type
if (resourceType == ResourceType.Other)
{
if (rasdInstance["OtherResourceType"].ToString() == otherResourceType)
{
RASD = rasdInstance;
break;
}
}
else
{
if (rasdInstance["ResourceSubType"].ToString() == resourceSubType)
{
RASD = rasdInstance;
break;
}
}
}
}
}
return RASD;
}
}
}

View File

@@ -0,0 +1,15 @@
[
//HyperVAdmin CSS
{
"includeInProject": true,
"options": { "sourceMap": true },
"outputFile": "Content/Styles/default.css",
"inputFile": "Content/Styles/default.scss"
},
{
"includeInProject": true,
"minify": { "enabled": true },
"outputFile": "Content/Styles/Default.min.css",
"inputFile": "Content/Styles/Default.scss"
}
]

View File

@@ -0,0 +1,49 @@
{
"version": "1.0",
"defaultProvider": "cdnjs",
"libraries": [
{
"library": "jquery@3.6.0",
"destination": "Content/Vendor/jquery/"
},
{
"library": "fancybox@3.5.7",
"destination": "Content/Vendor/fancybox/"
},
{
"library": "jquery-fullscreen-plugin@1.1.5",
"destination": "Content/Vendor/jquery-fullscreen-plugin/"
},
{
"provider": "unpkg",
"library": "@fortawesome/fontawesome-free@5.14.0",
"destination": "Content/Vendor/fortawesome/",
"files": [
"scss/_variables.scss",
"scss/_mixins.scss",
"scss/_core.scss",
"scss/_animated.scss"
]
},
{
"provider": "unpkg",
"library": "bootstrap@5.1.3",
"destination": "Content/Vendor/bootstrap/"
},
{
"provider": "filesystem",
"library": "https://raw.githubusercontent.com/joszz/is-loading/master/jquery.isloading.js",
"destination": "Content/Vendor/jquery.isloading/"
},
{
"provider": "filesystem",
"library": "https://raw.githubusercontent.com/Illyism/jquery.vibrate.js/master/build/jquery/jquery.vibrate.js",
"destination": "Content/Vendor/jquery.vibrate/"
},
{
"provider": "filesystem",
"library": "https://raw.githubusercontent.com/joszz/sorttable/master/sorttable.js",
"destination": "Content/Vendor/sorttable/"
}
]
}

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Antlr" version="3.5.0.2" targetFramework="net45" />
<package id="IIS.Microsoft.Web.Administration" version="8.5.9600.17042" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc" version="5.2.7" targetFramework="net472" />
<package id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="3.2.7" targetFramework="net472" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="3.2.7" targetFramework="net472" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
<package id="Microsoft.Web.LibraryManager.Build" version="2.1.161" targetFramework="net48" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net48" />
<package id="WebGrease" version="1.6.0" targetFramework="net45" />
</packages>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

View File

@@ -0,0 +1,105 @@
namespace visual_hyperinterval
{
partial class Form1
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.build = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(56, 13);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(649, 649);
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
//
// build
//
this.build.Location = new System.Drawing.Point(733, 341);
this.build.Name = "build";
this.build.Size = new System.Drawing.Size(75, 23);
this.build.TabIndex = 1;
this.build.Text = "Построить";
this.build.UseVisualStyleBackColor = true;
this.build.Click += new System.EventHandler(this.build_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(693, 665);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(12, 13);
this.label1.TabIndex = 2;
this.label1.Text = "x";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(38, 13);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(12, 13);
this.label2.TabIndex = 3;
this.label2.Text = "y";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(833, 687);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.build);
this.Controls.Add(this.pictureBox1);
this.Name = "Form1";
this.Text = "Визуализация генерации точек";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Button build;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
}
}

View File

@@ -0,0 +1,136 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace visual_hyperinterval
{
public partial class Form1 : Form
{
private double MAX_EXPONENT_THREE = 3486784401.0;
private List<uint> Points = new List<uint>();
private List<uint> PointsHyp = new List<uint>();
public Form1()
{
InitializeComponent();
}
private void build_Click(object sender, EventArgs e)
{
string path1 = @"D:\materials\projects\visual_hyperinterval\points.txt";
string path2 = @"D:\materials\projects\visual_hyperinterval\hyp.txt";
using (StreamReader sr1 = new StreamReader(path1, System.Text.Encoding.Default))
{
string line1;
while ((line1 = sr1.ReadLine()) != null)
{
Points.Add(uint.Parse(line1));
}
}
using (StreamReader sr2 = new StreamReader(path2, System.Text.Encoding.Default))
{
string line2;
while ((line2 = sr2.ReadLine()) != null)
{
PointsHyp.Add(uint.Parse(line2));
}
}
pictureBox1.Invalidate();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics gr = e.Graphics;
System.Drawing.Rectangle rect;
rect = new Rectangle(0, 0, pictureBox1.Width - 1, pictureBox1.Height - 1);
SolidBrush whiteBrush = new SolidBrush(Color.White);
SolidBrush redBrush = new SolidBrush(Color.Red);
Pen blackPen = new Pen(Color.Black);
Pen blackPen2 = new Pen(Color.Black, 1);
Pen bluePen = new Pen(Color.Blue);
Pen bluePen2 = new Pen(Color.DarkBlue, 2);
gr.DrawRectangle(blackPen, rect);
int u1 = 0;
int u2 = 0;
int v1 = 0;
int v2 = 0;
for (int i = 0; i < PointsHyp.Count - 3; i += 4)
{
// считываем точку из списка и приводим её к координатам pictureBox1
u1 = (int)((double)PointsHyp[i] / MAX_EXPONENT_THREE * (pictureBox1.Width - 1));
u2 = (int)((double)PointsHyp[i + 1] / MAX_EXPONENT_THREE * (pictureBox1.Height - 1));
v1 = (int)((double)PointsHyp[i + 2] / MAX_EXPONENT_THREE * (pictureBox1.Width - 1));
v2 = (int)((double)PointsHyp[i + 3] / MAX_EXPONENT_THREE * (pictureBox1.Height - 1));
// выполняем преобразование поворота и сдвиг
u2 = (pictureBox1.Height - 1) - u2;
v2 = (pictureBox1.Height - 1) - v2;
if ((u1 < v1) && (u2 < v2))
{
rect = new Rectangle(u1, u2, v1 - u1, v2 - u2);
gr.DrawRectangle(blackPen, rect);
}
else if ((v1 < u1) && (v2 < u2))
{
rect = new Rectangle(v1, v2, u1 - v1, u2 - v2);
gr.DrawRectangle(blackPen, rect);
}
else if ((u1 < v1) && (u2 > v2))
{
int tmp = u1;
u1 = v1;
v1 = tmp;
rect = new Rectangle(v1, v2, u1 - v1, u2 - v2);
gr.DrawRectangle(blackPen, rect);
}
else if ((u1 > v1) && (u2 < v2))
{
int tmp = u1;
u1 = v1;
v1 = tmp;
rect = new Rectangle(u1, u2, v1 - u1, v2 - u2);
gr.DrawRectangle(blackPen, rect);
}
}
for (int i = 0; i < Points.Count - 1; i += 2)
{
// считываем точку из списка и приводим её к координатам pictureBox1
u1 = (int)((double)Points[i] / MAX_EXPONENT_THREE * (pictureBox1.Width - 1));
u2 = (int)((double)Points[i + 1] / MAX_EXPONENT_THREE * (pictureBox1.Height - 1));
// выполняем преобразование поворота и сдвиг
u2 = (pictureBox1.Height - 1) - u2;
//gr.FillEllipse(redBrush, u1 - 3.0f, u2 - 3.0f, 3.0f * 2, 3.0f * 2);
//gr.DrawEllipse(bluePen2, u1 - 3.0f, u2 - 3.0f, 3.0f * 2, 3.0f * 2);
gr.FillEllipse(redBrush, u1 - 2.5f, u2 - 2.5f, 2.5f * 2, 2.5f * 2);
gr.DrawEllipse(blackPen2, u1 - 2.5f, u2 - 2.5f, 2.5f * 2, 2.5f * 2);
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

View File

@@ -0,0 +1,11 @@
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\bin\Debug\visual_hyperinterval.exe.config
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\bin\Debug\visual_hyperinterval.exe
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\bin\Debug\visual_hyperinterval.pdb
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\obj\Debug\visual_hyperinterval.csproj.AssemblyReference.cache
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\obj\Debug\visual_hyperinterval.Form1.resources
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\obj\Debug\visual_hyperinterval.Properties.Resources.resources
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\obj\Debug\visual_hyperinterval.csproj.GenerateResource.cache
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\obj\Debug\visual_hyperinterval.csproj.CoreCompileInputs.cache
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\obj\Debug\visual_hyperinterval.exe
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\obj\Debug\visual_hyperinterval.pdb
D:\materials\projects\visual_hyperinterval\visual_hyperinterval\obj\Debug\visual_hyperinterval.csproj.SuggestedBindingRedirects.cache