низкоуровневый доступ к диску

Тема в разделе "WASM.BEGINNERS", создана пользователем IceFire, 22 окт 2009.

  1. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Подскажите, пожалуйста, что почитать (лучше - исходник) о низкоуровневом доступе к диску (например, через disk.sys, если это возможно). Гуглил, не нашел.

    Задача - считать файл с диска в обход всех API, сервисов и пр. В образовательных целях.
     
  2. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    http://www.wasm.ru/article.php?article=lockfileswork
     
  3. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    IceFire
    Берешь микроскоп, карандаш и лист бумаги, а затем выписываешь на бумагу содержимое диска. :)))

    А если серьезно, API предназначено для унификации работы с дисками различных производителей. Даже средства DOS или BIOS для доступа к диску являются своеобразным API. А напрямую, наверное можно, но только к конкретному диску и с помощью конкретных средств, возможно имеющихся у производителя данной модели.

    Forever
    Он же написал в обход всех API, сервисов и пр.
     
  4. Yorik

    Yorik Артур

    Публикаций:
    0
    Регистрация:
    11 янв 2008
    Сообщения:
    18
    Возможно http://www.wasm.ru/article.php?article=atazen01
     
  5. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Ну он еще и про disk.sys упоминал. Я решил, что под API он имеет ввиду Win32 API и функции ядра.

    Ну а если нужно в обход ВСЕХ апи, то тогда придется ВСЕ апи написать самому. В любом случае с чем-то придется взаимодействовать...
     
  6. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Ну естественно речь шла про WinAPI. Интересует взаимодействие с жестким диском на самом низком уровне из предоставляемых операционной системой.
     
  7. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Тогда могу предложить несколько вариантов в порядке возрастания сложности:
    1. Работать с драйвером тома (открываем \\?\C:)с помощью функций CreateFile, ReadFile (или NtCreateFile, NtReadFile).
    2. Определять расположение тома на диске и работать с disk.sys. (\Device\Harddisk0\Partition0)
    3. ... дальше больше.

    Рекомендую работать именно в таком порядке (раз тебе для образовательных целей). Доводишь до работаспособного варианта первый способ. Потом пытаешся его улучшить...

    Один только вопрос, что именно ты собираешся читать (или писать)? Если хочешь с файлами поработать, то не забудь еще про реализацию файловой системы...
     
  8. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Forever

    Спасибо!

    Первый вариант использовать не буду, т.к. сервисы/функции могут быть перехвачены, а мне интересно прочитать "as is".

    Сейчас прочитал MTF-Record для нужного мне файла, осталось разобрать, как файл "размазан" по диску и прочитать через disk.sys. А вот тут я уже ничего не понимаю и буду признателен за любой линк по теме.
     
  9. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Алгоритм может быть таков:
    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.
     
  10. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Спасибо. Попробую - отпишусь.
     
  11. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Коллеги, никто не покажет кусок кода для формирования IRP для последующей передачи в ClassPNP!ClassReadWrite?

    Известно: адрес ClassReadWrite, начало области для чтения (в секторах и в байтах), размер области для чтения, память для чтения выделена. Нужно: IRP и pDeviceObject.
     
  12. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    IoBuildSynchronousFsdRequest не подойдет?
     
  13. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    было ж недавно обсуждение по работе через ата команды. по постам павиа поищите
     
  14. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    http://www.ozon.ru/context/detail/id/4760810/

    http://www.insidepro.com/rus/doc.shtml

    В книгах и статьях KPNC есть нужная тебе инфа, ну или по крайней мере часть.
    В "Восстановлении данных" точно было.
     
  15. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Forever

    Делаю так:

    Код (Text):
    1. if (uClassReadWriteAddr)
    2.     {
    3.         memset(pBuffer, 0, Length);
    4.  
    5.         pIRPRW=IoBuildSynchronousFsdRequest(
    6.             IRP_MJ_READ, //MajorFunction
    7.             pDeviceObject, //DeviceObject
    8.             pBuffer, //Buffer
    9.             Length, //Length
    10.             &StartingOffset, //StartingOffset
    11.             &keEvent, //Event
    12.             &StatusBlock  //IoStatusBlock
    13.         );
    14.         DbgPrint("pIRPRW: %#x", pIRPRW);
    15.         if (!(pIRPRW)) return STATUS_UNSUCCESSFUL;
    16.  
    17.         DbgPrint("=====Reading via ClassReadWrite=====");
    18.         __asm
    19.         {
    20.             mov edi, pDeviceObject
    21.             mov esi, pIRPRW
    22.             push esi
    23.             push edi
    24.             mov eax, uClassReadWriteAddr
    25.             call eax
    26.             push eax
    27.             pop ns
    28.         }
    29.     DbgPrint("ClassReadWrite routine said: %#x", ns);  
    30.     }
    ClassReadWrite возвращает STATUS_SUCCESS, но в буфере пустота.
     
  16. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    hack_virii

    Спасибо, уже читал. Именно по статьям Криса и написал парсер NTFS.
     
  17. reversecode

    reversecode Guest

    Публикаций:
    0
    IceFire
    почитай исходные тексты TrueCrypt или DiskCrypt
    там используеться низкоуровневый доступ если мне не изменяет память
     
  18. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Проблема решена. Кому интересно - здесь отличный материал по теме. С исходниками.