Aracılığıyla paylaş


IoConnectInterruptEx'in CONNECT_MESSAGE_BASED Sürümünü Kullanma

Windows Vista ve sonraki işletim sistemlerinde bir sürücü, sürücünün ileti sinyalli kesmeleri için bir ISR kaydetmek üzere IoConnectInterruptEx'in CONNECT_MESSAGE_BASED sürümünü kullanabilir. Sürücü, Parameters->Version için CONNECT_MESSAGE_BASED değerini belirtir ve işlemin diğer parametrelerini belirtmek için Parameters->MessageBased üyelerini kullanır.

  • Parameters-MessageBased.PhysicalDeviceObject>, ISR'nin hizmet verdiği cihazın Fiziksel Aygıt Nesnesi'ni (PDO) belirtir. Sistem, cihazın ileti sinyalli kesmelerini otomatik olarak tanımlamak için cihaz nesnesini kullanır.

  • Parameters->MessageBased.MessageServiceRoutine, InterruptMessageService rutinini işaret ederken, Parameters->MessageBased.ServiceContext, sistemin InterruptMessageService'e ServiceContext parametresi olarak ilettiği değeri belirtir. Sürücü bağlam bilgilerini geçirmek için bunu kullanabilir. Bağlam bilgilerini geçirme hakkında daha fazla bilgi için bkz. ISR Bağlam Bilgilerini Sağlama.

  • Sürücü, Parameters->MessageBased.FallBackServiceRoutine içinde bir geri dönüş InterruptMessageService yordamı da belirtebilir. Cihazda satır tabanlı kesmeler varsa ancak ileti sinyalli kesme yoksa, sistem bunun yerine satır tabanlı kesmelere hizmet vermek için InterruptMessageService yordamını kaydeder. Bu durumda sistem, Parameters-MessageBased.ServiceContext> parametresini ServiceContext parametresi olarak InterruptService'e geçirir. IoConnectInterruptEx, geri dönüş yordamını kaydettiyse Parameters->Version'ı CONNECT_LINE_BASED olarak güncelleştirir.

  • Parameters-MessageBased.ConnectionContext>, bir IO_INTERRUPT_MESSAGE_INFO (InterruptMessageService için) yapısına veya KINTERRUPT yapısına (InterruptService için) işaretçi alan bir değişkene işaret eder. Sürücü, ISR'yi kaldırmak için alınan işaretçiyi kullanabilir. Daha fazla bilgi için bkz. ISR'yi kaldırma.

  • Sürücüler isteğe bağlı olarak, ISR ile eşitlenirken kullanılacak sistem için Parameters-MessageBased.SpinLock> içinde bir döndürme kilidi belirtebilir. Sürücülerin çoğu, sistemin sürücü adına bir döndürme kilidi ayırmasını sağlamak için NULL belirtebilir. ISR ile eşitleme hakkında daha fazla bilgi için bkz. Cihaz Verilerine Erişimi Eşitleme.

Aşağıdaki kod örneğinde, CONNECT_MESSAGE_BASED kullanarak bir InterruptMessageService yordamının nasıl kaydedildiği gösterilmektedir.

IO_CONNECT_INTERRUPT_PARAMETERS params;

// deviceExtension is a pointer to the driver's device extension. 
//     deviceExtension->IntInfo is a PVOID.
//     deviceExtension->IntType is a ULONG.
// deviceInterruptService is a pointer to the driver's InterruptService routine.
// deviceInterruptMessageService is a pointer to the driver's InterruptMessageService routine.
// PhysicalDeviceObject is a pointer to the device's PDO. 
// ServiceContext is a pointer to driver-specified context for the ISR.

RtlZeroMemory( &params, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;
params.MessageBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.MessageBased.MessageServiceRoutine = deviceInterruptMessageService;
params.MessageBased.ServiceContext = ServiceContext;
params.MessageBased.SpinLock = NULL;
params.MessageBased.SynchronizeIrql = 0;
params.MessageBased.FloatingSave = FALSE;
params.MessageBased.FallBackServiceRoutine = deviceInterruptService;

status = IoConnectInterruptEx(&params);

if (NT_SUCCESS(status)) {
    // We record the type of ISR registered.
    devExt->IsrType = params.Version;
} else {
    // Operation failed. Handle error.
    ...
}