RxStartMinirdr-Funktion (mrx.h)

RxStartMinirdr wird aufgerufen, um einen Netzwerkminiumleitungsor zu starten, der zuvor aufgerufen hat, um sich bei RDBSS zu registrieren. Als Teil von RxStartMinirdr registriert RDBSS auch den Netzwerk-Miniumleitungstreiber als UNC-Anbieter (Universal Naming Convention) beim MUP (Multiple UNC Provider), wenn der Treiber die Unterstützung für UNC-Namen angibt.

Syntax

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

Parameter

[in] RxContext

Ein Zeiger auf die RX_CONTEXT Struktur, die verwendet werden soll, um das Geräteobjekt abzurufen und zu bestimmen, ob es sich um einen Dateisystemprozess handelt.

[out] PostToFsp

Ein Zeiger auf einen logischen Wert, der bei der Rückgabe auf TRUE festgelegt ist, wenn die Anforderung für die spätere Verarbeitung durch den Dateisystemprozess gesendet werden muss.

Rückgabewert

RxStartMinirdr gibt STATUS_SUCCESS zurück, wenn die Startsequenz erfolgreich war oder einen der folgenden Fehlerwerte:

Rückgabecode Beschreibung
STATUS_ACCESS_DENIED Die Anforderung, sich als UNC-Anbieter zu registrieren, ist fehlgeschlagen, weil der Zugriff verweigert wurde.
STATUS_ACCESS_VIOLATION Die Anforderung, sich als UNC-Anbieter zu registrieren, ist mit einer Zugriffsverletzung fehlgeschlagen.
STATUS_INSUFFICIENT_RESOURCES Es gab nicht genügend Ressourcen, um diese Routine abzuschließen.
STATUS_PENDING Die Startsequenz für RDBSS- und Netzwerkminiumleitungen muss im Kontext des Systemprozesses und nicht im Benutzermodus abgeschlossen werden. Wenn der Aufruf von RxStartMinirdr aus einem Benutzermodusprozess (z. B. einer Dienstanforderung im Benutzermodus) stammt, wird die Anforderung zur späteren Verarbeitung in RDBSS gesendet und STATUS_PENDING zurückgegeben. Dieser Fehler kann auch zurückgegeben werden, wenn bestimmte interne RDBSS-Sperren nicht ohne Wartezeit abgerufen werden können. Der Aufruf wird später über einen Systemthread abgeschlossen.
STATUS_REDIRECTOR_STARTED Der Netzwerk-Miniumleitungsor wurde bereits gestartet.

Hinweise

Ein Netzwerkminiumleitungsor registriert sich bei RDBSS, wenn der Treiber vom Kernel geladen wird, und hebt die Registrierung bei RDBSS auf, wenn der Treiber entladen wird. Ein Netzwerkminiumleitungsor informiert RDBSS über das Laden, indem er RxRegisterMinirdr aufruft, die aus RDBSS exportierte Registrierungsroutine. Im Rahmen dieses Registrierungsprozesses übergibt der Netzwerkminiumleitungsor einen Parameter an RxRegisterMinirdr , der ein Zeiger auf eine große Struktur ist, MINIRDR_DISPATCH, der Konfigurationsinformationen für den Netzwerkminiumleitungsor und eine Tabelle mit Zeigern auf Rückrufroutinen enthält, die vom Netzwerk-Miniumleitungstreiber implementiert werden. RDBSS verwendet die Rückrufroutinen, die in dieser Struktur übergeben werden, um mit dem Netzwerkminiumleitungsor zu kommunizieren.

