ЖУРНАЛ «СТА» №2/2006

Остальные функции — StartService, DeleteService и CloseServiceHandle — запускают, удаляют и закрывают дескриптор нашего драйвера. Далее приводятся прототипы функций и описания их параметров. StartService proto hService :HANDLE, dwNumServiceArgs :DWORD, lpServiceArgVectors :LPSTR hService Дескриптор драйвера/сервиса. dwNumServiceArgs Количество аргументов, передавае- мых сервису. Драйверу не передают- ся аргументы, поэтому значения NULL. lpServiceArgVectors Указатель на массив указателей, ссылающихся на строки, завер- шающиеся нулём. В строках содер- жатся передаваемые службе аргу- менты. В нашем случае аргументы отсутствуют, поэтому значение NULL. DeleteService proto hService :HANDLE hService Дескриптор удаляемой службы. CloseServiceHandle proto hSCObject :HANDLE hSCObject Дескриптор закрываемого SCM, сервиса, драйвера. П РОТОТИП ДРАЙВЕРА РЕЖИМА ЯДРА Рассмотрим шаблон простейшего драйвера (листинг 2). Не правда ли, если Вы знакомы с динамически подключаемой библио- текой (DLL) [3], то приведённый при- мер во многом напомнит Вам структу- ру простейшей динамической библио- теки. Надо сказать, что между драйве- рами и DLL очень много общего. По- сле загрузки драйвера операционная система передаёт управление на его точку входа. Предполагается, что вы- полняемая функция программы, ко- торой передано управление сразу по- сле загрузки драйвера, — это инициа- лизация структур и переменных, не- обходимых для дальнейшей работы драйвера, и отчёт перед ОС о выпол- ненной задаче (“DriverEntry is the first routine called after a driver is loaded, and is responsible for initializing the driver”, — читаем мы в MSDN). Точ- кой входа является метка, указанная после директивы End, то есть в нашем случае это EntryDriverUNIO (у Вашего драйвера может быть другое имя). В нашем примере после передачи управ- ления на точку входа происходит фор- мирование перехода из 0 в 1 на одном из выходов FPGA1платы UNIOXX5 74 СТА 2/2006 П Р О Г РАММНО Е ОБ Е С П Е Ч Е НИ Е / Д РАЙ В Е Р Ы www.cta.ru ; CardUNIO.asm .386 .model flat, stdcall option casemap:none include D:\masm32\INCLUDE\DDK\wxp\ntddk.inc UNIO_FPGA1_BaseAdrr equ 0a110h ; базовый адрес FPGA1 UNIOxx5 при поставке MyDelay equ 100h STATUS_IO_DEVICE_ERROR equ 0C0000185h .code ShortDelay proc ValDelay:DWORD push cx mov cx, ValDelay @@delay: dec cx jnz @@delay pop cx ret ShortDelay endp EntryDriverUNIO proc DriverObject:PDRIVER_OBJECT, \ RegistryPath:PUNICODE_STRING push cx push dx xor al,al inc al mov dx, UNIO_FPGA1_BaseAdrr ; в контрольном регистре устанавливаем BANK = 1 cli out dx,al sti invoke ShortDelay, MyDelay ; в регистрах маски каналы 023 на вывод inc dx mov al,0ffh cli out dx,al sti invoke ShortDelay, MyDelay xor al,al dec dx ; в контрольном регистре устанавливаем BANK = 0 cli out dx,al sti invoke ShortDelay, MyDelay inc dx ; формируем импульс на 07 выходах Cli Out dx,al invoke ShortDelay, MyDelay mov al,0ffh out dx,al invoke ShortDelay, MyDelay xor al,al out dx,al ; возвращаем системе сообщение о неудачной ; инициализации драйвера mov eax, STATUS_IO_DEVICE_ERROR pop dx pop cx ret EntryDriverUNIO endp End EntryDriverUNIO Листинг 2

RkJQdWJsaXNoZXIy MTQ4NjUy