Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Как получить сектора, на которых расположен файл?

#c_sharp #файлы #файловая_система #ntfs #fat32


В общем нужно получить сектора, на которых расположен файл и перезаписать их. Каким
образом это можно осуществить на C#? Может кто-то сталкивался?
    


Ответы

Ответ 1



Прямой доступ к секторам запоминающего устройства в C# можно осуществить следующим образом (но начиная с Windows Vista этот код подойдёт только для чтения): using System; using System.IO; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; namespace ConsoleApplication { class Program { const uint OPEN_EXISTING = 3; const uint GENERIC_READ = 0x80000000; const uint GENERIC_WRITE = 0x40000000; [DllImport("kernel32", SetLastError = true)] static extern SafeFileHandle CreateFile ( string FileName, uint DesiredAccess, uint ShareMode, uint SecurityAttributes, uint CreationDisposition, uint FlagsAndAttributes, int hTemplateFile ); static void Main() { byte[] buffer = new byte[512]; // PhysicalDrive2 - имя целевого привода using (SafeFileHandle handle = CreateFile("\\\\.\\PhysicalDrive2", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)) { using (FileStream stream = new FileStream(handle, FileAccess.ReadWrite)) { int sector = 35792; // Read stream.Position = 512 * sector; stream.Read(buffer, 0, 512); // Write (начиная с Windows Vista требует дополнительных манипуляций) stream.Position = 512 * sector; stream.Write(buffer, 0, 512); } } for (int i = 0; i < buffer.Length; i++) Console.Write(buffer[i].ToString() + ' '); Console.ReadKey(); } } } Не смотря на то, что позиция в данном случае указывается в байтах, так же, как это происходит при работе с памятью через драйвер файловой системы, обращение будет произведено именно к тому сектору, в котором расположен указанный байт. То есть в случае, если stream.Position = 600, чтение будет произведено с самого начала первого сектора — так, как будто stream.Position = 512, то есть с начала ячейки памяти. Особенности работы в ОС начиная с Windows Vista Для того, чтобы получить объект SafeFileHandle, запускать программу нужно с правами администратора. Без дополнительных манипуляций доступны для перезаписи: загрузочный сектор логического раздела BPB (англ. BIOS parameter block), однако его резервная копия без дополнительных манипуляций не доступна, равно как и все остальные сектора логического раздела (Condition 1); сектора, не принадлежащие ни одному логическому разделу, например сектор с MBR (англ. master boot record) и зарезервированное за ним пространство, или сектора, не отнесённые ни к одному логическому разделу по другим причинам (Condition 2). Условия доступа к секторам, принадлежащим логическим разделам: неявная блокировка раздела, посредством запроса эксклюзивного доступа для записи (Condition 3); явная блокировка раздела, посредством отправки запроса на блокировку и запроса на отключение (Condition 4); запрос на запись с флагом SL_FORCE_DIRECT_WRITE (Condition 5). To be continued... FAT32 Список секторов, на которых расположен файл, вычисляется из его кластерной цепочки. Начало кластерной цепочки хранится в записи о файле в директории, в которой он лежит. To be continued...

Комментариев нет:

Отправить комментарий