Dos fn 44h управление устройством вв ioctl


DOS, функция 44h Управление устройством ввода/вывода

AL — код подфункции:

AL=OOh — получить информацию об устройстве

AL=01h — установить информацию об устройстве

AL=02h — читать с символьного устройства

AL=03h — писать на символьное устройство

AL=04h — читать с блочного устройства

AL=05h — писать на блочное устройство

AL=06h — дать статус ввода

AL=07h — дать статус вывода

AL=08h — запрос съемного носителя

AL=09h — запрос удаленного устройства

Dos fn 44h: управление устройством в/в ioctl

Действительно функции MS DOS и BIOS обеспечивают нас многими возможностями. Но не всеми. А только самыми необходимыми, стандартными. Но устройств много и много специфических возможностей. Сама аббревиатура IOCTL это I/O Control. Реализуется этот контроль ввода вывода прерыванием Int 21H функцией 44H. Естественно что шаги по TASM я пишу не просто так. Если Вы читаете раздел VC++ то последние шаги на данный момент там были «Шаг 165 — Получения дескриптора VXD», «Шаг 166 — Функция DeviceIoControl». Наверно часть народа догадалась после этого шага к чему я клоню. Итак, эта функция 44h обеспечивает прямую связь между прикладной программой и драйвером устройства. Позволяет программе получать аппаратно-зависимую информацию и запрашивать операции, которые не поддерживаются другими функциональными вызовами MS-DOS. Вот оно. Эта функция позволяет работать напрямую с драйвером оборудования. А драйвера оборудования пишутся тоже по правилам. И если драйвер написан по правилам, то мы может к нему обратиться используя эту функцию. Вот так. Итак, как мы управляем устройствами можем несколькими методами, смотрим схему.

Мы можем использовать функции DOS, они умеют делать операции высокого уровня например создать файл. Мы можем использовать BIOS это более мелкие операции как например абсолютное чтение сектора с диска. DOS скорее всего то же пользуется функциями BIOS. И наконец мы можем использоваться функций DOS 44h для обращения к драйверу устройства. В каком он виде программном или аппаратном в данном случае нас не волнует.

Функции управления некоторыми устройствами

Для оповещения приложений об изменении в аппаратной конфигурации вычислительной системы или в параметрах энергообеспечения, ОС использует сообщения.

Сообщения устройств являются системными сообщениями, которые уведомляют приложения и другие компоненты об изменениях в составе аппаратного обеспечения вычислительной системы (подключен или отключен съемный диск и т.п.).

С целью удостовериться, что приложение не потеряет данные из-за исчезновения какого-либо устройства, ОС отслеживает конфигурацию аппаратного обеспечения ЭВМ и посылает сообщения о предстоящих изменениях в составе устройств приложениям с тем, чтобы те могли подготовиться к изменениям до того, как они наступят.

Для каждого события устройства, ОС посылает сообщение WM_DEVICECHANGE всем приложениям. В этом сообщении параметр wParam идентифицирует тип события устройства, а параметр lParam – является указателем на специфические для данного события данные.

Функция DeviceIoControl обеспечивает интерфейс ввода/вывода, с помощью которого приложения могут напрямую связываться с драйвером устройства. Функция DeviceIoControl является интерфейсом широкого пользования, который может посылать управляющие коды в различные устройства. Каждый управляющий код определяет операцию, которую должен выполнить драйвер. Некоторые стандартные управляющие коды определены в заголовочных файлах SDK (WinIOCtl.h). Дополнительные управляющие коды могут быть определены в драйверах в зависимости от специфики устройства.

В таблице 22 приведены некоторые стандартные коды функций, входящих в управляющие коды из SDK.

Таблица 22 — Стандартные управляющие коды

