Responsabilità facoltative di DriverEntry
A seconda della posizione di un determinato driver in una catena di driver a livelli, la natura del dispositivo sottostante e la progettazione del driver, una routine DriverEntry può anche essere responsabile del seguente:
Chiamata di IoAllocateDriverObjectExtension per creare e inizializzare un'estensione dell'oggetto driver, se il driver richiede l'archiviazione per i dati a livello di driver. L'estensione dell'oggetto driver è una struttura di dati specifica del driver. Ad esempio, un driver potrebbe usare l'estensione dell'oggetto driver per archiviare un percorso del Registro di sistema o altre informazioni globali.
Chiamata di PsCreateSystemThread per creare thread di lavoro esecutivi, se il driver è un driver di livello più alto (ad esempio un driver di file system) che usa tali thread. In questo caso, il driver deve avere anche una routine di callback di tipo WORKER_THREAD_ROUTINE, che accetta un singolo parametro PVOID di input.
Registrazione di una routine reinitialize . Vedere Scrittura di una routine reinitialize.
Gestione dei requisiti di inizializzazione specifici della classe che differiscono da quelli descritti qui, ad esempio quelli che un miniport o miniclasse specifico del dispositivo funziona in combinazione con una porta o un driver di classe potrebbe avere. Per informazioni dettagliate, vedere la documentazione specifica del tipo di dispositivo in Windows Driver Kit (WDK).
Fornitura di archiviazione per le risorse di sistema
Gli oggetti per dispositivo devono essere allocati nella routine AddDevice o nella routine Dispatch che gestisce la richiesta di IRP_MN_START_DEVICE PnP, non in DriverEntry.
Tuttavia, un driver potrebbe dover allocare memoria aggiuntiva dello spazio di sistema per altri usi a livello di driver. In tal caso, la routine DriverEntry può chiamare una (o più) delle routine seguenti:
IoAllocateDriverObjectExtension, per creare un'area di contesto associata all'oggetto driver
ExAllocatePoolWithTag per memoria di sistema impaginata o non di pagina
MmAllocateNonCachedMemory o MmAllocateContiguousMemory per la memoria dello spazio di sistema allineata alla cache (utilizzata per i buffer di I/O)
Ogni routine DriverEntry viene eseguita nel contesto di un thread di sistema in IRQL = PASSIVE_LEVEL. Pertanto, qualsiasi memoria allocata con ExAllocatePoolWithTag da usare esclusivamente durante l'inizializzazione può essere dal pool di pagine, purché il driver non controlli il dispositivo che contiene il file di pagina del sistema. La memoria allocata deve essere rilasciata con ExFreePool prima che DriverEntry restituisca il controllo. Tuttavia, un driver che imposta una routine Reinitialize può passare un puntatore a questa memoria quando chiama IoRegisterDriverReinitialization, rendendo quindi la routine Reinitialize del driver responsabile della liberazione dell'allocazione della memoria.
Attestazione di risorse hardware
I driver non PnP meno recenti hanno richiesto risorse dal Registro di sistema. I driver PnP, invece, non dichiarano né le risorse del dispositivo da né scrivono direttamente i requisiti delle risorse nel Registro di sistema. Invece, questi driver segnalano i requisiti in risposta a determinati IRP PnP, come parte del processo di enumerazione di PnP manager. Un driver PnP riceve le risorse allocate in una richiesta di IRP_MN_START_DEVICE PnP.
I driver che non interagiscono direttamente con il gestore PnP, ad esempio alcuni driver miniport, potrebbero avere requisiti di report diversi imposti da una classe o un driver di porta che interagisce con il gestore PnP. Tali requisiti sono specifici della classe del dispositivo. Per informazioni dettagliate specifiche e specifiche del dispositivo, vedere la documentazione per la classe di dispositivo pertinente nel Kit driver di Windows (WDK).
Uso del Registro di sistema
Una routine DriverEntry può usare il Registro di sistema per ottenere alcune delle informazioni necessarie per inizializzare il driver oppure potrebbe impostare informazioni nel Registro di sistema per altri driver o sottosistemi protetti da usare. La natura delle informazioni dipende dal tipo di dispositivo. I driver possono accedere al Registro di sistema usando le routine ZwXxx e RtlXxx . Il parametro RegistryPath della routine DriverEntry punta a una stringa Unicode conteggiata che specifica un percorso della chiave del Registro di sistema del driver, \Registry\Machine\System\CurrentControlSet\Services\*DriverName. La routine deve salvare una copia della stringa, non il puntatore stesso, poiché il puntatore non è più valido dopo *DriverEntry restituisce.