RxStartMinirdr 函数 (mrx.h)

调用 RxStartMinirdr 来启动以前调用的用于注册 RDBSS 的网络微型重定向程序。 作为 RxStartMinirdr 的一部分,如果驱动程序指示支持 UNC 名称,RDBSS 还将将网络微型重定向程序驱动程序注册为 UNC) 提供程序的通用命名 (约定, (MUP) 。

语法

NTSTATUS RxStartMinirdr(
  [in]  IN PRX_CONTEXT RxContext,
  [out] OUT PBOOLEAN   PostToFsp
);

参数

[in] RxContext

指向RX_CONTEXT结构的指针,用于获取设备对象并确定这是文件系统进程。

[out] PostToFsp

如果必须发布请求以供文件系统进程稍后处理,则为返回时设置为 TRUE 的逻辑值的指针。

返回值

如果启动序列成功或以下错误值之一,RxStartMinirdr 将返回STATUS_SUCCESS:

返回代码 说明
STATUS_ACCESS_DENIED 注册为 UNC 提供程序的请求失败,因为访问被拒绝。
STATUS_ACCESS_VIOLATION 注册为 UNC 提供程序的请求失败,出现访问冲突。
STATUS_INSUFFICIENT_RESOURCES 没有足够的资源来完成此例程。
STATUS_PENDING RDBSS 和网络微型重定向器的启动顺序必须在系统进程的上下文中完成,而不是在用户模式应用程序进程中完成。 如果对 RxStartMinirdr 的调用来自用户模式进程 (用户模式服务请求(例如) ),则会发布该请求,以便在 RDBSS 中稍后进行处理,并且将返回STATUS_PENDING。 如果某些内部 RDBSS 锁在等待前无法获取,则也可能返回此错误。 稍后将从系统线程完成调用。
STATUS_REDIRECTOR_STARTED 网络微型重定向程序已启动。

注解

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

网络微型重定向程序在收到对其 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 或 IOCTL 请求调用,以启动网络微型重定向程序。 成功调用 RxRegisterMinirdr 后,无法从网络微型重定向器的 DriverEntry 例程调用 RxStartMinirdr ,因为某些启动处理需要完成驱动程序初始化。

当 RDBSS 收到从用户模式发送到网络微型重定向程序驱动程序的 FSCTL 或 IOCTL 请求时,RDBSS 会创建一个RX_CONTEXT结构,并将此调用传递给网络微型重定向程序的 MRxLowIOSubmit[LOWIO_OP_FSCTL]MRxLowIOSubmit[LOWIO_OP_IOCTL] 调用回例程(在 MINIRDR_DISPATCH 结构中定义)。 网络微型重定向程序的此回调例程的实现将识别启动请求并调用 RxStartMinirdr。 下面更详细地列出了此正常事件过程:

  1. 用户模式应用程序发出专用 FSCTL 或 IOCTL 请求以启动网络微型重定向程序。

  2. RDBSS 内核驱动程序代表网络微型重定向程序接收 FSCTL 或 IOCTL 请求,因为 RDBSS 已将微型重定向程序驱动程序的驱动程序调度入口点替换为指向 RDBSS 内部例程。 请注意,这假定网络微型重定向程序在调用 RxRegisterMinirdr 时未在 Controls 参数中设置RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH。 传递给 RxRegisterMinirdr 的此选项异常,表明网络微型重定向程序不希望 RDBSS 替换其驱动程序调度入口点。

  3. RDBSS 代表网络重定向程序在内部接收 FSCTL 或 IOCTL 请求。 RDBSS 调度程序分配和初始化RX_CONTEXT结构。 然后,RDBSS 为此网络微型重定向程序调用MINIRDR_DISPATCH结构中定义的网络微型重定向程序 MRxLowIOSubmit[LOW_OP_FSCTL]MRxLowIOSubmit[LOW_OP_IOCTL] 例程,并将初始化的 RX_CONTEXT 结构作为参数传递。

  4. 此回调例程的网络微型重定向程序实现将识别用于启动和调用 RxStartMinirdr 的专用 FSCTL 或 IOCTL 请求,并将从 RDBSS 接收的RX_CONTEXT结构作为 RxContext 参数传入指针,并将 RxContextPostToFSP 成员的地址作为 PostToFsp 参数传递。

  5. 由于此调用是从用户模式发起的, 因此 RxStartMinirdr 将返回STATUS_PENDING并将 PostToFsp 设置为 TRUE。

  6. 网络微型重定向程序 MRxLowIOSubmit[LOW_OP_FSCTL]MRxLowIOSubmit[LOW_OP_IOCTL] 例程将收到此返回值,并将其传递回 RDBSS 调度程序。

  7. RDBSS 调度程序将收到STATUS_PENDING返回值,并将 PostToFsp 设置为 TRUE,然后将请求发布到工作线程以重新执行对网络微型重定向程序的调用。

在此之后,根据 FSCTL 或 IOCTL 是作为异步操作还是同步操作请求,有两种可能的结果。

如果这是异步请求,则会发生以下情况:

  • 用户模式调用方将收到来自呼叫的STATUS_PENDING响应。 已发布的工作线程最终会从文件系统线程调用 RxStartMinirdr ,并且将处理该调用。 如果请求, RxStartMinirdr 例程将尝试将网络微型重定向程序注册为 UNC 提供程序。 在 Windows Vista 之前的 Windows 版本中,RDBSS 将尝试将网络微型重定向程序注册为文件系统与 I/O 管理器。 如果这些调用成功, 则 RxStartMinirdr 将调用由网络微型重定向程序实现的 MrxStart 回调例程。 MrxStart 中的返回值最终将返回到作为异步操作启动调用序列进程的用户模式应用程序。

如果这是同步请求,则会发生以下情况:

  • 用户模式调用方不会收到STATUS_PENDING响应,但将被迫等待,直到从已发布的工作线程返回的调用。 已发布的工作线程最终会从文件系统线程调用 RxStartMinirdr ,并且将处理该调用。 如果请求, RxStartMinirdr 例程将尝试将网络微型重定向程序注册为 UNC 提供程序。 在 Windows Vista 之前的 Windows 版本中,RDBSS 将尝试将网络微型重定向程序注册为文件系统与 I/O 管理器。 如果这些调用成功, 则 RxStartMinirdr 将调用由网络微型重定向程序实现的 MrxStart 回调例程。 MrxStart 中的返回值将返回到启动调用序列进程的用户模式应用程序。

如果网络微型重定向程序指示在向 RDBSS 注册时支持 UNC, (Controls 参数到 RxRegisterMinirdr) ,则 RxStartMinirdr 将尝试将网络微型重定向器的 DeviceName 参数注册为 UNC 提供程序,MUP (RDBSS 代表网络微型重定向程序调用 FsRtlRegisterUncProvider) 。

在 Windows Vista 之前的 Windows 版本中, RxStartMinirdr 将文件系统注册到 I/O 管理器, (RDBSS 代表网络微型重定向程序) 调用 IoRegisterFileSystem

如果调用成功, 则 RxStartMinirdr 将调用网络微型重定向程序 MrxStart 例程。 如果 MrxStart 返回成功,则 RDBSS 中微型重定向程序的内部状态设置为RDBSS_STARTED。 微型重定向程序设备对象的 StartStopContext.Version 成员也将递增。

如果请求异步操作,则必须在系统进程的上下文中完成 RDBSS 和网络微型重定向器的启动顺序。 如果对 RxStartMinirdr 的调用来自用户模式进程 (用户模式服务请求(例如) ),则 RDBSS 将在内部将请求发布到工作队列供以后处理,并且将返回 STATUS_PENDING,PostToFsp 参数将设置为 TRUE。 此外,如果在等待的情况下无法获取某些内部 RDBSS 锁,则返回STATUS_PENDING并将 PostToFsp 设置为 TRUE。 返回STATUS_PENDING时,将从系统进程内再次调用 RxStartMinirdr 。 如果将发起调用 RxStartMinirdr 的 FSCTL 或 IOCTL 请求设置为异步操作,则 RDBSS 将返回STATUS_PENDING从用户模式备份到原始 FSCTL 或 IOCTL 请求的调用链。 相比之下,如果 FSCTL 或 IOCTL 请求用于同步操作,则调用也将发布到工作线程以供以后执行,但 FSCTL 或 IOCTL 调用在文件系统进程的上下文中执行 RxStartMinirdr 之前不会返回到用户模式。 在这种情况下,FSCTL 或 IOCTL 的调用方将永远不会看到STATUS_PENDING错误返回。 更典型的行为是针对这些启动/停止操作启动同步请求,以简化用户模式应用程序代码。

发生异常终止或其他故障时, RxStartMinirdr 将尝试撤消这些操作,包括取消向 MUP 注册 UNC 提供程序、取消注册文件系统、释放为存储要由 mailslot 广播使用的域名而分配的内存,以及更新内部 RDBSS 表。

要求

要求
目标平台 桌面
标头 mrx.h (包括 Mrx.h)
IRQL <= APC_LEVEL

另请参阅

、RxpUnregisterMinirdr

DriverEntry

FsRtlRegisterUncProvider

IoRegisterFileSystem

MRxLowIOSubmit[LOWIO_OP_FSCTL]

MRxLowIOSubmit[LOWIO_OP_IOCTL]

MRxStart

RxFsdDispatch

RxRegisterMinirdr

RxSetDomainForMailslotBroadcast

RxStopMinirdr

RxUnregisterMinirdr

__RxFillAndInstallFastIoDispatch