Compartilhar via


Usando IoConnectInterruptEx antes do Windows Vista

Um driver para Windows 2000, Windows XP ou Windows Server 2003 pode vincular à biblioteca Iointex.lib para usar IoConnectInterruptEx nessas versões do sistema operacional.

Para usar IoConnectInterruptEx nesse driver, inclua Iointex.h no código-fonte do driver, imediatamente após Wdm.h ou Ntddk.h. O cabeçalho Iointex.h declara um protótipo para a rotina. Ao criar o driver, verifique se ele está vinculado estaticamente ao Iointex.lib.

Para sistemas operacionais anteriores ao Windows Vista, a versão do IoConnectInterruptEx fornecida pelo Iointex.lib dá suporte apenas à versão CONNECT_FULLY_SPECIFIED da rotina. Se qualquer outra versão for especificada, a rotina retornará um código de erro NTSTATUS e definirá Parameters-Version> como CONNECT_FULLY_SPECIFIED.

Usando esse comportamento, você pode escrever seu driver para que ele use CONNECT_LINE_BASED ou CONNECT_MESSAGE_BASED no Windows Vista e CONNECT_FULLY_SPECIFIED em sistemas operacionais anteriores. Primeiro, chame IoConnectInterruptEx com Parameters-Version> igual a CONNECT_LINE_BASED ou CONNECT_MESSAGE_BASED. Se o valor retornado for um código de erro e Parameters-Version> != CONNECT_FULLY_SPECIFIED, repita a operação comParameters-Version> definido como CONNECT_FULLY_SPECIFIED.

O exemplo de código a seguir ilustra a técnica:

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