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

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

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

прерываний.
3. Символьная ссылка должны быть удалена из пространства имен, видимого
пользовательскими приложениями. Это выполняется при помощи вызова функции
IoDeleteSymbolicLink.
4. Объект драйвера должен быть удален вызовом функции ioDeieteDevice.
5. Если драйвер управляет многокомпонентным контроллером, необходимо
повторить шаги 3 и 4 для каждого устройства, подключенного к контроллеру,
а затем удалить сам объект контроллера при помощи вызова функции
IoDeleteController.
6. Следует выполнить освобождение памяти, выделенной драйверу, во всех
типах оперативной памяти.
Драйверы WDM модели выполняют почт и все из этих действий в обработчике
IRP_MJ_PNP запросов С субкодом IRP_MN_REMOVE.
Листинг 9.9 показывает пример написания процедуры unload. Обратите
внимание на преобразование имени драйвера в кодировку UNICODE.
// пример из драйвера GivelOEx #define DEVICE_NAME_STRING L"giveioex"
VOID GiveioUnload(IN PDRIVER_OBJECT DriverObject)
{
WCHAR DOSNameBuffer[] = L"\\DosDevices\\" DEVICE_NAME_STRING;
UNICODE_STRING uniDOSString;
if (IOPM_local)
MmFreeNonCachedMemory(IOPM_local, sizeof(IOPM));
RtllnitUnicodeString(SuniDOSString, DOSNameBuffer);
IoDeleteSymbolicLink (SuniDOSString);
IoDeieteDevice(DriverObject->DeviceObject);
}
Важно отметить, что процедура unload не вызывается в момент перезагрузки
или выключения системы. При необходимости выполнения действий во время
выключения следует делать это в обработчике запросов irp_mj_shutdown,
причем объект устройства должен быть с помощью вызова
196
Часть III. Практика программирования
функции loRegisterShutdownNotification занесен в очередь объектов,
получающих уведомление о выключении.
9.3.4. Рабочие процедуры драйвера
Клиенты драйвера (т. е. пользовательское приложения или модули режима
ядра) общаются с драйвером с помощью специальных структур данных,
называемых пакетами IRP (Input/output Request Packet, пакет запроса в/в).
При появлении запроса от приложения пользователя диспетчер в/в вызывает
соответствующий обработчик драйвера, который был зарегистрирован в
массиве DriverObject->Ma jorFunction [ ], как показано в листинге 9.2.
Пакеты IRP являются структурами данных переменной длины и состоят из
стандартного заголовка, содержащего общую учетную информацию, и одного
или нескольких блоков параметров, называемых ячейкой стека е/е (I/O stack
location). Структура пакета IRP показана на рис. 9.5.
Рис. 9.5. Структура пакета IRP
Заголовок пакета
Описывать все поля заголовка пакета IRP не имеет смысла. Код драйвера
может работать со следующими полями:
? pmdl MdiAddess - указатель на MDL-список (Memory Descriptor List,
список дескрипторов памяти), если устройство поддерживает прямой в/в;
? pvoid Associatedirp. systemBuffer - указатель на системный буфер для
случая, когда устройство поддерживает буферизированный в/в;
? то status block Tostatus - код состояния (статус) запроса;
Гпава 9. Введение в WDM
197
? boolean Cancel - индикатор того, что пакет IRP должен быть аннулирован,
? pvoid userBuffer - адрес пользовательского буфера для в/в.
Поле структуры iostatus фиксирует состояние данной операции в/в; когда
драйвер готов завершить обработку пакета IRP, он устанавливает поле
iostatus.status в значение status__xxx. В поле iostatus.information
записывается 0, если произошла ошибка или другое, определенное операцией
в/в значение, чаще всего - число переданных или полученных байт данных
(которое может быть равно и нулю).
Ячейки стека в/в
Основное назначение ячеек в/в состоит в хранении параметров запроса на
в/в. Диспетчер в/в создает пакет IRP с числом ячеек в стеке, равном числу
драйверных слоев, участвующих в обработке запроса. Любому драйверу в
иерархии разрешен доступ к его собственной ячейке стека. Когда драйвер
передает IRP-пакет нижнему драйверному уровню, он автоматически
перемещает указатель стека в/в пакета таким образом, что он указывает на
стековую ячейку для этого драйвера. Когда обработка пакета драйвером
нижнего уровня завершена, указатель стека снова возвращается в исходное
положение и указывает на ячейку стека для лежащего выше драйвера. Для
получения указателя на текущую ячейку существует специальный системный
ВЫЗОВ IoGetCurrentStackLocation.
Получив указатель на свою ячейку стека, т. е. указатель на структуру
io_stack_location, драйвер может работать со следующими полями:
? uchar MajorFunction - код irp_mj_xxx, описывающий назначение операции;
? uchar MinorFunction - субкод операции;
? pdevice__object DeviceObject - указатель на объект устройства, которому
был адресован данный запрос IRP;
? pfile object Fileobject - файловый объект для данного запроса, если он
задан.
В зависимости ОТ значения MajorFunction Поле Parameters Представляется
по-разному (т. е. оно описано как объединение (union)), например:
? для типа irp_mj_control в поле parameters доступны следующие поля:
• ULONG OutputBufferLength
• ULONG InputBufferLength
• ULONG IoControlCode
Предыдущая << 1 .. 62 63 64 65 66 67 < 68 > 69 70 71 72 73 74 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Завалишин Д. "Интернетско-русский разговорник" (Web-программирование)

Заенцев И.В. "Нейронные сети: основные модели" (Web-программирование)

Владимиров А.А. "Wi-фу: «боевые» приемы взлома и защиты беспроводных сетей" (Web-программирование)

Вьейра Р. "SQL Server 2000. Программирование в 2 ч." (Web-программирование)

Веллинг Л.Т. "Разработка web приложений с помощью php и mysql" (Web-программирование)
Авторские права © 2013 ComputersBooks. Все права защищены.

c1c0fc952cf0704ad12d6af2ad3bf47e03017fed