public static void WriteSector(char driveLetter, DiskSpaceLayout diskSpaceLayout, uint sectorNumber, byte[] bytesToWrite) { using (SafeFileHandle handle = CreateDeviceWriteHandle(driveLetter)) { WriteSector(handle, diskSpaceLayout, sectorNumber, bytesToWrite); } }
public static UsbDeviceInfo GetUSBDeviceInfo(char driveLetter) { byte[] bootSectorData; string fileSystemName; STORAGE_DEVICE_NUMBER deviceNumber; DeviceInfo deviceInfo = new DeviceInfo(); DiskSpaceLayout diskSpaceLayout = GetDiskLayout(driveLetter); using (SafeFileHandle handle = CreateDeviceReadHandle(driveLetter)) { bootSectorData = ReadSector(handle, diskSpaceLayout, 0); var volumeInfo = GetVolumeInformation(handle); fileSystemName = volumeInfo.FileSystemName; deviceNumber = Win32Utils.DeviceIoControlAction <STORAGE_DEVICE_NUMBER>(handle, DeviceControlCode.STORAGE_GET_DEVICE_NUMBER).Item1; } var bootSectorInfo = ParseBootSector(bootSectorData, fileSystemName); bootSectorInfo.FileSystemName_Query = fileSystemName; var driveType = NativeMethods.GetDriveType($"{driveLetter}:\\"); deviceInfo.DeviceSerialNumber = GetRemovableDriveDeviceId(driveType, deviceNumber); return(new UsbDeviceInfo(deviceInfo, bootSectorInfo, diskSpaceLayout)); }
public static byte[] ReadSector(char driveLetter, DiskSpaceLayout diskSpaceLayout, uint sectorNumber) { byte[] buffer = null; using (SafeFileHandle handle = CreateDeviceReadHandle(driveLetter)) { buffer = ReadSector(handle, diskSpaceLayout, sectorNumber); } return(buffer); }
private static byte[] ReadSector(SafeFileHandle safeHandle, DiskSpaceLayout diskSpaceLayout, uint sectorNumber) { byte[] buffer = new byte[diskSpaceLayout.lpBytesPerSector]; if (!NativeMethods.SetFilePointerEx(safeHandle, sectorNumber * diskSpaceLayout.lpBytesPerSector, out long newFilePointer, EMoveMethod.Begin)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } if (!NativeMethods.ReadFile(safeHandle, buffer, diskSpaceLayout.lpBytesPerSector, out int bytesRead)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } return(buffer); }
public static void WriteSector(SafeFileHandle safeHandle, DiskSpaceLayout diskSpaceLayout, uint sectorNumber, byte[] bytesToWrite) { if (bytesToWrite.Length > diskSpaceLayout.lpBytesPerSector) { throw new ArgumentOutOfRangeException(nameof(bytesToWrite), "You can write less or equal to disk layout bytes per sector count"); } else if (bytesToWrite.Length != diskSpaceLayout.lpBytesPerSector) { var additionalBytes = (int)(diskSpaceLayout.lpBytesPerSector - bytesToWrite.Length); if (additionalBytes != 0) { Array.Resize(ref bytesToWrite, bytesToWrite.Length + additionalBytes); } } if (!NativeMethods.SetFilePointerEx(safeHandle, sectorNumber * diskSpaceLayout.lpBytesPerSector, out long newFilePointer, EMoveMethod.Begin)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } if (!NativeMethods.DeviceIoControl(safeHandle, DeviceControlCode.LOCK_VOLUME, null, 0, null, 0, out var intOut, IntPtr.Zero)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } if (!NativeMethods.DeviceIoControl(safeHandle, DeviceControlCode.DISMOUNT_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } if (!NativeMethods.WriteFile(safeHandle, bytesToWrite, (uint)bytesToWrite.Length, out var bytesWritten) || bytesWritten != bytesToWrite.Length) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } if (!NativeMethods.DeviceIoControl(safeHandle, DeviceControlCode.UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } }