XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Security.Cryptography;
using System.Text.Json;
using XFESystem.Storage;
using XFESystem.StorageFixtures;

if(args.Length==3&&args[0]=="verify")
{
    StorageReadback.Verify(Path.GetFullPath(args[1]),args[2]);return;
}
if(args.Length!=3||args[0]!="create")throw new ArgumentException("create <new fixture directory> <ordinary managed DLL> | verify <private proof directory> <token>");
string directory=Path.GetFullPath(args[1]);if(Directory.Exists(directory))throw new IOException("Fixture directory must be new.");Directory.CreateDirectory(directory);
byte[] sample=File.ReadAllBytes(args[2]);var results=new List<object>();
foreach(var spec in new[]{("NvmeNtfs",128,"NTFS"),("SataExtended",256,"NTFS"),("UsbExFat",128,"exFAT"),("Nvme4K",128,"NTFS")})
{
    string path=Path.Combine(directory,spec.Item1+".img");using(var disk=new FixtureDisk(path,spec.Item1,true,spec.Item2*1024L*1024,spec.Item1=="Nvme4K"?4096:512))
    {
        var parts=spec.Item1=="SataExtended"?disk.ExtendedMbr():[disk.Gpt()];
        foreach(var part in parts)disk.Format(part,part.Number==6?"FAT":spec.Item3,sample);
        if(DiskPartitions.Read(disk).Length!=parts.Length)throw new IOException("Fixture partition parser disagrees.");
    }
    using var stream=File.OpenRead(path);results.Add(new{Path=path,Sha256=Convert.ToHexStringLower(SHA256.HashData(stream)),Kind=spec.Item1});
}
var receipt=new{Kind="XfeOtherDiskFixtures",Passed=true,HostOnly=true,PhysicalDiskAccess=false,ExternalProgramSha256=Convert.ToHexStringLower(SHA256.HashData(sample)),Images=results};
File.WriteAllText(Path.Combine(directory,"Manifest.json"),JsonSerializer.Serialize(receipt,new JsonSerializerOptions{WriteIndented=true}));Console.WriteLine(JsonSerializer.Serialize(receipt));