Pembuatan Subdevice

Istilah subdevice digunakan untuk menjelaskan pengikatan empat komponen yang tercantum dalam tabel berikut.

Komponen Deskripsi

Objek miniport

Objek yang mengekspos antarmuka IMiniportXxx driver miniport

Objek port

Objek yang mengekspos antarmuka IPortXxx driver port

Objek daftar sumber daya

Objek yang berisi daftar sumber daya driver adapter yang ditetapkan ke subdevice

String referensi

Nama yang ditambahkan ke nama jalur perangkat untuk menentukan subdevice selama pembuatan filter

Antarmuka IMiniportXxx dan IPortXxx subdevice masing-masing mewarisi dari antarmuka dasar IMiniport dan IPort.

Driver sistem PortCls tidak membedakan antara driver port dan driver miniport. Ini hanya memerlukan objek, seperti objek port, dengan antarmuka yang dapat menangani permintaan yang dihasilkan sistem.

Demikian pula, PortCls tidak terlibat langsung dalam mengelola sumber daya. Ini hanya perlu mengikat handler permintaan (driver port) ke daftar sumber daya. Driver adaptor bertanggung jawab untuk mengikat port, miniport, dan objek daftar sumber daya bersama-sama.

Contoh kode berikut menunjukkan bagaimana driver adaptor melakukan tindakan ini:

  //
  // 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();
  }

Untuk informasi tentang panggilan fungsi PortCls dalam contoh kode sebelumnya, lihat PcNewPort, PcNewMiniport, dan PcRegisterSubdevice.