Partager via


Utilisation d’IoConnectInterruptEx avant Windows Vista

Un pilote pour Windows 2000, Windows XP ou Windows Server 2003 peut être lié à la bibliothèque Iointex.lib pour utiliser IoConnectInterruptEx sur ces versions du système d’exploitation.

Pour utiliser IoConnectInterruptEx dans un tel pilote, incluez Iointex.h dans le code source de votre pilote, immédiatement après Wdm.h ou Ntddk.h. L’en-tête Iointex.h déclare un prototype pour la routine. Lorsque vous générez votre pilote, assurez-vous qu’il est lié statiquement à Iointex.lib.

Pour les systèmes d’exploitation antérieurs à Windows Vista, la version d’IoConnectInterruptEx fournie par Iointex.lib prend uniquement en charge la version CONNECT_FULLY_SPECIFIED de la routine. Si une autre version est spécifiée, la routine retourne un code d’erreur NTSTATUS et définit Parameters-Version> sur CONNECT_FULLY_SPECIFIED.

À l’aide de ce comportement, vous pouvez écrire votre pilote afin qu’il utilise CONNECT_LINE_BASED ou CONNECT_MESSAGE_BASED sur Windows Vista et CONNECT_FULLY_SPECIFIED sur des systèmes d’exploitation antérieurs. Appelez d’abord IoConnectInterruptEx avec Parameters-Version> égale à CONNECT_LINE_BASED ou CONNECT_MESSAGE_BASED. Si la valeur de retour est un code d’erreur et que Parameters-Version> != CONNECT_FULLY_SPECIFIED, réessayez l’opération avecParameters-Version> défini sur CONNECT_FULLY_SPECIFIED.

L’exemple de code suivant illustre la technique :

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