Программирование драйверов Windows


Отключение от источника прерываний - часть 2


/p>

Драйвер WDM, например, из пакета разработки устройств PCI шины фирмы PLX Technology, выходит из положения следующим образом.

Прежде всего, данный драйвер, получив IRP пакет с указанными признаками (IRP_MJ_PNP, субкодом IRP_MN_START_DEVICE), дает возможность сначала обработать его нижележащим драйверам, перехватывая его на обратном пути. После этого он производит анализ полученных ресурсов, в частности, подключает собственную функцию обработки прерываний PlxOnInterrupt к прерыванию, как оно было предопределено PnP Менеджером, передавшим выделенные ресурсы в ячейке стека пакета IRP.

int i, count; BOOLEAN interruptPresented = FALSE; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation( pIrp ); PCM_PARTIAL_RESOURCE_LIST pRawResource= &stack-&#62Parameters.StartDevice.AllocatedResources-&#62 List[0].PartialResourceList; count = pRawResource-&#62Count; for (i = 0; i &#60 count; i++, pRawResource++) { //Просмотр всех выделенных драйверу ресурсов switch (pRawResource -&#62Type) { case CmResourceTypeInterrupt: // Прерывание interruptPresented = TRUE; IrqL = (KIRQL) Resource-&#62u.Interrupt.Level; vector = Resource-&#62u.Interrupt.Vector; affinity = Resource-&#62u.Interrupt.Affinity; if (ResourceRaw-&#62Flags == CM_RESOURCE_INTERRUPT_LATCHED) mode = Latched; else mode = LevelSensitive; break; . . . } } if (interruptPresented) { // Здесь следует запретить прерывания от ведомого устройства . . . // Создание объекта прерывания и подключение к нему status = IoConnectInterrupt( &pDevExtension-&#62pInterruptObject, PlxOnInterrupt, pDevExtension, NULL, vector, IrqL, IrqL, mode, TRUE, affinity, FALSE ); if ( !NT_SUCCESS(status) ) { // обработка ошибки } else { // разрешить прерывания от устройства } }

Здесь pDevExtension указывает на структуру расширения объекта устройства (соответственно, эта структура должна предусмотреть в своем составе место для хранения указателя на создаваемый объект прерывания, здесь pInterruptObject), a PlxOnInterrupt передает адрес предоставляемой данным драйвером ISR процедуры, созданной в соответствии с прототипом, описанным в таблице 8.11.




Начало  Назад  Вперед