Код Назначение
IOCTL_CHANGER_GET_PARAMETERS 0x0000 Получить параметры указанного устройства.
IOCTL_CHANGER_GET_STATUS 0x0001 Получить текущее состояние указанного устройства
IOCTL_CHANGER_GET_PRODUCT_DATA 0x0002 Получить данные о устройстве (идентификатор производителя, устройства, серийный номер и т.п.)
IOCTL_STORAGE_GET_MEDIA_TYPES Получить архитектуру указанного устройства (количество цилиндров, тип диска, количество дорожек на цилиндр, количество секторов на дорожке и количество байт на секторе).

Тип управляющих кодов, которые разработчик может определить по своему усмотрению, зависит от устройства, которым предполагается управлять и от платформы, на которой будет запускаться разрабатываемое приложение. Приложения могут использовать или стандартные управляющие коды или специфичные для конкретного устройства коды для выполнения операций прямого ввода/вывода на жесткий диск, компакт-диск и т.п.

В таблице 23 перечислены некоторые функции, используемые для управления устройствами.

Таблица 23 — Функции для управления устройствами

Функция Описание
DeviceIoControl Посылает управляющий код напрямую драйверу определенного устройства. В качестве входных параметров используется: · Дескриптор устройства (создается при открытии или создании файлового объекта типа «устройство»); · Управляющий код, идентифицирующий операцию с устройством; · Указатель на входной буфер данных, которые необходимы для выполнения операции (этот параметр может быть равен 0, если операция не предполагает использование каких-либо входных данных); · Размер входного буфера данных в байтах; · Указатель на выходной буфер данных, которые необходимы для выполнения операции (этот параметр может быть равен 0, если операция не предполагает использование каких-либо выходных данных); · Размер выходного буфера данных в байтах; · Указатель на переменную, содержащую реальное число байт, записанных в выходной буфер.
InstallNewDevice Устанавливает новое устройство. Посылается запрос пользователю для выбора устройства. В качестве входных параметров используется: · Дескриптор окна, в котором будет осуществляться выбор устройства; · Указатель на класс устройства (этот параметр может быть равен 0, в этом случае пользователь начинает выбор устройства со страницы выбора обнаруженных устройств); · Указатель на переменную, определяющую необходимость перезагрузки вычислительной машины, после добавления нового устройства.
RegisterDeviceNotification Регистрирует устройство или тип устройств, для которых окно будет получать уведомления. В качестве входных параметров используется: · Дескриптор окна или службы (сервиса), которое будет получать уведомления о событиях, происходящих с устройством; · Указатель на блок данных, определяющих тип устройств, события с которыми будут инициировать уведомления; · Флаги, определяющие кому предназначено уведомление: окну или службе. Возвращаемое значение является дескриптором окна или службы.
UnregisterDeviceNotification Закрывает все дескрипторы указанного устройства. В качестве входного параметра задается дескриптор окна или службы, получавшего уведомления от устройства.

Контрольные вопросы


1. Дайте определение понятию «операционная среда».

2. Назначение программ форматов: COM и EXE.

3. Назвать основные функции прерывания INT 21h.

4. Назвать основные функции ввода/вывода данных.

3. Назвать основные функции однозадачной операционной системы

4. Назвать основные функции базовой системы ввода/вывод (BIOS).

5.Каким образом осуществляется прямая работа с видеопамятью?

6. Охарактеризовать основные элементы программы в среде Windows.

Илон Маск рекомендует:  Что такое код ovrimos_num_fields

7.Что такое механизм сообщений ОС Windows?

8. Из каких разделов кода состоит классическая структура программы под Windows?

9. Назвать основные API-функции.

10. Что такое сообщения, очередь сообщений?

11. Что такое процедура обратного вызова?

12. Назначение системных сообщений.

13. Как используются значения идентификаторов сообщений?

14. Какова структура данных сообщения?

15. Что такое оконная процедура?

16. Какие параметры имеет оконная процедура?

17. Назвать входные параметры оконной процедуры.

18. Что представляют собой динамические библиотеки?

19. Какие типы функций можно определить в динамических библиотеках?

20. Что такое динамическое связывание?

21. Какие существует методы вызова функции из DLL?

22.Какие API-функции используются во время выполнения DLL?

23. Пояснить модель ввода данных с клавиатуры.

