Funzione RxStartMinirdr (mrx.h)

RxStartMinirdr viene chiamato per avviare un mini-reindirizzamento di rete che in precedenza ha chiamato per la registrazione con RDBSS. Come parte di RxStartMinirdr, RDBSS registrerà anche il driver mini-redirector di rete come provider UNC (Universal Naming Convention) con il provider UNC multiplo (MUP) se il driver indica il supporto per i nomi UNC.

Sintassi

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

Parametri

[in] RxContext

Puntatore alla struttura RX_CONTEXT da usare per ottenere l'oggetto dispositivo e determinare se si tratta di un processo del file system.

[out] PostToFsp

Puntatore a un valore logico impostato su TRUE in caso di restituzione se la richiesta deve essere inserita per un'elaborazione successiva da parte del processo del file system.

Valore restituito

RxStartMinirdr restituisce STATUS_SUCCESS se la sequenza di avvio ha avuto esito positivo o uno dei valori di errore seguenti:

Codice restituito Descrizione
STATUS_ACCESS_DENIED Richiesta di registrazione come provider UNC non riuscita perché l'accesso è stato negato.
STATUS_ACCESS_VIOLATION La richiesta di registrazione come provider UNC non è riuscita con una violazione di accesso.
STATUS_INSUFFICIENT_RESOURCES Non sono state eseguite risorse sufficienti per completare questa routine.
STATUS_PENDING La sequenza di avvio per RDBSS e mini-redirector di rete deve essere completata nel contesto del processo di sistema, non in un processo di applicazione in modalità utente. Se la chiamata a RxStartMinirdr proviene da un processo in modalità utente (ad esempio una richiesta di servizio in modalità utente), la richiesta viene inviata per l'elaborazione successiva all'interno di RDBSS e STATUS_PENDING verrà restituita. Questo errore può essere restituito anche se non è possibile acquisire determinati blocchi RDBSS interni senza attendere. La chiamata verrà completata in un secondo momento da un thread di sistema.
STATUS_REDIRECTOR_STARTED Il mini-redirector di rete è già stato avviato.

Commenti

Un mini-redirector di rete viene registrato con RDBSS ogni volta che il driver viene caricato dal kernel e quindi annulla la registrazione con RDBSS quando il driver viene scaricato. Un mini-reindirizzamento di rete informa RDBSS che è stato caricato chiamando RxRegisterMinirdr, la routine di registrazione esportata da RDBSS. Come parte di questo processo di registrazione, il mini-reindirizzamento di rete passa un parametro a RxRegisterMinirdr che è un puntatore a una struttura di grandi dimensioni, MINIRDR_DISPATCH, che contiene informazioni di configurazione per il mini-reindirizzamento di rete e una tabella di puntatori alle routine di callback implementate dal driver mini-redirector di rete. RDBSS usa le routine di callback passate in questa struttura per comunicare con il mini-redirector di rete.

Il mini-redirector di rete non avvia effettivamente l'operazione finché non riceve una chiamata alla routine MRxStart , una delle routine di callback passate nella struttura MINIRDR_DISPATCH. La routine di callback MrxStart deve essere implementata dal driver mini-redirector di rete se desidera ricevere routine di callback per le operazioni, a meno che il mini-redirector di rete non mantenga i propri punti di ingresso di invio del driver. In caso contrario, RDBSS consentirà solo i pacchetti di richiesta di I/O seguenti attraverso il driver fino a quando MrxStart non restituisce correttamente:

  • Le richieste IRP per le operazioni di creazione del dispositivo e le operazioni del dispositivo in cui il parametro FileObject-FileName.Length> in IRPSP è zero e il parametro FileObject-RelatedFileObject> è NULL.

Per qualsiasi altra richiesta di IRP, la routine di invio rdBSS RxFsdDispatch restituirà lo stato di STATUS_REDIRECTOR_NOT_STARTED.

La routine dispatch RDBSS non riuscirà anche a tutte le richieste per i pacchetti di richiesta di I/O seguenti:

  • IRP_MJ_CREATE_MAILSLOT
  • IRP_MJ_CREATE_NAMED_PIPE

La routine MrxStart del mini-redirector di rete viene chiamata da RDBSS quando viene chiamata la routine RxStartMinirdr . La routine RDBSS RxStartMinirdr viene in genere chiamata come risultato di una richiesta MDFTL o IOCTL da un'applicazione o un servizio in modalità utente per avviare il mini-redirector di rete. La chiamata a RxStartMinirdr non può essere eseguita dalla routine DriverEntry del mini-redirector di rete dopo una chiamata a RxRegisterMinirdr perché alcune delle elaborazioni di avvio richiedono il completamento dell'inizializzazione del driver.

