Compartilhar via


Função IoConnectInterrupt (wdm.h)

A rotina IoConnectInterrupt registra a rotina de InterruptService (ISR) de um driver de dispositivo, de modo que ele será 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 da rotina de InterruptService fornecida pelo driver.

[in, optional] ServiceContext

Ponteiro para o contexto determinado pelo driver que será fornecido à rotina de InterruptService quando ele 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 de 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 aos 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 precisa alocar armazenamento para um bloqueio de rotação de interrupção e o ponteiro de entrada é 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 de Irql passados em u.Interrupt.Level em cada recurso de interrupção. Caso contrário, os valores de Irql e SynchronizeIrql são idênticos.

[in] InterruptMode

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

[in] ShareVector

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

[in] ProcessorEnableMask

Especifica um valor KAFFINITY que representa o conjunto de processadores em que as interrupções de dispositivo podem ocorrer nesta 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 umde Driver do WDM.

Valor de retorno

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.

Observações

Os novos drivers devem usar a rotina de 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 Parameters.StartDevice.AllocatedResources e Parameters.StartDevice.AllocatedResourcesTranslated membros 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 o 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 do ShareVector tiver sido definido como TRUE. Os drivers não devem habilitar interrupções até que IoConnectInterrupt retorne.

Requisitos

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

Consulte também

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt

KeInitializeSpinLock

KeSynchronizeExecution