驱动程序注册和启动/停止控件
操作系统启动时,Windows 会根据注册表中的设置加载 RDBSS 和任何网络小型重定向程序驱动程序。 对于使用 rdbsslib 进行静态链接的单一网络小型重定向程序驱动程序,驱动程序必须从其DriverEntry例程调用RxDriverEntry例程,以初始化与网络驱动程序链接的 rdbsslib 库的副本。 在这种情况下,在调用和使用任何其他 RDBSS 例程之前,必须先调用 RxDriverEntry 例程。 对于非单一网络小型重定向程序驱动程序 (Microsoft SMB 重定向程序) ,在加载 rdbss.sys 设备驱动程序时,会在其自己的 DriverEntry 例程中进行初始化。
当驱动程序由内核加载并在卸载驱动程序时使用 RDBSS 取消注册时,网络小型重定向器将注册到 RDBSS。 网络小型重定向程序通知 RDBSS,它已通过调用 RxRegisterMinirdr(从 RDBSS 导出的注册例程)已加载。 作为此注册过程的一部分,网络小型重定向器会将参数传递给 RxRegisterMinirdr ,这是指向大型结构 MINIRDR_DISPATCH 的指针。 此结构包含网络小型重定向器的配置信息,以及指向由网络小型重定向程序内核驱动程序实现的回调例程的发送表。 RDBSS 通过此回调例程列表进行网络小型重定向器驱动程序的调用。
RxRegisterMinirdr例程将网络微型重定向程序驱动程序的所有驱动程序调度例程设置为指向顶级 RDBSS 调度例程RxFsdDispatch。 网络小型重定向程序可通过以下方式重写此行为:保存其自己的入口点,并在调用RxRegisterMinirdr后重写驱动程序调度,并使用其自己的入口点重写此行为。
网络微重定向程序驱动程序在收到对其 MRxStart 例程的调用(在 MINIRDR_DISPATCH 结构中传递的回调例程之一)之前,不会实际启动操作。 如果网络小型重定向程序驱动程序希望接收操作的回调例程(除非网络小型重定向程序保留其自己的驱动程序调度入口点),则必须使用 MrxStart 回调例程。 否则,RDBSS 只允许将以下 i/o 请求数据包传递到驱动程序,直到 MrxStart 成功返回:
- IRP 的设备创建请求和设备操作,其中 > IRPSP 的长度为零, > 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 的调用返回 success,则 RDBSS 将 RDBSS 中的小型重定向器的内部状态设置为 RDBSS_STARTED。
RDBSS 导出例程 RxSetDomainForMailslotBroadcast,为 mailslot 广播设置域。 如果网络小型重定向程序支持 mailslots,则在注册过程中将使用此例程。
可以使用 RDBSS 导出的便利例程( __RxFillAndInstallFastIoDispatch)将用于处理 i/o 请求处理的所有 IRP_MJ_XXX 驱动程序例程指针复制到可比较的快速 i/o 调度向量,但此例程仅适用于非单片驱动程序。
RDBSS 还会导出例程,通知 RDBSS 网络微型重定向程序正在启动或停止。 如果网络小型重定向器包括可启动和停止重定向程序的用户模式管理服务或实用程序,则使用这些调用。 此用户模式服务或应用程序可将自定义的 FSCTL 或 IOCTL 请求发送到网络小型重定向程序驱动程序,以指示它应启动或停止。 重定向程序可调用 RDBSS RxStartMinirdr 或 RxStopMinirdr 例程,通知 RDBSS 启动或停止此网络微型重定向程序。
下表列出了 RDBSS 驱动程序注册和启动/停止控制例程。
例程所返回的值 | 说明 |
---|---|
此例程由单一网络小型重定向程序驱动程序从其 DriverEntry 例程调用,用于初始化 RDBSS。 对于非单片驱动程序,此初始化例程等效于 rbss.sys 设备驱动程序的 DriverEntry 例程。 |
|
此例程由网络微重定向程序驱动程序调用,用于向 RDBSS 注册驱动程序,这会将注册信息添加到内部注册表。 RDBSS 还为网络小型重定向程序构建设备对象。 |
|
如果驱动程序支持 mailslots,则网络微型重定向程序驱动程序将调用此例程来设置用于 mailslot 广播的域。 |
|
此例程启动一个网络微型重定向程序,调用它来注册自身。 如果驱动程序指示支持 UNC 名称,则 RDBSS 还会将网络微型重定向程序驱动程序注册为包含 MUP 的 UNC 提供程序。 |
|
此例程停止网络微型重定向程序驱动程序。 已停止的驱动程序将不再接收 IOCTL 或 FSCTL 请求以外的新命令。 |
|
此例程由网络微型重定向程序驱动程序调用,用来向 RDBSS 反注册驱动程序,并从内部 RDBSS 注册表中删除注册信息。 |
|
此例程是 rxstruc 中定义的内联函数,由网络微型重定向程序驱动程序调用,用于向 RDBSS 取消注册驱动程序并从内部 RDBSS 注册表中删除注册信息。 RxUnregisterMinirdr内联函数在内部调用RxpUnregisterMinirdr。 |
|
此例程使用正常调度 i/o 向量完全相同的 i/o 调度向量,并将其安装到与传递的设备对象关联的驱动程序对象中。 |
以下宏在 mrx 头文件中定义,该文件调用这些例程之一。 通常使用此宏,而不是直接调用 __RxFillAndInstallFastIoDispatch 例程。
宏 | 说明 |
---|---|
RxFillAndInstallFastIoDispatch (__devobj, __fastiodisp) |
此宏调用 __RxFillAndInstallFastIoDispatch来填写快速 i/o 调度向量,使其与正常调度 i/o 向量相同,并将其安装到与传递的设备对象关联的驱动程序对象中。 |