Freigeben über


IoBuildSynchronousFsdRequest-Funktion (wdm.h)

Die IoBuildSynchronousFsdRequest Routine ordnet und richtet einen IRP für eine synchron verarbeitete E/A-Anforderung ein.

Syntax

__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
);

Parameter

[in] MajorFunction

Der Hauptfunktionscode für das IRP. Dieser Code kann IRP_MJ_PNP, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_FLUSH_BUFFERSoder IRP_MJ_SHUTDOWN.

[in] DeviceObject

Ein Zeiger auf die DEVICE_OBJECT-Struktur für das Geräteobjekt des nächsten niedrigeren Treibers, das das Zielgerät darstellt.

[in, out] Buffer

Ein Zeiger auf einen Datenpuffer. Wenn MajorFunction-IRP_MJ_WRITEist, enthält der Puffer zu schreibende Daten. Wenn MajorFunction-IRP_MJ_READist, empfängt der Puffer Daten. Wenn MajorFunction-IRP_MJ_FLUSH_BUFFERS oder IRP_MJ_SHUTDOWNist, muss dieser Parameter NULL-sein.

[in, optional] Length

Die Länge des Puffers in Bytes, auf den Pufferverweist. Bei Geräten wie Datenträgern muss dieser Wert ein ganzzahliges Vielfaches der Sektorgröße sein. Ab Windows 8 kann die Sektorgröße 4.096 oder 512 Byte betragen. In früheren Versionen von Windows beträgt die Sektorgröße immer 512 Byte. Dieser Parameter ist für Lese- und Schreibanforderungen erforderlich, muss jedoch für Flush- und Shutdown-Anforderungen null sein.

[in, optional] StartingOffset

Ein Zeiger auf den Offset auf dem Datenträger für Lese- und Schreibanforderungen. Die Einheiten und Bedeutung dieses Werts sind treiberspezifisch. Dieser Parameter ist für Lese- und Schreibanforderungen erforderlich, muss jedoch für Flush- und Shutdown-Anforderungen null sein.

[in] Event

Ein Zeiger auf ein vom Aufrufer zugewiesenes und initialisiertes Ereignisobjekt. Der E/A-Manager legt das Ereignis auf den Zustand "Signaled" fest, wenn ein Treiber auf niedrigerer Ebene den angeforderten Vorgang abschließt. Nach dem Aufrufen IoCallDriver-kann der Treiber auf das Ereignisobjekt warten.

[out] IoStatusBlock

Ein Zeiger auf eine Position, die den E/A-Statusblock empfängt, der festgelegt wird, wenn das IRP durch einen Treiber auf niedrigerer Ebene abgeschlossen wird.

Rückgabewert

Wenn der Vorgang erfolgreich ist, gibt IoBuildSynchronousFsdRequest einen Zeiger auf eine initialisierte IRP--Struktur zurück, wobei die I/O-Position des nächsten Treibers aus den angegebenen Parametern eingerichtet ist. Andernfalls gibt die Routine NULL-zurück.

Bemerkungen

Ein Dateisystemtreiber (File System Driver, FSD) oder ein anderer höherer Treiber kann IoBuildSynchronousFsdRequest- aufrufen, um IRPs einzurichten, die synchron an Treiber auf niedrigerer Ebene gesendet werden.

IoBuildSynchronousFsdRequest ordnet ein IRP zu und richtet ein IRP ein, das Treiber auf niedrigerer Ebene anfordert, um einen synchronen Lese-, Schreib-, Flush- oder Herunterfahren-Vorgang auszuführen. Das IRP enthält genügend Informationen, um den Vorgang zu starten.

Treiber auf niedrigerer Ebene können Einschränkungen für Parameter auferlegen, die für diese Routine bereitgestellt werden. Beispielsweise können Datenträgertreiber festlegen, dass werte, die für Length angegeben werden, und StartingOffset ganzzahlige Vielfache der Größe des Gerätesektors sein.

Nach dem Aufrufen IoBuildSynchronousFsdRequest- zum Erstellen einer Anforderung muss der Treiber IoCallDriver- aufrufen, um die Anforderung an den nächsten niedrigeren Treiber zu senden. Wenn IoCallDriver- STATUS_PENDING zurückgibt, muss der Treiber auf den Abschluss des IRP warten, indem KeWaitForSingleObject für das angegebene Eventaufgerufen wird. Die meisten Treiber müssen keine IoCompletion- Routine für das IRP festlegen.

IRPs, die von IoBuildSynchronousFsdRequest erstellt werden, müssen durch den Aufruf eines Treibers an IoCompleteRequestabgeschlossen werden. Ein Treiber, der IoBuildSynchronousFsdRequest aufruft, darf nicht IoFreeIrpaufrufen, da der I/O-Manager diese synchronen IRPs freigibt, nachdem IoCompleteRequest aufgerufen wurde.

IoBuildSynchronousFsdRequest die IRPs in die Warteschlange stellt, die es in einer IRP-Warteschlange erstellt, die für den aktuellen Thread spezifisch ist. Wenn der Thread beendet wird, bricht der E/A-Manager das IRP ab.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Ab Windows 2000 verfügbar.
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <= APC_LEVEL
DDI-Complianceregeln ForwardedAtBadIrqlFsdSync(wdm), HwStorPortProhibitedDDIs(storport), IoBuildSynchronousFsdRequestNoFree(wdm), IoBuildSynchronSynchronousFsdRequestWait(wdm), IoBuildSynchronousFsdRequestWaitTimeout(wdm), PowerIrpDDis(wdm), SignalEventInCompletion(wdm)

Siehe auch

IO_STACK_LOCATION

IRP-

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompleteRequest-

KeInitializeEvent-

KeWaitForSingleObject