创建子设备
术语子设备用于描述下表中列出的四个组件的绑定。
组件 | 说明 |
---|---|
微型端口对象 |
公开微型端口驱动程序的 IMiniportXxx 接口的对象 |
Port 对象 |
公开端口驱动程序的 IPortXxx 接口的对象 |
资源列表对象 |
一个对象,其中包含分配给子资源的适配器驱动程序资源列表 |
引用字符串 |
添加到设备路径名称的名称,用于在创建筛选器期间指定子资源 |
子接口的 IMiniportXxx 和 IPortXxx 接口分别继承自基接口 IMiniport 和 IPort。
PortCls 系统驱动程序无法区分端口驱动程序和微型端口驱动程序。 它只需要一个对象(如端口对象),该对象具有可以处理系统生成的请求的接口。
同样,PortCls 不直接参与管理资源。 它只需要将请求处理程序(端口驱动程序)绑定到资源列表。 适配器驱动程序负责将端口、微型端口和资源列表对象绑定在一起。
以下代码示例演示适配器驱动程序如何执行以下操作:
//
// 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();
}
有关上述代码示例中 PortCls 函数调用的信息,请参阅 PcNewPort、 PcNewMiniport 和 PcRegisterSubdevice。