/// <summary> /// Чтение загрузочного сектора /// </summary> /// <returns></returns> private unsafe byte[] LoadBootSector() { byte[] bytes = new byte[BYTE_IN_SECTOR]; // BOOT сектор в виде одномерного массива байтов IntPtr BytesRead = IntPtr.Zero; fixed(byte *ptr = bytes) { HD_API.ReadFile(Drive, ptr, BYTE_IN_SECTOR, BytesRead, IntPtr.Zero); // Считывание первого сектора }; return(bytes); }
/// <summary> /// Чтение произвольного сектора с диска /// </summary> /// <param name="sectorNum">Номер сектора</param> /// <returns>Массив байт размером BPB.BYTE_IN_SECTOR</returns> private unsafe byte[] _ReadSector(int sectorNum) { byte[] bytes = new byte[BPB.BYTE_IN_SECTOR]; // сектор в виде одномерного массива байтов IntPtr BytesRead = IntPtr.Zero; ulong pointer = (ulong)sectorNum * (ulong)BPB.BYTE_IN_SECTOR; int hight = (int)(pointer >> 32); HD_API.SetFilePointer(Drive, (int)(pointer & 0xffffffff), out hight, HD_API.EMoveMethod.Begin); fixed(byte *ptr = bytes) { HD_API.ReadFile(Drive, ptr, BPB.BYTE_IN_SECTOR, BytesRead, IntPtr.Zero); // Считывание сектора }; HD_API.SetFilePointer(Drive, 0, out hight, HD_API.EMoveMethod.Begin); return(bytes); }
/// <summary> /// Конструктор /// </summary> /// <param name="drive">Имя логического диска в формате C:</param> public NTFS(string drive) { drive = "\\\\.\\" + drive; // Создаем файл для чтения с диска Drive = HD_API.CreateFile( drive, HD_API.GENERIC_READ, HD_API.FILE_SHARE_READ | HD_API.FILE_SHARE_WRITE, IntPtr.Zero, HD_API.OPEN_EXISTING, 0, IntPtr.Zero ); BPB = new BPB(Drive); // считываем блок параметров БИОС MFT = GetFirstMFT(); // считываем первую запись МФТ }