다음을 통해 공유


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는 시스템이 InterruptServiceServiceContext 매개 변수로 전달하는 값을 지정합니다. 드라이버는 이를 사용하여 컨텍스트 정보를 전달할 수 있습니다. 컨텍스트 정보를 전달하는 방법에 대한 자세한 내용은 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( &params, 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(&params);

if (!NT_SUCCESS(status)) {
    // Operation failed. Handle error.
    ...
}