次の方法で共有


サブデバイスの作成

サブデバイスという用語は、次の表にリストされている 4 つのコンポーネントのバインドを説明するために使用されます。

コンポーネント 説明

ミニポート オブジェクト

ミニポート ドライバーの 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();
  }

PcRegisterSubdevice.前述のコード例の PortCls 関数呼び出しの詳細情報は、PcNewPortPcNewMiniport、および PcRegisterSubdeviceを参照してください。