Partager via


Initialisation d’une cible d’E/S générale

L’infrastructure initialise la cible d’E/S locale d’un pilote pour un appareil lorsque le pilote appelle WdfDeviceCreate. Pour récupérer un handle sur la cible d’E/S locale d’un appareil, le pilote appelle WdfDeviceGetIoTarget.

La plupart des pilotes envoient des requêtes uniquement à leur cible d’E/S locale.

Pour initialiser une cible d’E/S distante pour un appareil, le pilote doit :

  1. Appelez WdfIoTargetCreate pour créer un objet cible d’E/S.

  2. Appelez WdfIoTargetOpen pour ouvrir une cible d’E/S afin que le pilote puisse lui envoyer des requêtes.

Lorsque le pilote appelle WdfIoTargetOpen, il identifie généralement la cible d’E/S distante en fournissant une chaîne Unicode qui représente un nom d’objet. Ce nom peut identifier un appareil, un fichier ou une interface d’appareil. L’infrastructure envoie les demandes d’E/S en haut de la pile de pilotes qui prend en charge le nom de l’objet.

Rarement, un pilote peut identifier une cible d’E/S distante en fournissant un pointeur vers une structure DEVICE_OBJECT modèle de pilote Windows (WDM). Ce pointeur identifie un autre pilote dans la pile du pilote appelant. Les pilotes basés sur l’infrastructure utilisent rarement cette technique, car ils ont rarement accès aux structures DEVICE_OBJECT d’autres pilotes.

L’exemple suivant montre comment l’exemple de pilote Ndisedge utilise la technique ci-dessus pour créer et ouvrir une cible d’E/S distante :

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