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

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

Агуров П.В. Интерфейсы USB. Практика использования и программирования — БВХ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interfeysusbpraktikaispolzovaniya2004.djvu
Предыдущая << 1 .. 131 132 133 134 135 136 < 137 > 138 139 140 141 142 143 .. 168 >> Следующая

return ntStatus;
}
В отличие от NT-драйвера, в WDM-драйвере создание объекта устройства и
регистрация символьных имен должна выполняться внутри процедуры
OnAddDevice (ЛИСТИНГ 14.13).
................ .................
ункцияjUS^-драйвера;....-ij:¦:,\
NTSTATUS OnAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject )
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_OBJECT deviceObject = NULL;
PDEVICE_EXTENSION pdx;
WCHAR NameBufferf] = L"\\Device\\" DEVICE_NAME_STRING;
WCHAR DOSNameBuffer[] = L"\\DosDevices\\" DEVICE_NAME_STRING;
UNICODE_STRING uniNameString, uniDOSString;
// Создание буферов для имен
RtllnitUnicodeString(SuniNameString, NameBuffer);
RtllnitUnicodeString(suniDOSString , DOSNameBuffer);
DbgPrint("UniName=%s DosName=%s", uniDOSString, uniNameString);
// Инифиализация объекта драйвера ntStatus = IoCreateDevice(
DriverObject,
442
Часть IV. Создание USB-устройств
sizeof (DEVICE_EXTENSION), suniNameString,
FILE_DEVICE JJNKNOWN,
0,
FALSE,
SdeviceObject
) ;
// Создание символьного имени драйвера ntstatus =
IoCreateSymbolicLink(suniDOSString, SuniNameString);
// Инициализация блока данных объекта устройства DbgPrint("Init device
extension");
pdx = (PDEVICE_EXTENSION) (deviceObject->DeviceExtension); pdx-
>OpenHandles = 0;
// Драйвер будет использовать прямой в/в для запросов // чтения и записи
deviceObject->Flags |= DO_DIRECT_IO;
// Сохраняем ссылку на драйвер нижнего уровня. Ему мы будем // пересылать
запросы на в/в pdx.->StackDeviceObject =
IoAttachDeviceToDeviceStack(deviceObject, PhysicalDeviceObject);
return ntstatus;
)
В WDM предусмотрен довольно удобный механизм хранения данных, относящихся
к конкретному экземпляру драйвера: при создании объекта устройства в
функцию ioCreateDevice передается размер блока пользовательских данных
(DeviceExtension). В любом другом обработчике можно легко получить
указатель на этот буфер с помощью следующего кода:
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION )fdo->DeviceExtension;
Внутренняя структура этих данных - забота программиста, драйвер только
лишь создает блок памяти нужного размера. В нашем примере мы используем
описание, показанное в листинге 14.14.
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
443
|/1иСТИНГ 14.14. Структура DEVICEJEXTENSION
typedef struct _DEVICE_EXTENSION (
// Объект устройства в IRP-стеке PDEVICE_OBJECT StackDeviceObject;
// Число устройств для этого драйвера ULONG OpenHandles;
// TRUE, если устройство стартовано BOOLEAN Started;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
Обработчики OnCreate и onciose в общем случае могут не выполнять никаких
специальных действий за исключением управления счетчиком копий драйвера
(листинг 14.15).
ма>....................................
........................................
01ИСТИНГ 14.15. Процедуры OnCreate и OnClose
RMj".....................................................................
.. ....
NTSTATUS OnCreate(
IN PDEVICEJOBJECT fdo,
IN PIRP Irp )
(
NTSTATUS ntstatus;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION )fdo->DeviceExtension;
// счетчик открытых устройств pdx->OpenHandles++;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0; ntstatus = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT); return ntstatus;
}
NTSTATUS OnClose(
IN PDEVICEJOBJECT fdo,
444
Часть IV. Создание USB-устройств
IN PIRP Irp )
{
NTSTATUS ntStatus;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION )fdo->DeviceExtension;
// счетчик открытых устройств pdx->OpenHandles-;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0; ntStatus = Irp->IoStatus.Status;
IoCompieteRequest (Irp, IO_NO_INCREMENT); return ntStatus;
}
Обработчик Onunioad может выполнять некоторые действия по освобождению
памяти, буферов и т. д., а диспетчер энергопотребления OnDispatchPower
используется только в случае, если устройство поддерживает
соответствующие интерфейсы. В нашем случае эти обработчики не выполняют
никаких специальных действий (листинг 14.16).
¦Йстинг<14 16 Обработчики OnUnload и OnDispatchPower
f .......
VOID OnUnload(
IN PDRIVER_OBJECT DriverObject )
{
}
NTSTATUS OnDispatchPower(
IN PDEVICE JOBJECT fdo,
IN PIRP Irp
)
{
PIO_STACK_LOCATION irpStack, nextStack;
PDEVICE_EXTENSION pdx = fdo->DeviceExtension;
NTSTATUS ntStatus;
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
445
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
irpStack = IoGetCurrentlrpStackLocation(Irp);
nextStack = IoGetNextlrpStackLocation(Irp);
RtlCopyMemory(nextStack, irpStack, sizeof (IO_STACK__LOCATION) ) ;
PoStartNextPowerlrp(Irp);
ntstatus = PoCallDriver(pdx->StackDeviceObject, Irp);
if (ntstatus == STATUS_PENDING)
{
IoMarklrpPending(Irp);
}
return ntstatus;
}
Основную работу по поддержке РпР производит процедура-диспетчер
OnDispatchPnp, распределяющая вызовы в соответствии с кодом MinorFunction
(ЛИСТИНГ 14.17).
Предыдущая << 1 .. 131 132 133 134 135 136 < 137 > 138 139 140 141 142 143 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

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

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

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

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