PMRX_CALLDOWN回调函数 (mrx.h)

此回调由 RDBSS 调用,以请求网络微型重定向程序执行基于提供的 IRP 的操作。

语法

PMRX_CALLDOWN PmrxCalldown;

NTSTATUS PmrxCalldown(
  [in, out] IN OUT PRX_CONTEXT RxContext
)
{...}

参数

[in, out] RxContext

指向RX_CONTEXT结构的指针。 此参数包含请求操作的 IRP。

返回值

此回调在成功时返回STATUS_SUCCESS或相应的 NTSTATUS 值,如下所示:

返回代码 说明
STATUS_ACCESS_DENIED 已发出停止或启动网络微型重定向程序的请求,但调用方缺少此操作的适当安全性。
STATUS_BUFFER_OVERFLOW 用于接收扩展属性信息的缓冲区太小。 应将此返回值视为成功,并且应在 RxContext 参数指向的 RX_CONTEXT 结构的 Info.Buffer 成员中返回尽可能多的有效数据。
STATUS_BUFFER_TOO_SMALL 缓冲区太小,无法接收请求的数据。 如果返回此值,则应将 RxContext 参数指向的 RX_CONTEXT 结构的 InformationToReturn 成员设置为要成功调用的预期缓冲区的最小大小。
STATUS_CONNECTION_DISCONNECTED 连接已断开连接。
STATUS_EA_CORRUPT_ERROR 从远程服务器接收了无效的扩展属性信息。
STATUS_EA_TOO_LARGE 传递的扩展属性信息大于远程共享支持的大小。
STATUS_FILE_CLOSED FCB 结构已收购,但关联的SRV_OPEN结构已关闭。
STATUS_INSUFFICIENT_RESOURCES 资源不足,无法完成操作。
STATUS_INTERNAL_ERROR 网络微型重定向器中发生内部错误。
STATUS_INVALID_BUFFER_SIZE 请求的缓冲区大小太大。
STATUS_INVALID_DEVICE_REQUEST 向网络微型重定向程序发送了无效的设备请求。
STATUS_INVALID_NETWORK_RESPONSE 从远程服务器收到无效响应。
STATUS_INVALID_PARAMETER 在 RxContext 中指定了无效的参数。
STATUS_LINK_FAILED 尝试重新连接到远程服务器以完成请求失败。
STATUS_MORE_PROCESSING_REQUIRED 网络微型重定向程序返回此值以禁用此打开的请求的折叠。
STATUS_NETWORK_ACCESS_DENIED 网络访问被拒绝。 如果要求网络微型重定向程序在只读共享上打开新文件,则可能会返回此错误。
STATUS_NETWORK_NAME_DELETED 已删除网络名称。
STATUS_NONEXISTENT_EA_ENTRY 文件对象上没有扩展属性,并且用户提供了扩展属性索引。
STATUS_NOT_IMPLEMENTED 请求的功能(如远程启动或远程页面文件)未实现。
STATUS_NOT_SUPPORTED 不支持请求的功能,例如扩展属性。
STATUS_OBJECT_NAME_COLLISION 要求网络微型重定向程序创建已存在的文件。
STATUS_OBJECT_NAME_NOT_FOUND 找不到对象名称。 如果要求网络微型重定向程序打开不存在的文件,则可能会返回此错误。
STATUS_OBJECT_PATH_NOT_FOUND 找不到对象路径。 如果请求了 NTFS 流对象,并且远程文件系统不支持流,则可能会返回此错误。
STATUS_ONLY_IF_CONNECTED SRV_OPEN结构未连接。
STATUS_REDIRECTOR_HAS_OPEN_HANDLES 这是停止网络微型重定向程序的请求,但重定向程序具有打开的句柄,阻止它此时停止。
STATUS_REDIRECTOR_NOT_STARTED 这是停止网络微型重定向程序的请求,但未启动重定向程序。
STATUS_REDIRECTOR_STARTED 这是启动网络微型重定向程序的请求,但重定向程序已启动。
STATUS_REPARSE 需要重新分析来处理符号链接。
STATUS_REQUEST_ABORTED 网络请求已中止。
STATUS_RETRY 应重试该操作。 如果网络微型重定向程序遇到共享冲突或拒绝访问错误,可能会返回此错误。
STATUS_SHARING_VIOLATION 发生共享冲突。
STATUS_UNSUCCESSFUL 调用失败。

注解

RDBSS 调用 MRxCloseSrvOpen 例程,以请求网络微型重定向程序关闭SRV_OPEN结构。

MRxCloseSrvOpen 由 RDBSS 作为对文件对象的清理和关闭操作的一部分调用。 假定网络微型重定向程序将在整个网络中关闭文件。

在调用 MRxCloseSrvOpen 之前,RDBSS 会修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

MajorFunction 设置为 IRP_MJ_CLOSE

pFcb 设置为要为其启动关闭处理的 FCB 结构

pFobx 设置为要为其启动关闭处理的 FOBX 结构

当用户关闭文件时,RDBSS 和网络微型重定向程序不一定关闭SRV_OPEN结构。 为了在某些情况下提高性能,网络微型重定向程序可能会尝试重复使用SRV_OPEN和缓存的数据,而无需与服务器联系。 某些 Microsoft Windows 应用程序表现出打开、读取和关闭文件,然后快速重新打开同一文件的行为。 在这些情况下,重用SRV_OPEN结构可以提高性能。

RDBSS 调用 MRxCloseSrvOpen 以在清理 FOBX 结构时延迟关闭处理。 当关闭处理因预期打开的请求而延迟,并且没有打开的请求传入时,就会发生这种情况。

MRxCloseSrvOpen 不能返回值 STATUS_RETRY指示应重试调用。 如果需要重试循环,则必须在 MRxCloseSrvOpen 例程中由网络微型重定向程序在内部处理该循环。

RDBSS 调用 MRxCollapseOpen 例程,请求网络微型重定向程序将打开的文件系统请求折叠到现有的SRV_OPEN结构上。

RDBSS 调用 MRxCollapseOpen 以在本地折叠SRV_OPEN结构。 咨询网络微型重定向程序以确定是否可能发生折叠,因此没有理由调用网络微型重定向程序两次。 如果网络微型重定向程序决定折叠SRV_OPEN结构,它将这样做并传回可返回的状态。 STATUS_SUCCESS 的返回值是终止返回值。 不同的返回值(例如,STATUS_MORE_PROCESSING_REQUIRED)被视为非终止返回值。

