Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 74

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 68 69 70 71 72 73 < 74 > 75 76 77 78 79 80 .. 166 >> Следующая

имя_драйвера;
? start (тип reg_dword) — значение этого параметра описывает стадию загрузки операционной системы, когда следует загружать драйвер. Возможные варианты приведены в табл. 9.4;
216
Часть III. Практика программирования
? туре (тип reg_dword) — значение этого параметра описывает тип драйвера. Некоторые значения этого параметра приведены в табл. 9.5;
? параметры подраздела епшп — подраздел Enum в ветке описания драйвера присутствует постоянно для драйверов, загруженных с помощью Мастера установки оборудования. Для драйверов, загружаемых при помощи SCM-сервиса, он появляется только после их удачного старта. В этом разделе присутствуют параметры Count (число обнаруженных устройств), Nextlnstance и параметры 1, 2 и т. д. Параметры 1, 2 и т. д. появляются только для удачно стартовавших драйверов, а их значения указывают на ветку HKLM\System\CurrentControlSet\Enum (где отражаются все когда-либо удачно стартовавшие драйверы).
Таблица 9.3. Значения параметра ErrorControl
Значение Символьное имя Описание
OxOO SERVlCE_ERR0R_IGNORE Ошибки игнорируются, загрузка продол-
жается без уведомлений об ошибках в данном драйвере
0x01 SERVlCE_ERROR_NORMAL Ошибки игнорируются, но сообщения об
ошибках выводятся, при этом загрузка продолжается
0x02 SERVICE_ERROR_SEVERE Порядок загрузки нарушается и начина-
ется заново с использованием набора параметров последней успешной загрузки, а если он уже используется, то ошибка игнорируется
0x03 SERVICE_ERROR_CRITICAL Порядок загрузки нарушается и начина-
ется заново с использованием набора ¦ параметров последней успешной загрузки, а если он уже используется, то загрузка прерывается и выводится сообщение об ошибке
Таблица 9.4. Значения параметра start
Значение Символьное имя Описание
0x00 SERVICE_BOOT_START Драйвер запускается загрузчиком ОС
0x01 SERVICE_SYSTEM_START Драйвер запускается на стадии загрузки
компонентов ядра ОС
0x02 SERVICE_AUTO_START Драйвер будет запущен средствами
SCM-менеджера после загрузки компо-
нентов ядра ОС
Гпава 9. Введение в WDM
217
Значение Символьное имя
0x03 SERVICE_DEMAND START
0x04 SERVICE DISABLED
Значение Символьное имя
Таблица 9.4 (окончание)
Описание
Драйвер запущен пользовательским приложением при помощи средств SCM-менеджера
Драйвер не может быть запущен
Таблица 9.5. Значения параметра Туре Описание
0x01 SERVICE-KERNEL_DRIVER Драйвер режима ядра
0x02 SERVICE_FILE_SYSTEM_DRIVER Драйвер файловой системы
0x04 SERViCE-ADAPTER Драйвер адаптера
9.4.3. Обращение к рабочим процедурам
Обращение к стандартным рабочим процедурам производится с помощью стандартных функций Windows API, а к пользовательским — с помощью вызова функции DeviceloControl.
Соответствие рабочих процедур и функций Windows API приведено в табл. 9.1. Например, вызов рабочей процедуры с кодом irp_mj_read производится с помощью вызова функции ReadFile.
Вызов функции DeviceloControl позволяет обращаться к рабочей процедуре irp_mj_device_control. Различение пользовательских процедур производится с помощью подкода (sub code), передаваемого при вызове DeviceloControl (см. разд. 9.2.5).
Листинг 9.22 демонстрирует вызов пользовательской рабочей процедуры с кодом $900.
і Листинг 9.22. Загрузка и обращение к рабочим процедурам драйвера
Procedure TGivelOEx.GiveloForProcess(dwProcessId : Cardinal);
var hDevice : SC-HANDLE; Result : Cardinal;
begin
Il Загрузить драйвер с именем giveioex hDevice:= CreateFiie('\\.\giveioex', GENERIC_READ or GENERICJWRITE,
218
Часть III. Практика программирования
О,nil,
OPEN_EXISTING,
FILE-ATTRIBUTEJIORMAl,
О
);
// Обращение к рабочей процедуре с кодом IRP_MJ_DEVICE_CONTROL // и подходом $900
DeviceloControl(hDevice, Get_Ctl_Code($900),
odwProcessId, SizeOf(dwProcessId), nil, 0, Result, nil); Il Закрытие драйвера CioseHandle(hDevice); end;
9.4.4. Хранение драйвера внутри исполняемого файла
В заключение раздела сделаем небольшое замечание. В приведенном ранее случае для работы программы требуется два файла — файл программы и файл драйвера. Для удобства установки и распространения программы можно использовать специальный ресурсный файл, позволяющий "встроить" файл драйвера в файл программы, и распространять один файл вместо двух. Для этого нужно в любом редакторе ресурсов создать бинарный ресурс, загрузив его из файла драйвера. Полученный файл ресурса (он имеет расширение res) с помощью директивы {$r имя_файла.гез} включают в модуль программы, содержащий обращение к драйверу, а затем выполняют следующие шаги (листинг 9.23):
1. Создать файл драйвера.
2. Записать в созданный файл содержимое ресурса.
3. Работать, как обычно, с созданным файлом драйвера.
4. Удалить файл драйвера.
Таким образом, динамическое создание и уничтожение файла драйвера будет производиться прозрачно для программы.
: Листинг 9.23. Динамическое создание файла драйвера
// Подключение файла ресурсов {$R GiveloEx.RES}
Il получение пути к системному каталогу function GetSystemDir : String;
Гпава 9. Введение в WDM
Предыдущая << 1 .. 68 69 70 71 72 73 < 74 > 75 76 77 78 79 80 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100