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

 

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

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

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

#define irp_ _mj_ _create OxOO
#define irp_ _mj _create_named_pipe OxOl
#define irp_ _mj_ _close 0x02
#define irp_ _mj_ _read 0x03
#define irp_ _mj_ _write 0x04
#define irp_ _mj_ _query_information 0x05
#define irp_ _mj_ _set_information 0x06
#define irp_ _mj_ _query_ea 0x07
#define irp_ _mj_ _set_ea 0x08
#define irp_ _mj_ jlush_buffers 0x09
#define irp_ __mj_ __query_volume_information OxOa
#define irp_ _mj_ _set_volume_information OxOb
#define irp_ _mj_ _directory_control OxOc
#define irp_ _mj_ _file_system_control OxOd
#define irp_ _mj_ _device_control OxOe
#define irp_ _mj_ _internal_device_control OxOf
tdefine irp_ _mj_ shutdown 0x10
#define irp_ _mj_ _lock_control 0x11
#define irp_ _mj_ ^cleanup 0x12
#define irp_ _mj_ _create_mailslot 0x13
#define irp_ _mj_ _query_security 0x14
#define irp_ _mj_ _set_security 0x15
#define irp_ _mj_ _power 0x16
#define irp_ _mj_ _system_control 0x17
fdefine irp_ _mj_ _device_change 0x18
#define irp_ _mj_ _query_quota 0x19
tdefine irp_ _mj_ _set_quota OxIa
tdefine irp_ _mj_ _pnp OxIb
tdefine irp_ _mj_ _pnp_power irp_mj_pnp
tdefine irp_ _mj_ maximum_function OxIb
Если драйверу интересен только один тип запросов, то можно воспользоваться константой irp_mj_maximum_function, как показано в листинге 9.5. Все запросы будут обрабатываться процедурой irpHandler, за исключением запросов irp_mj_device_control, которые будут поступать в процедуру
IrpDeviceControl.

Часть III. Практика программирования
Листинг 9.5. Обработка одного типа запроса
.nt і;
:or (і=0; і < IRP_MJ__MAXIMUM__FUNCTION; і++) DriverObject->MajorFunction[і] = IrpHandler;
)riverObject->MajorFunction[IRP MJ_DEVICE_CONTROL] = IrpDeviceControl;
основной обязанностью процедуры AddDevice (точнее юворя, той процедурі, которая была зарегистрирована В поле Driv<?rExtension->.Addnevjce іри вызове DriverEntry) является создание объекта устройства с использо-ШНИЄМ вызова loCreateDevice.
Заголовок процедуры AddDeviср показан в листинге 9.6, а скелетный пример >рганизации самой рабочей процедуры -- в листинге 9.7.
Лри необходимости подключения к объекту физического устройства (этот >бъект создается шинным драйвером) драйвер может вызвать функцию roAttachDevice, . передав ей указатель, взятый из параметра fhysicalDeviceObject.
ЛИСТИНГ 9.6. ЗаГОЛОВОК процедуры AddDevice
JTSTATUS XxxAddDevice( IN PDRlVERJDBJECT DrіverObject, IN PDEVICE_OBJECT FhysicalDeviceObject
Листинг 9.7. Пример процедуры AddDevice
Э.3.2. Процедура AddDevice
TTSTATUS Iter AddDevice ( IN PDRIVER_OBJECT DriverObject, IN PDEVICEJDBOSCT FhysicalDeviceObject
NTSTATUS
status = STATUS SUCCESS;
PDEVICE OBJECT
deviceObject = NULL; deviceExtension;
PDEVICE EXTENSION
ULONG
deviceType ^ V1.LEJDEVlCEJJNKNOWN;
гпава 9. Введение в WDM
193
// Вызов loIsWdmVersionAvailable{I1 0x20) возвращает TRoE //в операционных системах после Windows 2000. if (!loIsWdmVersionAvailable(1, 0x20)) (
deviceObject = IoGetAttachedDeviceReference(FhysicalDeviceObject);
deviceType = deviceObject->DeviceType;
ObDereferenceObject(deviceObject);
}
Il Создание объекта драйвера-фильтра status = loCreateDevice (DriverObject,
sizeof (DEVICE_EXTENSION),
NULL, Il без имени
deviceType,
FILE_DEVICE_SECURE_OPEN, FALSE,
SdeviceObject ) ;
if (!NT_SUCCESS (status)) { Il выход, если ошибка return status;
}
Il отладочная информация
DebugPrint (("AddDevice PDO (0x%x) FDO (0x%x)\n", FhysicalDeviceObject, deviceObject));
deviceExtension = (PDEVICE__EXTENSION) deviceObject->DeviceExtension; deviceExtension->NextLowerDriver =
loAttachDeviceToDeviceStack(deviceObject, FhysicalDeviceObject);
Il Ошибка означает сбой в системе Plug and Play if(NULL == deviceExtension->NextLowerDriver) ( IoDeieteDevi.ee (deviceObject) ; return STATUSJUNSUCCESSFUL;
}
deviceObject->Flags I= deviceExtension->NextLowerDriver->Flags &
(D0J3UFFERED IO I D0_ DIRECT IO 1
94
Часть Iii. Практика программирования
DO_POWER_PAGABLE
) ;
deviceObject->DeviceType =
deviceExtension->NextLowerDriver->DeviceType; deviceObject->Characteristics =
deviceExtension->NextLowerDriver->Characteristics; deviceExtension->Self = deviceObject;
Il Установка начального состояния фильтра INITIALIZE_PNP_STATE(deviceExtension);
DebugPrint(("AddDevice: %x to %x->%x \n", deviceObject,
deviceExtension->NextLowerDriver, PhysicalDeviceObject));
deviceObject->Flags &= ~DO_DEVICE_INITIALIZING; return STATUS SUCCESS;
).3.3. Процедура Unload
Эбычно загруженный драйвер остается в системе до перезагрузки. Для того [тобы сделать драйвер выгружаемым, необходимо написать и зарегистриро-іать процедуру выгрузки unload. Диспетчер в/в произведет вызов этой про-(едуры в момент ручной либо автоматической выгрузки драйвера.
Іаголовок этой процедуры показан в листинге 9.8.
Листинг 9.8. Заголовок процедуры unload
VOID GiveioUnload( IN PDRIVER_OBJECT pDriverObject Il указатель на объект драйвера
Процедура unload выполняет стандартный набор действий:
При необходимости драйвер может сохранять текущие настройки в системном реестре. При последующей загрузке драйвера эти данные могут
Предыдущая << 1 .. 61 62 63 64 65 66 < 67 > 68 69 70 71 72 73 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100