Compartilhar via


Função IoConnectInterrupt (wdm.h)

A rotina IoConnectInterrupt registra a ROTINA InterruptService (ISR) de um driver de dispositivo, para que ele seja chamado quando um dispositivo interromper em qualquer um de um conjunto especificado de processadores.

Sintaxe

NTSTATUS IoConnectInterrupt(
  [out]          PKINTERRUPT       *InterruptObject,
  [in]           PKSERVICE_ROUTINE ServiceRoutine,
  [in, optional] PVOID             ServiceContext,
  [in, optional] PKSPIN_LOCK       SpinLock,
  [in]           ULONG             Vector,
  [in]           KIRQL             Irql,
  [in]           KIRQL             SynchronizeIrql,
  [in]           KINTERRUPT_MODE   InterruptMode,
  [in]           BOOLEAN           ShareVector,
  [in]           KAFFINITY         ProcessorEnableMask,
  [in]           BOOLEAN           FloatingSave
);

Parâmetros

[out] InterruptObject

Ponteiro para o endereço do armazenamento fornecido pelo driver para um ponteiro para um conjunto de objetos de interrupção. Esse ponteiro deve ser passado em chamadas subsequentes para KeSynchronizeExecution.

[in] ServiceRoutine

Ponteiro para o ponto de entrada para a rotina InterruptService fornecida pelo driver.

[in, optional] ServiceContext

Ponteiro para o contexto determinado pelo driver que será fornecido à rotina InterruptService quando for chamado. A área ServiceContext deve estar na memória residente: na extensão do dispositivo de um objeto de dispositivo criado pelo driver, na extensão do controlador de um objeto controlador criado pelo driver ou no pool nãopagado alocado pelo driver do dispositivo. Consulte Fornecendo informações de contexto do ISR para obter detalhes.

[in, optional] SpinLock

Ponteiro para um bloqueio de rotação inicializado, para o qual o driver fornece o armazenamento, que será usado para sincronizar o acesso a dados determinados pelo driver compartilhados por outras rotinas de driver. Esse parâmetro será necessário se o ISR manipular mais de um vetor ou se o driver tiver mais de um ISR. Caso contrário, o driver não precisará alocar armazenamento para um bloqueio de rotação de interrupção e o ponteiro de entrada será NULL.

[in] Vector

Especifica o vetor de interrupção passado no recurso de interrupção no membro u.Interrupt.Vector do CM_PARTIAL_RESOURCE_DESCRIPTOR.

[in] Irql

Especifica o DIRQL passado no recurso de interrupção no membro u.Interrupt.Level do CM_PARTIAL_RESOURCE_DESCRIPTOR.

[in] SynchronizeIrql

Especifica o DIRQL no qual o ISR será executado. Se o ISR manipular mais de um vetor de interrupção ou o driver tiver mais de um ISR, esse valor deverá ser o mais alto dos valores irql passados em u.Interrupt.Level em cada recurso de interrupção. Caso contrário, os valores Irql e SynchronizeIrql são idênticos.

[in] InterruptMode

Especifica se a interrupção do dispositivo é LevelSensitive ou Latched.

[in] ShareVector

Especifica se o vetor de interrupção é compartilhável.

[in] ProcessorEnableMask

Especifica um valor KAFFINITY que representa o conjunto de processadores em que as interrupções de dispositivo podem ocorrer nessa plataforma. Esse valor é passado no recurso de interrupção em u.Interrupt.Affinity.

[in] FloatingSave

Especifica se a pilha de ponto flutuante deve ser salva quando o dispositivo do driver é interrompido. Para plataformas baseadas em x86 e itanium, esse valor deve ser definido como FALSE. Para obter mais informações sobre como salvar o ponto flutuante e o estado MMX, consulte Usando ponto flutuante ou MMX em um driver WDM.

Retornar valor

IoConnectInterrupt pode retornar um dos seguintes valores NTSTATUS:

STATUS_SUCCESS

STATUS_INVALID_PARAMETER: nenhum processador foi especificado.

STATUS_INSUFFICIENT_RESOURCES: não havia pool nãopagado suficiente.

Comentários

Novos drivers devem usar a rotina IoConnectInterruptEx , que é mais fácil de usar. Os drivers para dispositivos que dão suporte a MSI (interrupções sinalizadas por mensagem) devem usar IoConnectInterruptEx.

Um driver PnP deve chamar IoConnectInterrupt como parte da inicialização do dispositivo, antes de concluir a solicitação de IRP_MN_START_DEVICE PnP.

Quando um driver recebe uma solicitação IRP_MN_START_DEVICE , o driver recebe recursos de hardware brutos e traduzidos nos membros Parameters.StartDevice.AllocatedResources e Parameters.StartDevice.AllocatedResourcesTranslated da estrutura de IO_STACK_LOCATION do IRP, respectivamente. Para conectar sua interrupção, o driver usa os recursos em AllocatedResourcesTranslated.List.PartialResourceList.PartialDescriptors[]. O driver deve verificar a matriz de descritores parciais em busca de recursos do tipo CmResourceTypeInterrupt.

Se o driver fornecer o armazenamento para o SpinLock, ele deverá chamar KeInitializeSpinLock antes de passar seu bloqueio de rotação de interrupção para IoConnectInterrupt.

Ao retornar de uma chamada bem-sucedida para IoConnectInterrupt, o ISR do chamador poderá ser chamado se as interrupções estiverem habilitadas no dispositivo do driver ou se ShareVector tiver sido definido como TRUE. Os drivers não devem habilitar interrupções até que IoConnectInterrupt retorne.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows 2000.
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Regras de conformidade da DDI HwStorPortProhibitedDIs(storport), IrqlIoPassive2(wdm), PowerIrpDDis(wdm)

Confira também

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt

KeInitializeSpinLock

KeSynchronizeExecution