Condividi tramite


Uso di IoConnectInterruptEx prima di Windows Vista

Un driver per Windows 2000, Windows XP o Windows Server 2003 può collegarsi alla libreria Iointex.lib per usare IoConnectInterruptEx in tali versioni del sistema operativo.

Per usare IoConnectInterruptEx in un driver di questo tipo, includere Iointex.h nel codice sorgente del driver, immediatamente dopo Wdm.h o Ntddk.h. L'intestazione Iointex.h dichiara un prototipo per la routine. Quando si compila il driver, assicurarsi che sia collegato in modo statico a Iointex.lib.

Per i sistemi operativi precedenti a Windows Vista, la versione di IoConnectInterruptEx fornita da Iointex.lib supporta solo la versione CONNECT_FULLY_SPECIFIED della routine. Se viene specificata un'altra versione, la routine restituisce un codice di errore NTSTATUS e imposta Parameters-Version> su CONNECT_FULLY_SPECIFIED.

Usando questo comportamento, è possibile scrivere il driver in modo che usi CONNECT_LINE_BASED o CONNECT_MESSAGE_BASED in Windows Vista e CONNECT_FULLY_SPECIFIED nei sistemi operativi precedenti. Chiamare prima IoConnectInterruptEx con Parameters-Version> uguale a CONNECT_LINE_BASED o CONNECT_MESSAGE_BASED. Se il valore restituito è un codice di errore e Parameters-Version> != CONNECT_FULLY_SPECIFIED, ripetere l'operazione conParameters-Version> impostato su CONNECT_FULLY_SPECIFIED.

L'esempio di codice seguente illustra la tecnica :

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