24. Что такоефокус ввода?

25. Какие существует типы сообщений с символами?

26. На какие группы делятся сообщения «мыши»?


27. Охарактеризовать оконные процедуры.

28.Что такое диалоговое окно?

29.Охарактеризовать типы диалоговых окон.

30. Какова структура шаблона диалогового окна?

31. Какой формат может использовать шаблон?

32. Охарактеризовать расширенный формат.

33. Охарактеризовать стандартный формат.

34. Охарактеризовать функцию позволяющую получить информацию о процессоре.

34. Охарактеризовать функцию для определения версии ОС.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Учись учиться, не учась! 10382 — | 7886 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Функция 0ah: Ввод строки с клавиатуры в буфер

DS:DX = адрес входного буфера (смотри ниже)

Выход Буфер содержит ввод, заканчивающийся символом CR (ASCII 0dh)

Описание: При обращении буфер по адресу DS:DX должен содержать значение максимально допустимой длины ввода. На выходе функции в следующем байте содержится действительная длина ввода, затем введенный текст, завершающийся символом возврата каретки (0dh). Символы считываются с устройства стандартного ввода вплоть до CR (ASCII 0dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter). Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. Последний символ в буфере — всегда CR (не засчитан в байте длины). Символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редактирования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т. д. Большинство расширенных кодов ASCII игнорируются. При распознавании Ctrl-Break выполняется прерывание int 23h (буфер остается неизменным).

Завершение программы

Функция 4ch: Завершить программу (EXIT)

Вход AH = 4ch

AL = код возврата

Описание: Возвращает управление от порожденного процесса его родителю, устанавливая код возврата, который можно опросить функцией 4dh WAIT. Управление передается по адресу завершения в PSP завершаемой программы. В векторах Ctrl-Break и Critical Error восстанавливаются старые значения, сохраненные в родительском PSP.

Замечание: Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода возврата самой последней программы.

Функция 4dh: Дать код возврата программы (WAIT)

Вход AH = 4dh

Выход AL = код возврата последнего завершившегося процесса

AH = 0 — нормальное завершение

АН = 1 — завершение через Ctrl-Break int 23h


АН = 2 — завершение по критической ошибке устройства int 24h

АН = 3 — завершение через функцию 31h KEEP

Описание: Возвращает код возврата последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.

Функция 4dh: Дать код возврата программы (WAIT)

Вход AH = 4dh

Выход AL = код возврата последнего завершившегося процесса

AH = 0 — нормальное завершение

АН = 1 — завершение через Ctrl-Break int 23h

АН = 2 — завершение по критической ошибке устройства int 24h

АН = 3 — завершение через функцию 31h KEEP

Описание: Возвращает код возврата последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.

Работа с файлами

Функция 3ch: Создать файл через дескриптор

Вход AH = 3ch

DS:DX = адрес строки ASCIIZ с именем файла

CX = атрибут файла

Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если ошибки нет

Описание: DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. файл создается в указанном (или текущем) каталоге файл открывается в режиме доступа чтение/запись вы должны сохранить дескриптор (handle) для последующих операций, если файл уже существует:

· при открытии файл усекается до нулевой длины

· если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43h Изменить Атрибут)

CONFIG.SYS определяет число доступных дескрипторов в системе

Используйте функцию 5bh Создать Новый Файл, если вы не хотите

испортить существующий файл.

Функция 5bh: Создать новый файл

Вход AH = 5bh DOS 3.0+

DS:DX = адрес строки ASCIIZ с именем файла

CX = атрибут файла


Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если ошибок нет

Описание: DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имя_файла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен функции DOS 3ch CREATE, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Файл открывается для чтения/записи в совместимом Режиме Доступа.

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций.

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).

CONFIG.SYS определяет число доступных дескрипторов в системе

Используйте функцию 5bh Создать Новый Файл, если вы не хотите

испортить существующий файл.

Функция 3dh: Открыть дескриптор файла

Вход AH = 3dh

DS:DX = адрес строки ASCIIZ с именем файла

