DeviceIoControl

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

  1. maksum

    maksum New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    1
    Плохо в целом разбираюсь в программировании.
    Есть в винде такая API-функция, как DeviceIoControl, которая которая должна передавать некие функции драйверу устройства. Так вот, у меня есть некий код, который получает информацию о жестком диске: название, серийный номер, атрибуты SMART. В этом коде конечно используется DeviceIoControl. Я пытаюсь понять общий алгоритм действия функции DeviceIoControl по отношению к жесткому диску.

    Вызывая DeviceIoControl и передавая в этом вызове некоторые параметры:
    1. винда по коду операции определяет устройство
    2. и передает команду далее драйверу этого устройства
    3. драйвер отдает команду в жесткий диск
    4. в жестком диске обрабатывается посланная коанда на "железном уровне" и результаты отдаются обратно

    Вопрос: я правильно представляю как эта функция работает? Или как она работает?
     
  2. c4m310t

    c4m310t New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2008
    Сообщения:
    237
    0_o
    Воспользуйтесь поиском по сайту, в гугле поисчите, почитайте Сорокину "Программирование драйверов и систем безопастносит"... %)
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Приблизительно так и есть. Только устройство определяется не по коду операции. Оно должно быть открыто явно (CreateFile) перед посылкой ему команд. А в функцию DeviceIoControl передается хэндл этого устройства. Часто пока команда дойдет до железа, она проходит через цепочку (стек) драйверов. Результаты по той же цепочке передаются обратно.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    На самом деле так.
    1. По первому параметру винда определяет устройство DEVICE_OBJECT (реальному устройству он может соответствовать, а может и нет - это не важно) и обслуживающий его драйвер DRIVER_OBJECT
    2. Запрос ввода-вывода IRP с кодом команды и указателями на входные/выходные буффера передается высшему драйверу на стеке драйверов этого устройства.
    3. Если он ее обрабатывает, результат отдается юзермоду сразу. Если нет - передает ниже по стеку. Следующий драйвер может тоже обработать, а может передать ниже.
    4. Обрабатывающий драйвер может ничего не передать устройству, если команда не предназначена для устройства, он может только внести изменения во внутренние структуры или чего-либо еще. Действие может быть совершенно любое.
    Например, FSCTL_GET_COMPRESSION обрабатывается драйвером ФС.
    А вот IOCTL_DISK_FORMAT_TRACKS - будет обращаться к диску с целью форматирования дорожки.
    5. Результаты передаются в юзермод.