初始化微型端口驱动程序

当网络设备可用时,系统加载 NDIS 微型端口驱动程序以管理设备 (如果驱动程序尚未加载) 。 每个微型端口驱动程序都必须提供 DriverEntry 函数。 系统在加载驱动程序后调用 DriverEntryDriverEntry 将微型端口驱动程序的特征注册到 NDIS (包括支持的 NDIS 版本和驱动程序入口点) 。

系统将两个参数传递给 DriverEntry

  • 指向 I/O 系统创建的驱动程序对象的指针。

  • 指向注册表路径的指针,该路径指定特定于驱动程序的参数的存储位置。

DriverEntry 中,微型端口驱动程序在调用 NdisMRegisterMiniportDriver 函数时传递这两个指针。 微型端口驱动程序通过将入口点存储在 NDIS_MINIPORT_DRIVER_CHARACTERISTICS 结构中并将该结构传递给 NdisMRegisterMiniportDriver 来导出一组标准 MiniportXxx 函数。

微型端口驱动程序的 DriverEntry 返回由调用 NdisMRegisterMiniportDriver 返回的值。

微型端口驱动程序还会在 DriverEntry 中执行任何其他特定于驱动程序的初始化。 驱动程序在 MiniportInitializeEx 函数中执行特定于适配器的初始化。 有关适配器初始化的详细信息,请参阅 初始化适配器

DriverEntry 可以在堆栈上分配 NDIS_MINIPORT_DRIVER_CHARACTERISTICS 结构,因为 NDIS 库将相关信息复制到其自己的存储。 DriverEntry 应在其成员中设置驱动程序提供的任何值之前,使用 NdisZeroMemory 清除此结构的内存。 MajorNdisVersionMinorNdisVersion 成员必须包含驱动程序支持的 NDIS 的主要和次要版本。 在特征结构的每个 XxxHandler 成员中, DriverEntry 必须设置驱动程序提供的 MiniportXxx 函数的入口点,否则该成员必须为 NULL

为了使微型端口驱动程序能够配置可选服务,NDIS 在微型端口驱动程序调用 NdisMRegisterMiniportDriver 的上下文中调用 MiniportSetOptions 函数。 有关可选服务的详细信息,请参阅 配置可选的微型端口驱动程序服务

调用 NdisMRegisterMiniportDriver 的驱动程序必须做好准备,以便 NDIS 在 DriverEntry 返回后随时调用其 MiniportInitializeEx 函数。 此类驱动程序必须有足够的安装和配置信息存储在注册表中,或者可以通过调用 特定于 NdisXxx 总线类型的配置函数来设置驱动程序执行网络 I/O 操作所需的任何特定于 NIC 的资源。

微型端口驱动程序最终必须调用 NdisMDeregisterMiniportDriver ,以释放它通过调用 NdisMRegisterMiniportDriver 分配的资源。 如果在调用 NdisMRegisterMiniportDriver 成功后驱动程序初始化失败,驱动程序可以从 DriverEntry 中调用 NdisMDeregisterMiniportDriver。 否则,微型端口驱动程序必须释放其 MiniportDriverUnload 函数中分配的特定于驱动程序的资源。 换句话说,如果 NdisMRegisterMiniportDriver 不返回NDIS_STATUS_SUCCESS, 则 DriverEntry 必须在返回控制权之前释放它分配的任何资源。 如果发生这种情况,将不会加载驱动程序。 有关详细信息,请参阅 卸载微型端口驱动程序