Freigeben über


CcPrepareMdlWrite-Funktion (ntifs.h)

Die CcPrepareMdlWrite Routine bietet direkten Zugriff auf 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

Zeigen Sie auf ein Dateiobjekt für die zwischengespeicherte Datei.

[in] FileOffset

Zeigen Sie auf eine Variable, die den Anfangsbyte-Offset innerhalb der zwischengespeicherten Datei angibt, in die die Daten geschrieben werden sollen.

[in] Length

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

[out] MdlChain

Eine Kette mit einer oder mehreren Speicherdeskriptorlisten (MDL), die die Seiten beschreiben, in 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 er auf einen entsprechenden NTSTATUS-Fehlercode festgelegt. IoStatus.Information wird auf die tatsächliche Anzahl der Bytes festgelegt, die erfolgreich in der MDL-Kette gesperrt wurden.

Rückgabewert

Nichts

Bemerkungen

CcPrepareMdlWrite ähnelt CcCopyWrite, mit der Ausnahme, dass die Daten nicht in die zwischengespeicherte Datei kopiert werden. Stattdessen werden die physischen Seiten, die im Systemcache überschrieben werden sollen, im Arbeitsspeicher gesperrt, und CcPrepareMdlWrite gibt eine oder mehrere Speicherdeskriptorlisten (MDL) 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 CcMdlWriteAbortfolgen.

Beachten Sie, dass die von der MDL beschriebenen Seiten im Arbeitsspeicher gesperrt, aber nicht im Systembereich zugeordnet sind. Der Aufrufer kann diese Zuordnung ausführen, indem MmGetSystemAddressForMdlSafeaufgerufen wird.

Beachten Sie, dass auch dann, wenn der Aufruf von CcPrepareMdlWrite fehlschlägt, mindestens eine MDLs zugewiesen wurden. Der Aufrufer kann den Wert IoStatus.Information untersuchen, um festzustellen, ob dies aufgetreten ist. Falls ja, muss der Aufrufer CcMdlWriteComplete- aufrufen, um die zugeordneten MDLs freizuweisen.

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. Um die Kontrolle zu erlangen, wenn ein Fehler auftritt, sollte der Treiber den Aufruf von CcPrepareMdlWrite- in einem try-except oder try-finally Anweisung umschließen.

Verwenden Sie CcInitializeCacheMap, um eine Datei zwischenzuspeichern.

Anforderungen

Anforderung Wert
Zielplattform- Universal
Header- ntifs.h (einschließlich Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- < DISPATCH_LEVEL

Siehe auch

CcCopyWrite-

CcInitializeCacheMap-

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl-

IoBuildPartialMdl-

MmGetMdlByteCount

MmGetMdlByteOffset-

MmGetMdlPfnArray

MmGetMdlVirtualAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

MmInitializeMdl

MmMapLockedPages-

MmPrepareMdlForReuse

MmProbeAndLockPages

MmUnlockPages-

MmUnmapLockedPages