Bagikan melalui


Urutan Startup

Karena driver adaptor diinstal sebagai layanan driver mode kernel, sistem operasi memuat driver adaptor pada waktu startup sistem dan memanggil rutinitas DriverEntry driver. Rutinitas DriverEntry menerima dua parameter: objek driver dan nama jalur registri. DriverEntry harus memanggil fungsi PortCls PcInitializeAdapterDriver dengan parameter nama driver-object dan registry-path ditambah parameter ketiga, yang merupakan penunjuk ke fungsi AddDevice driver adapter.

Dalam contoh berikut, fungsi DriverEntry driver meneruskan penunjuk MyAddDevicefungsi , yang menunjuk ke fungsi AddDevice driver, sebagai parameter ketiga untuk rutinitas PcInitializeAdapterDriver .

NTSTATUS 
  DriverEntry( 
    PDRIVER_OBJECT  DriverObject,
    PUNICODE_STRING  RegistryPath
    )
  {
      return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
  }

Rutinitas PcInitializeAdapterDriver menginstal rutinitas AddDevice yang disediakan dalam ekstensi driver objek driver dan menginstal handler IRP driver PortCls di objek driver itu sendiri.

Kode berikut adalah contoh implementasi fungsi driver MyAddDevice .

#define MAX_MINIPORTS 6    // maximum number of miniports
NTSTATUS
  MyAddDevice(
    PDRIVER_OBJECT  DriverObject,
    PDEVICE_OBJECT  PhysicalDeviceObject 
    )
  {
      return PcAddAdapterDevice(DriverObject, PhysicalDeviceObject, MyStartDevice,
                                MAX_MINIPORTS, 0);
  }

Fungsi ini memanggil fungsi PortCls PcAddAdapterDevice, yang membuat perangkat adaptor yang ditentukan, mengaitkan driver dengan perangkat, dan menyimpan penunjuk ke fungsi driver MyStartDevice adaptor, yang dipanggil saat sistem operasi memulai perangkat (lihat Memulai Perangkat). Rutinitas PcAddAdapterDevice membuat objek perangkat fungsi (FDO) dan mengaitkannya dengan objek perangkat fisik (PDO) yang disediakan oleh sistem. FDO baru dibuat dengan ekstensi yang digunakan PortCls untuk menyimpan informasi konteks tentang perangkat. Konteks ini mencakup penunjuk MyStartDevice fungsi yang disediakan oleh MyAddDevice.

Setelah sistem operasi menentukan sumber daya apa (mengganggu, saluran DMA, alamat port I/O, dan sebagainya) untuk ditetapkan ke perangkat, ia mengirimkan permintaan untuk memulai (IRP_MN_START_DEVICE) kepada perangkat. Menanggapi permintaan ini, handler permintaan di driver PortCls memanggil fungsi driver MyStartDevice adaptor, yang ditunjukkan dalam contoh kode berikut:

NTSTATUS
  MyStartDevice(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp,
    PRESOURCELIST ResourceList
    )
  {
    ...
  }

Handler permintaan dilengkapi MyStartDevice dengan pointer ke objek perangkat, permintaan IRP_MN_START_DEVICE, dan daftar sumber daya (lihat IResourceList). Fungsi ini MyStartDevice mempartisi daftar sumber daya ke dalam sumber daya yang diperlukan untuk setiap driver miniport yang perlu dimulai. Fungsi kemudian memulai setiap driver miniport dan mengembalikan kontrol ke PortCls, yang menyelesaikan IRP dan mengembalikan kontrol ke sistem operasi.

Untuk contoh kode startup driver lainnya, lihat contoh driver adaptor audio di Microsoft Windows Driver Kit (WDK).