WdfIoTargetSendWriteSynchronously, fonction (wdfiotarget.h)
[S’applique à KMDF et UMDF]
La méthode WdfIoTargetSendWriteSynchronously génère une requête d’écriture et l’envoie de façon synchrone à une cible d’E/S.
Syntaxe
NTSTATUS WdfIoTargetSendWriteSynchronously(
[in] WDFIOTARGET IoTarget,
[in, optional] WDFREQUEST Request,
[in, optional] PWDF_MEMORY_DESCRIPTOR InputBuffer,
[in, optional] PLONGLONG DeviceOffset,
[in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions,
[out, optional] PULONG_PTR BytesWritten
);
Paramètres
[in] IoTarget
Handle vers un objet cible d’E/S local ou distant obtenu à partir d’un appel précédent à WdfDeviceGetIoTarget ou WdfIoTargetCreate, ou à partir d’une méthode qu’une cible d’E/S spécialisée fournit.
[in, optional] Request
Handle vers un objet de requête de framework. Ce paramètre est facultatif et peut être NULL. Pour plus d’informations sur ce paramètre, consultez la section Remarques suivante.
[in, optional] InputBuffer
Pointeur vers une structure WDF_MEMORY_DESCRIPTOR allouée par l’appelant qui décrit la mémoire tampon qui contient des données écrites sur l’appareil. Ce paramètre est facultatif et peut être NULL. Pour plus d’informations sur ce paramètre, consultez la section Remarques suivante.
[in, optional] DeviceOffset
Pointeur vers un emplacement qui spécifie un décalage de départ pour le transfert. La cible d’E/S (autrement dit, le pilote inférieur suivant) définit comment utiliser cette valeur. Par exemple, les pilotes de la pile de pilotes d’un disque peuvent spécifier un décalage à partir du début du disque. La cible d’E/S obtient ces informations dans la structure Parameters.Write.DeviceOffset membre de la structure WDF_REQUEST_PARAMETERS de la requête. Ce pointeur est facultatif. La plupart des pilotes définissent ce pointeur sur NULL .
[in, optional] RequestOptions
Pointeur vers une structure WDF_REQUEST_SEND_OPTIONS allouée par l’appelant qui spécifie les options de la requête. Ce pointeur est facultatif et peut être NULL. Pour plus d’informations sur ce paramètre, consultez la section Remarques suivante.
[out, optional] BytesWritten
Pointeur vers un emplacement qui reçoit le nombre d’octets écrits, si l’opération réussit. Ce pointeur est facultatif et peut être NULL.
Valeur de retour
Si l’opération réussit, WdfIoTargetSendWriteSynchronously retourne une fois la requête d’E/S terminée et la valeur de retour est la valeur d’état d’achèvement de la requête. Sinon, cette méthode peut retourner l’une des valeurs suivantes :
Retourner le code | Description |
---|---|
|
Un paramètre non valide a été détecté. |
|
La taille de la structure WDF_REQUEST_SEND_OPTIONS vers laquelle le paramètre RequestOptions pointait de façon incorrecte. |
|
La demande d’E/S a déjà été mise en file d’attente vers une cible d’E/S. |
|
L’infrastructure n’a pas pu allouer de ressources système (généralement la mémoire). |
|
Le pilote a fourni une valeur de délai d’attente et la demande n’a pas terminé dans le délai imparti. |
|
Le paquet de requête d’E/S (IRP) que le paramètre Request représente ne fournit pas suffisamment de structures IO_STACK_LOCATION pour permettre au pilote de transférer la requête. |
Cette méthode peut également retourner d’autres valeurs NTSTATUS .
Une vérification de bogue se produit si le pilote fournit un handle d’objet non valide.
Remarques
Utilisez la méthode WdfIoTargetSendWriteSynchronously pour envoyer des demandes d’écriture de manière synchrone. Pour envoyer des requêtes d’écriture de manière asynchrone, utilisez la méthode WdfIoTargetFormatRequestForWrite, suivie de la méthode WdfRequestSend.
WdfIoTargetSendWriteSynchronously ne retourne pas tant que la requête n’est pas terminée, sauf si le pilote fournit une valeur de délai d’attente dans la structure RequestOptions du paramètre WDF_REQUEST_SEND_OPTIONS, ou à moins qu’une erreur ne soit détectée.
Vous pouvez transférer une demande d’E/S reçue par votre pilote dans une file d’attente d’E/S, ou vous pouvez créer et envoyer une nouvelle demande. Dans les deux cas, l’infrastructure nécessite un objet de requête et un espace tampon.
Pour transférer une demande d’E/S reçue par votre pilote dans une file d’attente d’E/S :
- Spécifiez le handle de la requête reçue pour le paramètre WdfIoTargetSendWriteSynchronously méthode Request.
-
Utilisez la mémoire tampon d’entrée de la requête reçue pour le paramètre InputBuffer de la méthode WdfIoTargetSendWriteSynchronous ly.
Le pilote doit appeler
WdfRequestRetrieveInputMemory pour obtenir un handle vers un objet mémoire du framework qui représente la mémoire tampon d’entrée de la requête, puis placer ce handle dans la structureWDF_MEMORY_DESCRIPTOR que le pilote fournit pour le paramètre InputBuffer.
Les pilotes divisent souvent les demandes d’E/S reçues en demandes plus petites qu’ils envoient à une cible d’E/S, afin que votre pilote puisse créer de nouvelles requêtes.
Pour créer une demande d’E/S :
-
Fournissez un handle de requête NULL
pour le paramètre WdfIoTargetSendWriteSynchronously méthodeRequest , ou créez un objet de requête et fournissez son handle :- Si vous fournissez un handle de requête NULL
, l’infrastructure utilise un objet de requête interne. Cette technique est simple à utiliser, mais le pilote ne peut pas annuler la demande. - Si vous appelez WdfRequestCreate pour créer un ou plusieurs objets de requête, vous pouvez réutiliser ces objets de requête en appelant WdfRequestReuse. Cette technique permet aux EvtDriverDeviceAdd fonction de rappel de préallouer les objets de requête d’un appareil. En outre, un autre thread de pilote peut appeler WdfRequestCancelSentRequest pour annuler la requête, si nécessaire.
Votre pilote peut spécifier un paramètre RequestOptions non
NULL ou une NULL Demander paramètre. Vous pouvez, par exemple, utiliser le paramètre RequestOptions pour spécifier une valeur de délai d’attente. - Si vous fournissez un handle de requête NULL
-
Fournissez de l’espace tampon pour le paramètre WdfIoTargetSendWriteSynchronously de la méthode InputBuffer.
Votre pilote peut spécifier cet espace tampon en tant que mémoire tampon allouée localement, en tant que handle WDFMEMORY ou en tant que liste de descripteurs de mémoire (MDL). Vous pouvez utiliser la méthode la plus pratique.
Si nécessaire, l’infrastructure convertit la description de la mémoire tampon en une qui est correcte pour la méthode de de la cible d’E/S pour accéder aux mémoires tampons de données.
Les techniques suivantes pour spécifier l’espace tampon sont disponibles :
-
Fournissez une mémoire tampon locale.
Étant donné que WdfIoTargetSendWriteSynchronously gère les requêtes d’E/S de manière synchrone, le pilote peut créer des mémoires tampons de requête locales à la routine appelante, comme l’illustre l’exemple de code suivant.
WDF_MEMORY_DESCRIPTOR MemoryDescriptor; MY_BUFFER_TYPE MyBuffer; WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&MemoryDescriptor, (PVOID) &MyBuffer, sizeof(MyBuffer));
-
Fournissez un handle WDFMEMORY.
Appelez WdfMemoryCreate ou WdfMemoryCreatePreallocated pour obtenir un handle de mémoire gérée par l’infrastructure, comme l’illustre l’exemple de code suivant.
WDF_MEMORY_DESCRIPTOR MemoryDescriptor; WDFMEMORY MemoryHandle = NULL; status = WdfMemoryCreate(NULL, NonPagedPool, POOL_TAG, MY_BUFFER_SIZE, &MemoryHandle, NULL); WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&MemoryDescriptor, MemoryHandle, NULL);
Le pilote peut également appeler WdfRequestRetrieveInputMemory pour obtenir un handle vers un objet mémoire de framework qui représente la mémoire tampon d’entrée d’une demande d’E/S reçue, si vous souhaitez que le pilote passe le contenu de cette mémoire tampon à la cible d’E/S. Le pilote ne doit pas terminer la demande d’E/S reçue tant que la nouvelle requête WdfIoTargetSendWriteSynchronously envoyées à la cible d’E/S a été supprimée, réutilisée ou reformattée. (WdfIoTargetSendWriteSynchronously incrémente le nombre de références de l’objet mémoire. La suppression, la réutilisation ou la reformatage d’un objet de requête décrémente le nombre de références de l’objet mémoire.)
-
Fournissez un MDL.
Les pilotes peuvent obtenir le MDL associé à une demande d’E/S reçue en appelant WdfRequestRetrieveInputWdmMdl.
-
Fournissez une mémoire tampon locale.
Pour plus d’informations sur l’obtention des informations d’état une fois qu’une demande d’E/S est terminée, consultez Obtention des informations d’achèvement.
Pour plus d’informations sur WdfIoTargetSendWriteSynchronously, consultez 'envoi de requêtes d’E/S à des cibles d’E/S générales.
Pour plus d’informations sur les cibles d’E/S, consultez Utilisation des cibles d’E/S.
Exemples
L’exemple de code suivant crée un objet de mémoire de framework, initialise une structure WDF_MEMORY_DESCRIPTOR et transmet la structure à WdfIoTargetSendWriteSynchronously. Cet exemple spécifie NULL pour le handle d’objet de requête, de sorte que l’infrastructure crée un objet de requête pour la cible d’E/S.
WDF_MEMORY_DESCRIPTOR MemoryDescriptor;
WDFMEMORY MemoryHandle = NULL;
ULONG_PTR bytesWritten = NULL;
status = WdfMemoryCreate(
NULL,
NonPagedPool,
POOL_TAG,
MY_BUFFER_SIZE,
&MemoryHandle,
NULL
);
WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(
&MemoryDescriptor,
MemoryHandle,
NULL
);
status = WdfIoTargetSendWriteSynchronously(
ioTarget,
NULL,
&MemoryDescriptor,
NULL,
NULL,
&bytesWritten
);
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Universel |
version minimale de KMDF | 1.0 |
version minimale de UMDF | 2.0 |
d’en-tête | wdfiotarget.h (include Wdf.h) |
bibliothèque | Wdf01000.sys (KMDF) ; WUDFx02000.dll (UMDF) |
IRQL | <=PASSIVE_LEVEL |
règles de conformité DDI | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), InternalIoctlReqs(kmdf), IoctlReqs(kmdf), KmdfIrql(kmdf), Kmdf, Kmdf2(kmdf), KmdfIrqlExplicit(kmdf), ReadReqs(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf), SyncReqSend(kmdf) |
Voir aussi
WDF_MEMORY_DESCRIPTOR_INIT_HANDLE