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:
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.
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.
Rilasciare qualsiasi risorsa specifica del dispositivo allocata dal driver. In questo modo potrebbe essere necessario chiamare le routine di supporto del sistema seguenti:
IoDeleteSymbolicLink se la routine DriverEntry o Reinitialize denominata IoCreateSymbolicLink o IoCreateUnprotectedSymbolicLink e IoDeassignArcName se il driver chiama IoAssignArcName.
ExFreePool se DriverEntry o qualsiasi altra routine driver denominata ExAllocatePoolWithTag e il driver non ha ancora rilasciato la memoria allocata.
MmUnmapIoSpace se la routine DriverEntry o Reinitialize denominata MmMapIoSpace.
MmFreeNonCachedMemory se la routine DriverEntry o Reinitializedenominata MmAllocateNonCachedMemory.
MmFreeContiguousMemory se la routine DriverEntry o Reinitializedenominata MmAllocateContiguousMemory.
FreeCommonBuffer se la routine DriverEntry o Reinitialize denominata AllocateCommonBuffer.
IoAssignResources o IoReportResourceUsage se la routine DriverEntry o Reinitialize denominata una di queste routine di supporto o HalAssignSlotResources per richiedere risorse hardware nel Registro di configurazione per sé e/o per i relativi dispositivi fisici singolarmente.
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):
- Chiamare IoDisconnectInterrupt per liberare il puntatore dell'oggetto di interruzione archiviato nell'estensione del dispositivo o del controller corrispondente.
- Chiamare ObDereferenceObject con il puntatore all'oggetto file del driver inferiore successivo se ha chiamato IoGetDeviceObjectPointer e archiviato questo puntatore in un dispositivo o un'estensione del controller.
- Chiamare IoDetachDevice con il puntatore all'oggetto dispositivo del driver inferiore se si chiama IoAttachDevice o IoAttachDeviceToDeviceStack e archiviato questo puntatore in un dispositivo o un'estensione del controller.
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 .
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.