在调用 MRxCollapseOpen 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

pRelevantSrvOpen 设置为折叠SRV_OPEN结构。

Create.pSrvCall 设置为与SRV_OPEN关联的SRV_CALL结构。

如果网络微型重定向程序决定折叠SRV_OPEN结构,则必须将RX_CONTEXT结构的 SrvOpen 成员设置为折叠SRV_OPEN结构。

RDBSS 调用MRxCreate 例程来请求网络微型重定向程序创建文件系统对象。

RDBSS 调用 MRxCreate 以请求网络微型重定向程序跨网络打开文件系统对象。 此调用由 RDBSS 发出,以响应接收 IRP_MJ_CREATE 请求。

在调用 MRxCreate 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

pRelevantSrvOpen 设置为 SRV_OPEN 结构。

Create.pSrvCall 设置为 SRV_CALL 结构。

Create.NtCreateParameters 设置为请求的NT_CREATE_PARAMETERS。

在网络微型重定向器的上下文中,文件对象引用关联的文件控制块 (FCB) 和文件对象扩展 (FOBX) 结构。 文件对象和 FOBX 之间存在一对一的对应关系。 许多文件对象将引用同一 FCB,它表示远程服务器上的单个文件。 客户端可以有多个不同的打开请求 (NtCreateFile 请求) 在同一个 FCB 上,每个请求都将创建一个新的文件对象。 RDBSS 和网络微型重定向程序可以选择发送比收到的 NtCreateFile 请求少的 MRxCreate 请求,实际上在多个 FOBX 之间共享SRV_OPEN结构。

如果 MRxCreate 请求用于文件覆盖,并且 MRxCreate STATUS_SUCCESS返回,则 RDBSS 将获取分页 I/O 资源并截断文件。 如果缓存管理器正在缓存文件,RDBSS 将使用刚从服务器接收的大小更新缓存管理器的大小。

在返回之前,MRxCreate 必须设置 RxContext 参数指向的 RX_CONTEXT 结构的 CurrentIrp-IoStatus.Information> 成员。

RDBSS 调用 MRxDevFcbXXXControlFile 例程,将设备 FCB 控制请求 (IOCTL 或 FSCTL 请求) 传递到网络微型重定向程序。

MRxDevFcbXXXControlFile 处理与发送到网络微型重定向程序的设备 FCB 相关的 IOCTL 和 FSCTL 请求。

在调用 MRxDevFcbXXXControlFile 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

MajorFunction 设置为 IRP 的主要函数

如果这是IRP_MJ_FILE_SYSTEM_CONTROL请求,则 RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

LowIoContext.ParamsFor.FsCtl.MinorFunction 设置为 FSCTL 代码的次要函数代码

LowIoContext.ParamsFor.FsCtl.FsControlCode 设置为 IRP 的 FSCTL 代码

如果这是IRP_MJ_DEVICE_CONTROL或IRP_MJ_INTERNAL_DEVICE_CONTROL请求,则 RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

LowIoContext.ParamsFor.FsCtl.FsControlCode 设置为 IRP 的控制代码。

如果 MRxDevFcbXXXControlFile 返回STATUS_SUCCESS,则表示例程成功。 任何其他返回值指示发生了错误。

RDBSS 调用 MRxFlush 例程以请求网络微型重定向程序将文件系统对象的内容写入存储。 RDBSS 发出此调用以响应接收 IRP_MJ_FLUSH_BUFFERS 请求。

MRxFlush 处理文件刷新的网络请求。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_EXCLUSIVELOCK] 例程,以请求网络微型重定向程序打开文件对象上的独占锁。

如果 IrpSp-Flags> 设置了SL_EXCLUSIVE_LOCK位,RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_EXCLUSIVELOCK] 以响应接收IRP_MJ_LOCK_CONTROL请求,其次要代码为 IRP_MN_LOCK。

在调用 MRxLowIOSubmit[LOWIO_OP_EXCLUSIVELOCK]之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

LowIoContext.Operation 成员设置为 LOWIO_OP_EXCLUSIVELOCK。

LowIoContext.ResourceThreadId 成员设置为在 RDBSS 中启动操作的进程线程。

LowIoContext.ParamsFor.Locks.ByteOffset 成员设置为 IrpSp-Parameters.LockControl.ByteOffset.QuadPart> 的值。

LowIoContext.ParamsFor.Locks.Key 成员设置为 IrpSp-Parameters.LockControl.Key> 的值。

LowIoContext.ParamsFor.Locks.Flags 成员设置为 IrpSp-Flags> 的值。

LowIoContext.ParamsFor.Locks.Length 成员设置为 IrpSp-Parameters.LockControl.Length.QuadPart> 的值。

RX_CONTEXT 结构的 LowIoContext.Operation 成员指定要执行的低 I/O 操作。 多个低 I/O 例程有可能指向网络微型重定向器中的同一例程,因为此 LowIoContext.Operation 成员可用于区分所请求的低 I/O 操作。 例如,与文件锁相关的所有 I/O 调用都可以在网络微型重定向器中调用相同的低 I/O 例程,该例程可以使用 LowIoContext.Operation 成员来区分请求的锁定和解锁操作。

如果 MRxLowIOSubmit[LOWIO_OP_EXCLUSIVELOCK] 例程可能需要很长时间才能完成,则网络微型重定向程序驱动程序应在启动网络通信之前释放 FCB 结构。 可以通过调用 RxReleaseFcbResourceForThreadInMRx 来释放 FCB 结构。 在处理 MRxLowIOSubmit[LOWIO_OP_EXCLUSIVELOCK] 例程时,RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员保证指示在 RDBSS 中启动操作的进程线程。

RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员可用于代表另一个线程释放 FCB 结构。 异步例程完成后,可以释放从初始线程获取的 FCB 结构。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_FSCTL] 例程,以请求网络微型重定向程序对远程文件发出文件系统控制请求。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_FSCTL] 以响应接收 IRP_MJ_FILE_SYSTEM_CONTROL 请求。

在调用 MRxLowIOSubmit[LOWIO_OP_FSCTL]之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

LowIoContext.Operation 成员设置为 LOWIO_OP_FSCTL。

LowIoContext.ResourceThreadId 成员设置为在 RDBSS 中启动操作的进程线程。

