Condividi tramite


Routine AddDevice nei driver di funzione o filtro

Una routine AddDevice in una funzione o un driver di filtro deve seguire questa procedura:

  1. Chiamare IoCreateDevice per creare un oggetto dispositivo funzionale o filtrato (fdO o filtro DO) per il dispositivo da aggiungere.

    Non specificare un DeviceName per l'oggetto dispositivo, perché in questo modo viene ignorata la sicurezza del gestore PnP. Se un componente in modalità utente richiede un collegamento simbolico al dispositivo, registrare un'interfaccia del dispositivo (vedere il passaggio successivo seguente). Se un componente in modalità kernel richiede un nome di dispositivo legacy, il driver deve denominare l'oggetto dispositivo, ma la denominazione non è consigliata.

    Includere FILE_DEVICE_SECURE_OPEN nel parametro DeviceCharacteristics . Questa caratteristica indica al gestore di I/O di eseguire controlli di sicurezza sull'oggetto dispositivo per tutte le richieste aperte, inclusi i nomi di file relativi aperti e finali.

  2. [facoltativo] Creare uno o più collegamenti simbolici al dispositivo.

    Chiama IoRegisterDeviceInterface per registrare la funzionalità del dispositivo e creare un collegamento simbolico che le applicazioni o i componenti di sistema possono usare per aprire il dispositivo. Il driver deve abilitare l'interfaccia chiamando IoSetDeviceInterfaceState quando gestisce la richiesta di IRP_MN_START_DEVICE . Per altre informazioni, vedere Classi di interfaccia dispositivo.

  3. Archiviare il puntatore al PDO del dispositivo nell'estensione del dispositivo.

    Il gestore PnP fornisce un puntatore al PDO come parametro PhysicalDeviceObject per AddDevice. I driver usano il puntatore PDO nelle chiamate a routine come IoGetDeviceProperty.

  4. Definire i flag nell'estensione del dispositivo per tenere traccia di determinati stati PnP del dispositivo, ad esempio il dispositivo sospeso, rimosso e rimosso a sorpresa.

    Ad esempio, definire un flag per indicare che i runtime di integrazione in ingresso devono essere mantenuti mentre il dispositivo è in pausa. Creare una coda per contenere i runtime di integrazione, se il driver non dispone già di un meccanismo per l'accodamento dei runtime di integrazione. Per altre informazioni, vedere Accodamento e annullamento della coda dei runtime di integrazione.

    Allocare anche una struttura IO_REMOVE_LOCK nell'estensione del dispositivo e chiamare IoInitializeRemoveLock per inizializzare questa struttura. Per altre informazioni, vedere Using Remove Locks.For more information, see Using Remove Locks.

  5. Impostare il bit del flag DO_BUFFERED_IO o DO_DIRECT_IO nell'oggetto dispositivo per specificare il tipo di buffering che il gestore di I/O deve usare per le richieste di I/O inviate allo stack di dispositivi. Driver di livello superiore OPPURE questo membro con lo stesso valore del driver successivo inferiore nello stack, tranne possibilmente per i driver di livello più alto. Per altre informazioni, vedere Inizializzazione di un oggetto Device.

  6. Impostare il flag DO_POWER_INRUSH o DO_POWER_PAGABLE per il risparmio energia, se necessario. I driver visualizzabili devono impostare il flag di DO_POWER_PAGABLE. I flag dell'oggetto dispositivo vengono in genere impostati dal driver del bus quando crea il PDO per il dispositivo. Tuttavia, i driver di livello superiore possono occasionalmente dover modificare i valori di questi flag nelle routine AddDevice quando creano l'oggetto FDO o il filtro DO. Per informazioni dettagliate, vedere Impostazione dei flag oggetto dispositivo per il risparmio energia .

  7. Creare e/o inizializzare qualsiasi altra risorsa software usata dal driver per gestire questo dispositivo, ad esempio eventi, blocchi di rotazione o altri oggetti. Le risorse hardware, ad esempio le porte di I/O, vengono configurate in un secondo momento, in risposta a una richiesta di IRP_MN_START_DEVICE .

    Poiché una routine AddDevice viene eseguita in un contesto di thread di sistema in IRQL = PASSIVE_LEVEL, qualsiasi memoria allocata con ExAllocatePoolWithTag per l'uso esclusivo durante l'inizializzazione può essere dal pool di paging, purché il driver non controlli il dispositivo che contiene il file di pagina di sistema. Tale allocazione di memoria deve essere rilasciata con ExFreePool prima che AddDevice restituisca il controllo .

  8. Collegare l'oggetto dispositivo allo stack di dispositivi (IoAttachDeviceToDeviceStack).

    Specificare un puntatore al PDO del dispositivo nel parametro TargetDevice .

    Archiviare il puntatore restituito da IoAttachDeviceToDeviceStack. Questo puntatore, che punta all'oggetto dispositivo del driver inferiore successivo per il dispositivo, è un parametro obbligatorio per IoCallDriver e PoCallDriver quando si passano i runtime di integrazione nello stack di dispositivi.

  9. Cancellare il flag DO_DEVICE_INITIALIZING nell'oggetto FDO o filtrare DO con un'istruzione simile alla seguente:

    FunctionalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    
  10. Prepararsi a gestire i runtime di integrazione PnP per il dispositivo, ad esempio IRP_MN_QUERY_RESOURCE_REQUIREMENTS e IRP_MN_START_DEVICE.

Un driver non deve avviare il controllo del dispositivo finché non riceve un IRP_MN_START_DEVICE contenente l'elenco di risorse hardware assegnate al dispositivo dal gestore PnP.