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

 

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

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

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

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;
11 Создание буферов для имен
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_UNKNOWN,
0,
FALSE,
SdeviceObject
) ;
// Создание символьного имени драйвера ntStatus = IoCreateSymbolicLink(suniDOSString, SuniNameString);
Il Инициализация блока данных объекта устройства DbgPrint("Init device extension");
pdx = (PDEVICE_EXTENSION) (deviceObject->DeviceExtension); pdx->OpenHandles = 0;
Il Драйвер будет использовать прямой в/в для запросов // чтения и записи
deviceObject->Flags I= DO_DIRECT_IO;
Il Сохраняем ссылку на драйвер нижнего уровня. Ему мы будем // пересылать запросы на в/в pdx->StackDeviceObject =
IoAttachDeviceToDeviceStack(deviceObject, PhysicalDeviceObject);
return ntStatus;
}
B WDM предусмотрен довольно удобный механизм хранения данных, относящихся к конкретному экземпляру драйвера: при создании объекта устройства в функцию ioCreateDevice передается размер блока пользовательских данных (DeviceExtension). В любом другом обработчике можно легко получить указатель на этот буфер с помощью следующего кода:
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION )fdo->DeviceExtension;
Внутренняя структура этих данных — забота программиста, драйвер только лишь создает блок памяти нужного размера. В нашем примере мы используем описание, показанное в листинге 14.14.
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
443
^Листинг 14.14. Структура devxce_extenszoh
typedef struct _DEVICE_EXTENSION (
Il Объект устройства в IRP-стеке PDEVICEJOBJECT StackDeviceObject; // Число устройств для этого драйвера ULONG OpenHandles;
// TRUE, если устройство стартовано BOOLEAN Started;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
Обработчики onCreate и onciose в общем случае могут не выполнять никаких специальных действий за исключением управления счетчиком копий драйвера (листинг 14.15).
¦Листинг 14.15. Процедуры OnCreate и OnCIo««
NTSTATUS OnCreate(
IN PDEVICEJOBJECT fdo, IN PIRP Irp )
(
NTSTATUS ntStatus;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION )fdo->DeviceExtension;
Il счетчик открытых устройств pdx->OpenHandles++;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus. Information = 0; ntStatus = Irp->IoStatus.Status; IoCompleteRequest(Irp, I0_N0_INCREMENT); return ntStatus;
}
NTSTATUS OnClose(
IN PDEVICE_OBJECT fdo,
Hs
444
Часть IV. Создание USB-устройств
IN PIRP Irp )
{
NTSTATUS ntStatus;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION )fdo->DeviceExtension;
Il счетчик открытых устройств pdx->OpenHandles—;
Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; ntStatus = Irp->IoStatus. Status; IoCompieteRequest (Irp, IO_NO_INCREMENT) ; return ntStatus;
}
Обработчик onunload может выполнять некоторые действия по освобождению
паМЯТИ, буферов И Т. Д., а диспетчер Энергопотребления OnDispatehPower ИС-
пользуется только в случае, если устройство поддерживает соответствующие интерфейсы. В нашем случае эти обработчики не выполняют никаких специальных действий (листинг 14.16).
^ншї.іб. 09раб.0Г«(ИКИ OntfnXoad и OnDlepatchPowar К«< s
VOID OnUnload(
IN PDRIVER_OBJECT DriverObject )
{ }
NTSTATUS OnDispatehPower( IN PDEVICE_OBJECT 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;
}
Основную работу по поддержке PnP производит процедура-диспетчер OnDispatchPnp, распределяющая вызовы в соответствии с кодом MinorFunction (листинг 14.17).
HHrt4ji7.-AMcneT4epPnP-3anpo4:oBOnDi8pktehPnp
NTSTATUS OnDispatchPnp( IN PDEVICE_OBJECT fdo, IN PIRP Irp
)
{
PIO_STACK_LOCATION irpStack;
PDEVICE_EXTENSION pdx = fdo->DeviceExtension; UIXMG fen; NTSTATUS ntStatus;
Г •i-
/* Получаем текущую позицию в стеке драйверов */ irpStack = IoGetCurrentlrpStackLocation (Irp); /* Номер функции */ fen = irpStack->MinorFunction;
446
Часть IV. Создание USB-устройств
switch (fen) {
/* Обработка старта устройства */
case IRP_MN_START_DEVICE:
{
ntStatus = OnStartDevice(fdo); if (ntStatus == STATUS_SUCCESS) {
pdx->Started = TRUE;
}
break;
}
Предыдущая << 1 .. 130 131 132 133 134 135 < 136 > 137 138 139 140 141 142 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100