LowIoContext.ParamsFor.FsCtl.FsControlCode 成员设置为 FSCTL 主控制代码。

LowIoContext.ParamsFor.FsCtl.MinorFunction 成员设置为 FSCTL 次要控制代码。

LowIoContext.ParamsFor.FsCtl.pInputBuffer 成员设置为输入缓冲区。

LowIoContext.ParamsFor.FsCtl.InputBufferLength 成员设置为输入缓冲区长度。

LowIoContext.ParamsFor.FsCtl.pOutputBuffer 成员设置为输出缓冲区。

LowIoContext.ParamsFor.FsCtl.OutputBufferLength 成员设置为输出缓冲区长度。

(FSCTL) 由网络微型重定向程序处理的请求的文件系统控制代码可分为以下几个类别之一:

  • RDBSS 和网络微型重定向程序实现和使用 FSCL

  • 仅由网络微型重定向程序实现和使用的 FSCL

  • 网络微型重定向程序永远看不到的 FSCL。 这些 FSCL 仅用于调试辅助。

在处理 MRxLowIOSubmit[LOWIO_OP_FSCTL] 例程时,RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员保证指示在 RDBSS 中启动操作的进程线程。 RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员可用于代表另一个线程释放输入资源。 异步例程完成后,可以释放从初始线程获取的输入资源。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_IOCTL] 例程,以向网络微型重定向程序发出 I/O 系统控制请求。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_IOCTL] 以响应接收 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 请求。

在调用 MRxLowIOSubmit[LOWIO_OP_IOCTL]之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

LowIoContext.Operation 成员设置为 LOWIO_OP_IOCTL。

LowIoContext.ResourceThreadId 成员设置为在 RDBSS 中启动操作的进程线程。

LowIoContext.ParamsFor.IoCtl.IoControlCode 成员设置为 IOCTL 控件代码。

LowIoContext.ParamsFor.IoCtl.pInputBuffer 成员设置为输入缓冲区。

LowIoContext.ParamsFor.IoCtl.InputBufferLength 成员设置为输入缓冲区长度。

LowIoContext.ParamsFor.IoCtl.pOutputBuffer 成员设置为输出缓冲区。

LowIoContext.ParamsFor.IoCtl.OutputBufferLength 成员设置为输出缓冲区长度。

在处理 MRxLowIOSubmit[LOWIO_OP_IOCTL] 例程时,RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员保证指示在 RDBSS 中启动操作的进程线程。 RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员可用于代表另一个线程释放输入资源。 异步例程完成后,可以释放从初始线程获取的输入资源。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_NOTIFY_CHANGE_DIRECTORY] 例程,以向网络微型重定向程序发出目录更改通知操作的请求。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_NOTIFY_CHANGE_DIRECTORY] 以响应接收 IRP_MJ_DIRECTORY_CONTROL 请求。

在调用 MRxLowIOSubmit[LOWIO_OP_NOTIFY_CHANGE_DIRECTORY]之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

LowIoContext.Operation 成员设置为 LOWIO_OP_NOTIFY_CHANGE_DIRECTORY。

LowIoContext.ResourceThreadId 成员设置为在 RDBSS 中启动操作的进程线程。

如果 IrpSp> 标志设置了 SL_WATCH_TREE 位,则 LowIoContext.ParamsFor.NotifyChangeDirectory.WatchTree 成员设置为 TRUE

LowIoContext.ParamsFor.NotifyChangeDirectory.CompletionFilter 成员设置为 IrpSp-Parameters.NotifyDirectory.CompletionFilter> 的值。

LowIoContext.ParamsFor.NotifyChangeDirectory.NotificationBufferLength 成员设置为 IrpSp-Parameters.NotifyDirectory.Length> 的值。

LowIoContext.ParamsFor.NotifyChangeDirectory.pNotificationBuffer 成员设置为通过调用 MmGetSystemAddressForMdlSafeIrp-MdlAddress> 和 NormalPagePriority 中传递返回的值。 用户缓冲区也会被探测并锁定,以便进行写入访问。

目录更改通知操作通常由网络微型重定向程序作为异步操作实现,因为它可能需要相当长的时间。 该操作通常包括向请求更改通知的远程服务器发送网络请求。 当所需的更改在服务器上受到影响时,将获取响应。 这是一个操作示例,网络微型重定向程序可能需要注册唯一的上下文值来处理本地启动的取消。

在处理 MRxLowIOSubmit[LOWIO_OP_NOTIFY_CHANGE_DIRECTORY] 例程时,RX_CONTEXT的 LowIoContext.ResourceThreadId 成员保证指示在 RDBSS 中启动操作的进程线程。 LowIoContext.ResourceThreadId 成员可用于代表另一个线程释放 FCB 结构。 异步例程完成后,可以释放从初始线程获取的 FCB 结构。 可以通过调用 RxReleaseFcbResourceForThreadInMRx 来释放 FCB 结构。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_READ] 例程,向网络微型重定向程序发出读取请求。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_READ] 以响应接收 IRP_MJ_READ 请求。

在调用 MRxLowIOSubmit[LOWIO_OP_READ]之前,RDBSS 修改 RxContext 参数指向的RX_CONTEXT结构中的以下成员:

LowIoContext.Operation 成员设置为 LOWIO_OP_READ。

LowIoContext.ResourceThreadId 成员设置为在 RDBSS 中启动操作的进程线程。

LowIoContext.ParamsFor.ReadWrite.Key 成员设置为 IrpSp-Parameters.Read.Key> 的值。

如果 Irp-Flags> 已打开 IRP_PAGING_IO 位,则 ParamsFor.ReadWrite.Flags 成员已将 LOWIO_READWRITEFLAG_PAGING_IO 位设置为 on。

ParamsFor.ReadWrite.Buffer 成员设置为 IoReadAccess 锁定的用户缓冲区。

LowIoContext.ParamsFor.ReadWrite.ByteCount 成员设置为 IrpSp-Parameters.Read.Length> 的值。

读取请求通常由网络微型重定向程序作为异步操作实现,因为它可能需要相当长的时间。 该操作通常包括向远程服务器发送网络请求。 当在服务器上完成读取请求时,将获取响应。 这是一个操作示例,网络微型重定向程序可能需要为其注册上下文来处理本地启动的取消。

