Share via


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( &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.
    }
}