Condividi tramite


Errore di convalida degli handle degli oggetti

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 a un oggetto evento o un driver di rete potrebbe ricevere handle in 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 è stato passato all'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) ) {

Sebbene la chiamata a ObReferenceObjectByHandle abbia 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 del file, ad esempio, assicurarsi 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 prevede un handle in un oggetto 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 i canali di controllo, gli oggetti indirizzo e le connessioni dei driver TDI o volume, directory e oggetti File dei file system, assicurarsi di avere un modo per differenziarli.