Windows Vista 이전의 IoConnectInterruptEx 사용

Windows 2000, Windows XP 또는 Windows Server 2003용 드라이버는 Iointex.lib 라이브러리에 연결하여 해당 버전의 운영 체제에서 IoConnectInterruptEx 를 사용할 수 있습니다.

이러한 드라이버에서 IoConnectInterruptEx 를 사용하려면 Wdm.h 또는 Ntddk.h 바로 다음에 드라이버의 소스 코드에 Iointex.h를 포함합니다. Iointex.h 헤더는 루틴에 대한 프로토타입을 선언합니다. 드라이버를 빌드할 때 Iointex.lib에 정적으로 연결되어 있는지 확인합니다.

Windows Vista 이전 운영 체제의 경우 Iointex.lib에서 제공하는 IoConnectInterruptEx 버전은 루틴의 CONNECT_FULLY_SPECIFIED 버전만 지원합니다. 다른 버전이 지정된 경우 루틴은 NTSTATUS 오류 코드를 반환하고 Parameters-Version>을 CONNECT_FULLY_SPECIFIED 설정합니다.

이 동작을 사용하여 Windows Vista에서 CONNECT_LINE_BASED 또는 CONNECT_MESSAGE_BASED 사용하고 이전 운영 체제에서 CONNECT_FULLY_SPECIFIED 드라이버를 작성할 수 있습니다. 매개 변수 버전> CONNECT_LINE_BASED 또는 CONNECT_MESSAGE_BASED 동일한 IoConnectInterruptEx를 먼저 호출합니다. 반환 값이 오류 코드이고 Parameters-Version> != CONNECT_FULLY_SPECIFIED 경우parameters-Version>이 CONNECT_FULLY_SPECIFIED 설정하여 작업을 다시 시도합니다.

다음 코드 예제에서는 기술을 보여 줍니다.

IO_CONNECT_INTERRUPT_PARAMETERS params;

// deviceExtension is a pointer to the driver's device extension. 
//     deviceExtension->MessageUsed is a BOOLEAN.

RtlZeroMemory( &params, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;

// Set members of params.MessageBased here.

status = IoConnectInterruptEx(&params);

if ( NT_SUCCESS(status) ) {
    // Operation succeeded. We are running on Windows Vista.
    devExt->MessageUsed = TRUE; // We save this for posterity.
} else {
    // Check to see if we are running on an operating system prior to Windows Vista.
    if (params.Version == CONNECT_FULLY_SPECIFIED) {
        devExt->MessageUsed = FALSE;  // We're not using message-signaled interrupts.
 
        // Set members of params.FullySpecified here.
 
        status = IoConnectInterruptEx(&params);
    } else {
        // Other error.
    }
}