Creazione di sottodispositivi
Il termine subdevice viene usato per descrivere l'associazione dei quattro componenti elencati nella tabella seguente.
Componente | Descrizione |
---|---|
Oggetto Miniport |
Oggetto che espone l'interfaccia IMiniportXxx del driver miniport |
Oggetto Porta |
Oggetto che espone l'interfaccia IPortXxx del driver di porta |
Oggetto Elenco risorse |
Oggetto contenente un elenco di risorse del driver dell'adattatore assegnate al sottodevice |
Stringa di riferimento |
Nome aggiunto al nome del percorso del dispositivo per specificare un sottodevice durante la creazione del filtro |
Le interfacce IMiniportXxx e IPortXxx di un subdevice ereditano rispettivamente da interfacce di base IMiniport e IPort.
Il driver di sistema PortCls non distingue tra il driver di porta e il driver miniport. Richiede semplicemente un oggetto, ad esempio l'oggetto porta, con un'interfaccia che può gestire le richieste generate dal sistema.
Analogamente, PortCls non è direttamente coinvolto nella gestione delle risorse. Deve associare solo il gestore della richiesta (il driver della porta) a un elenco di risorse. Il driver dell'adattatore è responsabile dell'associazione tra gli oggetti porta, miniport e elenco risorse.
Nell'esempio di codice seguente viene illustrato come il driver dell'adapter esegue queste azioni:
//
// Instantiate the port by calling a function supplied by PortCls.
//
PPORT port;
NTSTATUS ntStatus = PcNewPort(&port, PortClassId);
if (NT_SUCCESS(ntStatus))
{
PUNKNOWN miniport;
//
// Create the miniport object.
//
if (MiniportCreate) // a function to create a proprietary miniport
{
ntStatus = MiniportCreate(&miniport,
MiniportClassId, NULL, NonPagedPool);
}
else // Ask PortCls for one of its built-in miniports.
{
ntStatus = PcNewMiniport((PMINIPORT*)&miniport,
MiniportClassId);
}
if (NT_SUCCESS(ntStatus))
{
//
// Bind the port, miniport, and resources.
//
ntStatus = port->Init(DeviceObject,
Irp, miniport, UnknownAdapter, ResourceList);
if (NT_SUCCESS(ntStatus))
{
//
// Hand the port driver and the reference
// string to PortCls.
//
ntStatus = PcRegisterSubdevice(DeviceObject,
Name, port);
}
//
// We no longer need to reference the miniport driver.
// Either the port driver now references it,
// or binding failed and it should be deleted.
//
miniport->Release();
}
//
// Release the reference that existed when PcNewPort() gave us
// the pointer in the first place. This reference must be released
// regardless of whether the binding of the port and miniport
// drivers succeeded.
//
port->Release();
}
Per informazioni sulle chiamate della funzione PortCls nell'esempio di codice precedente, vedere PcNewPort, PcNewMiniport e PcRegisterSubdevice.