驱动程序注册和启动/停止控件

操作系统启动时,Windows 会根据注册表中的设置加载 RDBSS 和任何网络微型重定向程序驱动程序。 对于与 rdbsslib.lib 静态链接的单体网络微型重定向程序驱动程序,驱动程序必须从其 DriverEntry 例程调用 RxDriverEntry 例程,以初始化与网络驱动程序链接的 RDBSSLIB 库的副本。 在这种情况下,在调用和使用任何其他 RDBSS 例程之前,必须调用 RxDriverEntry 例程。 对于非整体式网络微型重定向程序驱动程序 (Microsoft SMB 重定向程序) ,rdbss.sys设备驱动程序在加载时在其自己的 DriverEntry 例程中初始化。

当内核加载驱动程序时,网络微型重定向程序会向 RDBSS 注册,并在卸载驱动程序时注销 RDBSS。 网络微型重定向程序通过调用从 RDBSS 导出的注册例程 RxRegisterMinirdr 来通知 RDBSS 已加载它。 作为此注册过程的一部分,网络微型重定向程序将参数传递给 RxRegisterMinirdr ,该参数是指向大型结构的指针,MINIRDR_DISPATCH。 此结构包含网络微型重定向程序的配置信息,以及指向由网络微型重定向程序内核驱动程序实现的回调例程的指针的调度表。 RDBSS 通过此回调例程列表调用网络微型重定向程序驱动程序。

RxRegisterMinirdr 例程将网络微型重定向程序驱动程序的所有驱动程序调度例程设置为指向顶级 RDBSS 调度例程 RxFsdDispatch。 网络微型重定向程序可以替代此行为,方法是在调用 RxRegisterMinirdr 返回后保存自己的入口点,并使用自己的入口点重写驱动程序调度,或者在调用 RxRegisterMinirdr 时设置特殊参数。

网络微型重定向程序驱动程序在收到对其 MRxStart 例程(MINIRDR_DISPATCH 结构中传递的回调例程之一)的调用之前,不会实际启动操作。 如果 MrxStart 回调例程希望接收用于操作的回调例程,则必须由网络微型重定向程序驱动程序实现,除非网络微型重定向程序保留其自己的驱动程序调度入口点。 否则,在 MrxStart 成功返回之前,RDBSS 将仅允许以下 I/O 请求数据包通过驱动程序:

  • 设备 IRP 请求创建和设备操作,其中 IRPSP 上的 FileObject-FileName.Length> 为零,FileObject-RelatedFileObject> 为 NULL

对于任何其他 IRP 请求,RDBSS 调度例程 RxFsdDispatch 将返回STATUS_REDIRECTOR_NOT_STARTED状态。

RDBSS 调度例程还会使以下 I/O 请求数据包的任何请求失败:

  • IRP_MJ_CREATE_MAILSLOT

  • IRP_MJ_CREATE_NAMED_PIPE

调用 RxStartMinirdr 例程时,RDBSS 将调用由网络微型重定向程序实现的 MrxStart 回调例程。 RDBSS RxStartMinirdr 例程通常是由于文件系统控制代码 (FSCTL) 或 I/O 控制代码 (IOCTL) 请求从用户模式应用程序或服务启动网络微型重定向程序的结果。 成功调用 RxRegisterMinirdr 后,无法从网络微型重定向器的 DriverEntry 例程调用 RxStartMinirdr,因为某些启动处理需要完成驱动程序初始化。 收到 RxStartMinirdr 调用后,RDBSS 将通过调用网络微型重定向器的 MrxStart 例程来完成启动过程。 如果对 MrxStart 的调用返回成功,则 RDBSS 将 RDBSS 中微型重定向器的内部状态设置为RDBSS_STARTED。

RDBSS 导出例程 RxSetDomainForMailslotBroadcast,以设置 mailslot 广播的域。 如果网络微型重定向程序支持 mailslot,则会在注册期间使用此例程。

RDBSS 导出的便捷例程 (__RxFillAndInstallFastIoDispatch)可用于将所有用于处理 I/O 请求处理的IRP_MJ_XXX驱动程序例程指针复制到类似的快速 I/O 调度向量,但此例程仅适用于非整体驱动程序。

RDBSS 还导出例程,以通知 RDBSS 网络微型重定向程序正在启动或停止。 如果网络微型重定向程序包含启动和停止重定向器的用户模式管理服务或实用工具应用程序,则使用这些调用。 此用户模式服务或应用程序可以将自定义 FSCTL 或 IOCTL 请求发送到网络微型重定向程序驱动程序,以指示它应启动或停止。 重定向程序可以调用 RDBSS RxStartMinirdrRxStopMinirdr 例程,以通知 RDBSS 启动或停止此网络微型重定向程序。

下表列出了 RDBSS 驱动程序注册和启动/停止控制例程。

例程所返回的值 说明

RxDriverEntry

此例程由整体网络微型重定向程序驱动程序从其 DriverEntry 例程调用,以初始化 RDBSS。

对于非整体驱动程序,此初始化例程等效于rbss.sys设备驱动程序的 DriverEntry 例程。

RxRegisterMinirdr

此例程由网络微型重定向程序驱动程序调用,以向 RDBSS 注册驱动程序,这将注册信息添加到内部注册表。 RDBSS 还会为网络微型重定向程序生成设备对象。

RxSetDomainForMailslotBroadcast

如果驱动程序支持 mailslot,则网络微型重定向程序驱动程序会调用此例程来设置用于 mailslot 广播的域。

RxStartMinirdr

此例程启动一个网络微型重定向程序,该重定向程序调用 以注册自身。 如果驱动程序指示支持 UNC 名称,RDBSS 还会将网络微型重定向程序驱动程序注册为 MUP 的 UNC 提供程序。

RxStopMinirdr

此例程停止网络微型重定向程序驱动程序。 停止的驱动程序将不再接收除 IOCTL 或 FSCTL 请求以外的新命令。

RxpUnregisterMinirdr

此例程由网络微型重定向程序驱动程序调用,以取消向 RDBSS 注册驱动程序,并从内部 RDBSS 注册表中删除注册信息。

RxUnregisterMinirdr

此例程是在 rxstruc.h 中定义的内联函数,由网络微型重定向程序驱动程序调用该函数,用于取消向 RDBSS 注册驱动程序的注册,并从内部 RDBSS 注册表中删除注册信息。 RxUnregisterMinirdr 内联函数在内部调用 RxpUnregisterMinirdr

__RxFillAndInstallFastIoDispatch

此例程将填充与常规调度 I/O 向量相同的快速 I/O 调度向量,并将其安装到与传递的设备对象关联的驱动程序对象中。

以下宏在调用其中一个例程的 mrx.h 头文件中定义。 通常使用此宏,而不是直接调用 __RxFillAndInstallFastIoDispatch 例程。

说明

RxFillAndInstallFastIoDispatch (__devobj__fastiodisp)

此宏调用 __RxFillAndInstallFastIoDispatch以填充与常规调度 I/O 向量相同的快速 I/O 调度向量,并将其安装到与传递的设备对象关联的驱动程序对象中。