Der Netzwerkminiumleitungsor startet den Betrieb erst dann, wenn er einen Aufruf seiner MRxStart-Routine empfängt, einer der Rückrufroutinen, die in der MINIRDR_DISPATCH-Struktur übergeben werden. Die MrxStart-Rückrufroutine muss vom Netzwerk-Miniumleitungstreiber implementiert werden, wenn er Rückrufroutinen für Vorgänge empfangen möchte, es sei denn, der Netzwerkminiumleitungsor behält seine eigenen Einstiegspunkte für die Treiberausgabe bei. Andernfalls lässt RDBSS nur die folgenden E/A-Anforderungspakete an den Treiber zu, bis MrxStart erfolgreich zurückgegeben wird:

  • IRP-Anforderungen für Geräteerstellungsvorgänge und Gerätevorgänge, bei denen der Parameter FileObject-FileName.Length> auf dem IRPSP null und der FileObject-RelatedFileObject-Parameter> NULL ist.

Für jede andere IRP-Anforderung gibt die RDBSS-Dispatchroutine RxFsdDispatch eine status von STATUS_REDIRECTOR_NOT_STARTED zurück.

Die RDBSS-Dispatchroutine schlägt auch alle Anforderungen für die folgenden E/A-Anforderungspakete fehl:

  • IRP_MJ_CREATE_MAILSLOT
  • IRP_MJ_CREATE_NAMED_PIPE

Die MrxStart-Routine des Netzwerkminimumleitungs wird von RDBSS aufgerufen, wenn die RxStartMinirdr-Routine aufgerufen wird. Die RDBSS RxStartMinirdr-Routine wird in der Regel als Ergebnis einer FSCTL- oder IOCTL-Anforderung von einer Benutzermodusanwendung oder eines Diensts aufgerufen, um den Netzwerkminiumleitungsor zu starten. Der Aufruf von RxStartMinirdr kann nach einem erfolgreichen Aufruf von RxRegisterMinirdr nicht aus der DriverEntry-Routine des Netzwerkminirdors erfolgen, da für einen Teil der Startverarbeitung die Initialisierung des Treibers abgeschlossen sein muss.

Wenn RDBSS eine FSCTL- oder IOCTL-Anforderung empfängt, die aus dem Benutzermodus an den Netzwerkminiumleitungstreiber gesendet wird, erstellt RDBSS eine RX_CONTEXT-Struktur und übergibt diesen Aufruf an die in der MINIRDR_DISPATCH-Struktur definierte MRxLowIOSubmit[LOWIO_OP_FSCTL] oder MRxLowIOSubmit[LOWIO_OP_IOCTL]. Die Implementierung dieser Rückrufroutine durch die Netzwerkminiumleitung würde die Anforderung zum Starten und Aufrufen von RxStartMinirdr erkennen. Dieser normale Prozess von Ereignissen ist unten ausführlicher aufgeführt:

  1. Eine Anwendung im Benutzermodus gibt eine private FSCTL- oder IOCTL-Anforderung aus, um die Netzwerkminiumleitung zu starten.

  2. Der RDBSS-Kerneltreiber empfängt die FSCTL- oder IOCTL-Anforderung im Namen des Netzwerk-Mini-Redirectors, da RDBSS die Einstiegspunkte für die Treiberverteilung des Miniumleitungstreibers ersetzt hat, um auf interne RDBSS-Routinen zu verweisen. Beachten Sie, dass dabei davon ausgegangen wird, dass der Netzwerk-Mini-Redirector beim Aufrufen von RxRegisterMinirdr die RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH im Controls-Parameter nicht festgelegt hat. Diese Option, die an RxRegisterMinirdr übergeben wird, ist ungewöhnlich und weist darauf hin, dass der Netzwerkminiumleitungsor nicht möchte, dass RDBSS seine Einstiegspunkte für die Treiberausgabe ersetzt.

  3. RDBSS empfängt die FSCTL- oder IOCTL-Anforderung intern im Namen des Netzwerkumleitungs. Der RDBSS-Dispatcher weist eine RX_CONTEXT-Struktur zu und initialisiert sie. RDBSS ruft dann die in der MINIRDR_DISPATCH-Struktur für diesen Netzwerk-Mini-Redirector definierte Routine MRxLowIOSubmit[LOW_OP_FSCTL] oder MRxLowIOSubmit[LOW_OP_IOCTL] auf und übergibt die initialisierte RX_CONTEXT-Struktur als Parameter.

  4. Die Netzwerkminiumleitungsimplementierung dieser Rückrufroutine würde die private FSCTL- oder IOCTL-Anforderung zum Starten und Aufrufen von RxStartMinirdr erkennen und einen Zeiger auf die von RDBSS empfangene RX_CONTEXT Struktur als RxContext-Parameter und die Adresse des PostToFSP-Members von RxContext als PostToFsp-Parameter übergeben.

  5. Da dieser Aufruf aus dem Benutzermodus initiiert wurde, gibt RxStartMinirdr STATUS_PENDING zurück und legt PostToFsp auf TRUE fest.

  6. Die Netzwerkminiumleitungsroutine MRxLowIOSubmit[LOW_OP_FSCTL] oder MRxLowIOSubmit[LOW_OP_IOCTL] würde diesen Rückgabewert empfangen und an den RDBSS-Verteiler zurückgeben.

  7. Der RDBSS-Verteiler würde den STATUS_PENDING Rückgabewert empfangen und PostToFsp auf TRUE festlegen und dann eine Anforderung an einen Workerthread senden, um den Aufruf des Netzwerkminiumleitungs erneut auszuführen.