AL = Режим открытия

Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если нет ошибки

Описание: DS:DX указывает на строку ASCIIZ в формате: d:\путь\имя_файла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. При этом:

· файл должен существовать. См. функцию 3ch (Создать Файл). Файл открывается в выбранном Режиме Доступа/Режиме Открытия

AL = 0 открыть для чтения

AL = 1 открыть для записи

AL = 2 открыть для чтения и записи

· указатель чтения/записи устанавливается в 0. См. 42h (LSEEK)

· вы должны сохранить дескриптор (handle) для последующих операций

· если запрашивается открытие в одном из режимов разделения, должно быть активно разделение файлов (команда DOS SHARE).

· CONFIG.SYS определяет число доступных дескрипторов файлов.

Функция 3eh: Закрыть дескриптор файла

Вход AH = 3eh

BX = дескриптор файла

Выход AX = код ошибки, если CF установлен

Описание: BX содержит дескриптор файла (handle), возвращенный при открытии. Файл, представленный этим дескриптором, закрывается, его буферы сбрасываются, и запись в каталоге обновляется корректными размером, временем и датой. Из-за нехватки дескрипторов файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть часть стандартных дескрипторов, например, дескриптор 3 (стандартный AUX).

Илон Маск рекомендует:  Что такое код dbplus_tremove

Функция 3fh: Читать файл через дескриптор


Вход AH = 3fh

BX = дескриптор файла

DS:DX = адрес буфера для чтения данных

CX = число считываемых байтов

Выход AX = код ошибки, если CF установлен

AX = число действительно прочитанных байтов

Описание: CX байтов данных считываются из файла или устройства с дескриптором, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX. Используйте функцию 42h LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байтов) с CX (запрошенное число байтов):

· если AX = CX, (и CF сброшен) — чтение было корректным без ошибок

· если AX = 0, достигнут конец файла (EOF)

если AX = CX, запись была успешной, если AX адрес буфера (чтение) или данных (запись)

CX = число передаваемых байтов

BX = дескриптор файла (только устройство, но не файл!)

Выход AX= код ошибки, если CF установлен

Подф. 04-05: Читать (AL=04h) или Писать (AL=05h) строку IOCTL на БЛОЧНОЕ устройство

Вход DS:DX=> адрес буфера (чтение) или данных (запись)

CX= число передаваемых байтов

Выход AX = код ошибки, если CF установлен AX = действительное число переданных байтов (если CF=NC=0)

Подф. 06-07: Дать статус ввода (AL=06h) или статус вывода (AL=07h)

Вход BX = дескриптор файла (устройство или дисковый файл)

Выход AL = 0ffh — не конец файла;

AL = 0 — EOF (для дисковых дескрипторов)

AL = 0ffh — готово;

AL = 0 — не готово (для устройств)

Подф. 08h: Использует ли блочное устройство съемный носитель?

Выход AX = 00h — съемный носитель (т. е. гибкий диск)

АХ = 01h — несъемный (жесткий диск или RAM-диск)

АХ = 0fh код ошибки, если BL содержит неверный диск

DOS Fn 35H: дать вектор прерывания


Читайте также:

  1. N-МЕРНОЕ ВЕКТОРНОЕ ПРОСТРАНСТВО».
  2. X1, X2, … , Xn – вектора множества X
  3. Аннулирующий многочлен вектора, пространства
  4. Базис и координаты вектора.
  5. Базис системы векторов. Координаты вектора в данном базисе. Разложение вектора по базису — существование и единственность.
  6. Базис. Координаты вектора в базисе
  7. Базис. Координаты вектора в базисе
  8. Базис. Розкладання вектора по базису
  9. В векторной графике
  10. В векторной форме
  11. В этой формуле тензор устанавливает соответствие в 4-пространстве между векторными полями и .

Выход

Вход

DOS Fn 34H: адрес статуса реентерабельности DOS

Выход

