Поделиться через


Использование IoConnectInterruptEx до Windows Vista

Драйвер для Windows 2000, Windows XP или Windows Server 2003 может связаться с библиотекой Iointex.lib, чтобы использовать IoConnectInterruptEx в этих версиях операционной системы.

Чтобы использовать IoConnectInterruptEx в таком драйвере, включите Iointex.h в исходный код драйвера сразу после Wdm.h или Ntddk.h. Заголовок Iointex.h объявляет прототип для подпрограммы. При сборке драйвера убедитесь, что он статически связан с Iointex.lib.

Для операционных систем до Windows Vista версия IoConnectInterruptEx , предоставляемая Iointex.lib, поддерживает только CONNECT_FULLY_SPECIFIED версию подпрограммы. Если указана другая версия, подпрограмма возвращает код ошибки NTSTATUS и задает параметру Parameters-Version> значение CONNECT_FULLY_SPECIFIED.

Используя это поведение, вы можете написать драйвер, чтобы он использовал CONNECT_LINE_BASED или CONNECT_MESSAGE_BASED в Windows Vista и CONNECT_FULLY_SPECIFIED в более ранних операционных системах. Сначала вызовите IoConnectInterruptEx с параметром Parameters-Version>, равным CONNECT_LINE_BASED или CONNECT_MESSAGE_BASED. Если возвращаемое значение является кодом ошибки и Parameters-Version> != CONNECT_FULLY_SPECIFIED, повторите операцию с параметромParameters-Version> CONNECT_FULLY_SPECIFIED.

Следующий пример кода иллюстрирует этот метод:

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