gestione di RX_CONTEXT e IRP
La struttura RX_CONTEXT è una delle strutture di dati fondamentali usate da RDBSS e mini-redirector di rete per gestire un pacchetto di richiesta di I/O . Una struttura RX_CONTEXT descrive un IRP durante l'elaborazione e contiene informazioni sullo stato che consentono il rilascio delle risorse globali al termine dell'IRP. La struttura dei dati RX_CONTEXT incapsula un IRP da usare da RDBSS, mini-reindirizzamenti di rete e dal file system. Una struttura RX_CONTEXT include un puntatore a un singolo IRP e a tutto il contesto necessario per elaborare l'IRP.
Una struttura RX_CONTEXT viene talvolta definita contesto IRP o RxContext nei file di intestazione di Windows Driver Kit (WDK) e altre risorse usate per lo sviluppo di driver mini-redirector di rete.
Il RX_CONTEXT è una struttura di dati a cui sono collegate informazioni aggiuntive fornite dai vari mini redirector di rete. Dal punto di vista della progettazione, queste informazioni aggiuntive possono essere gestite in uno dei diversi modi seguenti:
Consentire la definizione dei puntatori di contesto come parte di RX_CONTEXT, che i mini-reindirizzamenti di rete usano per archiviare le informazioni. Ciò implica che ogni volta che una struttura RX_CONTEXT viene allocata e eliminata definitivamente, il driver mini-redirector di rete deve eseguire un'allocazione o una distruzione separata del blocco di memoria che contiene le informazioni aggiuntive sul mini-reindirizzamento di rete. Poiché RX_CONTEXT strutture vengono create e distrutte in un numero elevato, questa non è una soluzione accettabile dal punto di vista delle prestazioni.
Un altro approccio consiste nell'allocare le dimensioni di ogni struttura RX_CONTEXT in base a una quantità predefinita per ogni mini redirector di rete, che viene quindi riservato per l'uso dal mini redirector. Questo approccio evita l'allocazione e la distruzione aggiuntive, ma complica il codice di gestione RX_CONTEXT in SERVIZI Desktop remoto.
Il terzo approccio consiste nell'allocare un'area predefinita, che è la stessa per tutti i mini redirector di rete come parte di ogni RX_CONTEXT. Si tratta di un'area non formattata sopra la quale qualsiasi struttura desiderata può essere imposto dai vari mini redirector di rete. Tale approccio supera gli svantaggi associati agli approcci precedenti. Questo è l'approccio attualmente implementato in SERVIZI Desktop remoto.
Il terzo approccio è lo schema usato da RDBSS. Di conseguenza, gli sviluppatori di driver mini-redirector di rete devono provare a definire il contesto privato associato per adattarsi a questa area predefinita definita nella struttura dei dati RX_CONTEXT. I driver mini-redirector di rete che violano questa regola comportano una significativa riduzione delle prestazioni.
Molte routine e routine RDBSS esportate da un mini-redirector di rete fanno riferimento a RX_CONTEXT strutture nel thread di avvio o in un altro thread utilizzato dalla routine. Pertanto, le strutture RX_CONTEXT vengono conteggiate per gestire l'uso per le operazioni asincrone. Quando il conteggio dei riferimenti passa a zero, la struttura RX_CONTEXT può essere finalizzata e rilasciata nell'ultima operazione di dereferenziazione.
RDBSS fornisce una serie di routine usate per modificare una struttura RX_CONTEXT e l'IRP associato. Queste routine vengono utilizzate per allocare, inizializzare ed eliminare una struttura RX_CONTEXT. Queste routine vengono usate anche per completare l'IRP associato a un RX_CONTEXT e configurare una routine di annullamento per un RX_CONTEXT.
Le routine seguenti modificano le strutture RX_CONTEXT:
Routine | Descrizione |
---|---|
Questa routine viene utilizzata per completare un IRP associato a una struttura RX_CONTEXT. Questa routine viene usata internamente da RDBSS e non deve essere usata dai mini-reindirizzamenti di rete. |
|
Questa routine viene utilizzata per completare un IRP associato a una struttura RX_CONTEXT. Questa routine viene usata internamente da RDBSS e non deve essere usata dai mini-reindirizzamenti di rete. |
|
Questa routine alloca una nuova struttura RX_CONTEXT e inizializza la struttura dei dati. |
|
Questa routine dereferenzia una struttura RX_CONTEXT e se il conteggio dei riferimenti va a zero, dealloca e rimuove la struttura RX_CONTEXT specificata dalle strutture di dati in memoria RDBSS. |
|
Questa routine inizializza una struttura RX_CONTEXT appena allocata. |
|
Questa routine prepara una struttura RX_CONTEXT per il riutilizzo reimpostando tutte le allocazioni e le acquisizioni specifiche dell'operazione eseguite in precedenza. I parametri ottenuti da IRP non vengono modificati. Questa routine viene usata internamente da RDBSS e non deve essere usata dai mini-reindirizzamenti di rete. |
|
Questa routine riattiva il thread in attesa successivo, se presente, nella coda di I/O di blocco serializzata. |
|
La routine configura una routine di annullamento del mini redirector di rete per una struttura di RX_CONTEXT. |
|
__RxSynchronizeBlockingOperations | Questa routine viene usata per sincronizzare l'I/O di blocco con la stessa coda di lavoro. Questa routine viene utilizzata internamente da RDBSS per sincronizzare le operazioni named pipe. Questa routine può essere utilizzata da un mini-redirector di rete per sincronizzare le operazioni in una coda separata gestita dal mini-redirector di rete. La routine è disponibile solo in Windows Server 2003. |
__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock | Questa routine viene usata per sincronizzare l'I/O di blocco con la stessa coda di lavoro. Questa routine viene utilizzata internamente da RDBSS per sincronizzare le operazioni named pipe. Questa routine può essere utilizzata da un mini-redirector di rete per sincronizzare le operazioni in una coda separata gestita dal mini-redirector di rete. La routine è disponibile solo in Windows XP e Windows 2000. |
Le macro seguenti sono definite nel file di intestazione rxcontx.h che chiamano le routine elencate nella tabella precedente. Queste macro vengono in genere usate invece di chiamare direttamente queste routine.
Macro | Descrizione |
---|---|
RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE) |
Questa macro sincronizza il blocco delle richieste di I/O nella stessa coda di lavoro. In Windows Server 2003 questa macro chiama la routine __RxSynchronizeBlockingOperations con il parametro DropFcbLock impostato su FALSE. In Windows XP e Windows 2000 questa macro chiama la routine __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock con il parametro DropFcbLock impostato su FALSE. |
RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE) |
Questa macro sincronizza il blocco delle richieste di I/O nella stessa coda di lavoro. In Windows Server 2003 questa macro chiama la routine __RxSynchronizeBlockingOperations con il parametro DropFcbLock impostato su TRUE. In Windows XP e Windows 2000 questa macro chiama la routine __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock con il parametro DropFcbLock impostato su TRUE. |