Вход

  • AH = 33H
  • AL = 0 чтобы опросить текущий статус контроля Ctrl-Break
  • AL = 1 чтобы установить статус контроля Ctrl-Break
  • DL = требуемый статус (0=OFF, 1=ON) (только при AL=1)
  • DL = текущий статус (0=OFF, 1=ON)

Описание:

если AL=0, в DL возвращается текущий статус контроля Ctrl-Break. если AL=1, в DL возвращается новый текущий статус. когда статус ON, DOS проверяет на Ctrl-Break с консоли для большинства функций (исключая 06H и 07H). при обнаружении, выполняется INT 23H (если оно не перехватывется, то это снимает процесс). когда статус OFF, DOS проверяет на Ctrl-Break лишь при операциях стандартного в/в, стандартной печати и стандартных операциях AUX.

  • AH = 34H НЕТ В ДОКУМЕНТАЦИИ
  • ES:BX = адрес флага активности DOS

Описание:

Эту недокументированную функцию использует PRINT (фоновый процессор печатного спулинга) в момент его установки, так что он может позднее определить, можно ли использовать файловые функции DOS.

При возврате из этой функции ES:BX содержит адрес внутреннего флага DOS, указывающего, выполняется ли в данный момент какая-либо функция DOS. когда спулеру PRINT требуется открыть файл (или использовать какую-либо функцию DOS), он проверяет этот флаг. если ES:[BX] содержит не 0, фоновая программа (TSR, либо popup) НЕ ДОЛЖНА использовать никаких функций DOS.

Резидентные popup-программы часто активизируются по прерыванию от таймера или клавиатуры. так как это может произойти в любой момент, не исключено, что в этот момент будет выполняться какая-либо функция DOS. если теперь popup вызовет функцию DOS, это разрушит стек DOS и, вероятно, приведет к катастрофической ошибке. Путем проверки этого флага popup может определить, возможны ли вызовы функций DOS.

Это, однако, осложняется тем фактом, что COMMAND.COM и некоторые другие программы проводят большую часть времени, запросив ввод с клавиатуры через функцию 0aH (дать строку). таким образом, флаг почти всегда взведен, и на службу DOS наложено табу.

Вы можете выйти из положения, перехватывая INT 21H и отслеживая вызовы функции 0aH. когда приходит такой запрос, не выполняйте его немедленно. Вместо этого организуйте цикл, в котором с некоторой задержкой вызывайте функцию 0bH (дать статус ввода). Циклите, пока не заметите, что нажата клавиша. после этого можно выйти из цикла и вызвать функцию 0aH. Понятно, что при таком способе всегда существует окно времени, в котором проснувшийся popup может без боязни использовать функции DOS. можно также перехватывать INT 28H, если вы любите рисковать.

Предупреждение:

Эта функция не документирована, и опираться на нее рискованно. большинство popup-программ перехватывают INT 21H и отслеживают статус DOS индивидуально (ибо им и так приходится отслеживать 0aH).

| следующая лекция ==>
DOS Fn 33H: установить/опросить статус Ctrl-Break | DOS Fn 40H: писать в файл через описатель


Дата добавления: 2014-01-20 ; Просмотров: 400 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Разработка Unix подобной OS — Драйверы символьных устройств (8)

В предыдущей статье мы ввели многозадачность. Сегодня пришло время рассмотреть тему драйверов символьных устройств.

Конкретно сегодня мы напишем драйвер терминала, механизм отложенной обработки прерываний, рассмотрим тему обработчиков верхних и нижних половин прерываний.

Начнем с создания структуры устройства, затем введем базовую поддержку файлового ввода-вывода, рассмотрим структуру io_buf и функции для работы с файлами из stdio.h.

Оглавление

Система сборки (make, gcc, gas). Первоначальная загрузка (multiboot). Запуск (qemu). Библиотека C (strcpy, memcpy, strext). Библиотека C (sprintf, strcpy, strcmp, strtok, va_list . ). Сборка библиотеки в режиме ядра и в режиме пользовательского приложения. Системный журнал ядра. Видеопамять. Вывод на терминал (kprintf, kpanic, kassert). Динамическая память, куча (kmalloc, kfree). Организация памяти и обработка прерываний (GDT, IDT, PIC, syscall). Исключения. Виртуальная память (каталог страниц и таблица страниц). Процесс. Планировщик. Многозадачность. Системные вызовы (kill, exit, ps).

