创建子设备

术语子设备用于描述下表中列出的四个组件的绑定。

组件 说明

微型端口对象

公开微型端口驱动程序的 IMiniportXxx 接口的对象

Port 对象

公开端口驱动程序的 IPortXxx 接口的对象

资源列表对象

一个对象,其中包含分配给子资源的适配器驱动程序资源列表

引用字符串

添加到设备路径名称的名称,用于在创建筛选器期间指定子资源

子接口的 IMiniportXxx 和 IPortXxx 接口分别继承自基接口 IMiniportIPort

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 函数调用的信息,请参阅 PcNewPortPcNewMiniportPcRegisterSubdevice