Плохо в целом разбираюсь в программировании. Есть в винде такая API-функция, как DeviceIoControl, которая которая должна передавать некие функции драйверу устройства. Так вот, у меня есть некий код, который получает информацию о жестком диске: название, серийный номер, атрибуты SMART. В этом коде конечно используется DeviceIoControl. Я пытаюсь понять общий алгоритм действия функции DeviceIoControl по отношению к жесткому диску. Вызывая DeviceIoControl и передавая в этом вызове некоторые параметры: 1. винда по коду операции определяет устройство 2. и передает команду далее драйверу этого устройства 3. драйвер отдает команду в жесткий диск 4. в жестком диске обрабатывается посланная коанда на "железном уровне" и результаты отдаются обратно Вопрос: я правильно представляю как эта функция работает? Или как она работает?
0_o Воспользуйтесь поиском по сайту, в гугле поисчите, почитайте Сорокину "Программирование драйверов и систем безопастносит"... %)
Приблизительно так и есть. Только устройство определяется не по коду операции. Оно должно быть открыто явно (CreateFile) перед посылкой ему команд. А в функцию DeviceIoControl передается хэндл этого устройства. Часто пока команда дойдет до железа, она проходит через цепочку (стек) драйверов. Результаты по той же цепочке передаются обратно.
На самом деле так. 1. По первому параметру винда определяет устройство DEVICE_OBJECT (реальному устройству он может соответствовать, а может и нет - это не важно) и обслуживающий его драйвер DRIVER_OBJECT 2. Запрос ввода-вывода IRP с кодом команды и указателями на входные/выходные буффера передается высшему драйверу на стеке драйверов этого устройства. 3. Если он ее обрабатывает, результат отдается юзермоду сразу. Если нет - передает ниже по стеку. Следующий драйвер может тоже обработать, а может передать ниже. 4. Обрабатывающий драйвер может ничего не передать устройству, если команда не предназначена для устройства, он может только внести изменения во внутренние структуры или чего-либо еще. Действие может быть совершенно любое. Например, FSCTL_GET_COMPRESSION обрабатывается драйвером ФС. А вот IOCTL_DISK_FORMAT_TRACKS - будет обращаться к диску с целью форматирования дорожки. 5. Результаты передаются в юзермод.