Использование 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( ¶ms, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;
// Set members of params.MessageBased here.
status = IoConnectInterruptEx(¶ms);
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(¶ms);
} else {
// Other error.
}
}