Подскажите, пожалуйста, что почитать (лучше - исходник) о низкоуровневом доступе к диску (например, через disk.sys, если это возможно). Гуглил, не нашел. Задача - считать файл с диска в обход всех API, сервисов и пр. В образовательных целях.
IceFire Берешь микроскоп, карандаш и лист бумаги, а затем выписываешь на бумагу содержимое диска. )) А если серьезно, API предназначено для унификации работы с дисками различных производителей. Даже средства DOS или BIOS для доступа к диску являются своеобразным API. А напрямую, наверное можно, но только к конкретному диску и с помощью конкретных средств, возможно имеющихся у производителя данной модели. Forever Он же написал в обход всех API, сервисов и пр.
Ну он еще и про disk.sys упоминал. Я решил, что под API он имеет ввиду Win32 API и функции ядра. Ну а если нужно в обход ВСЕХ апи, то тогда придется ВСЕ апи написать самому. В любом случае с чем-то придется взаимодействовать...
Ну естественно речь шла про WinAPI. Интересует взаимодействие с жестким диском на самом низком уровне из предоставляемых операционной системой.
Тогда могу предложить несколько вариантов в порядке возрастания сложности: 1. Работать с драйвером тома (открываем \\?\Cс помощью функций CreateFile, ReadFile (или NtCreateFile, NtReadFile). 2. Определять расположение тома на диске и работать с disk.sys. (\Device\Harddisk0\Partition0) 3. ... дальше больше. Рекомендую работать именно в таком порядке (раз тебе для образовательных целей). Доводишь до работаспособного варианта первый способ. Потом пытаешся его улучшить... Один только вопрос, что именно ты собираешся читать (или писать)? Если хочешь с файлами поработать, то не забудь еще про реализацию файловой системы...
Forever Спасибо! Первый вариант использовать не буду, т.к. сервисы/функции могут быть перехвачены, а мне интересно прочитать "as is". Сейчас прочитал MTF-Record для нужного мне файла, осталось разобрать, как файл "размазан" по диску и прочитать через disk.sys. А вот тут я уже ничего не понимаю и буду признателен за любой линк по теме.
Алгоритм может быть таков: 1. Открываешь устройство тома. 2. Делаешь запрос IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Этот запрос возвращает тебе номера дисков на которых находится том, а также смещения и длины этих кусков (экстентов). В случае, если кусков много - необходимо определять тип тома (RAID0, RAID1, RAID5, композитный том). Здесь подсказать ничего хорошего не смогу. В случае, если том простой - экстент будет только один. 3. В MFT все смещения данных на томе представлены как LCN - номер кластера, считая от начала тома. Используя информацию, полученную выше, ты можешь получить смещение, относительно начала диска. 4. Открываешь диск \Device\Harddisk[номер полученный в п. 2]\Partition0. 5. Делаешь все, что тебе нужно. Это то, что касается работы с диском. Для работы с файловой системой - читай доки. Для FAT имеется спецификация, для NTFS почитай здесь http://linux-ntfs.org/doku.php.
Коллеги, никто не покажет кусок кода для формирования IRP для последующей передачи в ClassPNP!ClassReadWrite? Известно: адрес ClassReadWrite, начало области для чтения (в секторах и в байтах), размер области для чтения, память для чтения выделена. Нужно: IRP и pDeviceObject.
http://www.ozon.ru/context/detail/id/4760810/ http://www.insidepro.com/rus/doc.shtml В книгах и статьях KPNC есть нужная тебе инфа, ну или по крайней мере часть. В "Восстановлении данных" точно было.
Forever Делаю так: Код (Text): if (uClassReadWriteAddr) { memset(pBuffer, 0, Length); pIRPRW=IoBuildSynchronousFsdRequest( IRP_MJ_READ, //MajorFunction pDeviceObject, //DeviceObject pBuffer, //Buffer Length, //Length &StartingOffset, //StartingOffset &keEvent, //Event &StatusBlock //IoStatusBlock ); DbgPrint("pIRPRW: %#x", pIRPRW); if (!(pIRPRW)) return STATUS_UNSUCCESSFUL; DbgPrint("=====Reading via ClassReadWrite====="); __asm { mov edi, pDeviceObject mov esi, pIRPRW push esi push edi mov eax, uClassReadWriteAddr call eax push eax pop ns } DbgPrint("ClassReadWrite routine said: %#x", ns); } ClassReadWrite возвращает STATUS_SUCCESS, но в буфере пустота.
IceFire почитай исходные тексты TrueCrypt или DiskCrypt там используеться низкоуровневый доступ если мне не изменяет память