啟動順序
因為介面卡驅動程式會安裝為核心模式驅動程式服務,所以作業系統會在系統啟動時載入配接器驅動程式,並呼叫驅動程式的 DriverEntry 常式。 DriverEntry常式會收到兩個參數:驅動程式物件和登錄路徑名稱。 DriverEntry 應該使用 driver-object 和 registry-path 名稱參數以及第三個參數呼叫 PortCls 函式 PcInitializeAdapterDriver ,這是配接器驅動程式 AddDevice 函式的指標。
在下列範例中,驅動程式的 DriverEntry 函式會傳遞函式指標 MyAddDevice
,指向驅動程式的 AddDevice 函式,做為 PcInitializeAdapterDriver 常式的第三個參數。
NTSTATUS
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
}
PcInitializeAdapterDriver常式會在驅動程式物件的驅動程式擴充功能中安裝提供的AddDevice常式,並在驅動程式物件本身安裝 PortCls 驅動程式的 IRP 處理常式。
下列程式碼是驅動程式函式的範例實作 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);
}
此函式會呼叫 PortCls 函式 PcAddAdapterDevice,這會建立指定的配接器裝置、建立驅動程式與裝置的關聯,以及儲存介面卡驅動程式函 MyStartDevice
式的指標,當作業系統啟動裝置時呼叫, (請參閱 啟動裝置) 。 PcAddAdapterDevice常式會 (FDO) 建立功能裝置物件,並將它與系統所提供的實體裝置物件 (PDO) 產生關聯。 新的 FDO 是使用 PortCls 用來儲存裝置內容資訊的擴充功能所建立。 此內容包含 MyStartDevice
所提供的 MyAddDevice
函式指標。
作業系統判斷 (中斷、DMA 通道、I/O 埠位址等) 指派給裝置的資源之後,它會將要求傳送給裝置,以啟動 (IRP_MN_START_DEVICE) 。 為了回應此要求,PortCls 驅動程式中的要求處理常式會呼叫配接器驅動程式的 MyStartDevice
函式,如下列範例程式碼所示:
NTSTATUS
MyStartDevice(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PRESOURCELIST ResourceList
)
{
...
}
要求處理常式會 MyStartDevice
提供裝置物件的指標、IRP_MN_START_DEVICE要求和資源清單, (請參閱 IResourceList) 。 函 MyStartDevice
式會將資源清單分割成每個需要啟動之迷你埠驅動程式所需的資源。 函式接著會啟動每個迷你埠驅動程式,並將控制權傳回至 PortCls,這會完成 IRP 並將控制權傳回至作業系統。
如需驅動程式啟動程式碼的更多範例,請參閱 Microsoft Windows 驅動程式套件中的範例音訊配接器驅動程式 (WDK) 。