Verwenden von IoConnectInterruptEx vor Windows Vista

Ein Treiber für Windows 2000, Windows XP oder Windows Server 2003 kann mit der Bibliothek Iointex.lib verknüpft werden, um IoConnectInterruptEx unter diesen Versionen des Betriebssystems zu verwenden.

Um IoConnectInterruptEx in einem solchen Treiber zu verwenden, fügen Sie Iointex.h in den Quellcode ihres Treibers ein, und folgen Sie direkt wdm.h oder Ntddk.h. Der Iointex.h-Header deklariert einen Prototyp für die Routine. Stellen Sie beim Erstellen des Treibers sicher, dass er statisch mit Iointex.lib verknüpft ist.

Bei Betriebssystemen vor Windows Vista unterstützt die von Iointex.lib bereitgestellte Version von IoConnectInterruptEx nur die CONNECT_FULLY_SPECIFIED Version der Routine. Wenn eine andere Version angegeben wird, gibt die Routine einen NTSTATUS-Fehlercode zurück und legt Parameters-Version> auf CONNECT_FULLY_SPECIFIED fest.

Mit diesem Verhalten können Sie Ihren Treiber so schreiben, dass er CONNECT_LINE_BASED oder CONNECT_MESSAGE_BASED unter Windows Vista und CONNECT_FULLY_SPECIFIED unter früheren Betriebssystemen verwendet. Rufen Sie zuerst IoConnectInterruptEx mit Parameters-Version> auf, die gleich CONNECT_LINE_BASED oder CONNECT_MESSAGE_BASED ist. Wenn der Rückgabewert ein Fehlercode ist und Parameters-Version> != CONNECT_FULLY_SPECIFIED, wiederholen Sie den Vorgang, wobeiParameters-Version> auf CONNECT_FULLY_SPECIFIED festgelegt ist.

Das folgende Codebeispiel veranschaulicht die Technik:

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