Partager via


WdfRequestRetrieveInputBuffer, fonction (wdfrequest.h)

[S’applique à KMDF et UMDF]

La méthode WdfRequestRetrieveInputBuffer récupère la mémoire tampon d’entrée d’une requête d’E/S.

Syntaxe

NTSTATUS WdfRequestRetrieveInputBuffer(
  [in]            WDFREQUEST Request,
                  size_t     MinimumRequiredLength,
  [out]           PVOID      *Buffer,
  [out, optional] size_t     *Length
);

Paramètres

[in] Request

Handle d’un objet de requête d’infrastructure.

MinimumRequiredLength

Taille de mémoire tampon minimale, en octets, dont le pilote a besoin pour traiter la demande d’E/S.

[out] Buffer

Pointeur vers un emplacement qui reçoit l’adresse de la mémoire tampon.

[out, optional] Length

Pointeur vers un emplacement qui reçoit la taille de la mémoire tampon, en octets. Ce paramètre est facultatif et peut être NULL.

Valeur retournée

WdfRequestRetrieveInputBuffer retourne STATUS_SUCCESS si l’opération réussit. Sinon, cette méthode peut retourner l’une des valeurs suivantes :

Code de retour Description
STATUS_INVALID_PARAMETER
Un paramètre d’entrée n’est pas valide.
STATUS_BUFFER_TOO_SMALL
La longueur de la mémoire tampon d’entrée est égale à zéro, ou le paramètre MinimumRequiredSize spécifie une taille de mémoire tampon supérieure à la taille réelle de la mémoire tampon.
STATUS_INVALID_DEVICE_REQUEST
Le type de requête n’est pas valide ou la demande n’utilise ni e/S en mémoire tampon ni directe. Pour plus d’informations sur les méthodes prises en charge pour accéder aux mémoires tampons de données, consultez la section Remarques suivante.
STATUS_INTERNAL_ERROR
La demande a déjà été effectuée.
STATUS_INSUFFICIENT_RESOURCES
La mémoire est insuffisante.
 

Cette méthode peut également retourner d’autres valeurs NTSTATUS.

Un bogue case activée se produit si le pilote fournit un handle d’objet non valide.

Remarques

La mémoire tampon d’entrée d’une requête contient des informations, telles que les données à écrire sur un disque, qui ont été fournies par l’initiateur de la demande. Votre pilote peut appeler WdfRequestRetrieveInputBuffer pour obtenir la mémoire tampon d’entrée pour une demande d’écriture ou une demande de contrôle d’E/S d’appareil, mais pas pour une demande de lecture (car les demandes de lecture ne fournissent pas de données d’entrée).

La méthode WdfRequestRetrieveInputBuffer récupère la mémoire tampon d’entrée pour les demandes d’E/S qui utilisent la méthode d’E/S mise en mémoire tampon ou la méthode d’E/S directe pour accéder aux mémoires tampons de données. Si le code de contrôle d’E/S de la demande est IRP_MJ_INTERNAL_DEVICE_CONTROL, ou si la demande provient d’un autre pilote en mode noyau, WdfRequestRetrieveInputBuffer prend également en charge les demandes d’E/S qui n’utilisent ni e/S en mémoire tampon ni direct E/S.

Si WdfRequestRetrieveInputBuffer retourne STATUS_SUCCESS, le pilote reçoit l’adresse et, éventuellement, la taille de la mémoire tampon d’entrée.

Le pilote peut accéder à la mémoire tampon récupérée jusqu’à ce qu’il termine la demande d’E/S que représente le paramètre Request .

Au lieu d’appeler WdfRequestRetrieveInputBuffer, le pilote peut appeler WdfRequestRetrieveInputMemory, ce qui crée un objet de mémoire framework qui représente la mémoire tampon.

Pour plus d’informations sur WdfRequestRetrieveInputBuffer, consultez Accès aux mémoires tampons de données dans les pilotes Framework-Based.

Exemples

L’exemple de code suivant fait partie de la fonction de rappel EvtIoDeviceControl de l’exemple de pilote série. Si le code de contrôle D’E/S est IOCTL_SERIAL_SET_TIMEOUT, le pilote obtient de nouvelles valeurs de délai d’attente à partir de la mémoire tampon d’entrée de la demande d’E/S.

VOID
SerialEvtIoDeviceControl(
    IN WDFQUEUE     Queue,
    IN WDFREQUEST   Request,
    IN size_t       OutputBufferLength,
    IN size_t       InputBufferLength,
    IN ULONG        IoControlCode
    )
{
    PVOID  buffer;
    size_t  bufSize;

    switch (IoControlCode) {
...

        case IOCTL_SERIAL_SET_TIMEOUTS: {

            PSERIAL_TIMEOUTS NewTimeouts;

            Status = WdfRequestRetrieveInputBuffer(
                                                   Request,
                                                   sizeof(SERIAL_TIMEOUTS),
                                                   &buffer,
                                                   &bufSize
                                                   );
            if (!NT_SUCCESS(Status)) {
                break;
            }

            NewTimeouts =(PSERIAL_TIMEOUTS)buffer;
    }
...
}

Configuration requise

Condition requise Valeur
Plateforme cible Universal
Version KMDF minimale 1.0
Version UMDF minimale 2.0
En-tête wdfrequest.h (include Wdf.h)
Bibliothèque Wdf01000.sys (KMDF) ; WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Règles de conformité DDI BufAfterReqCompletedIntIoctl(kmdf),BufAfterReqCompletedIntIoctlA(kmdf),BufAfterReqCompletedIoctl(kmdf), BufAfterReqCompletedIoctlA(kmdf), BufAfterReqCompletedRead(kmdf), BufAfterReqCompletedWrite(kmdf),BufAfterReqCompletedWriteA(kmdf), DriverCreate(kmdf), InputBufferAPI(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Voir aussi

WdfRequestRetrieveInputMemory

WdfRequestRetrieveOutputBuffer

WdfUsbTargetDeviceRetrieveConfigDescriptor