Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Аппаратное обеспечение -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 71

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

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

GIVEIO_TYPE 40000
// Коды функций IOCTL от 0x800 до OxFFF могут использоваться #define
IOCTL_IOPM_GET_ALL_ACCESS\
CTL_CODE(GIVEIO_TYPE, 0x900, METHODJ3UFFERED, FILE_ANY_ACCESS)
#define IOCTL_DISK_SET_PARTITION_INFO\
CTL_CODE(IOCTL_DISK_BASE, 0x008, METHODJBUFFERED,\ FILE_READ_DATA |
FILE_WRITE_DATA)
Листинг 9.17. Формирование кода IOCTL в Delphi Const
GIVEIO_TYPE = 40000;
METHODJBUFFERED = 0;
FILE_ANY_ACCESS = $0000;'
// Функция формирования кода IOCTL function Get_Ctl_Code(Nr: Integer);
Cardinal; begin Result:=
(GIVEIO_TYPE shl 16) or (FILE_ANY_ACCESS shl 14) or (Nr shl 2) or
METHOD_BUFFERED; end;
// Пример формирования кода для листинга 8.15 Var
IOCTL_IOPM_GET_ALL_ACCESS: Cardinal;
IOCTL_IOPM_GET_ALL_ACCESS:= Get_Ctl Code C$900);
206_________________________________________Часть III. Практика
программирования
Таблица 9.2. Параметры макроопределения ctl code
Параметр Описание
DeviceType Код драйвера: • 0x0000-0x7FFFF - зарезервированы Microsoft •
0x8000-OxFFFF - определяются пользователем
ControlCode Определяемые драйвером IOCTL-коды: • 0x000-0x7FF -
зарезервировано Microsoft • 0x800-OxFFF - определяются пользователем
TransferType Способ получения доступа к буферу: • 0:METHODJBUFFERED
• 1: METHOD_.IN_DIRECT • 2: METHOD_OUT_DIRECT • 3:METHOD_NEITHER
RequiredAccess Тип доступа: • 0x0000: FILE_ANY_ACCESS • 0x0001:
FILE_READ_ACCESS • 0x0002: FILE_WRITE_ACCESS • 0x0003:
FILE_READ_ACCESS 1 FlLE_WRlTE_ACCESS
Заметим, что из табл. 8.2 видно, что флаги с и F, показанные на рис. 9.6
будут равны 0, если код IOCTL является зарезервированным кодом Microsoft.
Более подробное обсуждение значения констант, составляющих код IOCTL,
выходит за рамки нашей книги, их можно найти в [8, 9]. Нас же прежде
всего интересует способ обработки пользовательских кодов. Листинг 9.18
показывает пример обработки IOCTL-кодов в рабочей процедуре драйвера.
: Листинг 9.18. Обработка IOCTL-кода в рабочей процедуре драйвера
//в процедуре DriverEntry регистрируем рабочую процедуру драйвера // для
обработки IOCTL-кодов NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverQbject,
IN PUNICODE_STRING RegistryPath
)
Глава 9. Введение в WDM
207
DriverObj ect->Ma j orFunctior} [IRP_MJ_DEVICE_C0NTR0L] -
IOCTL_DeviceControl;
return STATUS_SUCCESS;
}
// Рабочая процедура драйвера NTSTATUS
IOCTL_DeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP plrp )
{
// результат
NTSTATUS ntstatus - STATUS_SUCCESS;
// получить указатель на стек
PIO_STACK_I?)CATION irpSp = IoGetCurrentlrpStackLocation(pIrp);
// получить код IOCTL
ULONG ioctlCode = irpSp->Parameters.DeviceloControl.IoControlCode;
// размер входного буфера
ULONG inSize - irpSp->Parameters.DeviceloControl.InputBufferLength;
// размер выходного буфера
ULONG outsize *= irpSp->Parameters.DeviceloControl.OutputBufferLength;
// обработка кодов IOCTL . switch (ioctlCode)
{
// кода IOCTL_xxx формируются разработчиком драйвера case IOCTL_CODEl:
(
// проверяем входные параметры if ((inSize =0) II (outsize = 0))
{
ntstatus = STATU S_INVALID_PARAMETER; break;
}
.........обработка IOCTL_CODE1........
break;
}
208
Часть III. Практика программирования
case I0CTL_G0DE2:
{
// проверяем входные параметры if (inSize < 100)
{
ntStatus = STATU S_BUFFER_TOO_SMALL; break;
}
........ обработка I0CTL_C0DE2 .......
break;
}
}
pIrp->IoStatus.Status = ntStatus;
IoCompieteRequest( plrp, IO_NO_INCREMENT );
return ntStatus;
}
Как видно из заголовка функции DeviceloControl, драйверу передается
входной и выходной буферы с данными. Драйвер получает указатели на эти
данные а полях пакета IRP, зависящих от метода доступа, "зашифрованного"
в коде номера IOCTL (см. табл. 9.2):
? при использовании метода method__buffered диспетчер в/в предоставляет
единственный буфер в нестраничной памяти, достаточный для размещения
входного и выходного буферов инициатора вызова. Адрес этой области
размещается в поле Associatedirp.SystemBuffer (листинг 9.8). Затем
производится копирование входного буфера с данными инициатора запроса в
эту область. В поле userBuffer заносится оригинальный адрес буфера для
получения данных инициатора запроса. По завершении обработки запроса
диспетчер в/в копирует содержимое выделенной области данных в выходной
буфер инициатора запроса. Таким образом, драйверу предоставляется один
буфер, даже если инициатор запроса указал два разных буфера;
? при использовании методов method__in_direct и method__out_direct
диспетчер в/в производит фиксацию (lock) выходного буфера инициатора
запроса в физической памяти. Затем он производит построение списка
дескрипторов памяти для выходного буфера и сохраняет указатель на этот
список в поле MdiAddress пакета 1RP. Кроме того, диспетчер в/в выделяет
временную область в нестраничном пуле и сохраняет этот адрес в поле
Associatedirp. SystemBuf fer пакета 1RP. Производится копирование
содержимого входного буфера инициатора запроса в выделенный системный
буфер, а В поле UserBuffer производится запись значения
Предыдущая << 1 .. 65 66 67 68 69 70 < 71 > 72 73 74 75 76 77 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.