MRxLowIOSubmit[LOWIO_OP_READ] 例程正在处理时,RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员保证指示在 RDBSS 中启动操作的进程线程。 LowIoContext.ResourceThreadId 成员可用于代表另一个线程释放 FCB 结构。 异步例程完成后,可以释放从初始线程获取的 FCB 结构。 可以通过调用 RxReleaseFcbResourceForThreadInMRx 来释放 FCB 结构。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_SHAREDLOCK] 例程,以请求网络重定向程序打开文件对象上的共享锁。

如果 IrpSp-Flags> 未设置SL_EXCLUSIVE_LOCK位,RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_SHAREDLOCK] 以响应接收具有IRP_MN_LOCK次要代码的IRP_MJ_LOCK_CONTROL请求。

在调用 MRxLowIOSubmit[LOWIO_OP_SHAREDLOCK]之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

LowIoContext.Operation 成员设置为 LOWIO_OP_SHAREDLOCK。

LowIoContext.ResourceThreadId 成员设置为在 RDBSS 中启动操作的进程线程。

LowIoContext.ParamsFor.Locks.ByteOffset 成员设置为 IrpSp-Parameters.LockControl.ByteOffset.QuadPart> 的值。

LowIoContext.ParamsFor.Locks.Key 成员设置为 IrpSp-Parameters.LockControl.Key> 的值。

LowIoContext.ParamsFor.Locks.Flags 成员设置为 IrpSp-Flags> 的值。

LowIoContext.ParamsFor.Locks.Length 成员设置为 IrpSp-Parameters.LockControl.Length.QuadPart> 的值。

RX_CONTEXT 结构的 LowIoContext.Operation 成员指定要执行的低 I/O 操作。 多个低 I/O 例程可能指向网络微型重定向器中的同一例程,因为 LowIoContext.Operation 成员可用于区分请求的低 I/O 操作。 例如,与文件锁相关的所有 I/O 调用都可以在网络微型重定向器中调用相同的低 I/O 例程,并且此例程可以使用 LowIoContext.Operation 成员来区分所请求的锁定和解锁操作。

如果 MRxLowIOSubmit[LOWIO_OP_SHAREDLOCK] 例程可能需要很长时间才能完成,则网络微型重定向程序驱动程序应在启动网络通信之前释放 FCB 结构。 可以通过调用 RxReleaseFcbResourceForThreadInMRx 来释放 FCB 结构。 在处理 MRxLowIOSubmit[LOWIO_OP_SHAREDLOCK] 例程时,RX_CONTEXT的 LowIoContext.ResourceThreadId 成员保证指示在 RDBSS 中启动操作的进程线程。

可以使用 RX_CONTEXT 结构的 LowIoContext.ResourceThreadId 成员代表另一个线程释放 FCB 结构。 异步例程完成后,可以释放从初始线程获取的 FCB 结构。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_UNLOCK] 例程,以请求网络微型重定向程序删除文件对象上的单个锁。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_UNLOCK] 以响应接收具有IRP_MN_UNLOCK_SINGLE次要代码 的IRP_MJ_LOCK_CONTROL 请求。

在调用 MRxLowIOSubmit[LOWIO_OP_UNLOCK]之前,RDBSS 修改 RxContext 参数指向的RX_CONTEXT结构中的以下成员:

LowIoContext.Operation 成员设置为 LOWIO_OP_UNLOCK。

LowIoContext.ResourceThreadId 成员设置为在 RDBSS 中启动操作的进程线程。

LowIoContext.ParamsFor.Locks.ByteOffset 成员设置为 IrpSp-Parameters.LockControl.ByteOffset.QuadPart> 的值。

LowIoContext.ParamsFor.Locks.Key 成员设置为 IrpSp-Parameters.LockControl.Key> 的值。

LowIoContext.ParamsFor.Locks.Length 成员设置为 IrpSp-Parameters.LockControl.Length.QuadPart> 的值。

RX_CONTEXT 结构的 LowIoContext.Operation 成员指定要执行的低 I/O 操作。 多个低 I/O 例程可能指向网络微型重定向器中的同一例程,因为此 LowIoContext.Operation 成员可用于区分请求的低 I/O 操作。 例如,与文件锁相关的所有 I/O 调用都可以在网络微型重定向器中调用相同的低 I/O 例程,并且此例程可以使用 LowIoContext.Operation 成员来区分所请求的锁定和解锁操作。

如果 MRxLowIOSubmit[LOWIO_OP_UNLOCK] 例程可能需要很长时间才能完成,则网络微型重定向程序驱动程序应在启动网络通信之前释放 FCB 结构。 可以通过调用 RxReleaseFcbResourceForThreadInMRx 来释放 FCB 结构。 在处理 MRxLowIOSubmit[LOWIO_OP_UNLOCK] 例程时,RX_CONTEXT的 LowIoContext.ResourceThreadId 成员保证指示在 RDBSS 中启动操作的进程线程。

可以使用 RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员代表另一个线程释放 FCB 结构。 异步例程完成后,可以释放从初始线程获取的 FCB 结构。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_UNLOCK_MULTIPLE] 例程,以请求网络微型重定向程序删除在文件对象上保留的多个锁。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_UNLOCK_MULTIPLE] 以响应接收 具有IRP_MN_UNLOCK_ALL或IRP_MN_UNLOCK_ALL_BY_KEY 次要代码的IRP_MJ_LOCK_CONTROL请求。

在调用 MRxLowIOSubmit[LOWIO_OP_UNLOCK_MULTIPLE]之前,RDBSS 修改 RxContext 参数指向的RX_CONTEXT结构中的以下成员:

LowIoContext.Operation 成员设置为 LOWIO_OP_UNLOCK_MULTIPLE。

LowIoContext.ResourceThreadId 成员设置为在 RDBSS 中启动操作的进程线程。

LowIoContext.ParamsFor.Locks.LockList 成员设置为LOWIO_LOCK_LIST元素的列表。 每个元素指定要解锁的范围。

要解锁的字节范围在 RX_CONTEXT 结构的 LowIoContext.ParamsFor.Locks.LockList 成员中指定。 LOWIO_LOCK_LIST结构如下所示:

typedef struct _LOWIO_LOCK_LIST {
  struct  _LOWIO_LOCK_LIST  *Next;
  ULONG  LockNumber;
  RXVBO  ByteOffset;
  LONGLONG  Length;
  ULONG  Key;
  BOOLEAN  ExclusiveLock;
} LOWIO_LOCK_LIST, *PLOWIO_LOCK_LIST;