Драйверы символьных устройств. Системные вызовы (ioctl, fopen, fread, fwrite). Библиотека C (fopen, fclose, fprintf, fscanf).

Файловая система ядра (initrd), elf и его внутренности. Системные вызовы (exec). Оболочка как полноценная программа для ядра. Пользовательский режим защиты (ring3). Сегмент состояния задачи (tss).

Илон Маск рекомендует:  Что такое код swfsprite >setframes

Драйверы символьных устройств

Начинается все с об]явления символьного устройства. Как ты помнишь, в Linux Device Drivers определение устройства выглядело так:

Основной смысл в том, чтобы назначить устройству реализации функций файлового ввода-вывода.

Мы обойдемся одной структурой, но смысл будет похожий:

Каждому устройству соответствует половин список прерываний, вызываемых в момент генерации прерываний.

В Linux такие половины называются верхними, у нас наоборот, нижними (более низкий уровень).

Лично мне это показалось более логичным и я ненароком запомнил термины наоборот. Каждый элемент списка нижних половин прерываний опишем так:

При инициализации драйвер будет регистрировать свое устройство через функцию dev_register, другими словами добавлять новое устройство в кольцевой список:

Чтобы все это хоть как-то заработало нам понадобится зачаток файловой системы. На первых порах, файлы у нас будут только для символьных устройств.

Т.е. открытие файла будет эквивалентно созданию структуры FILE из stdio для соответствующего файлу драйвера.

При этом, имена файлов будут совпадать с именем устройств. Определим понятие файлового дескриптора в нашей библиотеки C (stdio.h).

Для простоты пусть пока все открытые файлы будут храниться в кольцевом списке. Элемент списка опишем так:

Для каждого открытого файла мы будем хранить ссылку на устройство. Реализуем кольцевой список открытых файлов и реализуем системные вызовы read/write/ioctl.

При открытии файла нам нужно просто структуре io_buf_t присвоить начальные позиции буферов чтения и записи из драйвера, ну и соответственно связать файловые операции с драйвером устройства.

Файловые операции read/write/ioctl определим по одному шаблону на примере системного вызова read.

Сами системные вызовы которые мы научились писать в прошлом уроке будут просто вызывать эти функции.

Короче говоря они просто будут дергать коллбэки из определения устройства. Теперь напишем драйвер терминала.

Драйвер терминала


Нам понадобится буфер вывода на экран и буфер ввода с клавиатуры, а также пару флагов для режимов ввода и вывода.

Напишем функцию создания устройства. Она просто проставляет коллбэки файловых операций и обработчики нижних половин прерываний, после чего регистрирует устройство в кольцевом списке.

Нижний обработчик половин прерываний для клавиатуры определим так:

Тут мы просто кладем введенный символ в буффер клавиатуры. В конце регистрируем отложенный вызов обработчика верхних половин прерываний клавиатуры. Делается это посылкой сообщения (IPC) потоку ядра.

Сам же поток ядра довольно прост:

С помощью него будет вызываться обработчик верхних половин прерываний клавиатуры. Его целью является дублирование символа на экран через копирование буфера вывода в видеопамять.

Теперь осталось написать сами функции ввода-вывода, вызываемые из файловых операций.

Посимвольные операции не сильно сложнее и в комментировании думаю не нуждаются.

Осталось только для управления режимами ввода и вывода реализовать ioctl.

Теперь реализуем файловый ввод вывод на уровне нашей библиотеки С.

Ну и немного высокоуровневых функций приведу тут:

Чтобы пока не морочиться с форматным чтением, будем всегда просто читать в строку как будто дан флаг %s. Мне было лень вводить новый статус задачи для ожидания файловых дескрипторов, поэтому просто в бесконечном цикле пытаемся считать что-нибудь пока нам это не удасться.

