Freigeben über


CcPrepareMdlWrite-Funktion (ntifs.h)

Die CcPrepareMdlWrite-Routine bietet direkten Zugriff auf den zwischengespeicherten Dateispeicher, sodass der Aufrufer Daten in die Datei schreiben kann.

Syntax

void CcPrepareMdlWrite(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

Parameter

[in] FileObject

Zeiger auf ein Dateiobjekt für die zwischengespeicherte Datei.

[in] FileOffset

Zeiger auf eine Variable, die den Anfangsbyteoffset in der zwischengespeicherten Datei angibt, in die die Daten geschrieben werden sollen.

[in] Length

Länge der Daten in Bytes, die in den Systemcache geschrieben werden sollen.

[out] MdlChain

Eine Kette von mindestens einer Speicherdeskriptorliste (MDL), die die Seiten beschreibt, auf die die Daten geschrieben werden sollen.

[out] IoStatus

Zeiger auf eine IO_STATUS_BLOCK-Struktur. Wenn der Aufruf von CcPrepareMdlWrite erfolgreich ist, wird IoStatus.Status auf STATUS_SUCCESS festgelegt. Andernfalls wird ein entsprechender NTSTATUS-Fehlercode festgelegt. IoStatus.Information ist auf die tatsächliche Anzahl von Bytes festgelegt, die erfolgreich in der MDL-Kette gesperrt wurden.

Rückgabewert

Keine

Bemerkungen

CcPrepareMdlWrite ähnelt CcCopyWrite, mit dem Unterschied, dass die Daten nicht in die zwischengespeicherte Datei kopiert werden. Stattdessen sind die physischen Seiten, die im Systemcache überschrieben werden sollen, im Arbeitsspeicher gesperrt, und CcPrepareMdlWrite gibt eine oder mehrere MDL -Speicherdeskriptorlisten zurück, die den angegebenen Bytebereich beschreiben. Diese Seiten bleiben im Arbeitsspeicher gesperrt, bis CcMdlWriteComplete oder CcMdlWriteAbort aufgerufen wird. Daher muss jedem Aufruf von CcPrepareMdlWrite ein Aufruf von CcMdlWriteComplete oder CcMdlWriteAbort folgen.

Beachten Sie, dass die von der MDL beschriebenen Seiten im Arbeitsspeicher, aber nicht im Systemspeicher zugeordnet sind. Der Aufrufer kann diese Zuordnung durch Aufrufen von MmGetSystemAddressForMdlSafe ausführen.

Beachten Sie, dass selbst wenn der Aufruf von CcPrepareMdlWrite fehlschlägt, eine oder mehrere MDLs zugewiesen wurden. Der Aufrufer kann den Wert von IoStatus.Information untersuchen, um festzustellen, ob dies aufgetreten ist. Wenn ja, muss der Aufrufer CcMdlWriteComplete aufrufen, um die zugewiesenen MDLs frei zu geben.

Wenn ein Fehler auftritt, löst CcPrepareMdlWrite eine status Ausnahme für diesen bestimmten Fehler aus. Wenn beispielsweise ein Poolzuordnungsfehler auftritt, löst CcPrepareMdlWrite eine STATUS_INSUFFICIENT_RESOURCES Ausnahme aus. Wenn ein E/A-Fehler auftritt, löst CcPrepareMdlWrite die status Ausnahme des E/A-Fehlers aus. Daher sollte der Treiber den Aufruf von CcPrepareMdlWrite in einer try-except- oder try-finally-Anweisung umschließen, um die Kontrolle zu erlangen, wenn ein Fehler auftritt.

Um eine Datei zwischenzuspeichern, verwenden Sie CcInitializeCacheMap.

Anforderungen

Anforderung Wert
Zielplattform Universell
Header ntifs.h (include Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Weitere Informationen

CcCopyWrite

CcInitializeCacheMap

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl

IoBuildPartialMdl

MmGetMdlByteCount

MmGetMdlByteOffset

MmGetMdlPfnArray

MmGetMdlVirtualAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

MmInitializeMdl

MmMapLockedPages

MmPrepareMdlForReuse

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages