Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W przypadku systemów operacyjnych Windows Vista i nowszych sterownik może użyć wersji CONNECT_MESSAGE_BASED funkcji IoConnectInterruptEx do zarejestrowania ISR dla przerwań sygnalizowanych komunikatami. Sterownik określa wartość CONNECT_MESSAGE_BASED dla Parameters->Version, i używa elementów członkowskich Parameters->MessageBased do określenia innych parametrów operacji.
Parametry->MessageBased.PhysicalDeviceObject określa PDO dla urządzenia, który obsługuje ISR. System używa obiektu urządzenia do automatycznego identyfikowania przerwań sygnalizatora komunikatów urządzenia.
Parametry->MessageBased.MessageServiceRoutine wskazuje na procedurę InterruptMessageService, podczas gdy Parametry->MessageBased.ServiceContext określają wartość, którą system przekazuje jako parametr ServiceContext do procedury InterruptMessageService. Sterownik może użyć go do przekazywania informacji kontekstowych. Aby uzyskać więcej informacji na temat przekazywania informacji kontekstowych, zobacz Zapewnianie informacji kontekstowych ISR.
Sterownik może również określić rezerwową procedurę InterruptMessageService w Parameters->MessageBased.FallBackServiceRoutine. Jeśli urządzenie ma przerwania oparte na wierszu, ale nie ma żadnych przerwań sygnalizatora komunikatów, system zarejestruje procedurę InterruptMessageService w celu obsługi przerwań opartych na wierszu. W tym przypadku system przekazuje Parameters->MessageBased.ServiceContext jako parametr ServiceContext do InterruptService. IoConnectInterruptEx aktualizuje Parameters->Version na CONNECT_LINE_BASED, jeśli zarejestrowano procedurę awaryjną.
Parameters-> wskazuje zmienną, która odbiera wskaźnik do struktury IO_INTERRUPT_MESSAGE_INFO (dla InterruptMessageService) lub struktury KINTERRUPT (dla InterruptService). Sterownik może użyć odebranego wskaźnika, aby usunąć isr. Aby uzyskać więcej informacji, zobacz Usuwanie ISR.
Sterowniki mogą opcjonalnie określić blokadę spinową w Parametrach->MessageBased.SpinLock, aby system używał jej podczas synchronizacji z procedurą obsługi przerwań (ISR). Większość sterowników może po prostu określić NULL, aby umożliwić systemowi przydzielenie blokady spinowej w imieniu sterownika. Aby uzyskać więcej informacji na temat synchronizowania z isR, zobacz Synchronizowanie dostępu do danych urządzenia.
W poniższym przykładzie kodu pokazano, jak zarejestrować procedurę InterruptMessageService przy użyciu CONNECT_MESSAGE_BASED.
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( ¶ms, 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(¶ms);
if (NT_SUCCESS(status)) {
// We record the type of ISR registered.
devExt->IsrType = params.Version;
} else {
// Operation failed. Handle error.
...
}