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 | verify "); 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(); 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));