Panoramica degli ID contenitore

Nella famiglia di sistemi operativi Windows, i dispositivi sono fondamentalmente una raccolta di istanze funzionali del dispositivo, ognuna delle quali rappresenta un endpoint funzionale che consente una forma di comunicazione al dispositivo.

Il termine nodo dispositivo (devnode) fa riferimento allo stack di driver per un endpoint funzionale di questo tipo, oltre alle proprietà che descrivono l'endpoint e il relativo stato associato. Ad esempio, un dispositivo multifunzione che supporta la funzionalità stampante, scanner e fax può avere più devnodes, uno per ogni endpoint funzionale nel dispositivo.

Prima di Windows 7, ogni endpoint funzionale aveva un devnode associato. I componenti della piattaforma Windows e le applicazioni di terze parti possono eseguire query su devnodes per lo stato e le informazioni del dispositivo e possono comunicare con l'hardware del dispositivo anche se le interfacce esposte da endpoint funzionali.

Per un dispositivo a funzione singola, un singolo devnode contiene tutte le informazioni correlate all'endpoint funzionale del dispositivo. Analogamente, un dispositivo multifunzione ha più devnodes associati a ognuno degli endpoint funzionali del dispositivo. Tuttavia, Windows non può riconoscere che un gruppo di devnodes ha avuto origine dallo stesso dispositivo fisico. Ogni devnode appartenente allo stesso dispositivo multifunzione non include informazioni di identificazione che consentono al gestore di Plug and Play (PnP) di raggruppare più devnodes come singolo dispositivo. Pertanto, non è possibile avere una visualizzazione olistica del dispositivo e le funzioni fornite da un singolo dispositivo fisico.

A partire da Windows 7, il sistema operativo usa un nuovo ID (ID contenitore) per raggruppare uno o più devnodes provenienti da e appartenere a ogni istanza di un determinato dispositivo fisico. L'ID contenitore è una proprietà di ogni devnode e viene specificata tramite un valore GUID (Global Unique Identifier).

Ogni istanza di un dispositivo fisico installato nel computer ha un ID contenitore univoco. Tutti i devnodes che rappresentano una funzione in tale istanza del dispositivo fisico condividono lo stesso ID contenitore. Nella figura seguente viene illustrato un esempio di tale relazione.

diagramma che illustra gli ID contenitore per i devnodes di un dispositivo multifunzione.

Esiste un ID contenitore con un significato speciale per i driver del bus: NULL_GUID definito come : {00000000-0000-0000-0000-000000000000}.

In generale, non restituire NULL_GUID come caso predefinito quando si segnala un ID contenitore. Non gestire invece IRP_MN_QUERY_ID per il caso busQueryContainerIDs e consentire a PnP di applicare la logica predefinita.

Quando si restituisce NULL_GUID come ID contenitore, un driver del bus dichiara a PnP che il dispositivo non deve essere parte di alcun contenitore, quindi restituire NULL_GUID è appropriato solo in casi molto speciali. Ad esempio, un devnode , ad esempio un dispositivo di volume, può estendersi su più dischi in più contenitori, ma non appartiene a alcun contenitore. Tale dispositivo avrà un DEVPKEY_Device_BaseContainerId uguale a NULL_GUID e non avrà un DEVPKEY_Device_ContainerId a tutti.

Oltre ai casi molto speciali, un conducente del bus non dovrebbe mai restituire NULL_GUID quando segnala un dispositivo hardware e i driver del bus devono proteggere l'hardware difettoso che segnala un valore NULL_GUID dal loro bus. In questi casi il driver del bus deve trattarlo come un errore del dispositivo o considerarlo come se il dispositivo non segnalasse un valore.