Localize UI text and add copy progress bar

This commit is contained in:
2025-11-13 19:20:28 +01:00
parent f71e8989db
commit 299007a8e3
14 changed files with 183 additions and 84 deletions

View File

@@ -5,6 +5,7 @@ using Windows.Win32.System.Ioctl;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
using Windows.Win32.Storage.FileSystem;
using System.Runtime.Versioning;
using static Windows.Win32.PInvoke;
using static BadBuilder.Formatter.Constants;
@@ -12,6 +13,7 @@ using static BadBuilder.Formatter.Utilities;
namespace BadBuilder.Formatter
{
[SupportedOSPlatform("windows")]
public static class DiskFormatter
{
public static unsafe string FormatVolume(char driveLetter, long diskSize)
@@ -35,30 +37,30 @@ namespace BadBuilder.Formatter
process.WaitForExit();
if (process.ExitCode == 0) return "";
else return Error($"Native format failed with exit code: {process.ExitCode}");
else return Error($"Die native Formatierung ist mit dem Exitcode {process.ExitCode} fehlgeschlagen.");
}
string devicePath = $"\\\\.\\{driveLetter}:";
uint volumeID = GetVolumeID();
SafeFileHandle driveHandle = OpenDeviceHandle(devicePath);
if (driveHandle.IsInvalid) return Error("Unable to open device. GetLastError: " + Marshal.GetLastWin32Error());
if (driveHandle.IsInvalid) return Error("Gerät konnte nicht geöffnet werden. GetLastError: " + Marshal.GetLastWin32Error());
if (!EnableExtendedDASDIO(driveHandle) || !LockDevice(driveHandle))
return Error($"Failed to initialize device access. GetLastError: {Marshal.GetLastWin32Error()}");
return Error($"Gerätezugriff konnte nicht initialisiert werden. GetLastError: {Marshal.GetLastWin32Error()}");
DISK_GEOMETRY diskGeometry;
if (!TryGetDiskGeometry(driveHandle, out diskGeometry))
return Error($"Failed to get disk geometry. GetLastError: {Marshal.GetLastWin32Error()}");
return Error($"Datenträgergeometrie konnte nicht ermittelt werden. GetLastError: {Marshal.GetLastWin32Error()}");
PARTITION_INFORMATION partitionInfo;
bool isGPT = false;
if (!TryGetPartitionInfo(driveHandle, ref diskGeometry, out partitionInfo, out isGPT))
return Error($"Failed to get partition information. GetLastError: {Marshal.GetLastWin32Error()}");
return Error($"Partitionsinformationen konnten nicht ermittelt werden. GetLastError: {Marshal.GetLastWin32Error()}");
uint totalSectors = (uint)(partitionInfo.PartitionLength / diskGeometry.BytesPerSector);
if (!IsValidFAT32Size(totalSectors))
return Error("Invalid drive size for FAT32.");
return Error("Ungültige Laufwerksgröße für FAT32.");
FAT32BootSector bootSector = InitializeBootSector(diskGeometry, partitionInfo, totalSectors, volumeID);
FAT32FsInfoSector fsInfo = InitializeFsInfo();
@@ -69,12 +71,12 @@ namespace BadBuilder.Formatter
return formatOutput;
if (!UnlockDevice(driveHandle) || !DismountVolume(driveHandle))
return Error($"Failed to release the device. GetLastError: {Marshal.GetLastWin32Error()}");
return Error($"Gerät konnte nicht freigegeben werden. GetLastError: {Marshal.GetLastWin32Error()}");
driveHandle.Dispose();
if (!SetVolumeLabel($"{driveLetter}:", "BADUPDATE"))
return Error($"Unable to set volume label. GetLastError: {Marshal.GetLastWin32Error()}");
return Error($"Volumenbezeichnung konnte nicht gesetzt werden. GetLastError: {Marshal.GetLastWin32Error()}");
return string.Empty;
}
@@ -222,7 +224,7 @@ namespace BadBuilder.Formatter
uint clusterCount = userAreaSize / bootSector.SectorsPerCluster;
if (clusterCount < 65536 || clusterCount > 0x0FFFFFFF)
return Error("The drive's cluster count is out of range (65536 < clusterCount < 0x0FFFFFFF)");
return Error("Die Clusteranzahl des Laufwerks liegt außerhalb des gültigen Bereichs (65536 < clusterCount < 0x0FFFFFFF).");
fsInfo.FreeClusterCount = clusterCount - 1;