Quando RDBSS riceve una richiesta MDFTL o IOCTL inviata al driver mini-redirector di rete dalla modalità utente, RDBSS crea una struttura RX_CONTEXT e passa questa chiamata alla routine di callback del mini-redirector di rete MRxLowIOSubmit[LOWIO_OP_FSCTL] o MRxLowIOSubmit[LOWIO_OP_IOCTL] routine di chiamata definita nella struttura MINIRDR_DISPATCH. L'implementazione del mini-redirector di rete di questa routine di callback riconosce la richiesta di avvio e chiamata di RxStartMinirdr. Questo normale processo di eventi è elencato di seguito in modo più dettagliato:

  1. Un'applicazione in modalità utente invia una richiesta PRIVATA DITL o IOCTL per avviare il mini-reindirizzamento di rete.

  2. Il driver kernel RDBSS riceve la richiesta MDFTL o IOCTL per conto del mini-redirector di rete poiché RDBSS ha sostituito i punti di ingresso di invio del driver del mini-redirector per puntare alle routine interne rdBSS. Si noti che si presuppone che il mini-redirector di rete non abbia impostato il RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH nel parametro Controls quando si chiama RxRegisterMinirdr. Questa opzione passata a RxRegisterMinirdr sarebbe insolita e indica che il mini redirector di rete non vuole che RDBSS sostituisca i relativi punti di ingresso di invio del driver.

  3. RDBSS riceve la richiesta MDFTL o IOCTL internamente per conto del redirector di rete. Il dispatcher RDBSS alloca e inizializza una struttura RX_CONTEXT. RDBSS chiama quindi la routine MRxLowIOSubmit[LOW_OP_FSCTL] o MRxLowIOSubmit[LOW_OP_IOCTL] definita nella struttura di MINIRDR_DISPATCH per questo mini redirector di rete, passando la struttura di RX_CONTEXT inizializzata come parametro.

  4. L'implementazione del mini-redirector di rete di questa routine di callback riconoscerebbe la richiesta PRIVATA MDFTL o IOCTL per avviare e chiamare RxStartMinirdr, passando un puntatore alla struttura RX_CONTEXT ricevuta da RDBSS come parametro RxContext e l'indirizzo del membro PostToFSP di RxContext come parametro PostToFsp .

  5. Poiché questa chiamata è stata avviata dalla modalità utente, RxStartMinirdr restituirà STATUS_PENDING e imposterà PostToFsp su TRUE.

  6. La routine MRxLowIOSubmit[LOW_OP_FSCTL] o MRxLowIOSubmit[LOW_OP_IOCTL] riceverà questo valore restituito e la passerà di nuovo al dispatcher RDBSS.

  7. Il dispatcher RDBSS riceverà il valore restituito STATUS_PENDING e imposterebbe PostToFsp su TRUE e quindi pubblicherebbe una richiesta a un thread di lavoro per eseguire nuovamente la chiamata al mini-redirector di rete.

Dopo questo punto, esistono due possibili risultati in base al fatto che sia stato richiesto ILTL o L'IOCTL come operazione asincrona o sincrona.

Se si tratta di una richiesta asincrona, si verificherebbe quanto segue:

  • Il chiamante in modalità utente riceverà la risposta STATUS_PENDING dalla chiamata. Il thread di lavoro inviato chiamerebbe infine RxStartMinirdr da un thread del file system e la chiamata verrebbe elaborata. La routine RxStartMinirdr tenterà di registrare il mini-reindirizzamento di rete come provider UNC, se richiesto. Nelle versioni di Windows precedenti a Windows Vista, RDBSS tenterà quindi di registrare il mini-redirector di rete come file system con la gestione di I/O. Se queste chiamate hanno esito positivo, RxStartMinirdr chiama la routine di callback MrxStart implementata dal mini-redirector di rete. Il valore restituito da MrxStart verrà infine restituito all'applicazione in modalità utente che ha avviato il processo della sequenza chiamante come operazione asincrona.

