Страницы

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

Показаны сообщения с ярлыком fat32. Показать все сообщения
Показаны сообщения с ярлыком fat32. Показать все сообщения

вторник, 25 февраля 2020 г.

Получение FAT32 свойств файла

#cpp #fat32


Я хочу получить FAT32 свойства некоторого файла. Я уже разобрался как FAT32 хранит
их и написал структуру для их хранения. Но возник вопрос: как их получить?

Сначала я хотел сделать так:

FILE* in = fopen("H:\\test.txt", "rb");


Но fopen() лишает нас этой информации.

Можно ли каким-либо образом получить FAT32 свойства файла? 
    


Ответы

Ответ 1



С++ абстрагирует от вас свойства файловой системы, так что вам придётся пользоваться системно-специфическими функциями. Для Windows информация, которая вам нужна, находится в структуре WIN32_FIND_DATA. Её можно получить, например, при помощи FindFirstFile. Код из MSDN: #include WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(filename, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { // обработать ошибку return; } else { // можно пользоваться // не забудьте в конце: FindClose(hFind); } Для Linux-платформы аналогичную информацию выдаёт функция stat (2). #include #include struct stat sb; if (stat(argv[1], &sb) == -1) { // обработать ошибку return; } else { // можно пользоваться }

четверг, 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...

воскресенье, 22 декабря 2019 г.

USB флешка с FAT32 + EXTfs под Linux-ом

#linux #ext4 #fat32 #flash_память


Хотелось-бы сделать странную флешку: чтобы на ней был ext[234] и FAT32 одновременно.

Но не с двумя разделами, а с одним разделом, то есть, сделать что-то типа (/dev/sdf
— это флешка):


Создаем файл badblocks, в нем указываем блоки, идущие подряд, а суммарный объем этих
bad-блоков совпадает с разделом FAT32.
Форматируем флешку целиком в ext[234] с указанием файла badblocks (mkfs.ext4 -b badblocks
/dev/sdf).
Через fdisk (fdisk /dev/sdf) создаем единственный primary-раздел, который находится
в области, отмеченной в badblocks.
Форматируем /dev/sdf1 в FAT32


Понятно, что в linux-е мне такой флешку придется монтировать руками, зато под виндою
она подхватится автоматически.

Возможно, существует какой-нибудь HOWTO на эту тему, просто с первой попытки не нашел.
    


Ответы

Ответ 1



для того, чтобы операционная система ms/windows могла примонтировать раздел со своей «родной» файловой системой fat, вовсе не требуется тех ухищрений, что изложены в вопросе. необходимо и достаточно, чтобы этот раздел был первым на usb-storage (aka «флэшка»), у которой установлен removable bit. все остальные разделы, какая бы там ни была файловая система, для ms/windows (без каких-нибудь специализированных средств) остаются «вне поля зрения» — воспринимается только первый раздел.

Ответ 2



Полагаю, что речь об этом приёме. Способ заключается в переключении между двумя таблицами разделов, в каждой из которых по одному разделу. В одной из них раздел при создании файловой системы получил на вход крупную последовательность "битых блоков", обходящую местонахождение раздела из второй таблицы. На флэшке виден в каждый момент только один из этих двух, переключение происходит посредством... перезаписи таблицы разделов. Предполагается, что в обычном состоянии флэшка содержит таблицу разделов, с которой видна только файловая система с "зелёным" пространством. Когда "тихо и спокойно", можно записать на флэшку другую таблицу разделов (pro tip: её можно хранить в последнем секторе диска, только надо его обходить остальными инструментами) и тем самым получить доступ к "секретному разделу", потеряв доступ к основному. "Сделав дело", можно вернуть исходную таблицу разделов обратно, вернув флэшку в обычное состояние. Какие файловые системы будут на внешнем и внутреннем разделах, совершенно неважно (лишь бы файловая система умела обходить стороной "плохие" блоки). Windows вполне может видеть оба раздела при условии перезаписи таблицы разделов (и осознании этого факта операционной системой) и совместимой файловой системы на них (например, FAT32). То есть, если вы забудете вернуть исходную таблицу разделов на место, Windows в этом случае успешно увидит секретный раздел. Такой раздел не стоит делать большим, потому что "плохие блоки" в рамках файловой системы обычно числятся как "всегда занятые" во всяких графических инструментах. Так что если диск пуст (нет файлов и папок, в т. ч. скрытых), а на нём занято существенное количество места (заметно больше, чем на диске всего "сырого места" минус структуры ФС), то это может быть сигналом того, что на диске имеется подобная штука.

Ответ 3



Вот тут есть довольно-таки старая, но весёлая инструкция. Или не то?

воскресенье, 12 мая 2019 г.

Получение FAT32 свойств файла

Я хочу получить FAT32 свойства некоторого файла. Я уже разобрался как FAT32 хранит их и написал структуру для их хранения. Но возник вопрос: как их получить?
Сначала я хотел сделать так:
FILE* in = fopen("H:\\test.txt", "rb");
Но fopen() лишает нас этой информации.
Можно ли каким-либо образом получить FAT32 свойства файла?


Ответ

С++ абстрагирует от вас свойства файловой системы, так что вам придётся пользоваться системно-специфическими функциями.
Для Windows информация, которая вам нужна, находится в структуре WIN32_FIND_DATA. Её можно получить, например, при помощи FindFirstFile
Код из MSDN:
#include
WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(filename, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { // обработать ошибку return; } else { // можно пользоваться
// не забудьте в конце: FindClose(hFind); }
Для Linux-платформы аналогичную информацию выдаёт функция stat (2)
#include #include
struct stat sb; if (stat(argv[1], &sb) == -1) { // обработать ошибку return; } else { // можно пользоваться }