using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using FastSeekWpf.NativeInterop; namespace FastSeekWpf.Core; public static class DriveDiscovery { public static List GetNtfsDrives() { var drives = new List(); char[] buffer = new char[256]; uint len = Win32Api.GetLogicalDriveStringsW((uint)buffer.Length, buffer); if (len == 0) return drives; // Parse null-separated drive strings (same as Rust buf[..len].split(|&c| c == 0)) var driveStrings = new List(); var sb = new StringBuilder(); for (int i = 0; i < len; i++) { if (buffer[i] == '\0') { if (sb.Length > 0) { driveStrings.Add(sb.ToString()); sb.Clear(); } } else { sb.Append(buffer[i]); } } foreach (var root in driveStrings) { if (IsNtfs(root)) { drives.Add(new NtfsDrive { Letter = root[0], Root = root }); } } return drives; } private static bool IsNtfs(string root) { var fsName = new StringBuilder(32); bool ok = Win32Api.GetVolumeInformationW( root, null!, 0, out _, out _, out _, fsName, (uint)fsName.Capacity); if (!ok) return false; return fsName.ToString().StartsWith("NTFS", StringComparison.OrdinalIgnoreCase); } }