IoConnectInterruptEx의 CONNECT_MESSAGE_BASED 버전 사용
Windows Vista 이상 운영 체제의 경우 드라이버는 CONNECT_MESSAGE_BASED 버전의 IoConnectInterruptEx 를 사용하여 드라이버의 메시지 신호 인터럽트에 대한 ISR을 등록할 수 있습니다. 드라이버는 Parameters-Version에 대한 CONNECT_MESSAGE_BASED 값을 지정하고 Parameters-MessageBased>>의 멤버를 사용하여 작업의 다른 매개 변수를 지정합니다.
Parameters-MessageBased.PhysicalDeviceObject>는 ISR이 서비스하는 디바이스에 대한 PDO를 지정합니다. 시스템은 디바이스 개체를 사용하여 디바이스의 메시지 신호 인터럽트 를 자동으로 식별합니다.
Parameters-MessageBased.MessageServiceRoutine>은 InterruptMessageService 루틴을 가리키고 Parameters-MessageBased.ServiceContext>는 시스템이 InterruptMessageService에 ServiceContext 매개 변수로 전달하는 값을 지정합니다. 드라이버는 이를 사용하여 컨텍스트 정보를 전달할 수 있습니다. 컨텍스트 정보를 전달하는 방법에 대한 자세한 내용은 ISR 컨텍스트 정보 제공을 참조하세요.
드라이버는 Parameters-MessageBased.FallBackServiceRoutine>에서 대체 인터럽트MessageService 루틴을 지정할 수도 있습니다. 디바이스에 줄 기반 인터럽트는 있지만 메시지 신호 인터럽트는 없는 경우 시스템은 대신 InterruptMessageService 루틴을 등록하여 라인 기반 인터럽트 서비스를 제공합니다. 이 경우 시스템은 Parameters-MessageBased.ServiceContext>를 ServiceContext 매개 변수 로 InterruptService에 전달합니다. IoConnectInterruptEx는 대체 루틴을 등록한 경우 parameters-Version>을 CONNECT_LINE_BASED 업데이트합니다.
Parameters-MessageBased.ConnectionContext>는 IO_INTERRUPT_MESSAGE_INFO(InterruptMessageService의 경우) 구조체 또는 KINTERRUPT 구조체(InterruptService의 경우)에 대한 포인터를 수신하는 변수를 가리킵니다. 드라이버는 수신된 포인터를 사용하여 ISR을 제거할 수 있습니다. 자세한 내용은 ISR 제거를 참조하세요.
드라이버는 필요에 따라 ISR과 동기화할 때 사용할 시스템의 Parameters-MessageBased.SpinLock>에서 스핀 잠금을 지정할 수 있습니다. 대부분의 드라이버는 시스템이 드라이버를 대신하여 스핀 잠금을 할당할 수 있도록 NULL 을 지정할 수 있습니다. ISR과 동기화하는 방법에 대한 자세한 내용은 디바이스 데이터에 대한 액세스 동기화를 참조하세요.
다음 코드 예제에서는 CONNECT_MESSAGE_BASED 사용하여 InterruptMessageService 루틴을 등록하는 방법을 보여 줍니다.
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.
...
}