Partager via


Fonction IoBuildSynchronousFsdRequest (wdm.h)

La routine IoBuildSynchronousFsdRequest alloue et configure un IRP pour une requête d’E/S traitée de manière synchrone.

Syntaxe

__drv_aliasesMem PIRP IoBuildSynchronousFsdRequest(
  [in]           ULONG            MajorFunction,
  [in]           PDEVICE_OBJECT   DeviceObject,
  [in, out]      PVOID            Buffer,
  [in, optional] ULONG            Length,
  [in, optional] PLARGE_INTEGER   StartingOffset,
  [in]           PKEVENT          Event,
  [out]          PIO_STATUS_BLOCK IoStatusBlock
);

Paramètres

[in] MajorFunction

Code de fonction principal pour l’IRP. Ce code peut être IRP_MJ_PNP, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_FLUSH_BUFFERSou IRP_MJ_SHUTDOWN.

[in] DeviceObject

Pointeur vers la structure DEVICE_OBJECT pour l’objet périphérique du pilote inférieur suivant, qui représente l’appareil cible.

[in, out] Buffer

Pointeur vers une mémoire tampon de données. Si MajorFunction est IRP_MJ_WRITE, la mémoire tampon contient des données à écrire. Si MajorFunction est IRP_MJ_READ, la mémoire tampon reçoit des données. Si MajorFunction est IRP_MJ_FLUSH_BUFFERS ou IRP_MJ_SHUTDOWN, ce paramètre doit être NULL.

[in, optional] Length

Longueur, en octets, de la mémoire tampon pointée par tampon. Pour les appareils tels que les disques, cette valeur doit être un multiple entier de la taille du secteur. À compter de Windows 8, la taille du secteur peut être de 4 096 ou 512 octets. Dans les versions antérieures de Windows, la taille du secteur est toujours de 512 octets. Ce paramètre est requis pour les demandes de lecture et d’écriture, mais doit être égal à zéro pour les demandes de vidage et d’arrêt.

[in, optional] StartingOffset

Pointeur vers le décalage sur le disque, pour les demandes de lecture et d’écriture. Les unités et la signification de cette valeur sont spécifiques au pilote. Ce paramètre est requis pour les demandes de lecture et d’écriture, mais doit être égal à zéro pour les demandes de vidage et d’arrêt.

[in] Event

Pointeur vers un objet d’événement alloué par l’appelant et initialisé. Le gestionnaire d’E/S définit l’événement à l’état Signaled lorsqu’un pilote de niveau inférieur termine l’opération demandée. Après avoir appelé IoCallDriver, le pilote peut attendre l’objet d’événement.

[out] IoStatusBlock

Pointeur vers un emplacement qui reçoit le bloc d’état d’E/S défini lorsque l’IRP est terminé par un pilote de niveau inférieur.

Valeur de retour

Si l’opération réussit, IoBuildSynchronousFsdRequest retourne un pointeur vers une structure IRP initialisée, avec l’emplacement de pile d’E/S du pilote suivant configuré à partir des paramètres fournis. Sinon, la routine retourne NULL .

Remarques

Un pilote de système de fichiers (FSD) ou un autre pilote de niveau supérieur peut appeler IoBuildSynchronousFsdRequest pour configurer les fournisseurs d’intégration qu’il envoie de manière synchrone aux pilotes de niveau inférieur.

IoBuildSynchronousFsdRequest alloue et configure un IRP qui demande aux pilotes de niveau inférieur d’effectuer une opération synchrone de lecture, d’écriture, de vidage ou d’arrêt. L’IRP contient suffisamment d’informations pour démarrer l’opération.

Les pilotes de niveau inférieur peuvent imposer des restrictions sur les paramètres fournis à cette routine. Par exemple, les pilotes de disque peuvent exiger que les valeurs fournies pour Longueur et StartingOffset être des multiples entiers de la taille du secteur de l’appareil.

Après avoir appelé IoBuildSynchronousFsdRequest pour créer une requête, le pilote doit appeler IoCallDriver pour envoyer la requête au pilote inférieur suivant. Si IoCallDriver retourne STATUS_PENDING, le pilote doit attendre la fin de l’IRP en appelant KeWaitForSingleObject sur l'événement dedonné. La plupart des pilotes n’ont pas besoin de définir une routine IoCompletion pour l’IRP.

Les adresses IP virtuelles créées par IoBuildSynchronousFsdRequest doivent être effectuées par l’appel d’un pilote à IoCompleteRequest. Un pilote qui appelle IoBuildSynchronousFsdRequest ne doit pas appeler IoFreeIrp, car le gestionnaire d’E/S libère ces IRP synchrones après l' IoCompleteRequest a été appelé.

IoBuildSynchronousFsdRequest met en file d’attente les runtimes d’intégration qu’il crée dans une file d’attente IRP spécifique au thread actuel. Si le thread se ferme, le gestionnaire d’E/S annule l’IRP.

Exigences

Exigence Valeur
client minimum pris en charge Disponible à partir de Windows 2000.
plateforme cible Universel
d’en-tête wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
règles de conformité DDI ForwardedAtBadIrqlFsdSync(wdm), HwStorPortProhibitedDDIs(storport), IoBuildSynchronousFsdRequestNoFree(wdm), IoBuildSynchronou, IoBuildSynchronousFsdRequestWaitTimeout(wdm), PowerIrpDDis(wdm), SignalEventInCompletion(wdm)

Voir aussi

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompleteRequest

KeInitializeEvent

KeWaitForSingleObject