Читаем Использование NuMega DriverStudio для написания WDM-драйверов полностью

NTSTATUS XDSPdrvDevice::OnRemoveDevice(KIrp I) {

 t << "Entering XDSPdrvDevice::OnRemoveDevice\n";

 // Освободить ресурсы устройства

 Invalidate();

 // Здесь добавляется код, специфичный для данного устройства.

 return STATUS_SUCCESS;

}

Иногда бывает необходимо отменить обработку IRP, уже поставленного в очередь (такие запросы иногда посылает диспетчер В/В). Когда такая ситуация может возникнуть?

Представим такую ситуацию: в приложении пользователя поток послал нашему драйверу запрос на ввод-вывод и завершил свою работу. А IRP-пакет попал в очередь запросов и терпеливо ждет своей очереди на обработку. Конечно же, обработка такого "бесхозного" IRP-пакета должна быть отменена. Для этого драйвером поддерживается целый механизм отмены обработки запросов. В Win2000 DDK подробно описано, почему ЛЮБОЙ драйвер должен поддерживать этот механизм. Это связано, в основном, с проблемами надежности и устойчивости работы системы. Ведь сбой в драйвере — это, практически, сбой в ядре ОС.

В классе KPnPDevice механизм отмены запроса реализован при помощи метода CancelQueuedIrp.

VOID XDSPdrvDevice::CancelQueuedIrp(KIrp I) {

 //Получаем очередь IRP-пакетов этого устройства.

 KDeviceQueue dq(DeviceQueue());

//Проверить, является ли IRP, который должен быть отменен, тем пакетом, который должен

 //быть обработан.

 if ( (PIRP)I == CurrentIrp() ) {

  //Уничтожить пакет.

  CurrentIrp() = NULL;

  //При вызове метода CancelQueuedIrp устанавливается глобальная системная

  //защелка (SpinLock). Теперь следует ее сбросить.

  CancelSpinLock::Release(I.CancelIrql());

  t << "IRP canceled " << I << EOL;

  I.Information() = 0;

  I.Status() = STATUS_CANCELLED;

  //Обработать следующий пакет.

  PnpNextIrp(I);

 }

 //Удалить из очереди пакет. Если это удалось, то функция вернет true.

 else if (dq.RemoveSpecificEntry(I)) {

  // Это удалось. Теперь сбрасываем защелку.

  CancelSpinLock::Release(I.CancelIrql());

  t << "IRP canceled " << I << EOL;

  I.Information() = 0;

  I.PnpComplete(this, STATUS_CANCELLED);

 } else {

  //Неудача. Сбрасываем защелку.

  CancelSpinLock::Release(I.CancelIrql());

 }

}

Меотод StartIo является виртуальной функцией. Она вызывается системой, когда драйвер готов обрабатывать следующий запрос в очереди. Это чрезвычайно важная функция: она является диспетчером всех запросов на ввод-вывод, поступаемых к нашему драйверу. В функции вызываются обработчики запросов на чтение, запись а также обработчики вызовов IOCTL. К счастью, умный DriverWizard генерирует скелет функции автоматически и вносить изменения в нее в нашем простом случае не требуется. В принципе, в эту функцию можно ввести какие-то дополнительные проверки IRP-пакетов.

VOID XDSPdrvDevice::StartIo(KIrp I) {

 t << "Entering StartIo, " << I << EOL;

 // Здесь надо проверить, отменен этот запрос или нет. Это производится при помощи вызова

 //метода TestAndSetCancelRoutine. Также этот метод устанавливает новую функцию отмены

 //пакетов, если это необходимо. Адрес новой функции передается вторым параметром. Если

 //он равен NULL,то вызывается старая функция. Если пакет должен быть отменен, функция

 //вернет FALSE.

 if (!I.TestAndSetCancelRoutine(LinkTo(CancelQueuedIrp), NULL, CurrentIrp())) {

  //Пакет отменен.

  return;

 }

 // Начать обработку запроса.

 // Выбрать необходимую функцию

 switch (I.MajorFunction()) {

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных