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 |