Funzione RxStartMinirdr (mrx.h)
RxStartMinirdr viene chiamato per avviare un mini-reindirizzamento di rete chiamato in precedenza per la registrazione con RDBSS. Come parte di RxStartMinirdr, RDBSS registrerà anche il driver del mini-redirector di rete come provider UNC (Universal Naming Convention) con il provider UNC (MUP) multiple 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 di 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 | La 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 | Per completare questa routine sono state eseguite risorse insufficienti. |
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 dell'applicazione in modalità utente. Se la chiamata a RxStartMinirdr proviene da un processo in modalità utente (una richiesta di servizio in modalità utente, ad esempio), la richiesta viene inviata per un'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. |
Osservazioni
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-redirector di rete e una tabella di puntatori alle routine di callback implementate dal driver di mini-reindirizzamento di rete. RDBSS usa le routine di callback passate in questa struttura per comunicare con il mini-reindirizzamento 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 mrxStart routine di callback deve essere implementata dal driver del 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 richieste di I/O seguenti attraverso il driver fino a quando MrxStart restituisce correttamente:
- Le richieste IRP per le operazioni di creazione di dispositivi e dispositivi in cui il parametro FileObject->FileName.Length in IRPSP è zero e il parametro FileObject->RelatedFileObject è NULL.
Per qualsiasi altra richiesta IRP, la routine dispatch RDBSS RxFsdDispatch restituirà uno 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
Il mini-redirector di rete routine mrxStart viene chiamata da RDBSS quando viene chiamata la routine RxStartMinirdr. La routine RDBSS RxStartMinirdr viene in genere chiamata come risultato di una richiesta RDTL 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 corretta a RxRegisterMinirdr poiché alcune delle operazioni di elaborazione iniziali richiedono il completamento dell'inizializzazione del driver.
Quando RDBSS riceve una richiesta RDTL o IOCTL inviata a un driver mini-redirector di rete dalla modalità utente, RDBSS crea una struttura di RX_CONTEXT e passa questa chiamata alla routine di callback del mini-redirector di rete LOWIO_OP_IOCTLLOWIO_OP_FSCTL definita nella struttura MINIRDR_DISPATCH. L'implementazione del mini-redirector di rete di questa routine di callback riconosce la richiesta di avvio e chiamata RxStartMinirdr. Questo normale processo di eventi è elencato di seguito in modo più dettagliato:
Un'applicazione in modalità utente genera una richiesta PRIVATA DITL o IOCTL per avviare il mini-reindirizzamento di rete.
Il driver del kernel RDBSS riceve la richiesta FSCTL o IOCTL per conto del mini-redirector di rete, poiché RDBSS ha sostituito i punti di ingresso del dispatch driver del driver mini-redirector per puntare alle routine interne di RDBSS. Si noti che si presuppone che il mini-reindirizzamento 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-reindirizzamento di rete non vuole che RDBSS sostituisca i relativi punti di ingresso di invio del driver.
RDBSS riceve internamente la richiesta MDFTL o IOCTL per conto del redirector di rete. Il dispatcher RDBSS alloca e inizializza una struttura RX_CONTEXT. RDBSS chiama quindi il mini-redirector di rete MRxLowIOSubmit[LOW_OP_FSCTL] o MRxLowIOSubmit[LOW_OP_IOCTL] routine definita nella struttura di MINIRDR_DISPATCH per questo mini-reindirizzamento di rete, passando la struttura RX_CONTEXT inizializzata come parametro.
L'implementazione del mini-redirector di rete di questa routine di callback riconoscerebbe la richiesta PRIVATEFSTL o IOCTL per avviare e chiamare RxStartMinirdr, passando un puntatore alla struttura RX_CONTEXT ricevuta da RDBS Come parametro RxContext e l'indirizzo del membro PostToFSP di di RxContext come parametro PostToFsp.
Poiché questa chiamata è stata avviata dalla modalità utente, RxStartMinirdr restituirà STATUS_PENDING e imposta PostToFsp su TRUE.
Il mini-redirector di rete MRxLowIOSubmit[LOW_OP_FSCTL] o MRxLowIOSubmit[LOW_OP_IOCTL] routine riceverà questo valore restituito e lo passerebbe di nuovo al dispatcher RDBSS.
Il dispatcher RDBSS riceve il valore restituito STATUS_PENDING e imposta PostToFsp su TRUE e quindi invia una richiesta a un thread di lavoro per eseguire nuovamente la chiamata al mini-reindirizzamento di rete.
Dopo questo punto, ci sono due possibili risultati in base al fatto che l'oggetto FSCTL o IOCTL sia stato richiesto come operazione asincrona o sincrona.
Se si trattasse 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 RxStartMinirdr da un thread del file system e la chiamata verrebbe elaborata. La routine RxStartMinirdr tenterà di registrare il mini-redirector di rete come provider UNC, se richiesto. Nelle versioni di Windows precedenti a Windows Vista, RDBSS tenterà quindi di registrare il mini-reindirizzamento di rete come file system con 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 di sequenza chiamante come operazione asincrona.
Se si trattasse di una richiesta sincrona, si verificherebbe quanto segue:
- Il chiamante in modalità utente non riceve la risposta STATUS_PENDING, ma deve attendere fino a quando la chiamata restituita dal thread di lavoro inviato. Il thread di lavoro inviato chiamerebbe RxStartMinirdr da un thread del file system e la chiamata verrebbe elaborata. La routine RxStartMinirdr tenterà di registrare il mini-redirector di rete come provider UNC, se richiesto. Nelle versioni di Windows precedenti a Windows Vista, RDBSS tenterà quindi di registrare il mini-reindirizzamento di rete come file system con 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à restituito all'applicazione in modalità utente che ha avviato il processo di 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 gestione operazioni di I/O (RDBSS chiama IoRegisterFileSystem per conto del mini-redirector di rete).
Se le chiamate hanno esito positivo, RxStartMinirdr chiama il mini-redirector di rete routine mrxStart. Se mrxStart restituisce esito positivo, lo stato interno del mini-redirector in RDBSS è impostato su RDBSS_STARTED. Anche il StartStopContext.Version membro dell'oggetto dispositivo mini-redirector verrà incrementato.
La sequenza di avvio per RDBSS e il mini-redirector di rete devono essere completate nel contesto del processo di sistema se è richiesta l'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à restituita e il parametro PostToFsp verrà impostato su TRUE. Inoltre, se non è possibile ottenere determinati blocchi RDBSS interni 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 è stata impostata la richiesta DALLTL o IOCTL CHE ha avviato la chiamata a RxStartMinirdr per l'operazione asincrona, RDBSS restituirà STATUS_PENDING eseguire il backup della catena di chiamate alla richiesta ORIGINALE DICTL o IOCTL dalla modalità utente. Al contrario, se la richiesta FSCTL o IOCTL era per l'operazione sincrona, la chiamata verrebbe inviata anche a un thread di lavoro per un'esecuzione successiva, ma la chiamata ALLATL o IOCTL NON tornerebbe in modalità utente fino a quando non RxStartMinirdr era stato eseguito nel contesto del processo di file system. In questo caso, il chiamante dell'ISTRUZIONE 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 altro tipo, 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 da parte delle trasmissioni mailslot e l'aggiornamento delle tabelle RDBSS interne.
Fabbisogno
Requisito | Valore |
---|---|
piattaforma di destinazione | Desktop |
intestazione | mrx.h (include Mrx.h) |
IRQL | <= APC_LEVEL |
Vedere anche
MRxLowIOSubmit[LOWIO_OP_FSCTL]
MRxLowIOSubmit[LOWIO_OP_IOCTL]