Compartilhar via


Interromper objetos de sincronização

O driver do sistema PortCls implementa a interface IInterruptSync em benefício de drivers de miniport. IInterruptSync representa um objeto de sincronização de interrupção que sincroniza a execução de uma lista de ISRs (rotinas de serviço de interrupção) com rotinas sem interrupção.

Os objetos de sincronização de interrupção fornecem dois recursos principais:

  • Execução de uma lista de ISRs em resposta a uma interrupção. O objeto de sincronização está conectado a uma fonte de interrupção. Sempre que a interrupção ocorre, o objeto de sincronização executa os ISRs em uma ordem especificada de acordo com o modo selecionado. (Consulte a descrição a seguir dos três modos.)

  • Execução de rotinas que não são ISRs. Essas rotinas sem interrupção não estão conectadas à interrupção do objeto de sincronização. Em vez disso, uma rotina sem interrupção é executada em um momento da escolha do chamador. No entanto, o objeto de sincronização executa a rotina de não interrupção de forma síncrona com a lista de ISRs do objeto. Em outras palavras, a rotina de não interrupção é executada até a conclusão antes que qualquer um dos ISRs na lista do objeto de sincronização comece a ser executado e vice-versa.

Um objeto de sincronização de interrupção é flexível ao lidar com vários ISRs. Os ISRs residem em uma lista vinculada que o objeto de sincronização atravessa no momento da interrupção. Quando um driver de miniporto registra um ISR com um objeto de sincronização, ele especifica se o ISR deve ser adicionado ao início ou ao final desta lista.

Um driver de miniporto chama a função PcNewInterruptSync para criar um objeto de sincronização de interrupção. Durante essa chamada, o driver especifica a maneira como o objeto deve percorrer sua lista de ISRs no momento da interrupção. A chamada dá suporte às três opções especificadas pelas constantes de enumeração INTERRUPTSYNCMODE na tabela a seguir.

Constante Significado

InterruptSyncModeNormal

Chame cada ISR na lista até que um deles retorne STATUS_SUCCESS.

InterruptSyncModeAll

Chame cada ISR na lista exatamente uma vez, independentemente dos códigos de retorno dos ISRs anteriores.

InterruptSyncModeRepeat

Percorra toda a lista de ISRs até que ocorra uma viagem pela lista na qual nenhum ISR na lista retorna STATUS_SUCCESS.

No modo InterruptSyncModeNormal , o objeto de sincronização chama cada ISR na lista até que um deles retorne STATUS_SUCCESS. Todos os ISRs na lista que seguem esse ISR não são chamados. Esse modo emula a maneira como o sistema operacional normalmente lida com ISRs. Se nenhum dos ISRs retornar STATUS_SUCCESS, o comportamento será o mesmo que InterruptSyncModeAll.

No modo InterruptSyncModeAll , cada ISR na lista é chamado exatamente uma vez, independentemente dos códigos de retorno dos ISRs anteriores. Isso se destina a um hardware mais primitivo em que a origem da interrupção não é determinística, embora também possa ser útil em outras situações. Por exemplo, duas fontes de interrupção podem ser sincronizadas firmemente em cada interrupção, independentemente de qual das duas fontes uma interrupção específica vem.

No modo InterruptSyncModeRepeat , o objeto de sincronização percorre repetidamente toda a lista de ISRs até que ocorra uma viagem pela lista na qual nenhuma rotina na lista retorna STATUS_SUCCESS. Esse modo é apropriado para situações em que interrupções de várias fontes podem ser disparadas na mesma linha de interrupção ao mesmo tempo, ou uma segunda interrupção pode ser disparada durante o processamento do ISR. Cada fonte de interrupção deve ser capaz de determinar se ela requer processamento. O sistema deixará de responder se um ISR que sempre retorna STATUS_SUCCESS estiver registrado com um objeto de sincronização nesse modo.

Em qualquer um desses modos, o objeto de sincronização reconhecerá a interrupção no sistema operacional se qualquer um dos ISRs registrados retornar STATUS_SUCCESS. Nos três modos, se todas as fontes de interrupção indicarem que não trataram a interrupção com êxito, o objeto de sincronização retornará um código de resultado malsucedido ao sistema operacional.

A interface IInterruptSync dá suporte aos seguintes métodos:

IInterruptSync::CallSynchronizedRoutine

IInterruptSync::Connect

IInterruptSync::D isconnect

IInterruptSync::GetKInterrupt

IInterruptSync::RegisterServiceRoutine