Inizializzazione di un oggetto Device

Dopo la restituzione di IoCreateDevice , assegnare 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, il driver di livello superiore potrebbe dover impostare il campo StackSize su un valore maggiore, come indicato nella documentazione specifica del dispositivo. L'impostazione delle dimensioni dello stack garantisce che i runtime di integrazione inviati al driver di livello superiore contengano una posizione dello stack di I/O specifica del driver, oltre al numero corretto di percorsi 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 in I/O diretti 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 questo puntatore all'oggetto file in modo che possa 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 inferiore, un driver intermedio non può concatenarsi tra il file system e il driver inferiore chiamando IoAttachDevice o IoAttachDeviceToDeviceToDeviceStack. Inoltre, un FSD può impostare il membro SectorSize dell'oggetto dispositivo in base alla geometria dell'hardware del volume sottostante quando si verifica un montaggio. Per altre informazioni, vedere DEVICE_OBJECT.

Un driver intermedio o di livello più basso imposta anche un bit nei flag dell'oggetto dispositivo tramite ORing con DO_DIRECT_IO o con DO_BUFFERED_IO in ogni oggetto dispositivo creato. I driver di livello più alto di dispositivi logici o virtuali possono evitare l'impostazione dei flag per l'I/O memorizzato nel buffer o diretto se il writer del driver decide che il lavoro aggiuntivo coinvolto pagherà in prestazioni migliori del driver. Un driver intermedio deve configurare il campo Flags dell'oggetto dispositivo in modo che corrisponda a quello dell'oggetto dispositivo del driver inferiore successivo.

La configurazione di un campo Contrassegni oggetto dispositivo con DO_DIRECT_IO o DO_BUFFERED_IO determina il modo in cui il gestore di I/O passa l'accesso ai buffer utente in tutte le richieste di trasferimento dei 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 OPPURE il membro Flags dell'oggetto dispositivo con DO_VERIFY_VOLUME se rileva (o sospetta) una modifica nel supporto durante le operazioni di I/O. Per altre informazioni, vedere Supporto di supporti rimovibili . I driver di dispositivi che richiedono l'alimentazione inrush devono OR il membro Flags con DO_POWER_INRUSH e i driver di dispositivi che non si trovano nel percorso di paging del sistema devono OR il 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 tutti gli oggetti definiti dal kernel e altre strutture di dati definite dal sistema per cui ha fornito l'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 . Quelle 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 inizializzate quando il driver gestisce la richiesta di IRP_MN_START_DEVICE . Per altre informazioni sulle routine AddDevice , vedere Scrittura di una routine AddDevice.