RX_CONTEXT 的 LowIoContext.Operation 成员指定要执行的低 I/O 操作。 多个低 I/O 例程可能指向网络微型重定向器中的同一例程,因为 LowIoContext.Operation 成员可用于区分请求的低 I/O 操作。 例如,与文件锁相关的所有 I/O 调用都可以在网络微型重定向器中调用相同的低 I/O 例程,并且此例程可以使用 LowIoContext.Operation 成员来区分所请求的锁定和解锁操作。

如果 MRxLowIOSubmit[LOWIO_OP_UNLOCK_MULTIPLE] 例程可能需要很长时间才能完成,则网络微型重定向程序驱动程序应在启动网络通信之前释放 FCB 结构。 可以通过调用 RxReleaseFcbResourceForThreadInMRx 来释放 FCB 结构。 在处理 MRxLowIOSubmit[LOWIO_OP_UNLOCK_MULTIPLE] 例程时,RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员保证指示在 RDBSS 中启动操作的进程线程。

可以使用 RX_CONTEXT 的 LowIoContext.ResourceThreadId 成员代表另一个线程释放 FCB 结构。 异步例程完成后,可以释放从初始线程获取的 FCB 结构。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_WRITE] 例程,向网络微型重定向器发出写入请求。

RDBSS 调用 MRxLowIOSubmit[LOWIO_OP_WRITE] 以响应接收 IRP_MJ_WRITE 请求。

在调用 MRxLowIOSubmit[LOWIO_OP_WRITE]之前,RDBSS 修改 RxContext 参数指向的RX_CONTEXT结构中的以下成员:

LowIoContext.Operation 成员设置为 LOWIO_OP_WRITE。

LowIoContext.ResourceThreadId 成员设置为在 RDBSS 中启动操作的进程线程。

LowIoContext.ParamsFor.ReadWrite.Key 成员设置为 IrpSp-Parameters.Read.Key> 的值。

如果 Irp-Flags> 已打开 IRP_PAGING_IO 位,则 ParamsFor.ReadWrite.Flags 成员已将 LOWIO_READWRITEFLAG_PAGING_IO 位设置为 on。

ParamsFor.ReadWrite.Buffer 成员设置为 IoWriteAccess 锁定的用户缓冲区。

LowIoContext.ParamsFor.ReadWrite.ByteCount 成员设置为 IrpSp-Parameters.Write.Length> 的值。

写入请求通常由网络微型重定向程序作为异步操作实现,因为它可能需要相当长的时间。 该操作通常包括向远程服务器发送网络请求。 当写入请求在服务器上完成时,将获取响应。 这是一个操作示例,网络微型重定向程序可能需要为其注册上下文来处理本地启动的取消。

在处理 MRxLowIOSubmit[LOWIO_OP_WRITE] 例程时,RX_CONTEXT的 LowIoContext.ResourceThreadId 成员保证指示在 RDBSS 中启动操作的进程线程。 LowIoContext.ResourceThreadId 成员可用于代表另一个线程释放 FCB 结构。 异步例程完成后,可以释放从初始线程获取的 FCB 结构。 可以通过调用 RxReleaseFcbResourceForThreadInMRx 来释放 FCB 结构。

MRxQueryDirectory 例程由 RDBSS 调用,以请求网络微型重定向程序查询文件目录上的信息。

在调用 MRxQueryDirectory 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.FileInformationClass 成员设置为 IrpSp-Parameters.QueryDirectory.FileInformationClass>

Info.Buffer 成员设置为 I/O 请求数据包中的用户缓冲区。 如果需要,RDBSS 已锁定此缓冲区。

Info.LengthRemaining 成员设置为 IrpSp-Parameters.QueryDirectory.Length>

QueryDirectory.FileIndex 成员设置为 IrpSp-Parameters.QueryDirectory.FileIndex>

如果 IrpSp-Flags 已打开 SL_RESTART_SCAN 位,则 QueryDirectory.RestartScan> 成员设置为非零。

如果 IrpSp-Flags> 具有SL_RETURN_SINGLE_ENTRY位,则 QueryDirectory.ReturnSingleEntry 成员设置为非零。

如果 IrpSp-Flags 具有SL_INDEX_SPECIFIED位,则 QueryDirectory.IndexSpecified> 成员设置为非零。

如果关联的 FOBX 的 UnicodeQueryTemplate.Buffer 成员为 NULL,并且 FOBX 的 Flags 成员没有FOBX_FLAG_MATCH_ALL位,则 QueryDirectory.InitialQuery 成员设置为非零。

对于 (“.”的野生卡查询(例如) ),RDBSS 会将关联的 FOBX 的 UnicodeQueryTemplate.Buffer 成员设置为传递的野生卡查询。

如果从 MRxQueryDirectory 返回时RX_CONTEXT结构的 PostRequest 成员为 TRUE,则 RDBSS 将调用 RxFsdPostRequest,并将RX_CONTEXT结构传递给辅助角色队列,以便文件系统进程 (FSP) 进行处理。

RDBSS 调用 MRxQueryEaInfo 例程来请求网络微型重定向程序查询文件系统对象上的扩展属性信息。

RDBSS 发出对 MRxQueryEaInfo 的调用,以响应接收 IRP_MJ_QUERY_EA 请求。

在调用 MRxQueryEaInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.Buffer 成员设置为来自 I/O 请求数据包的用户缓冲区。 如果需要,RDBSS 已锁定此缓冲区。

Info.LengthRemaining 成员设置为 IrpSp-Parameters.QueryEa.Length>

QueryEa.UserEaList 成员设置为 IrpSp-Parameters.QueryEa.EaList>

QueryEa.UserEaListLength 成员设置为 IrpSp-Parameters.QueryEa.EaListLength>

QueryEa.UserEaIndex 成员设置为 IrpSp-Parameters.QueryEa.EaIndex>

如果 IrpSp-Flags> 具有SL_RESTART_SCAN位,则 QueryEa.RestartScan 成员设置为非零。

如果 IrpSp-Flags> 具有SL_RETURN_SINGLE_ENTRY位,则 QueryEa.ReturnSingleEntry 成员设置为非零。

