Criação de subdispositivos
O termo subdispositivo é usado para descrever a associação dos quatro componentes listados na tabela a seguir.
Componente | Descrição |
---|---|
Objeto Miniport |
Um objeto que expõe a interface IMiniportXxx do driver de miniport |
Objeto Port |
Um objeto que expõe a interface IPortXxx do driver de porta |
Objeto de lista de recursos |
Um objeto que contém uma lista de recursos do driver do adaptador atribuídos ao subdispositivo |
Cadeia de caracteres de referência |
Um nome adicionado ao nome do caminho do dispositivo para especificar um subdispositivo durante a criação do filtro |
As interfaces IMiniportXxx e IPortXxx de um subdevice herdam das interfaces base IMiniport e IPort, respectivamente.
O driver do sistema PortCls não distingue entre o driver de porta e o driver de miniport. Ele simplesmente requer um objeto, como o objeto de porta, com uma interface que pode lidar com solicitações geradas pelo sistema.
Da mesma forma, PortCls não está diretamente envolvido no gerenciamento de recursos. Ele só precisa associar o manipulador de solicitação (o driver de porta) a uma lista de recursos. O driver do adaptador é responsável por associar os objetos de porta, miniporte e lista de recursos.
O exemplo de código a seguir mostra como o driver do adaptador executa essas ações:
//
// 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();
}
Para obter informações sobre as chamadas de função PortCls no exemplo de código anterior, consulte PcNewPort, PcNewMiniport e PcRegisterSubdevice.