Condividi tramite


Inizializzazione di una destinazione di I/O generale

Il framework inizializza la destinazione di I/O locale di un driver per un dispositivo quando il driver chiama WdfDeviceCreate. Per recuperare un handle nella destinazione di I/O locale di un dispositivo, il driver chiama WdfDeviceGetIoTarget.

La maggior parte dei driver invia richieste solo alla destinazione di I/O locale.

Per inizializzare una destinazione di I/O remota per un dispositivo, il driver deve:

  1. Chiamare WdfIoTargetCreate per creare un oggetto di destinazione I/O.

  2. Chiamare WdfIoTargetOpen per aprire una destinazione di I/O in modo che il driver possa inviare richieste.

Quando il driver chiama WdfIoTargetOpen, in genere identifica la destinazione di I/O remota fornendo una stringa Unicode che rappresenta un nome dell'oggetto. Questo nome può identificare un dispositivo, un file o un'interfaccia del dispositivo. Il framework invia richieste di I/O all'inizio dello stack di driver che supporta il nome dell'oggetto.

Raramente, un driver potrebbe identificare una destinazione di I/O remota fornendo un puntatore a una struttura WDM (Windows Driver Model DEVICE_OBJECT ). Questo puntatore identifica un driver diverso nello stack del driver chiamante. I driver basati su framework usano raramente questa tecnica perché raramente hanno accesso alle strutture DEVICE_OBJECT di altri driver.

Nell'esempio seguente viene illustrato come il driver di esempio Ndisedge usa la tecnica precedente per creare e aprire una destinazione di I/O remota:

status = WdfIoTargetCreate(Adapter->WdfDevice,
                        WDF_NO_OBJECT_ATTRIBUTES,
                        &Adapter->IoTarget);
    if (!NT_SUCCESS(status)) {
        DEBUGP(MP_ERROR, ("WdfIoTargetCreate failed 0x%x\n",
               status));
        return status;
    }

    WDF_IO_TARGET_OPEN_PARAMS_INIT_CREATE_BY_NAME(&openParams,
                                &fileName,
                                STANDARD_RIGHTS_ALL
                                );

    status = WdfIoTargetOpen(Adapter->IoTarget,
                        &openParams);
    if (!NT_SUCCESS(status)) {
        DEBUGP(MP_ERROR, ("WdfIoTargetOpen failed 0x%x\n", status));
        return status;
    }