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

XFESystem

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

公开
关注 0 Fork 0 Star 0
UTF-8
$ErrorActionPreference = 'Stop'
. (Join-Path $PSScriptRoot 'physical-media.ps1') -LoadFunctionsOnly
function Reject($Disk, $Parts = @(), $Bytes = 256MB) {
    $rejected = $false
    try { Assert-XfeDisk $Disk $Parts $Bytes } catch { $rejected = $true }
    if (-not $rejected) { throw 'Expected a dangerous or unsupported target to be rejected.' }
}
function Disk {
    [pscustomobject]@{Number=9;UniqueId='fixture-id';Size=[uint64]1GB;LogicalSectorSize=512;BusType='USB';IsSystem=$false;IsBoot=$false;IsReadOnly=$false}
}
Assert-XfeDisk (Disk) @() 256MB
$d=Disk; $d.IsSystem=$true; Reject $d
$d=Disk; $d.IsBoot=$true; Reject $d
$d=Disk; $d.UniqueId=''; Reject $d
$d=Disk; $d.Size=128MB; Reject $d
$d=Disk; $d.LogicalSectorSize=4096; Reject $d
$d=Disk; $d.BusType='Spaces'; Reject $d
$d=Disk; $d.IsReadOnly=$true; Reject $d
Reject (Disk) @([pscustomobject]@{IsSystem=$true;IsBoot=$false;DriveLetter='';AccessPaths=@()})
$oldDrive=$env:SystemDrive
try {
    $env:SystemDrive='C:'
    Reject (Disk) @([pscustomobject]@{IsSystem=$false;IsBoot=$false;DriveLetter='C';AccessPaths=@()})
    Reject (Disk) @([pscustomobject]@{IsSystem=$false;IsBoot=$false;DriveLetter='';AccessPaths=@('C:\')})
} finally { $env:SystemDrive=$oldDrive }
function ExperimentalDisk {
    $value=Disk
    $value.UniqueId='5000000000002AEF'
    $value | Add-Member NoteProperty SerialNumber '230222336207'
    $value | Add-Member NoteProperty IsOffline $true
    return $value
}
function RejectExperimental($Value) {
    $rejected=$false
    try {Assert-XfeExperimentalDisk $Value @() 128MB} catch {$rejected=$true}
    if(-not $rejected){throw 'Unsafe experimental USB identity was accepted.'}
}
Assert-XfeExperimentalDisk (ExperimentalDisk) @() 128MB
$d=ExperimentalDisk;$d.SerialNumber='other';RejectExperimental $d
$d=ExperimentalDisk;$d.UniqueId='5001FF20564C4900';RejectExperimental $d
$d=ExperimentalDisk;$d.BusType='SATA';RejectExperimental $d
$d=ExperimentalDisk;$d.IsOffline=$false;RejectExperimental $d
$d=ExperimentalDisk;$d.IsSystem=$true;RejectExperimental $d
$d=ExperimentalDisk;$d.Size=262144;RejectExperimental $d
$p1=[pscustomobject]@{PartitionNumber=1;Offset=1048576;Size=1000000;GptType='C12A7328-F81F-11D2-BA4B-00A0C93EC93B';IsBoot=$false;IsSystem=$false;DriveLetter=$null;AccessPaths=@()}
$p2=[pscustomobject]@{PartitionNumber=1;Offset=1048576;Size=1000000;GptType='c12a7328-f81f-11d2-ba4b-00a0c93ec93b';IsBoot=$false;IsSystem=$false;DriveLetter=[char]0;AccessPaths=@($null,'')}
if((Get-XfePartitionFingerprint @($p1)) -cne (Get-XfePartitionFingerprint @($p2))){throw 'Equivalent null/NUL partition values changed identity.'}
$p2.Size++
if((Get-XfePartitionFingerprint @($p1)) -ceq (Get-XfePartitionFingerprint @($p2))){throw 'Changed partition bounds did not change identity.'}
if ((Get-XfeCrc32 ([Text.Encoding]::ASCII.GetBytes('123456789'))) -ne [uint32]3421780262) { throw 'CRC32 known vector failed.' }
$h=New-Object byte[] 512
Set-XfeU64 $h 32 123456789
if ([BitConverter]::ToUInt64($h,32) -ne 123456789) { throw 'Little-endian GPT update failed.' }
Set-XfeHeaderCrc $h
$crc=[BitConverter]::ToUInt32($h,16)
Set-XfeU32 $h 16 0
if ($crc -ne (Get-XfeCrc32 ([byte[]]$h[0..91]))) { throw 'Relocated GPT CRC failed.' }
$lockPath=[IO.Path]::GetTempFileName()
$locked=$null
try {
    [IO.File]::WriteAllText($lockPath,'locked-source',[Text.UTF8Encoding]::new($false))
    $expected=Get-XfeToken 'locked-source'
    $locked=Open-XfeLockedImage $lockPath $expected
    if($locked.Position -ne 0){throw 'Locked source did not rewind for the copy.'}
    $writeBlocked=$false
    try {$unexpected=[IO.File]::Open($lockPath,[IO.FileMode]::Open,[IO.FileAccess]::Write,[IO.FileShare]::ReadWrite);$unexpected.Dispose()} catch [IO.IOException] {$writeBlocked=$true}
    if(-not $writeBlocked){throw 'Concurrent source modification was not blocked.'}
    $locked.Dispose();$locked=$null
    $mismatchRefused=$false
    try {$unexpected=Open-XfeLockedImage $lockPath ('0'*64);$unexpected.Dispose()} catch {$mismatchRefused=$true}
    if(-not $mismatchRefused){throw 'A stale source hash was accepted.'}
    $writeAfter=[IO.File]::Open($lockPath,[IO.FileMode]::Open,[IO.FileAccess]::Write,[IO.FileShare]::ReadWrite);$writeAfter.Dispose()
} finally {if($locked){$locked.Dispose()};[IO.File]::Delete($lockPath)}
# Regular files exercise complete post-relocation verification and actual-end
# backup checks. No Storage cmdlet or physical-drive handle is used here.
$sourcePath=[IO.Path]::GetTempFileName()
$targetPath=[IO.Path]::GetTempFileName()
$sourceStream=$null;$targetStream=$null
try {
    $sourceBytes=New-Object byte[] 2MB
    for($index=0;$index -lt $sourceBytes.Length;$index+=4096){$sourceBytes[$index]=[byte](($index/4096)%251)}
    [Text.Encoding]::ASCII.GetBytes('EFI PART').CopyTo($sourceBytes,512)
    [Text.Encoding]::ASCII.GetBytes('EFI PART').CopyTo($sourceBytes,$sourceBytes.Length-512)
    [IO.File]::WriteAllBytes($sourcePath,$sourceBytes)
    $sourceStream=[IO.File]::OpenRead($sourcePath)
    $targetStream=[IO.FileStream]::new($targetPath,[IO.FileMode]::Create,[IO.FileAccess]::ReadWrite,[IO.FileShare]::Read)
    $targetStream.SetLength(4MB)
    $targetStream.Write($sourceBytes,0,$sourceBytes.Length)
    $geometry=Get-XfeAdjustedGpt $sourceStream 4MB
    Set-XfeAdjustedGpt $targetStream $geometry
    $targetStream.Flush($true)
    $verified=Test-XfeAdjustedReadback $sourceStream $targetStream 4MB
    if(-not $verified.FullImageVerified -or -not $verified.ActualTailBackupGptVerified -or $verified.ImageBytesVerified -ne 2MB -or $verified.ActualLastLba -ne 8191 -or $verified.ExpectedAdjustedImageSha256 -cne $verified.ActualAdjustedImageSha256){throw 'Complete adjusted regular-file verification failed.'}
    # Corrupt an interior payload byte outside every GPT metadata region.
    Write-XfeBytes $targetStream 100000 ([byte[]]@(123))
    $rejected=$false
    try {Test-XfeAdjustedReadback $sourceStream $targetStream 4MB|Out-Null} catch {$rejected=$true}
    if(-not $rejected){throw 'Interior payload corruption escaped full readback.'}
    Write-XfeBytes $targetStream 100000 ([byte[]]@($sourceBytes[100000]))
    Write-XfeBytes $targetStream (4MB-512) ([byte[]]@(0))
    $rejected=$false
    try {Test-XfeAdjustedReadback $sourceStream $targetStream 4MB|Out-Null} catch {$rejected=$true}
    if(-not $rejected){throw 'Actual-tail backup corruption escaped verification.'}
    # An exactly image-sized device overlaps the source backup metadata.
    $targetStream.SetLength(2MB)
    [void]$targetStream.Seek(0,[IO.SeekOrigin]::Begin)
    $targetStream.Write($sourceBytes,0,$sourceBytes.Length)
    Set-XfeAdjustedGpt $targetStream (Get-XfeAdjustedGpt $sourceStream 2MB)
    if(-not (Test-XfeAdjustedReadback $sourceStream $targetStream 2MB).FullImageVerified){throw 'Exact-size target verification failed.'}
} finally {
    if($sourceStream){$sourceStream.Dispose()};if($targetStream){$targetStream.Dispose()}
    [IO.File]::Delete($sourcePath);[IO.File]::Delete($targetPath)
}
Write-Host 'PHYSICAL_MEDIA_GUARDS_OK: exact experimental USB identity, semantic partition binding, source lock, complete adjusted payload and actual-tail GPT; regular files only, no disks enumerated or written.'