Condividi tramite


Rilascio di risorse Driver-Allocated

Le specifiche del modo in cui un driver usa il Registro di sistema, configura oggetti di sistema e risorse nelle estensioni del dispositivo, estensione del controller o pool non a pagine allocato dal driver varia da driver a driver. Tuttavia, qualsiasi routine di scaricamento deve rilasciare le risorse che un driver usa in fasi.

La routine di scaricamento di qualsiasi driver deve assicurarsi che nessun'altra routine del driver stia attualmente usando o che venga usata brevemente una determinata risorsa prima di rilasciare tale risorsa.

In generale, una routine di scaricamento rilascia tutte le risorse allocate dal driver nelle fasi seguenti:

  1. Se il driver non è già stato fatto, disabilitare gli interruzioni in qualsiasi dispositivo fisico, se possibile, e quindi chiamare IoDisconnectInterrupt non appena vengono disabilitati gli interruzioni.

  2. Assicurarsi che nessun'altra routine driver possa fare riferimento alle risorse che la routine Scarica intende rilasciare.

    Ad esempio, una routine di scaricamento deve chiamare IoStopTimer se la routine IoTimer del driver è attualmente abilitata per un determinato oggetto dispositivo. Deve assicurarsi che nessun thread sia in attesa di uno degli oggetti dispatcher del driver e che i relativi oggetti timer non vengano accodati per le chiamate alle routine CustomTimerDpc prima di liberare l'archiviazione per gli oggetti dispatcher. Deve chiamare KeRemoveQueueDpc se ha una routine CustomDpc che l'ISR potrebbe avere accodato e così via.

    Se il driver denominato IoQueueWorkItem, deve assicurarsi che l'elemento di lavoro sia stato completato. IoQueueWorkItem accetta un riferimento nell'oggetto dispositivo associato; non è possibile scaricare il driver se tali riferimenti rimangono.

    Se il driver denominato PsCreateSystemThread, la routine Di caricamento deve anche causare l'esecuzione del thread creato dal driver in modo che il thread stesso possa chiamare PsTerminateSystemThread prima che il driver venga scaricato. Un driver non può rilasciare un thread di sistema creato dal driver chiamando ZwClose con ThreadHandle restituito da PsCreateSystemThread.

  3. Rilasciare qualsiasi risorsa specifica del dispositivo allocata dal driver. In questo modo potrebbe essere necessario chiamare le routine di supporto del sistema seguenti:

  4. Rilasciare oggetti e risorse di sistema configurati nella routine DriverEntry o Reinitialize nell'estensione del dispositivo degli oggetti dispositivo o nell'estensione del controller dell'oggetto controller (se ne è stato creato uno). In particolare, il driver deve eseguire le operazioni seguenti prima di tentare di eliminare l'oggetto dispositivo (IoDeleteDevice) o l'oggetto controller (IoDeleteController):

  5. Liberare le risorse hardware richieste dalla routine DriverEntry o Reinitialize per i dispositivi fisici del driver, se presenti nel Registro di sistema nell'albero \Registry\Machine\Hardware\ResourceMap .

  6. Rimuovere tutti i nomi per i relativi dispositivi che la routine DriverEntry o Reinitialize archiviata nel Registro di sistema in \Registry.. \Albero DeviceMap , nonché.

Dopo il rilascio del dispositivo, del sistema e delle risorse hardware, il driver può eliminare i relativi oggetti dispositivo e controller, come descritto in Rilascio di oggetti dispositivo e controller.