Création d’un sous-appareil
Le terme subdevice est utilisé pour décrire la liaison des quatre composants répertoriés dans le tableau suivant.
Composant | Description |
---|---|
Objet Miniport |
Objet qui expose l’interface IMiniportXxx du pilote miniport |
Objet Port |
Objet qui expose l’interface IPortXxx du pilote de port |
Objet de liste de ressources |
Objet contenant une liste de ressources de pilote d’adaptateur qui sont affectées au sous-appareil |
Chaîne de référence |
Nom ajouté au nom du chemin d’accès de l’appareil pour spécifier un sous-appareil lors de la création du filtre |
Les interfaces IMiniportXxx et IPortXxx d’un sous-appareil héritent respectivement des interfaces de base IMiniport et IPort.
Le pilote système PortCls ne fait pas de distinction entre le pilote de port et le pilote miniport. Il nécessite simplement un objet, tel que l’objet port, avec une interface capable de gérer les requêtes générées par le système.
De même, PortCls n’est pas directement impliqué dans la gestion des ressources. Il doit uniquement lier le gestionnaire de requêtes (le pilote de port) à une liste de ressources. Le pilote de l’adaptateur est chargé de lier les objets de port, de miniport et de liste de ressources.
L’exemple de code suivant montre comment le pilote de l’adaptateur effectue ces actions :
//
// 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();
}
Pour plus d’informations sur les appels de fonction PortCls dans l’exemple de code précédent, consultez PcNewPort, PcNewMiniport et PcRegisterSubdevice.