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) |