Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Um driver pode usar a versão CONNECT_FULLY_SPECIFIED do IoConnectInterruptEx para registrar uma rotina InterruptService para uma interrupção específica. Um driver pode usar a versão CONNECT_FULLY_SPECIFIED a partir do Windows Vista. Vinculando-se à biblioteca Iointex.lib, o driver pode usar a versão CONNECT_FULLY_SPECIFIED no Windows 2000, Windows XP e Windows Server 2003. Para obter mais informações, consulte Usando IoConnectInterruptEx antes do Windows Vista.
O driver especifica um valor de CONNECT_FULLY_SPECIFIED para Parameters->Version e usa os membros de Parameters->FullySpecified para especificar os outros parâmetros da operação:
Parameters-FullySpecified.PhysicalDeviceObject> especifica o DOP para o dispositivo que o ISR atende.
Parameters->FullySpecified.ServiceRoutine aponta para a rotina InterruptService, enquanto Parameters->FullySpecified.ServiceContext especifica o valor que o sistema passa como parâmetro ServiceContext para InterruptService. O driver pode usar isso para passar informações de contexto. Para obter mais informações sobre como passar informações de contexto, consulte Fornecendo informações de contexto ISR.
O driver fornece um ponteiro para uma variável PKINTERRUPT em Parameters->FullySpecified.InterruptObject. A rotina IoConnectInterruptEx define essa variável para apontar para o objeto de interrupção da interrupção, que pode ser usado ao remover o ISR.
Os drivers podem, opcionalmente, especificar um bloqueio de rotação em Parameters-FullySpecified.SpinLock> para o sistema usar ao sincronizar com o ISR. A maioria dos drivers pode simplesmente especificar NULL para permitir que o sistema aloque um spin lock em nome do driver. Para obter mais informações sobre a sincronização com um ISR, consulte Sincronizando o acesso aos dados do dispositivo.
O driver deve especificar as propriedades principais da interrupção noutros membros de Parameters->FullySpecified. O sistema fornece as informações necessárias na matriz de estruturas CM_PARTIAL_RESOURCE_DESCRIPTOR quando envia o IRP IRP_MN_START_DEVICE para o motorista.
O sistema fornece para cada interrupção uma estrutura CM_PARTIAL_RESOURCE_DESCRIPTOR com membro Type igual a CmResourceTypeInterrupt. Para uma interrupção sinalizada por mensagem, o bit de CM_RESOURCE_INTERRUPT_MESSAGE do membro Flags é ativado; senão, é desativado.
O membro u.Interrupt de CM_PARTIAL_RESOURCE_DESCRIPTOR contém a descrição de uma interrupção baseada em linha, enquanto o membro u.MessageInterrupt.Translated contém a descrição de uma interrupção sinalizada por mensagem. A tabela a seguir indica onde, na estrutura CM_PARTIAL_RESOURCE_DESCRIPTOR, encontrar as informações necessárias para definir os membros de Parameters>FullySpecified para ambos os tipos de interrupção. Para obter mais informações, consulte o exemplo de código que segue a tabela.
| Membro | Interrupção baseada em linha | Interrupção sinalizada por mensagem |
|---|---|---|
ShareVector |
ShareDisposition |
ShareDisposition |
Vetor |
u.Interrupt.Vetor |
u.MessageInterrupt.Translated.Vetor |
Irql |
u.Interrupt.Level |
u.MessageInterrupt.Translated.Level |
InterruptMode |
Bandeiras & CM_RESOURCE_INTERRUPT_LATCHED |
|
ProcessorEnableMask |
u.Interrupt.Affinity |
u.MessageInterrupt.Translated.Affinity |
Um driver só receberá estruturas CM_PARTIAL_RESOURCE_DESCRIPTOR para interrupções sinalizadas por mensagem no Windows Vista e versões posteriores do Windows.
O exemplo de código a seguir demonstra como registrar uma rotina InterruptService usando CONNECT_FULLY_SPECIFIED.
IO_CONNECT_INTERRUPT_PARAMETERS params;
// deviceExtension is a pointer to the driver's device extension.
// deviceExtension->IntObj is a PKINTERRUPT.
// deviceInterruptService is a pointer to the driver's InterruptService routine.
// IntResource is a CM_PARTIAL_RESOURCE_DESCRIPTOR structure of either type CmResourceTypeInterrupt or CmResourceTypeMessageInterrupt.
// PhysicalDeviceObject is a pointer to the device's PDO.
// ServiceContext is a pointer to driver-specified context for the ISR.
RtlZeroMemory( ¶ms, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_FULLY_SPECIFIED;
params.FullySpecified.PhysicalDeviceObject = PhysicalDeviceObject;
params.FullySpecified.InterruptObject = &devExt->IntObj;
params.FullySpecified.ServiceRoutine = deviceInterruptService;
params.FullySpecified.ServiceContext = ServiceContext;
params.FullySpecified.FloatingSave = FALSE;
params.FullySpecified.SpinLock = NULL;
if (IntResource->Flags & CM_RESOURCE_INTERRUPT_MESSAGE) {
// The resource is for a message-signaled interrupt. Use the u.MessageInterrupt.Translated member of IntResource.
params.FullySpecified.Vector = IntResource->u.MessageInterrupt.Translated.Vector;
params.FullySpecified.Irql = (KIRQL)IntResource->u.MessageInterrupt.Translated.Level;
params.FullySpecified.SynchronizeIrql = (KIRQL)IntResource->u.MessageInterrupt.Translated.Level;
params.FullySpecified.ProcessorEnableMask = IntResource->u.MessageInterrupt.Translated.Affinity;
} else {
// The resource is for a line-based interrupt. Use the u.Interrupt member of IntResource.
params.FullySpecified.Vector = IntResource->u.Interrupt.Vector;
params.FullySpecified.Irql = (KIRQL)IntResource->u.Interrupt.Level;
params.FullySpecified.SynchronizeIrql = (KIRQL)IntResource->u.Interrupt.Level;
params.FullySpecified.ProcessorEnableMask = IntResource->u.Interrupt.Affinity;
}
params.FullySpecified.InterruptMode = (IntResource->Flags & CM_RESOURCE_INTERRUPT_LATCHED ? Latched : LevelSensitive);
params.FullySpecified.ShareVector = (BOOLEAN)(IntResource->ShareDisposition == CmResourceShareShared);
status = IoConnectInterruptEx(¶ms);
if (!NT_SUCCESS(status)) {
...
}