Funzione CcPrepareMdlWrite (ntifs.h)

La routine CcPrepareMdlWrite consente l'accesso diretto alla memoria file memorizzata nella cache in modo che il chiamante possa scrivere dati nel file.

Sintassi

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

Parametri

[in] FileObject

Puntatore a un oggetto file per il file memorizzato nella cache.

[in] FileOffset

Puntatore a una variabile che specifica l'offset dei byte iniziale all'interno del file memorizzato nella cache in cui devono essere scritti i dati.

[in] Length

Lunghezza in byte dei dati da scrivere nella cache di sistema.

[out] MdlChain

Catena di uno o più elenchi di descrittori di memoria (MDL) che descrivono le pagine in cui devono essere scritti i dati.

[out] IoStatus

Puntatore a una struttura IO_STATUS_BLOCK. Se la chiamata a CcPrepareMdlWrite ha esito positivo, IoStatus.Status è impostato su STATUS_SUCCESS. In caso contrario, viene impostato su un codice di errore NTSTATUS appropriato. IoStatus.Information è impostato sul numero effettivo di byte bloccati correttamente nella catena MDL.

Valore restituito

nessuno

Osservazioni

CcPrepareMdlWrite è simile a CcCopyWrite, ad eccezione del fatto che i dati non vengono copiati nel file memorizzato nella cache. Le pagine fisiche da sovrascrivere nella cache di sistema sono invece bloccate in memoria e CcPrepareMdlWrite restituisce uno o più elenchi di descrittori di memoria (MDL) che descrivono l'intervallo di byte specificato. Queste pagine rimangono bloccate in memoria finché non viene chiamato CcMdlWriteComplete o CcMdlWriteAbort . Ogni chiamata a CcPrepareMdlWrite deve quindi essere seguita da una chiamata a CcMdlWriteComplete o CcMdlWriteAbort.

Si noti che le pagine descritte dal file MDL sono bloccate in memoria, ma non mappate nello spazio di sistema. Il chiamante può eseguire questo mapping chiamando MmGetSystemAddressForMdlSafe.

Si noti che anche se la chiamata a CcPrepareMdlWrite ha esito negativo, è possibile che sia stato allocato uno o più mdls. Il chiamante può esaminare il valore di IoStatus.Information per determinare se si è verificato questo problema. In caso affermativo, il chiamante deve chiamare CcMdlWriteComplete per liberare gli ELENCHI MDL allocati.

Se si verifica un errore, CcPrepareMdlWrite genera un'eccezione di stato per quel particolare errore. Ad esempio, se si verifica un errore di allocazione del pool, CcPrepareMdlWrite genera un'eccezione STATUS_INSUFFICIENT_RESOURCES; se si verifica un errore di I/O, CcPrepareMdlWrite genera l'eccezione di stato dell'errore di I/O. Pertanto, per ottenere il controllo se si verifica un errore, il driver deve eseguire il wrapping della chiamata a CcPrepareMdlWrite in un'istruzione try-except o try-finally .

Per memorizzare nella cache un file, usare CcInitializeCacheMap.

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Intestazione ntifs.h (include Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Vedi anche

CcCopyWrite

CcInitializeCacheMap

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl

IoBuildPartialMdl

MmGetMdlByteCount

MmGetMdlByteOffset

MmGetMdlPfnArray

MmGetMdlVirtualAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

MmInitializeMdl

MmMapLockedPages

MmPrepareMdlForReuse

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages