初始化筛选器驱动程序
筛选器驱动程序初始化在系统加载驱动程序后立即发生。 筛选器驱动程序作为系统服务加载。 系统可以在微型端口驱动程序加载之前、期间或之后的任何时候加载筛选器驱动程序。 筛选器驱动程序支持的类型的微型端口适配器可用且筛选器驱动程序初始化完成之后,NDIS 可以将筛选器模块附加到微型端口适配器。
驱动程序堆栈启动时,如果尚未加载筛选器驱动程序,系统会加载这些驱动程序。 有关启动包含筛选器模块的驱动程序堆栈的详细信息,请参阅 启动驱动程序堆栈。
加载筛选器驱动程序后,系统会调用驱动程序的 DriverEntry 例程。
系统将两个参数传递给 DriverEntry:
指向 I/O 系统创建的驱动程序对象的指针。
指向注册表路径的指针,该路径指定特定于驱动程序的参数的存储位置。
如果驱动程序成功注册为 NDIS 筛选器驱动程序,则 DriverEntry 返回STATUS_SUCCESS或其等效NDIS_STATUS_SUCCESS。 如果 DriverEntry 通过传播 NdisXxx 函数或内核模式支持例程返回的错误状态来初始化失败,驱动程序将不会保持加载状态。 DriverEntry 必须同步执行;也就是说,它不能返回STATUS_PENDING或其等效NDIS_STATUS_PENDING。
筛选器驱动程序在 NDIS 中注册为筛选器驱动程序时,将驱动程序对象传递给 NdisFRegisterFilterDriver 函数。 驱动程序可以使用注册表路径获取配置信息。 有关如何访问筛选器驱动程序配置信息的详细信息,请参阅 访问筛选器驱动程序的配置信息。
筛选器驱动程序从其 DriverEntry 例程调用 NdisFRegisterFilterDriver。 筛选器驱动程序通过将 NDIS_FILTER_DRIVER_CHARACTERISTICS 结构传递到 FilterCharacteristics 参数处的 NdisFRegisterFilterDriver 来导出一组 FilterXxx 函数。
NDIS_FILTER_DRIVER_CHARACTERISTICS 结构指定必需和可选 FilterXxx 函数的入口点。 可以绕过某些可选函数。 有关绕过函数的详细信息,请参阅 数据绕过模式。
调用 NdisFRegisterFilterDriver 的 驱动程序必须准备好立即调用其任何 FilterXxx 函数。
NDIS_FILTER_DRIVER_CHARACTERISTICS 结构指定以下必需 FilterXxx 函数的入口点:
NDIS_FILTER_DRIVER_CHARACTERISTICS 结构指定以下可选、运行时不可更改 的 FilterXxx 函数的入口点:
FilterCancelSendNetBufferLists
NDIS_FILTER_DRIVER_CHARACTERISTICS 结构指定以下可选、运行时可更改 的 FilterXxx 函数的默认入口点:
FilterSendNetBufferListsComplete
上述四个函数也在 NDIS_FILTER_PARTIAL_CHARACTERISTICS 结构中定义。 此结构指定可以通过从 FilterSetModuleOptions 函数调用 NdisSetOptionalHandlers 函数在运行时更改的函数。 如果筛选器驱动程序将在运行时更改这些部分特征,则必须提供 FilterSetModuleOptions 的入口点。 每个筛选器模块的部分特征可能不同。 有关详细信息,请参阅 启动筛选器模块。
NDIS 在调用 NdisFRegisterFilterDriver 的上下文中调用 FilterSetOptions 函数。 FilterSetOptions 向 NDIS 注册可选服务。 有关详细信息,请参阅 配置可选筛选器驱动程序服务。
如果调用 NdisFRegisterFilterDriver 成功,则 NDIS 使用筛选器驱动程序句柄填充 NdisFilterDriverHandle 中的变量。 筛选器驱动程序保存此句柄,稍后将此句柄传递给需要筛选器驱动程序句柄作为输入参数的 NDIS 函数,例如 NdisFDeregisterFilterDriver。 当驱动程序卸载时,它必须调用 NdisFDeregisterFilterDriver 函数,以释放 由 NdisFRegisterFilterDriver 分配的驱动程序资源。
FilterSetOptions 返回后,筛选器模块将处于“分离”状态。 对 FilterSetOptions 的调用返回后,NDIS 可以随时调用筛选器驱动程序的 FilterAttach 函数。 驱动程序在 FilterAttach 函数中执行特定于筛选器模块的初始化。 有关将筛选器模块附加到驱动程序堆栈的详细信息,请参阅 附加筛选器模块。
筛选器驱动程序还会执行它在 DriverEntry 中所需的任何其他特定于驱动程序的初始化。 筛选器驱动程序必须释放其 FilterDriverUnload 例程中分配的特定于驱动程序的资源。 有关详细信息,请参阅 卸载筛选器驱动程序。