如果 IrpSp-Flags> 具有SL_INDEX_SPECIFIED位,则 QueryEa.IndexSpecified 成员设置为非零。

成功后,MRxQueryEaInfo 应将RX_CONTEXT结构的 Info.LengthRemaininging 成员设置为返回的扩展属性信息的长度,并更新 Fobx-OffsetOfNextEaToReturn> 成员。 如果成功调用 MRxQueryEaInfo,RDBSS 会将 IRP 的 IoStatus.Information 成员设置为 IrpSp-Parameters.QueryEa.Length> 减去 RX_CONTEXT 的 Info.LengthRemaining 成员。

RDBSS 调用 MRxQueryFileInfo 例程,以请求网络微型重定向程序查询文件系统对象上的文件信息。

RDBSS 发出对 MRxQueryFileInfo 的调用,以响应接收 IRP_MJ_QUERY_INFORMATION 请求。

在调用 MRxQueryFileInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.FileInformationClass 成员设置为 IrpSp-Parameters.QueryFile.FileInformationClass>(请求的FILE_INFORMATION_CLASS值)。

Info.Buffer 成员设置为 I/O 请求数据包中的用户缓冲区。

Info.LengthRemaining 成员设置为 IrpSp-Parameters.QueryFile.Length>

QueryDirectory.FileIndex 成员设置为 IrpSp-Parameters.QueryDirectory.FileIndex>

如果 IrpSp-Flags> 设置了 SL_RESTART_SCAN 位,则会设置 QueryDirectory.RestartScan 成员。

如果 IrpSp-Flags 已设置SL_RETURN_SINGLE_ENTRY位,则会设置 QueryDirectory.ReturnSingleEntry> 成员。

如果 Fobx-UnicodeQueryTemplate.Buffer 为 NULL 且 Fobx-Flags> 未设置FOBX_FLAG_MATCH_ALL位,则会设置 QueryDirectory.InitialQuery> 成员。

成功后,网络微型重定向程序应将 RX_CONTEXT 结构的 Info.LengthRemaining 成员设置为 Info.Length 成员减去返回的文件信息的长度。 如果成功调用 MRxQueryFileInfo,RDBSS 会将 IRP 的 IoStatus.Information 成员设置为 IrpSp-Parameters.QueryFile.Length> 减去 RX_CONTEXT 的 Info.LengthRemaining 成员。

RDBSS 不支持具有 IrpSp 标志>集SL_INDEX_SPECIFIED位的请求。 网络微型重定向程序不会在设置了 SL_INDEX_SPECIFIED 位 IrpSp 标志>的情况下接收对 MRxQueryFileInfo 的调用。

RDBSS 调用 MRxQueryQuotaInfo 例程来请求网络微型重定向程序查询文件系统对象上的配额信息。

RDBSS 发出对 MRxQueryQuotaInfo 的调用,以响应接收 IRP_MJ_QUERY_QUOTA 请求。

在调用 MRxQueryQuotaInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.Buffer 成员设置为 I/O 请求数据包中的用户缓冲区。 如果需要,RDBSS 已锁定此缓冲区。

Info.LengthRemaining 成员设置为 IrpSp-Parameters.QueryQuota.Length>

QueryQuota.SidList 成员设置为 IrpSp-Parameters.QueryQuota.SidList>

QueryQuota.SidListLength 成员设置为 IrpSp-Parameters.QueryQuota.SidListLength>

QueryQuota.StartSid 成员设置为 IrpSp-Parameters.QueryQuota.StartSid>

QueryQuota.Length 成员设置为 IrpSp-Parameters.QueryQuota.Length>

如果 IrpSp-Flags 设置了 SL_RESTART_SCAN 位,则 QueryQuota.RestartScan> 成员设置为非零。

如果 IrpSp-Flags 设置了 SL_RETURN_SINGLE_ENTRY 位,则 QueryQuota.ReturnSingleEntry> 成员设置为非零。

如果 IrpSp-Flags 设置了 SL_INDEX_SPECIFIED 位,则 QueryQuota.IndexSpecified> 成员设置为非零。

成功后,网络微型重定向程序应将 RX_CONTEXT 结构的 Info.LengthRemaining 成员设置为要返回的配额信息的长度。 如果成功调用 MRxQueryQuotaInfo,RDBSS 会将 IRP 的 IoStatus.Information 成员设置为 RX_CONTEXT 的 Info.LengthRemaining 成员。

如果对 MRxQueryQuotaInfo 的调用成功,则应将 RX_CONTEXT 结构的 InformationToReturn 成员设置为返回的配额信息的长度。 如果调用不成功,应将 RX_CONTEXT 的 InformationToReturn 成员设置为零。

RDBSS 调用 MRxQuerySdInfo 例程以请求网络微型重定向程序查询文件系统对象上的安全描述符信息。

RDBSS 发出对 MRxQuerySdInfo 的调用,以响应接收 IRP_MJ_QUERY_SECURITY 请求。

在调用 MRxQuerySdInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

QuerySecurity.SecurityInformation 成员设置为 IrpSp-Parameters.QuerySecurity.SecurityInformation>

Info.Buffer 成员设置为 I/O 请求数据包中的用户缓冲区。 如果需要,RDBSS 已锁定此缓冲区。

Info.LengthRemaining 成员设置为 IrpSp-Parameters.QuerySecurity.Length>

成功后,网络微型重定向程序应将RX_CONTEXT结构的 InformationToReturn 成员设置为返回的安全信息的长度。 如果成功调用 MRxQuerySdInfo,RDBSS 会将 IRP 的 IoStatus.Information 成员设置为 RX_CONTEXT 的 InformationToReturn 成员。

RDBSS 调用 MRxQueryVolumeInfo 例程来请求网络微型重定向程序查询卷信息。

RDBSS 在以下任一情况下发出对 MRxQueryVolumeInfo 的调用:

在IRP_MJ_QUERY_VOLUME_INFORMATION请求中调用 MRxQueryVolumeInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.FsInformationClass 成员设置为 IrpSp-Parameters.QueryVolume.FsInformationClass>

Info.Buffer 成员设置为 Irp-AssociatedIrp.SystemBuffer>

Info.LengthRemaining 成员设置为 IrpSp-Parameters.QueryVolume.Length>

