Uso de IoConnectInterruptEx antes de Windows Vista
Un controlador para Windows 2000, Windows XP o Windows Server 2003 puede vincularse a la biblioteca Iointex.lib para usar IoConnectInterruptEx en esas versiones del sistema operativo.
Para usar IoConnectInterruptEx en este controlador, incluya Iointex.h en el código fuente del controlador, inmediatamente después de Wdm.h o Ntddk.h. El encabezado Iointex.h declara un prototipo para la rutina. Al compilar el controlador, asegúrese de que está vinculado estáticamente a Iointex.lib.
En el caso de los sistemas operativos anteriores a Windows Vista, la versión de IoConnectInterruptEx proporcionada por Iointex.lib solo admite la versión de CONNECT_FULLY_SPECIFIED de la rutina. Si se especifica alguna otra versión, la rutina devuelve un código de error NTSTATUS y establece Parameters-Version> en CONNECT_FULLY_SPECIFIED.
Con este comportamiento, puede escribir el controlador para que use CONNECT_LINE_BASED o CONNECT_MESSAGE_BASED en Windows Vista y CONNECT_FULLY_SPECIFIED en sistemas operativos anteriores. En primer lugar, llame a IoConnectInterruptEx con Parameters-Version> igual a CONNECT_LINE_BASED o CONNECT_MESSAGE_BASED. Si el valor devuelto es un código de error y Parameters-Version> != CONNECT_FULLY_SPECIFIED, vuelva a intentar la operación conParameters-Version> establecido en CONNECT_FULLY_SPECIFIED.
En el ejemplo de código siguiente se muestra la técnica :
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.
}
}