Partilhar via


Interromper objetos de sincronização

O driver do sistema PortCls implementa a interface IInterruptSync para o benefício dos drivers de miniporta. IInterruptSync representa um objeto de sincronização de interrupção que sincroniza a execução de uma lista de rotinas de serviço de interrupção (ISRs) 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. Cada vez que a interrupção ocorre, o objeto de sincronização executa os ISRs em uma ordem especificada de acordo com o modo selecionado. (Veja a seguinte descrição dos três modos.)

  • Execução de rotinas que não são ISRs. Essas rotinas ininterruptas não estão conectadas à interrupção do objeto de sincronização. Em vez disso, uma rotina ininterrupta é executada em um momento escolhido pelo chamador. No entanto, o objeto de sincronização executa a rotina ininterrupta de forma síncrona com a lista de ISRs do objeto. Em outras palavras, a rotina ininterrupta é 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 percorre no momento da interrupção. Quando um driver de miniporta registra um ISR com um objeto de sincronização, ele especifica se o ISR deve ser adicionado ao início ou ao fim dessa lista.

Um driver de miniporta 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 atravessar sua lista de ISRs no momento da interrupção. A chamada suporta as três opções especificadas pelas constantes de enumeração INTERRUPTSYNCMODE na tabela abaixo.

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 precedentes.

InterruptSyncModeRepeat

Percorra toda a lista de ISRs até que uma passagem pela lista ocorra em que nenhum ISR na lista retorne STATUS_SUCCESS.

No modo InterruptSyncModeNormal , o objeto de sincronização chama cada ISR na lista até que um deles retorne STATUS_SUCCESS. Quaisquer ISRs na lista que são seguidos por este ISR não serão chamados. Este 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 é destinado a hardware mais primitivo, onde a fonte da interrupção não é determinística, embora possa ser útil em outras situações também. Por exemplo, duas fontes de interrupção podem estar fortemente sincronizadas em cada interrupção, independentemente de qual das duas fontes provém de uma interrupção específica.

No modo InterruptSyncModeRepeat, o objeto de sincronização percorre repetidamente toda a lista de ISRs até ocorrer uma iteração pela lista na qual nenhuma rotina na lista retorna STATUS_SUCCESS. Este 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 acionada durante o processamento ISR. Cada fonte de interrupção deve ser capaz de determinar se 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 algum dos ISRs registados retornar STATUS_SUCCESS. Em todos os três modos, se todas as fontes de interrupção indicarem que não manipularam a interrupção com êxito, o objeto de sincronização retornará um código de resultado malsucedido para o sistema operacional.

A interface IInterruptSync suporta os seguintes métodos:

IInterruptSync::CallSynchronizedRoutine

IInterruptSync::Connect

IInterruptSync::Disconnect

IInterruptSync::GetKInterrupt

IInterruptSync::RegisterServiceRoutine