Sdílet prostřednictvím


Použití IoConnectInterruptEx před Windows Vista

Ovladač pro systém Windows 2000, Windows XP nebo Windows Server 2003 může propojit s knihovnou Iointex.lib, aby používal IoConnectInterruptEx v těchto verzích operačního systému.

Pokud chcete použít IoConnectInterruptEx v takovém ovladači, zahrňte Iointex.h do zdrojového kódu pro váš ovladač bezprostředně za Wdm.h nebo Ntddk.h. Hlavička Iointex.h deklaruje prototyp rutiny. Při sestavování ovladače se ujistěte, že je staticky propojený se službou Iointex.lib.

V případě operačních systémů starších než Windows Vista podporuje verze IoConnectInterruptEx poskytovaná službou Iointex.lib pouze CONNECT_FULLY_SPECIFIED verzi rutiny. Pokud je zadána jakákoli jiná verze, rutina vrátí kód chyby NTSTATUS a nastaví Parametry–>verze na CONNECT_FULLY_SPECIFIED.

Pomocí tohoto chování můžete napsat ovladač tak, aby používal CONNECT_LINE_BASED nebo CONNECT_MESSAGE_BASED v systému Windows Vista a CONNECT_FULLY_SPECIFIED v dřívějších operačních systémech. První volání IoConnectInterruptEx s parametry –>verze rovna CONNECT_LINE_BASED nebo CONNECT_MESSAGE_BASED. Pokud je návratová hodnota kód chyby a parametry–>verze != CONNECT_FULLY_SPECIFIED, zkuste operaci zopakovat pomocí parametry–> verze nastavenou na CONNECT_FULLY_SPECIFIED.

Následující příklad kódu znázorňuje techniku:

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