Share via


Funzione ProbeForWrite (wdm.h)

Avviso

La funzione ProbeForWrite non è consigliata per l'uso nel software corrente ed è inclusa solo per la compatibilità cronologica. Usare invece ProbeForRead durante la convalida dei buffer utente. Per altre info, vedi La sezione Osservazioni.

La routine ProbeForWrite verifica che un buffer in modalità utente risieda effettivamente nella parte in modalità utente dello spazio indirizzi, sia scrivibile e allineato correttamente.

Sintassi

void ProbeForWrite(
  [in, out] volatile VOID *Address,
  [in]      SIZE_T        Length,
  [in]      ULONG         Alignment
);

Parametri

[in, out] Address

Specifica l'inizio del buffer in modalità utente.

[in] Length

Specifica la lunghezza, in byte, del buffer in modalità utente. Vedere altre informazioni nella sezione Osservazioni.

[in] Alignment

Specifica l'allineamento richiesto, in byte, dell'inizio del buffer in modalità utente.

Valore restituito

nessuno

Osservazioni

Questa funzione in genere non offre alcun vantaggio significativo rispetto a ProbeForRead perché un driver affidabile deve sempre essere pronto a gestire le modifiche di protezione nello spazio di indirizzi virtuali in modalità utente, incluse le modifiche di protezione che rimuovono l'autorizzazione di scrittura in un buffer passato a un driver dopo l'esecuzione di una chiamata ProbeForWrite . Poiché ProbeForWrite accede a ogni pagina nel buffer fornito, le prestazioni possono essere ridotte a causa del sovraccarico di accesso a ogni pagina, soprattutto se il buffer fornito descrive un'area estesa dello spazio indirizzi virtuale. Inoltre, poiché ProbeForWrite scrive in ogni pagina, lo stesso buffer potrebbe non essere usato in modo sicuro con più richieste di driver simultanee. Per questi motivi, il nuovo codice driver deve sempre usare ProbeForRead .

Nella tabella seguente vengono descritte le proprietà di ogni routine di probe del buffer in modalità kernel:

Comportamento ProbeForRead ProbeForWrite
Conferma che il buffer descrive un'area nello spazio indirizzi in modalità utente, se la lunghezza è diversa da zero x x
Conferma che l'indirizzo e la lunghezza di base del buffer non eseguono il wrapping del valore massimo del puntatore x x
Conferma che il buffer è allineato al limite di allineamento richiesto, se la lunghezza è diversa da zero x x
Conferma che il buffer è inizialmente scrivibile (può cambiare in qualsiasi momento se l'applicazione in modalità utente riproteggi lo spazio indirizzi) x
Accede a ogni pagina nel buffer (overhead aggiuntivo) x
Modifica ogni pagina nel buffer (può causare un comportamento imprevisto se lo stesso buffer viene usato in parallelo con più richieste driver) x

In passato, in determinati processori che non rispettavano le autorizzazioni di sola lettura per il codice in modalità kernel, c'erano differenze funzionali significative tra ProbeForWrite e ProbeForRead. In questi casi, il sistema operativo in precedenza si basava su ProbeForWrite eseguendo un controllo esplicito della grafia di paging. Questa distinzione non è più significativa per tutti i processori supportati da Windows NT 4.0 o versione successiva.

Osservazioni legacy

I driver in modalità kernel possono usare ProbeForWrite per convalidare l'accesso in scrittura ai buffer allocati nello spazio utente. Viene usato più comunemente durante METHOD_NEITHER I/O per convalidare il buffer utente a cui punta Irp-UserBuffer>.

Se l'intervallo di memoria specificato non è un intervallo di indirizzi in modalità utente valido o non è scrivibile (nessun accesso, sola lettura e così via), ProbeForWrite genera l'eccezione STATUS_ACCESS_VIOLATION. Se l'inizio dell'intervallo di indirizzi non è allineato al limite di byte specificato da Alignment, ProbeForWrite genera l'eccezione STATUS_DATATYPE_MISALIGNMENT.

I driver devono chiamare ProbeForWrite all'interno di un blocco try/except . Se la routine genera un'eccezione, il driver deve completare l'IRP con l'errore appropriato. Si noti che gli accessi successivi da parte del driver al buffer in modalità utente devono essere incapsulati anche all'interno di un blocco try/except : un'applicazione dannosa potrebbe avere un altro thread eliminando, sostituendo o modificando la protezione degli intervalli di indirizzi utente in qualsiasi momento (anche dopo o durante una chiamata a ProbeForRead o ProbeForWrite). Per altre informazioni, vedere Gestione delle eccezioni.

Non usare questa routine sugli indirizzi in modalità kernel; genererà un'eccezione.

Se Irp-RequestorMode> KernelMode = , i campi Irp-AssociatedIrp.SystemBuffer> e Irp-UserBuffer> non contengono indirizzi in modalità utente e una chiamata a ProbeForWrite per eseguire il probe di un buffer a cui punta uno dei campi genererà un'eccezione.

Se Length = 0, ProbeForWrite non controlla l'indirizzo. In questo caso, la routine non genera un'eccezione per un indirizzo non allineato o non rientra nell'intervallo di indirizzi utente validi.

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows 2000.
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Regole di conformità DDI HwStorPortProhibitedDDDIs(storport), IrqlExApcLte2(wdm)

Vedi anche

ProbeForRead