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

RxCompleteRequest

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.

RxCompleteRequest_Real

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.

RxCreateRxContext

Questa routine alloca una nuova struttura RX_CONTEXT e inizializza la struttura dei dati.

RxDereferenceAndDeleteRxContext_Real

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.

RxInitializeContext

Questa routine inizializza una struttura RX_CONTEXT appena allocata.

RxPrepareContextForReuse

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.

RxResumeBlockedOperations_Serially

Questa routine riattiva il thread in attesa successivo, se presente, nella coda di I/O di blocco serializzata.

RxSetMinirdrCancelRoutine

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.