Condividi tramite


Errore di verifica dello stato di un driver

Nell'esempio seguente, il driver usa la macro ASSERT per verificare lo stato del dispositivo corretto in una versione di debug di un'immagine del driver, ma non controlla lo stato del dispositivo nella compilazione retail della stessa origine driver:

   case IOCTL_WAIT_FOR_EVENT:

      ASSERT((!Extension->WaitEventIrp));
      Extension->WaitEventIrp = Irp;
      IoMarkIrpPending(Irp);
      status = STATUS_PENDING;

Nell'immagine del driver di debug, se il driver contiene già l'IRP in sospeso, il sistema asserisce. In una compilazione al dettaglio, tuttavia, il driver non verifica la presenza di questo errore. Due chiamate alla stessa IOCTL causano la perdita di traccia da parte del driver di un'IRP.

In un sistema multiprocessore questo frammento di codice potrebbe causare problemi aggiuntivi. Si supponga che nella voce questa routine abbia la proprietà di (diritto di modificare) questo IRP. Quando la routine salva il puntatore Irp nella struttura globale in Extension-WaitEventIrp>, un altro thread può ottenere l'indirizzo IRP da tale struttura globale ed eseguire operazioni sull'IRP. Per evitare questo problema, il driver deve contrassegnare l'IRP in sospeso prima di salvare l'IRP e deve includere sia la chiamata a IoMarkIrpPending che l'assegnazione in una sequenza interlocked. Una routine Annulla per l'IRP potrebbe essere necessaria anche.