Максимальное число диапазонов адресов, которые можно отобразить в расширение объекта устройства, указывается в переменной MAX_MAPPED_MMIO. Я не буду заострять внимание на обсуждении функции Dispatchcreate, так как она ничего не делает. Она всего лишь возвращает код успешного завершения диспетчеру ввода-вывода. Ее единственное назначение состоит в том, чтобы ответить функциям API CreateFile и cioseHandie правильным значением, когда приложение пользовательского режима открывает доступ к драйверу. Наиболее важной частью драйвера является обработчик кодов IOCTL. Значительная часть взаимодействий между приложением пользовательского режима и драйвером bios_probe осуществляется с помощью кодов IOCTL. После того как дескриптор драйвера будет успешно открыт, коды IOCTL могут поступать в драйвер, где они обрабатываются функцией DispatchioControl. В этой функции поступивший код анализируется в операторе switch, который вызывает соответствующий обработчик. Например, когда в драйвер поступает КОД IOCTL READ_PORT_BYTE, DispatchioControl вызывает обработчик ReadPortByte. Обработчик ReadPortByte считывает байт из указанного аппаратного порта и передает его приложению пользовательского режима. Обратите внимание, что некоторые части обработчика ReadPortByte реализованы в виде встроенных процедур на языке ассемблера, так как они работают непосредственно с аппаратными средствами. Все обработчики типа, Т. е. обработчики ReadPortWord, ReadPortLong, WritePortWord И WritePortLong, работают подобно обработчику Разница заключается только в количестве параметров функций, они работают, а также в типе операций, которые они выполняют. начинающиеся со строки write, выполняют операции записи в указанн аппаратный порт описывающий диапазон адресов ввода-вывода, отображенных на виртуальное адресное пространство ядра в пункте 1.
Рубрика: Женский интерес