Freigeben über


FsRtlCopyWrite-Funktion (ntifs.h)

Die FsRtlCopyWrite Routine kopiert Daten aus einem Benutzerpuffer in eine zwischengespeicherte Datei.

Syntax

BOOLEAN FsRtlCopyWrite(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  BOOLEAN          Wait,
  [in]  ULONG            LockKey,
  [in]  PVOID            Buffer,
  [out] PIO_STATUS_BLOCK IoStatus,
  [in]  PDEVICE_OBJECT   DeviceObject
);

Parameter

[in] FileObject

Ein Zeiger auf ein Dateiobjekt für die zwischengespeicherte Datei, in die die Daten geschrieben werden sollen.

[in] FileOffset

Ein Zeiger auf eine Variable, die den Anfangsbyte-Offset innerhalb der zwischengespeicherten Datei angibt.

[in] Length

Die Länge in Byte der zu schreibenden Daten.

[in] Wait

Auf TRUE festgelegt, wenn der Aufrufer in einen Wartezustand versetzt werden kann, bis alle Daten kopiert wurden, andernfalls FALSE.

[in] LockKey

Ein Wert, der dem zu sperrenden Bytebereich zugeordnet ist. Wenn der zu sperrende Bereich einen anderen Bereich überlappt, der bereits mit einer nicht exklusiven Sperre gesperrt ist, oder wenn der zu lesende Bereich ein Unterbereich eines anderen Bereichs ist, der bereits nichtexklusiv gesperrt ist, muss der Wert in diesem Parameter der Schlüssel für diese nichtexklusive Sperre sein. Die Sperre muss vom übergeordneten Prozess des aufrufenden Threads gehalten werden. Andernfalls hat dieser Parameter keine Auswirkung.

[in] Buffer

Ein Zeiger auf den Puffer, aus dem die Daten kopiert werden sollen.

[out] IoStatus

Ein Zeiger auf eine vom Aufrufer zugewiesene Struktur, die den endgültigen Abschlussstatus und Informationen zum Vorgang empfängt. Wenn die Daten erfolgreich kopiert werden, enthält IoStatus.Status- STATUS_SUCCESS. Wenn nicht alle Daten erfolgreich kopiert werden, enthält IoStatus.Information die tatsächliche Anzahl von Bytes, die kopiert wurden.

[in] DeviceObject

Ein Zeiger auf das Geräteobjekt für das bereitgestellte Volume, das die Dateidaten enthält.

Rückgabewert

FsRtlCopyWrite TRUE zurück, wenn die Kopieranforderung abgeschlossen wurde, andernfalls FALSE. Beachten Sie, dass ein Rückgabewert von TRUE nicht notwendigerweise bedeutet, dass der Kopiervorgang erfolgreich war.

Wenn FsRtlCopyWrite FALSE zurückgibt, oder wenn der Inhalt von IoStatus darauf hinweist, dass der Kopiervorgang fehlgeschlagen ist, muss der Aufrufer einen Schreib-IRP zuweisen, anstatt FsRtlCopyWriteaufzurufen.

Bemerkungen

Anstatt eine dateisystemspezifische schnelle E/A-Schreibroutine zu implementieren, sollten Entwickler von Dateisystemen, die die Dateizwischenspeicherung unterstützen, die Verwendung von FsRtlCopyWrite als Einstiegspunkt des Dateisystems für die Verarbeitung schneller E/A-Schreibanforderungen in Betracht ziehen. Dies erfordert, dass die DriverEntry Routine des Dateisystems den FastIoWrite-Einstiegspunkt auf FsRtlCopyWrite in der FAST_IO_DISPATCH Struktur des Dateisystemtreiberobjekts festlegen. Darüber hinaus muss das Dateisystem folgendes ausführen:

  1. Für jede Datei, für die schnelle E/A ausgeführt werden kann, muss das Dateisystem eine FSRTL_COMMON_FCB_HEADER Struktur zuordnen und initialisieren.

    In den meisten Dateisystemen wird dies erreicht, indem die FSRTL_COMMON_FCB_HEADER Struktur in einen Dateisteuerungsblock (FILE Control Block, FCB) oder eine vergleichbare Struktur eingeschlossen wird, die verwendet wird, um den Zustand einer geöffneten Datei beizubehalten.

    Der Speicher für die FSRTL_COMMON_FCB_HEADER-Struktur wird in der Regel aus dem ausgelagerten Pool zugewiesen.

  2. Für jede Datei, für die schnelle E/A ausgeführt werden kann, muss das Dateisystem alle Dateiobjekte für die Datei mit der FSRTL_COMMON_FCB_HEADER Struktur verknüpfen. Dies geschieht durch Festlegen der FsContext Member jedes Dateiobjekts auf diese Struktur (oder auf die FCB oder eine andere Struktur, die die FSRTL_COMMON_FCB_HEADER Struktur enthält).

  3. Beim Zwischenspeichern einer Datei muss das Dateisystem den IsFastIoPossible Member der FSRTL_COMMON_FCB_HEADER Struktur der Datei auf einen geeigneten Wert festlegen. Dieser Wert sollte nach Bedarf aktualisiert werden, solange die Datei zwischengespeichert bleibt.

    Insbesondere sollten Dateisysteme die IsFastIoPossible Member der FSRTL_COMMON_FCB_HEADER Struktur so festlegen, dass sie fastIoIsQuestionable, sobald eine exklusive Bytebereichssperre für die zwischengespeicherte Datei vorhanden ist.

Wenn Wait WAHR ist, wird FsRtlCopyWrite- garantiert, die Daten zu kopieren und WAHR zurückzugeben. Wenn die erforderlichen Seiten der zwischengespeicherten Datei bereits im Arbeitsspeicher vorhanden sind, werden die Daten sofort kopiert, und es tritt keine Blockierung auf. Wenn erforderliche Seiten nicht vorhanden sind, wird der Aufrufer in einen Wartezustand versetzt, bis alle erforderlichen Seiten resident wurden und die Daten kopiert werden können.

Wenn Wait FALSE ist, wird FsRtlCopyWrite die Blockierung verweigern und FALSE zurückgeben, wenn die Hauptressource der Datei nicht abgerufen werden kann oder die erforderlichen Seiten der zwischengespeicherten Datei nicht bereits im Arbeitsspeicher vorhanden sind.

Die FastIoCheckIfPossible Routine des Dateisystems ist dafür verantwortlich, sicherzustellen, dass der durch FileOffset- definierte Bytebereich und Length keinen exklusiv gesperrten Bytebereich enthält, für den der Aufrufer nicht den entsprechenden LockKey Wert übergibt. Wenn das Dateisystem die FsRtlXxxLockYyy Supportroutinen zum Verwalten von Bytebereichssperren verwendet, kann dies durch Aufrufen von FsRtlFastCheckLockForWrite aus der FastIoCheckIfPossible Routine erreicht werden, bevor FsRtlCopyReadaufgerufen wird.

Verwenden Sie zum Zwischenspeichern einer Datei die CcInitializeCacheMap Routine.

Anforderungen

Anforderung Wert
Zielplattform- Universal
Header- ntifs.h (einschließlich Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- PASSIVE_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Siehe auch

CcInitializeCacheMap-

FsRtlCopyRead-

FsRtlFastCheckLockForWrite