Nach diesem Punkt gibt es zwei mögliche Ergebnisse, die darauf basieren, ob der FSCTL- oder IOCTL-Vorgang als asynchroner oder synchroner Vorgang angefordert wurde.

Wenn dies eine asynchrone Anforderung wäre, würde Folgendes auftreten:

  • Der Benutzermodusaufrufer erhält die STATUS_PENDING Antwort vom Anruf. Der bereitgestellte Workerthread ruft schließlich RxStartMinirdr aus einem Dateisystemthread auf, und der Aufruf wird verarbeitet. Die RxStartMinirdr-Routine versucht, den Netzwerkminiumleitungsor bei Bedarf als UNC-Anbieter zu registrieren. Bei Versionen von Windows vor Windows Vista versucht RDBSS dann, den Netzwerkminiumleitungsor als Dateisystem beim E/A-Manager zu registrieren. Wenn diese Aufrufe erfolgreich sind, ruft RxStartMinirdr die mrxStart-Rückrufroutine auf, die vom Netzwerk-Mini-Redirector implementiert wird. Der Rückgabewert von MrxStart wird schließlich an die Benutzermodusanwendung zurückgegeben, die den aufrufenden Sequenzprozess als asynchronen Vorgang initiiert hat.

Wenn dies eine synchrone Anforderung wäre, würde Folgendes auftreten:

  • Der Benutzermodusaufrufer erhält die STATUS_PENDING Antwort nicht, wird aber gezwungen, zu warten, bis der Aufruf aus dem bereitgestellten Workerthread zurückgegeben wurde. Der bereitgestellte Workerthread ruft schließlich RxStartMinirdr aus einem Dateisystemthread auf, und der Aufruf wird verarbeitet. Die RxStartMinirdr-Routine versucht, den Netzwerkminiumleitungsor bei Bedarf als UNC-Anbieter zu registrieren. Bei Versionen von Windows vor Windows Vista versucht RDBSS dann, den Netzwerkminiumleitungsor als Dateisystem beim E/A-Manager zu registrieren. Wenn diese Aufrufe erfolgreich sind, ruft RxStartMinirdr die mrxStart-Rückrufroutine auf, die vom Netzwerk-Mini-Redirector implementiert wird. Der Rückgabewert von MrxStart wird an die Benutzermodusanwendung zurückgegeben, die den Aufrufsequenzprozess initiiert hat.

Wenn ein Netzwerkminiumleitung bei der Registrierung mit RDBSS (der Controls-Parameter für RxRegisterMinirdr) unterstützung für UNC angibt, versucht RxStartMinirdr , den DeviceName-Parameter des Netzwerkmini-Redirectors als UNC-Anbieter mit MUP zu registrieren (RDBSS ruft FsRtlRegisterUncProvider im Namen des Netzwerkmini-Redirectors auf).

