Funzione ZwReadFile (wdm.h)
La routine ZwReadFile legge i dati da un file aperto.
Sintassi
NTSYSAPI NTSTATUS ZwReadFile(
[in] HANDLE FileHandle,
[in, optional] HANDLE Event,
[in, optional] PIO_APC_ROUTINE ApcRoutine,
[in, optional] PVOID ApcContext,
[out] PIO_STATUS_BLOCK IoStatusBlock,
[out] PVOID Buffer,
[in] ULONG Length,
[in, optional] PLARGE_INTEGER ByteOffset,
[in, optional] PULONG Key
);
Parametri
[in] FileHandle
Handle all'oggetto file. Questo handle viene creato da una chiamata riuscita a ZwCreateFile o ZwOpenFile.
[in, optional] Event
Facoltativamente, un handle a un oggetto evento da impostare sullo stato segnalato dopo il completamento dell'operazione di lettura. I driver di dispositivo e intermedio devono impostare questo parametro su NULL.
[in, optional] ApcRoutine
Questo parametro è riservato. I driver di dispositivo e intermedio devono impostare questo puntatore su NULL.
[in, optional] ApcContext
Questo parametro è riservato. I driver di dispositivo e intermedio devono impostare questo puntatore su NULL.
[out] IoStatusBlock
Puntatore a una struttura IO_STATUS_BLOCK che riceve lo stato di completamento finale e informazioni sull'operazione di lettura richiesta. Il membro Information riceve il numero di byte effettivamente letti dal file.
[out] Buffer
Puntatore a un buffer allocato dal chiamante che riceve i dati letti dal file.
[in] Length
Dimensioni, in byte, del buffer a cui punta il buffer.
[in, optional] ByteOffset
Puntatore a una variabile che specifica l'offset di byte iniziale nel file in cui verrà avviata l'operazione di lettura. Se viene eseguito un tentativo di lettura oltre la fine del file, ZwReadFile restituisce un errore.
Se la chiamata a ZwCreateFile imposta uno dei flag CreateOptions FILE_SYNCHRONOUS_IO_ALERT o FILE_SYNCHRONOUS_IO_NONALERT, Gestione I/O mantiene la posizione del file corrente. In tal caso, il chiamante di ZwReadFile può specificare che l'offset di posizione del file corrente viene usato anziché un valore ByteOffset esplicito. Questa specifica può essere effettuata usando uno dei metodi seguenti:
Specificare un puntatore a un valore LARGE_INTEGER con il membro HighPart impostato su -1 e il membro LowPart impostato sul valore definito dal sistema FILE_USE_FILE_POINTER_POSITION.
Passare un puntatore NULL per ByteOffset.
ZwReadFile aggiorna la posizione del file corrente aggiungendo il numero di byte letti al termine dell'operazione di lettura, se usa la posizione del file corrente gestita da I/O Manager.
Anche quando gestione I/O mantiene la posizione del file corrente, il chiamante può reimpostare questa posizione passando un valore ByteOffset esplicito a ZwReadFile. Questa operazione modifica automaticamente la posizione del file corrente in tale valore ByteOffset , esegue l'operazione di lettura e quindi aggiorna la posizione in base al numero di byte effettivamente letti. Questa tecnica fornisce al chiamante il servizio atomico di ricerca e lettura.
[in, optional] Key
I driver di dispositivo e intermedio devono impostare questo puntatore su NULL.
Valore restituito
ZwReadFile restituisce STATUS_SUCCESS o il codice di errore NTSTATUS appropriato.
Commenti
I chiamanti di ZwReadFile devono avere già chiamato ZwCreateFile con il valore FILE_READ_DATA o GENERIC_READ impostato nel parametro DesiredAccess .
Se la chiamata precedente a ZwCreateFile imposta il flag FILE_NO_INTERMEDIATE_BUFFERING nel parametro CreateOptions su ZwCreateFile, i parametri Length e ByteOffset su ZwReadFile devono essere multipli delle dimensioni del settore. Per altre informazioni, vedere ZwCreateFile.
ZwReadFile inizia la lettura dall'oggetto ByteOffset specificato o dalla posizione corrente del file nel buffer specificato. Termina l'operazione di lettura in una delle condizioni seguenti:
Il buffer è pieno perché il numero di byte specificati dal parametro Length è stato letto. Pertanto, non è possibile inserire più dati nel buffer senza un overflow.
La fine del file viene raggiunta durante l'operazione di lettura, quindi non sono presenti più dati nel file da trasferire nel buffer.
Se il chiamante ha aperto il file con il flag SYNC impostato in DesiredAccess, il thread chiamante può sincronizzare al completamento dell'operazione di lettura aspettando l'handle file, FileHandle. L'handle viene segnalato ogni volta che viene completata un'operazione di I/O rilasciata nell'handle. Tuttavia, il chiamante non deve attendere un handle aperto per l'accesso al file sincrono (FILE_SYNCHRONOUS_IO_NONALERT o FILE_SYNCHRONOUS_IO_ALERT). In questo caso, ZwReadFile attende per conto del chiamante e non restituisce fino al completamento dell'operazione di lettura. Il chiamante può attendere in modo sicuro l'handle del file solo se vengono soddisfatte tutte e tre le condizioni seguenti:
L'handle è stato aperto per l'accesso asincrono, ovvero non è stato specificato alcun flag FILE_SYNCHRONOUS_IO_XXX .
L'handle viene usato per un'unica operazione di I/O alla volta.
ZwReadFile ha restituito STATUS_PENDING.
Un driver deve chiamare ZwReadFile nel contesto del processo di sistema se esistono alcune delle condizioni seguenti:
Il driver ha creato l'handle di file che passa a ZwReadFile.
ZwReadFile indicherà al driver il completamento di I/O tramite un evento creato dal driver.
ZwReadFile notifica al driver del completamento di I/O tramite una routine di callback APC che il driver passa a ZwReadFile.
I gestori di file ed eventi sono validi solo nel contesto del processo in cui vengono creati gli handle. Pertanto, per evitare fori di sicurezza, il driver deve creare qualsiasi file o handle di eventi che passa a ZwReadFile nel contesto del processo di sistema anziché il contesto del processo in cui si trova il driver.
Analogamente, ZwReadFile deve essere chiamato nel contesto del processo di sistema se notifica il driver di completamento di I/O tramite un APC, perché le API vengono sempre attivate nel contesto del thread che genera la richiesta di I/O. Se il driver chiama ZwReadFile nel contesto di un processo diverso da quello del sistema, l'APC potrebbe essere ritardato in modo indefinito o potrebbe non essere attivato a tutti.
Per altre informazioni sull'uso dei file, vedere Uso di file in un driver.
I chiamanti di ZwReadFile devono essere in esecuzione in IRQL = PASSIVE_LEVEL e con API kernel speciali abilitate.
Se la chiamata a questa funzione si verifica in modalità utente, è necessario usare il nome "NtReadFile" anziché "ZwReadFile".
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Universale |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Libreria | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL (vedere la sezione Osservazioni) |
Regole di conformità DDI | BufAfterReqCompletedIntIoctlA(kmdf), BufAfterReqCompletedIoctlA(kmdf), BufAfterReqCompletedReadA(kmdf), BufAfterReqCompletedWriteA(kmdf), HwStorPortProhibitedDDDIs(storport), PowerIrpDDis(wdm) |