IoConnectInterruptEx의 CONNECT_LINE_BASED 버전 사용
Windows Vista 이상 운영 체제의 경우 드라이버는 CONNECT_LINE_BASED 버전의 IoConnectInterruptEx 를 사용하여 드라이버의 라인 기반 인터럽트에 대한 InterruptService 루틴을 등록할 수 있습니다. (이전 운영 체제용 드라이버는 CONNECT_FULLY_SPECIFIED 버전의 IoConnectInterruptEx를 사용할 수 있습니다.)
참고 이 메서드는 모든 줄 기반 인터럽트에서 단일 ISR(인터럽트 서비스 루틴)을 등록하는 드라이버에만 사용할 수 있습니다. 드라이버가 여러 인터럽트를 받을 수 있는 경우 CONNECT_FULLY_SPECIFIED 버전의 IoConnectInterruptEx를 사용해야 합니다.
드라이버는 Parameters-Version에 대한 CONNECT_LINE_BASED 값을 지정하고Parameters-LineBased>>의 멤버를 사용하여 작업의 다른 매개 변수를 지정합니다.
Parameters-LineBased.PhysicalDeviceObject는 ISR이 서비스하는 디바이스에 대한 PDO(물리적 디바이스 개체)를 지정합니다.> 시스템은 디바이스 개체를 사용하여 디바이스의 줄 기반 인터럽트 를 자동으로 식별합니다.
Parameters-LineBased.ServiceRoutine> 은 InterruptService 루틴을 가리키고 Parameters-LineBased>는 가리킵니다. ServiceContext는 시스템이 InterruptService에 ServiceContext 매개 변수로 전달하는 값을 지정합니다. 드라이버는 이를 사용하여 컨텍스트 정보를 전달할 수 있습니다. 컨텍스트 정보를 전달하는 방법에 대한 자세한 내용은 ISR 컨텍스트 정보 제공을 참조하세요.
드라이버는 Parameters-LineBased.InterruptObject>에서 PKINTERRUPT 변수에 대한 포인터를 제공합니다. IoConnectInterruptEx 는 ISR을 제거할 때 사용할 수 있는 인터럽트의 인터럽트 개체를 가리키도록 이 변수를 설정합니다. 자세한 내용은 ISR 제거를 참조하세요.
드라이버는 필요에 따라 ISR과 동기화할 때 사용할 시스템의 Parameters-LineBased.SpinLock>에서 스핀 잠금을 지정할 수 있습니다. 대부분의 드라이버는 시스템이 드라이버를 대신하여 스핀 잠금을 할당할 수 있도록 NULL 을 지정할 수 있습니다. ISR과 동기화하는 방법에 대한 자세한 내용은 디바이스 데이터에 대한 액세스 동기화를 참조하세요.
다음 코드 예제에서는 CONNECT_LINE_BASED 사용하여 InterruptService 루틴을 등록하는 방법을 보여 줍니다.
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.
// 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_LINE_BASED;
params.LineBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.LineBased.InterruptObject = &deviceExtension->IntObj;
params.LineBased.ServiceRoutine = deviceInterruptService;
params.LineBased.ServiceContext = ServiceContext;
params.LineBased.SpinLock = NULL;
params.LineBased.SynchronizeIrql = 0;
params.LineBased.FloatingSave = FALSE;
status = IoConnectInterruptEx(¶ms);
if (!NT_SUCCESS(status)) {
// Operation failed. Handle error.
...
}