На этом все. Теперь ты можешь смело прикручивать драйвера к своему ядру!

Ссылки

Смотри видеоурок для дополнительной информации.

→ Исходный код в git репозиторий (тебе нужна ветка lesson8)

Список литературы

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Dos fn 44h: управление устройством в/в ioctl

Функция DeviceIoControl предусматривает интерфейс управления устройствами ввода и вывода (IOCTL), через который приложение может общаться непосредственно с драйвером устройства. Функция DeviceIoControl — это интерфейс общего назначения, который может отправлять управляющие коды разнообразным устройствам. Каждый управляющий код представляет операцию выполняемую драйвером. Например, управляющий код может попросить, чтобы драйвер устройства возвратил информацию о соответствующем устройстве, или предписать драйверу, чтобы тот выполнил действие на устройстве, такое как форматирование диска.

Большинство стандартных управляющих кодов определяются в заголовочных файлах SDK. Кроме того, драйверы устройства могут определить свои собственные специальные для устройства управляющие коды. Список стандартных управляющих кодов, включенных в документацию SDK, см. в разделе Замечания описания функции DeviceIoControl.

Типы управляющих кодов, которые Вы можете определить, зависят от устройства, к которому вы обращаетесь, и платформы, на которой запускается ваше приложение. Приложения могут использовать стандартные управляющие коды или специальные для устройства управляющие коды, чтобы выполнить прямые операции ввода и вывода данных на накопителе на гибких магнитных дисках, на жестком диске, на накопителе на магнитной ленте или устройстве чтения компакт-дисков (CDROM)

Windows Me/98/95: Приложения не могут использовать стандартные управляющие коды в заголовочных файлах SDK.Эти приложения ограничены в использовании управляющих кодов, поддерживаемых драйвером виртуального устройства, к которому обращаются. Например, системный драйвер VxD, VWIN32.VXD, поддерживает функции управления вводом и выводом данных (IOCTL), первоначально предусмотренными MS-DOS с прерыванием 21h.

Дополнительную информацию смотри в статях ниже:

Dos fn 44h: управление устройством в/в ioctl

Второй аргумент является кодом запроса, значение которого зависит от устройства. Третий аргумент является нетипизированным указателем на память. Обычно, это char *argp (было до тех пор, пока в C не появился vvoid *) и далее он будет называться именно так.

В значении request функции ioctl() кодируется информация является ли параметр входным или выходным и размер аргумента argp в байтах. Макросы и определения, используемые при указании в ioctl() запросах request, определены в файле .

Отправка устройству информации через DeviceIoControl

Теперь пытаюсь разобраться с DeviceIoControl.

В прошлой программе с помощью SetupDiGetDeviceInterfaceDetail нашел символьную ссылку на устройство, открыл его с помощью CreateFile() и попытался отправить туда строку символов с помощью WriteFile() никаких ошибок, возвращается информация о том что символы переданы, но на устройстве никаких изменений.

Тогда я решил покапаться в демонстрационных версиях, поставляемых с устройством и в его драйвере и обнаружил, что запись на устройство производится через DeviceIoControl. Попробовал используя исходники написать свою версию функции, получилось вот так:

в результате не происходит ошибок, но и возвращается что передано 0. Что здесь неправильно? CTL_CODE взят из исходников драйвера, там написано «Request the driver to perform a hardware 32 bit write». Handle устройства по идее верный. Неправильно создается буфер? Его создание я взял из примера какой-то программы и не особо понимаю его смысл. Мне нужно для начала передать хоть что-то, хоть пачку нулей. Если они будут переданы — на устройстве это будет видно.

Добавлено через 8 минут
Да, и в этой программе в CreateFile() я использовал FILE_FLAG_OVERLAPPED, так как прочитал где-то, что для DeviceIoControl нужен асинхронный ввод/вывод. В предыдущей программе использовался FILE_ATTRIBUTE_NORMAL, это изменение требует еще какой-то доработки?

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL