Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Alcuni driver devono modificare gli oggetti passati dai chiamanti o devono gestire due oggetti file contemporaneamente. Ad esempio, un driver modem potrebbe ricevere un handle per un oggetto evento oppure un driver di rete potrebbe ricevere handle a due oggetti file diversi. Il driver deve convalidare questi handle. Poiché vengono passati da un chiamante e non tramite il gestore di I/O, il gestore di I/O non può eseguire alcun controllo di convalida.
Nel frammento di codice seguente, ad esempio, il driver ha passato l'handle AscInfo-AddressHandle>, ma non lo ha convalidato prima di chiamare ObReferenceObjectByHandle:
//
// This handle is embedded in a buffered request.
//
status = ObReferenceObjectByHandle(
AscInfo->AddressHandle,
0,
NULL,
KernelMode,
&fileObject,
NULL);
if (NT_SUCCESS(status)) {
if ( (fileObject->DeviceObject == DeviceObject) &&
(fileObject->FsContext2 == TRANSPORT_SOCK) ) {
Anche se la chiamata a ObReferenceObjectByHandle ha esito positivo, il codice non riesce a garantire che il puntatore restituito faccia riferimento a un oggetto file; considera attendibile il chiamante per passare le informazioni corrette.
Anche se tutti i parametri per la chiamata a ObReferenceObjectByHandle sono corretti e la chiamata ha esito positivo, un driver può comunque ottenere risultati imprevisti se l'oggetto file non è destinato al driver. Nel frammento di codice seguente, il driver presuppone che una chiamata con esito positivo restituisca un puntatore all'oggetto file previsto:
status = ObReferenceObjectByHandle (
AcpInfo->Handle,
0L,
DesiredAccess,
*IoFileObjectType,
Irp->RequestorMode,
(PVOID *)&AcpEndpointFileObject,
NULL);
if ( !NT_SUCCESS(status) ) {
goto complete;
}
AcpEndpoint = AcpEndpointFileObject->FsContext;
if ( AcpEndpoint->Type != BlockTypeEndpoint )
Anche se ObReferenceObjectByHandle restituisce un puntatore a un oggetto file, il driver non garantisce che il puntatore faccia riferimento all'oggetto file previsto. In questo caso, il driver deve convalidare il puntatore prima di accedere ai dati specifici del driver in AcpEndpointFileObject-FsContext>.
Per evitare tali problemi, un driver deve verificare la presenza di dati validi, come indicato di seguito:
Controllare il tipo di oggetto per assicurarsi che sia quello previsto dal driver.
Assicurarsi che l'accesso richiesto sia appropriato per il tipo di oggetto e le attività necessarie. Se il driver esegue una copia rapida dei file, ad esempio, assicurati che l'handle abbia accesso in lettura.
Assicurarsi di specificare la modalità di accesso corretta (UserMode o KernelMode) e che la modalità di accesso sia compatibile con l'accesso richiesto.
Se il driver si aspetta un handle per un oggetto di file creato dal driver stesso, convalidare l'handle rispetto all'oggetto dispositivo o al driver. Tuttavia, prestare attenzione a non interrompere i filtri che inviano richieste di I/O per dispositivi strani.
Se il driver supporta più tipi di oggetti file (ad esempio canali di controllo, oggetti indirizzo e connessioni di driver TDI o oggetti Volume, Directory e File dei file system), assicurati di avere un modo per differenziarli.