示例#1
0
 public static void WriteSector(char driveLetter, DiskSpaceLayout diskSpaceLayout, uint sectorNumber, byte[] bytesToWrite)
 {
     using (SafeFileHandle handle = CreateDeviceWriteHandle(driveLetter))
     {
         WriteSector(handle, diskSpaceLayout, sectorNumber, bytesToWrite);
     }
 }
示例#2
0
        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));
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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());
            }
        }