对于IRP_MJ_QUERY_VOLUME_INFORMATION请求,如果从 MRxQueryVolumeInfo 返回时RX_CONTEXT结构的 PostRequest 成员为 TRUE,则 RDBSS 将调用 RxFsdPostRequest 来发布请求。 在这种情况下,IRP_MJ_QUERY_VOLUME_INFORMATION请求会将RX_CONTEXT结构传递给队列RX_CONTEXT辅助角色队列,以供文件系统进程 (FSP) 进行处理。

如果从 MRxQueryVolumeInfo 返回时RX_CONTEXT结构的 PostRequest 成员为 FALSE,则网络微型重定向程序必须将RX_CONTEXT结构的 Info.LengthRemaining 成员设置为返回的卷信息的长度。 RDBSS 将 IRP 的 IoStatus.Information 成员设置为 IrpSp-Parameters.QueryVolume.Length> 减去 RX_CONTEXT 结构的 Info.LengthRemaining 成员。

如果对 MRxQueryVolumeInfo 的调用成功,则网络微型重定向程序应将 RX_CONTEXT 结构的 Info.LengthRemaining 成员设置为 Info.Length 成员减去返回的卷信息的长度。 如果成功调用 MRxQueryVolumeInfo,RDBSS 会将 IRP 的 IoStatus.Information 成员设置为 IrpSp-Parameters.QueryVolume.Length> 减去 RX_CONTEXT 结构的 Info.LengthRemaining 成员。

对于 Info.FsInformationClass 成员设置为 FileFsDeviceInformation 的IRP_MJ_QUERY_VOLUME_INFORMATION请求,网络微型重定向程序在 RxContext 参数指向的 RX_CONTEXT 结构中返回以下信息:

Info.Buffer 成员包含FILE_FS_DEVICE_INFORMATION结构

Info.Buffer.Characteristics 成员设置为卷的特征,其中必须包括FILE_REMOTE_DEVICE作为选项之一。

Info.Buffer.DeviceType 成员设置为关联的NET_ROOT结构的 DeviceType 成员。 如果关联NET_ROOT的 Type 成员NET_ROOT_PIPE, 则 Info.Buffer.DeviceType 成员设置为 FILE_DEVICE_NAMED_PIPE。

对于 Info.FsInformationClass 成员设置为 FileFsVolumeInformation 的IRP_MJ_QUERY_VOLUME_INFORMATION请求,网络微型重定向程序在 RxContext 参数指向的 RX_CONTEXT 结构中返回以下信息:

Info.Buffer 成员包含FILE_FS_VOLUME_INFORMATION结构。

Info.Buffer 成员设置为关联的 NET_ROOT 结构的 VolumeInfo 成员。

Info.LengthRemaining 成员设置为关联的 NET_ROOT 结构的 VolumeInfoLength 成员。

从 RDBSS 为 IRP_MJ_FILE_SYSTEM_CONTROL 调用 MRxQueryVolumeInfo 是链接跟踪信息的请求。 在为 IRP_MJ_FILE_SYSTEM_CONTROL 调用 MRxQueryVolumeInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.FsInformationClass 成员设置为 FileFsObjectIdInformation

Info.Buffer 成员设置为 FILE_FS_OBJECTID_INFORMATION 结构。

Info.LengthRemaining 成员设置为 sizeof (FILE_FS_OBJECTID_INFORMATION) 。

对于IRP_MJ_FILE_SYSTEM_CONTROL请求,IRP 的 AssociatedIrp.SystemBuffer 成员指向LINK_TRACKING_INFORMATION结构。

如果请求作为返回值为 STATUS_SUCCESS 或 STATUS_BUFFER_OVERFLOW 的 MRxQueryVolumeInfo IRP_MJ_FILE_SYSTEM_CONTROL发起,RDBSS 会将在 RX_CONTEXT 结构的 Info.Buffer 成员中传递的 FILE_FS_OBJECTID_INFORMATION 结构的 ObjectId 成员复制到 FCB 结构的 NetRoot-DiskParameters.VolumeId> 成员和 IRP 的 AssociatedIrp.SystemBuffer.VolumeId 成员。 如果成功调用 MRxQueryVolumeInfo,RDBSS 将设置LINK_TRACKING_INFORMATION结构的 Type 成员。 如果 FCB 结构的 NetRoot-Flags> 成员设置了 NETROOT_FLAG_DFS_AWARE_NETROOT 位,则 TYPE 成员由 RDBSS 设置为 DfsLinkTrackingInformation。 如果 FCB 结构的 NetRoot-Flags> 成员未设置NETROOT_FLAG_DFS_AWARE_NETROOT位,则 RDBSS 会将 Type 成员设置为 NtfsLinkTrackingInformation。 成功后,RDBSS 会将 IRP 的 IoStatus.Information 成员设置为LINK_TRACKING_INFORMATION结构的大小。

RDBSS 调用 MRxSetEaInfo 例程来请求网络微型重定向程序在文件系统对象上设置扩展属性信息。

RDBSS 发出对 MRxSetEaInfo 的调用,以响应接收 IRP_MJ_SET_EA 请求。

在调用 MRxSetEaInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.Buffer 成员设置为来自 I/O 请求数据包的用户缓冲区。 如果需要,RDBSS 已锁定此缓冲区。

Info.LengthRemaining 成员设置为 IrpSp-Parameters.QueryEa.Length>

RDBSS 调用 MRxSetFileInfo 例程以请求网络微型重定向程序设置文件系统对象上的文件信息。

RDBSS 发出对 MRxSetFileInfo 的调用,以响应接收 IRP_MJ_SET_INFORMATION 请求。

在调用 MRxSetFileInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.FileInformationClass 成员设置为 IrpSp-Parameters.SetFile.FileInformationClass>(指定的FILE_INFORMATION_CLASS值)。

Info.Buffer 成员设置为 Irp-AssociatedIrp.SystemBuffer>

Info.Length 成员设置为 IrpSp-Parameters.SetFile.Length>

RDBSS 调用 MRxSetFileInfoAtCleanup 例程,请求网络微型重定向程序在清理时设置文件系统对象上的文件信息。

当文件对象的最后一个句柄关闭时,RDBSS 在清理期间发出对 MRxSetFileInfoAtCleanup 的调用。 这不同于删除对文件对象的最后一次引用时调用的关闭操作。

