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( ¶ms, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;
// Set members of params.MessageBased here.
status = IoConnectInterruptEx(¶ms);
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(¶ms);
} else {
// Other error.
}
}