Se si trattasse di una richiesta sincrona, si verificherebbe quanto segue:

  • Il chiamante in modalità utente non riceverà la risposta STATUS_PENDING, ma verrebbe forzata ad attendere fino a quando la chiamata restituita dal thread di lavoro inviato. Il thread di lavoro inviato chiamerebbe infine RxStartMinirdr da un thread del file system e la chiamata verrebbe elaborata. La routine RxStartMinirdr tenterà di registrare il mini-reindirizzamento di rete come provider UNC, se richiesto. Nelle versioni di Windows precedenti a Windows Vista, RDBSS tenterà quindi di registrare il mini-redirector di rete come file system con la gestione di I/O. Se queste chiamate hanno esito positivo, RxStartMinirdr chiama la routine di callback MrxStart implementata dal mini-redirector di rete. Il valore restituito da MrxStart viene restituito all'applicazione in modalità utente che ha avviato il processo della sequenza chiamante.

Se un mini-redirector di rete indica il supporto per UNC durante la registrazione con RDBSS (il parametro Controls per RxRegisterMinirdr), RxStartMinirdr tenterà di registrare il parametro DeviceName del mini redirector di rete come provider UNC con MUP (RDBSS chiama FsRtlRegisterUncProvider per conto del mini-redirector di rete).

Nelle versioni di Windows precedenti a Windows Vista , RxStartMinirdr registra il file system con il gestore di I/O (RDBSS chiama IoRegisterFileSystem per conto del mini-redirector di rete).

Se le chiamate hanno esito positivo, RxStartMinirdr chiama la routine MrxStart mini-redirector di rete. Se MrxStart restituisce esito positivo, lo stato interno del mini redirector in RDBSS viene impostato su RDBSS_STARTED. Verrà incrementato anche il membro StartStopContext.Version dell'oggetto dispositivo mini-redirector.

La sequenza di avvio per RDBSS e il mini-redirector di rete devono essere completati nel contesto del processo di sistema se è richiesta un'operazione asincrona. Se la chiamata a RxStartMinirdr proviene da un processo in modalità utente (ad esempio una richiesta di servizio in modalità utente), la richiesta verrà inserita internamente da RDBSS in una coda di lavoro per un'elaborazione successiva e STATUS_PENDING verrà restituito e il parametro PostToFsp verrà impostato su TRUE. Inoltre, se alcuni blocchi RDBSS interni non possono essere ottenuti senza attendere, STATUS_PENDING viene restituito e PostToFsp è impostato su TRUE. Quando viene restituito STATUS_PENDING, RxStartMinirdr verrà chiamato di nuovo dall'interno di un processo di sistema. Se per l'operazione asincrona è stata impostata la richiesta MDFTL o IOCTL che ha avviato la chiamata a RxStartMinirdr , RDBSS restituirà STATUS_PENDING eseguire il backup della catena di chiamate alla richiesta ORIGINALE DITL o IOCTL dalla modalità utente. Al contrario, se la richiesta MDFTL o IOCTL era per l'operazione sincrona, la chiamata verrebbe inviata anche a un thread di lavoro per un'esecuzione successiva, ma la chiamata AITL o IOCTL non tornerebbe alla modalità utente fino a quando RxStartMinirdr non era stato eseguito nel contesto del processo del file system. In questo caso, il chiamante del FILETL o IOCTL non visualizzerà mai il STATUS_PENDING errore restituito. Il comportamento più tipico consiste nell'avviare una richiesta sincrona per queste operazioni di avvio/arresto per semplificare il codice dell'applicazione in modalità utente.

In caso di interruzione anomala o di un altro errore, RxStartMinirdr tenterà di annullare queste operazioni, inclusa la deregistrazione del provider UNC con MUP, l'annullamento della registrazione del file system, la liberazione della memoria allocata per l'archiviazione del nome di dominio da usare dalle trasmissioni mailslot e l'aggiornamento delle tabelle RDBSS interne.

Requisiti

Requisito Valore
Piattaforma di destinazione Desktop
Intestazione mrx.h (include Mrx.h)
IRQL <= APC_LEVEL

Vedi anche

, RxpUnregisterMinirdr

DriverEntry

FsRtlRegisterUncProvider

IoRegisterFileSystem

MRxLowIOSubmit[LOWIO_OP_FSCTL]

MRxLowIOSubmit[LOWIO_OP_IOCTL]

MRxStart

RxFsdDispatch

RxRegisterMinirdr

RxSetDomainForMailslotBroadcast

RxStopMinirdr

RxUnregisterMinirdr

__RxFillAndInstallFastIoDispatch