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