Condividi tramite


Inizializzazione di un oggetto dispositivo

Dopo che IoCreateDevice restituisce, assegnando al chiamante un puntatore a un DeviceObject che contiene un puntatore all'estensione del dispositivo, i driver devono configurare determinati campi negli oggetti dispositivo per i rispettivi dispositivi fisici, logici e/o virtuali.

IoCreateDevice imposta il campo StackSize di un oggetto dispositivo appena creato su uno. Un driver di livello più basso può ignorare questo campo. Quando un driver di livello superiore chiama IoAttachDeviceToDeviceStack per collegarsi al driver inferiore successivo, tale routine imposta automaticamente il campo StackSize nell'oggetto dispositivo su quello dell'oggetto dispositivo del driver inferiore successivo più uno. Per alcuni tipi di dispositivo, tuttavia, potrebbe essere necessario impostare il campo StackSize su un valore maggiore, come indicato nella documentazione specifica del dispositivo. L'impostazione delle dimensioni dello stack garantisce che gli IRP inviati al driver di livello superiore contengano una posizione dello stack di I/O specifica del driver, oltre al numero corretto di posizioni dello stack di I/O per tutti i driver di livello inferiore nella catena.

IoCreateDevice imposta il campo AlignmentRequirement di un oggetto dispositivo appena creato sulla dimensione della riga della cache dei dati del processore meno uno, per garantire che i buffer usati nelle operazioni di I/O dirette siano allineati correttamente. Dopo la restituzione di IoCreateDevice , i driver di dispositivo fisici di livello più basso devono eseguire le operazioni seguenti:

  1. Sottrarre uno dal requisito di allineamento del dispositivo.

  2. Confrontare il risultato del passaggio 1 con il valore corrente dell'oggetto dispositivo AlignmentRequirement.

  3. Se il requisito di allineamento del dispositivo è maggiore, impostare AlignmentRequirement sul risultato del passaggio 1. In caso contrario, lasciare il valore AlignmentRequirement impostato da IoCreateDevice.

Dopo che qualsiasi driver di livello superiore si concatena su un altro driver chiamando IoGetDeviceObjectPointer, il driver di livello superiore deve impostare il campo AlignmentRequirement dell'oggetto dispositivo appena creato su quello dell'oggetto dispositivo del driver di livello inferiore successivo. Come regola generale, un driver di livello superiore non deve modificare questo valore. Se un driver di livello superiore chiama IoAttachDevice o IoAttachDeviceToDeviceStack, tali routine impostano automaticamente il campo AlignmentRequirement nell'oggetto dispositivo su quello dell'oggetto dispositivo del driver di livello inferiore.

IoGetDeviceObjectPointer restituisce puntatori sia all'oggetto dispositivo del driver di livello inferiore che all'oggetto file associato. Solo un FSD (o, possibilmente, un altro driver di livello più alto) può usare il puntatore all'oggetto file restituito. Un driver intermedio che chiama IoGetDeviceObjectPointer deve salvare il puntatore dell'oggetto file in modo da poter essere dereferenziato chiamando ObDereferenceObject quando il driver viene scaricato.

Dopo che un FSD monta il volume contenente l'oggetto file che rappresenta l'oggetto dispositivo di un driver di livello inferiore, un driver intermedio non può concatenarsi tra il file system e il driver di livello inferiore chiamando IoAttachDevice o IoAttachDeviceToDeviceStack. Inoltre, un FSD può impostare il membro SectorSize dell'oggetto dispositivo in base alla geometria dell'hardware del volume sottostante al momento del montaggio. Per altre informazioni, vedere DEVICE_OBJECT.

Un driver intermedio o di livello più basso imposta inoltre un bit nei Flags dell'oggetto dispositivo effettuando un OR con DO_DIRECT_IO o con DO_BUFFERED_IO in ogni oggetto dispositivo che crea. I driver di livello più elevato di dispositivi logici o virtuali possono evitare di impostare Flags per l'I/O memorizzato nel buffer o diretto se l'autore del driver decide che il lavoro aggiuntivo richiesto sarà vantaggioso per migliorare le prestazioni del driver. Un driver intermedio deve configurare il campo Flags del relativo oggetto dispositivo in modo che corrisponda a quello dell'oggetto dispositivo del driver inferiore successivo.

La configurazione del campo Flags dell'oggetto dispositivo con DO_DIRECT_IO o DO_BUFFERED_IO determina come la gestione dell'I/O passa l'accesso ai buffer utente nelle richieste di trasferimento dati inviate successivamente al driver.

Il driver può quindi impostare qualsiasi altro valore dipendente dal dispositivo nell'oggetto dispositivo. Ad esempio, i driver non WDM per i dispositivi multimediali rimovibili devono OR il membro Flags dell'oggetto dispositivo con DO_VERIFY_VOLUME se rilevano (o sospettano) una modifica nel supporto durante le operazioni di I/O. Per ulteriori informazioni, vedere Supporto per i supporti rimovibili. I driver dei dispositivi che richiedono corrente di spunto devono eseguire un OR logico del membro Flags con DO_POWER_INRUSH e i driver dei dispositivi che non si trovano nel percorso di paging del sistema devono eseguire un OR logico del membro Flags con DO_POWER_PAGABLE. I driver di funzione e filtro devono cancellare il flag di DO_DEVICE_INITIALIZING.

Dopo l'inizializzazione dell'oggetto dispositivo, un driver può anche inizializzare qualsiasi oggetto definito dal kernel e altre strutture di dati definite dal sistema per le quali ha fornito spazio di archiviazione nell'estensione del dispositivo. Proprio quando un driver esegue queste attività dipende dal dispositivo, dal tipo dell'oggetto e/o dalla natura dei dati. In generale, tutti gli oggetti o le strutture di dati che possono essere mantenuti tramite le richieste di avvio e arresto PnP possono essere inizializzati nella routine AddDevice . Quelli che richiedono informazioni sulle risorse fornite con una richiesta di IRP_MN_START_DEVICE PnP o che potrebbero richiedere modifiche quando il dispositivo viene arrestato e/o riavviato, devono essere inizializzati quando il driver gestisce la richiesta di IRP_MN_START_DEVICE . Per altre informazioni sulle routine AddDevice , vedere Scrittura di una routine AddDevice.