Bei Versionen von Windows vor Windows Vista registriert RxStartMinirdr das Dateisystem beim E/A-Manager (RDBSS ruft IoRegisterFileSystem im Namen des Netzwerk-Mini-Redirectors auf).

Wenn die Aufrufe erfolgreich sind, ruft RxStartMinirdr die Netzwerk-Miniumleitung mrxStart-Routine auf. Wenn MrxStart erfolgreich zurückgibt, wird der interne Zustand der Miniumleitung in RDBSS auf RDBSS_STARTED festgelegt. Das StartStopContext.Version-Member des Mini-Redirector-Geräteobjekts wird ebenfalls erhöht.

Die Startsequenz für RDBSS und die Netzwerkminiumleitung muss im Kontext des Systemprozesses abgeschlossen werden, wenn ein asynchroner Vorgang angefordert wird. Wenn der Aufruf von RxStartMinirdr von einem Prozess im Benutzermodus (z. B. einer Benutzermodusdienstanforderung) stammt, wird die Anforderung von RDBSS intern an eine Arbeitswarteschlange zur späteren Verarbeitung gesendet und STATUS_PENDING zurückgegeben, und der PostToFsp-Parameter wird auf TRUE festgelegt. Wenn außerdem bestimmte interne RDBSS-Sperren nicht ohne Warten abgerufen werden können, wird STATUS_PENDING zurückgegeben und PostToFsp auf TRUE festgelegt. Wenn STATUS_PENDING zurückgegeben wird, wird RxStartMinirdr innerhalb eines Systemprozesses erneut aufgerufen. Wenn die FSCTL- oder IOCTL-Anforderung, die den Aufruf von RxStartMinirdr initiiert hat, für den asynchronen Betrieb festgelegt wurde, gibt RDBSS STATUS_PENDING die Anrufkette aus dem Benutzermodus an die ursprüngliche FSCTL- oder IOCTL-Anforderung zurück. Im Gegensatz dazu, wenn die FSCTL- oder IOCTL-Anforderung für synchronen Betrieb war, würde der Aufruf auch für die spätere Ausführung an einen Arbeitsthread gesendet, aber der FSCTL- oder IOCTL-Aufruf würde erst dann in den Benutzermodus zurückkehren, wenn RxStartMinirdr im Kontext des Dateisystemprozesses ausgeführt wurde. In diesem Fall würde der Aufrufer des FSCTL oder IOCTL nie den STATUS_PENDING Fehler zurückgeben. Das typischere Verhalten besteht darin, eine synchrone Anforderung für diese Start-/Stopp-Vorgänge zu initiieren, um den Anwendungscode im Benutzermodus zu vereinfachen.

Bei einer abnormalen Beendigung oder einem anderen Fehler versucht RxStartMinirdr , diese Vorgänge rückgängig zu machen, einschließlich der Aufhebung der Registrierung des UNC-Anbieters bei MUP, dem Aufheben der Registrierung des Dateisystems, dem Freigeben von Arbeitsspeicher, der für das Speichern des Domänennamens für maillot-Broadcasts verwendet wird, und dem Aktualisieren interner RDBSS-Tabellen.

Anforderungen

Anforderung Wert
Zielplattform Desktop
Kopfzeile mrx.h (einschließlich Mrx.h)
IRQL <= APC_LEVEL

Weitere Informationen

, RxpUnregisterMinirdr

DriverEntry

FsRtlRegisterUncProvider

IoRegisterFileSystem

MRxLowIOSubmit[LOWIO_OP_FSCTL]

MRxLowIOSubmit[LOWIO_OP_IOCTL]

MRxStart

RxFsdDispatch

RxRegisterMinirdr

RxSetDomainForMailslotBroadcast

RxStopMinirdr

RxUnregisterMinirdr

__RxFillAndInstallFastIoDispatch