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:

傳回碼 Description
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 回呼例程,除非網路迷你重新導向器保留自己的驅動程式分派進入點。 否則,RDBSS 將只允許下列 I/O 要求封包傳送至驅動程式,直到 MrxStart 成功傳回為止:

  • 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 例程呼叫 RxRegisterMinirdr 進行,因為某些開始處理需要完成驅動程式初始化。

當 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 接著會呼叫網路迷你重新導向器 MRxLowIOSubmit[LOW_OP_FSCTL]MRxLowIOSubmit[LOW_OP_IOCTL] 例程,此網络迷你重新導向器MINIRDR_DISPATCH結構中所定義的例程,以參數方式傳入初始化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 參數註冊為具有 MUP (RDBSS 呼叫 FsRtlRegisterUncProvider 的 UNC 提供者,以代表網路迷你重新導向器) 。

在 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 要求用於同步作業,則呼叫也會張貼到工作線程以供稍後執行,但在文件系統進程的內容中執行 RxStartMinirdr 之前,FSCTL 或 IOCTL 呼叫不會返回使用者模式。 在此情況下,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