如果文件上的时间戳或文件大小已更改,RDBSS 将调用 MRxSetFileInfoAtCleanup。 RDBSS 对 MRxSetFileInfoAtCleanup 的调用是针对其中每个更改单独进行的。 如果文件大小和时间戳都已更改,则 RDBSS 对 MRxSetFileInfoAtCleanup 进行两次调用。

在调用 MRxSetFileInfoAtCleanup 之前,如果文件的时间戳已更改,RDBSS 会修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.FileInformationClass 成员设置为 fileBasicInformation FILE_INFORMATION_CLASS值。

Info.Buffer 成员设置为在堆栈上分配的FILE_BASIC_INFORMATION结构。

Info.Length 成员设置为FILE_BASIC_INFORMATION结构的大小。

在调用 MRxSetFileInfoAtCleanup 之前,如果文件大小已更改,RDBSS 会修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.FileInformationClass 成员设置为 FileEndOfFileInformation FILE_INFORMATION_CLASS值。

Info.Buffer 成员设置为堆栈上分配的FILE_END_OF_FILE_INFORMATION结构。

Info.Length 成员设置为 sizeof (FILE_END_OF_FILE_INFORMATION)

RDBSS 忽略 MRxSetFileInfoAtCleanup 的返回值。

网络微型重定向程序可以选择在此例程中不执行任何操作,并返回STATUS_SUCCESS。 对文件大小或时间戳所做的任何更改都将在清理操作期间进行处理。

RDBSS 调用 MRxSetQuotaInfo 例程以请求网络微型重定向程序设置文件系统对象上的配额信息。

RDBSS 发出对 MRxSetQuotaInfo 的调用,以响应接收 IRP_MJ_SET_QUOTA 请求。

在调用 MRxSetQuotaInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.Buffer 成员设置为来自 I/O 请求数据包的用户缓冲区。 如果需要,RDBSS 已锁定此缓冲区。

Info.LengthRemaining 成员设置为 IrpSp-Parameters.SetQuota.Length>

RDBSS 调用 MRxSetSdInfo 例程来请求网络微型重定向程序在文件系统对象上设置安全描述符信息。

RDBSS 发出对 MRxSetSdInfo 的调用,以响应接收 IRP_MJ_SET_SECURITY 请求。

在调用 MRxSetSdInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

SetSecurity.SecurityInformation 成员设置为 IrpSp-Parameters.SetSecurity.SecurityInformation>

SetSecurity.SecurityDescriptor 成员设置为 IrpSp-Parameters.SetSecurity.SecurityDescriptor>

RDBSS 调用 MRxSetVolumeInfo 例程来请求网络微型重定向程序设置卷信息。

RDBSS 发出对 MRxSetVolumeInfo 的调用,以响应接收 IRP_MJ_SET_VOLUME_INFORMATION 请求。

在调用 MRxSetVolumeInfo 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

Info.FsInformationClass 成员设置为 IrpSp-Parameters.SetVolume.FsInformationClass>

Info.Buffer 成员设置为 Irp-AssociatedIrp.SystemBuffer>

Info.LengthRemaining 成员设置为 IrpSp-Parameters.SetVolume.Length>

RDBSS 调用 MRxShouldTryToCollapseThisOpen 例程,请求网络微型重定向程序指示 RDBSS 是否应尝试将打开的请求折叠到现有文件系统对象上。

调用 MRxShouldTryToCollapseThisOpen 以确定打开的请求是否不应折叠。

在调用 MRxShouldTryToCollapseThisOpen 之前,RDBSS 修改 RxContext 参数指向的 RX_CONTEXT 结构中的以下成员:

pRelevantSrvOpen 成员设置为SRV_OPEN。

MRxShouldTryToCollapseThisOpen 的 调用可能是对目录的更改通知请求。 因此,网络微型重定向程序可能不允许折叠打开的请求,以便更改通知正常工作。

如果 RX_CONTEXT 结构的 Create.NtCreateParameters.CreateOptions 成员具有FILE_OPEN_FOR_BACKUP_INTENT选项或FILE_DELETE_ON_CLOSE选项集,RDBSS 不允许打开折叠。

RDBSS 调用 MRxTruncate 例程来请求网络微型重定向程序截断文件系统对象的内容。

如果满足以下两个条件,则 MRxTruncate 作为清理操作的一部分调用:

  • 文件对象对应于磁盘文件或目录

  • 这是最后一次清理调用,文件对象被标记为截断。

如果 FCB 结构的 fcbstate 成员设置了 FCB_STATE_TRUNCATE_ON_CLOSE 位,则会将文件对象标记为截断。 RDBSS 将在稍后的某个时间取消初始化缓存映射。

调用 MRxTruncate 后,将调用 MRxCleanupFobx 作为清理操作的一部分。

RDBSS 忽略 MRxTruncate 的返回值。

RDBSS 调用 MRxZeroExtend 例程来请求网络微型重定向程序截断文件系统对象的内容。

如果文件对象未标记为要删除,并且文件对象不是分页文件,则作为清理操作的一部分调用 MRxZeroExtend。 调用 MRxZeroExtend 以确保有效数据长度和文件大小之间的部分为零扩展。 调用 MRxZeroExtend 后,RDBSS 将 FCB 结构的 Header.ValidDataLength.QuadPart 成员设置为 FCB 结构的 Header.FileSize.QuadPart 成员。

调用 MRxZeroExtend 后,将调用 MRxCleanupFobx 作为清理操作的一部分。

RDBSS 忽略 MRxZeroExtend 的返回值。

RDBSS 调用 MRxCleanupFobx 例程以请求网络微型重定向程序关闭文件系统对象扩展。 RDBSS 发出此调用以响应对文件对象接收IRP_MJ_CLEANUP请求。

MRxCleanupFobx 由 RDBSS 作为对文件对象的清理和关闭操作的一部分调用。

MRxCleanupFobx 无法返回值 STATUS_RETRY指示应重试调用。 如果需要重试循环,则必须由网络微型重定向程序在 MRxCleanupFobx 例程内部处理。

要求

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

另请参阅

MRxAreFilesAliased

MRxCleanupFobx

MRxCollapseOpen

MRxCreate

MRxDeallocateForFobx

MRxDeallocateForFobx

MRxExtendForCache

MRxExtendForNonCache

MRxFlush

MRxForceClosed

MRxIsLockRealizable

MRxShouldTryToCollapseThisOpen

MRxTruncate

MRxZeroExtend

RxFinalizeNetFCB