gestion des RX_CONTEXT et des IRP
La structure RX_CONTEXT est l’une des structures de données fondamentales utilisées par RDBSS et les mini-redirecteurs réseau pour gérer un paquet de demandes d’E/S (IRP). Une structure RX_CONTEXT décrit un IRP pendant son traitement et contient des informations d’état qui permettent aux ressources globales d’être publiées à l’issue de l’IRP. La structure de données RX_CONTEXT encapsule un IRP à utiliser par RDBSS, les mini-redirecteurs réseau et le système de fichiers. Une structure RX_CONTEXT inclut un pointeur vers un IRP unique et tout le contexte requis pour traiter l’IRP.
Une structure RX_CONTEXT est parfois appelée contexte IRP ou RxContext dans les fichiers d’en-tête du Kit de pilotes Windows (WDK) et d’autres ressources utilisées pour développer des pilotes de mini-redirecteur réseau.
Le RX_CONTEXT est une structure de données à laquelle sont attachées des informations supplémentaires fournies par les différents mini redirecteurs réseau. Du point de vue de la conception, ces informations supplémentaires peuvent être gérées de plusieurs manières :
Autorisez la définition de pointeurs de contexte dans le cadre de RX_CONTEXT, que les mini-redirecteurs réseau utilisent pour stocker leurs informations. Cela implique que chaque fois qu’une structure de RX_CONTEXT est allouée et détruite, le pilote de mini-redirecteur réseau doit effectuer une allocation ou une destruction associée distincte du bloc de mémoire qui contient les informations supplémentaires du mini-redirecteur réseau. Étant donné que RX_CONTEXT structures sont créées et détruites en grand nombre, ce n’est pas une solution acceptable du point de vue des performances.
Une autre approche consiste à surallouer la taille de chaque structure RX_CONTEXT selon un montant prédéfinis pour chaque mini redirecteur réseau, qui est ensuite réservé à l’utilisation par le mini redirecteur. Une telle approche évite l’allocation et la destruction supplémentaires, mais complique le code de gestion RX_CONTEXT dans RDBSS.
La troisième approche consiste à allouer une zone prédéfinie, qui est la même pour tous les mini redirecteurs réseau dans le cadre de chaque RX_CONTEXT. Il s’agit d’une zone non mise en forme sur laquelle toute structure souhaitée peut être imposée par les différents mini redirecteurs réseau. Une telle approche surmonte les inconvénients associés aux approches précédentes. Il s’agit de l’approche actuellement implémentée dans RDBSS.
La troisième approche est le schéma utilisé par RDBSS. Par conséquent, les développeurs de pilotes de mini-redirecteur réseau doivent essayer de définir le contexte privé associé pour s’adapter à cette zone prédéfinie définie dans la structure de données RX_CONTEXT. Les pilotes de mini-redirecteur réseau qui enfreignent cette règle entraînent une pénalité de performances importante.
De nombreuses routines et routines RDBSS exportées par un mini-redirecteur réseau font référence aux structures RX_CONTEXT dans le thread de lancement ou dans un autre thread utilisé par la routine. Ainsi, les structures RX_CONTEXT sont comptabilisées pour gérer leur utilisation pour les opérations asynchrones. Lorsque le nombre de références passe à zéro, la structure RX_CONTEXT peut être finalisée et publiée lors de la dernière opération de déréférencement.
RDBSS fournit un certain nombre de routines utilisées pour manipuler une structure RX_CONTEXT et l’IRP associé. Ces routines sont utilisées pour allouer, initialiser et supprimer une structure RX_CONTEXT. Ces routines sont également utilisées pour effectuer l’IRP associée à un RX_CONTEXT et configurer une routine d’annulation pour un RX_CONTEXT.
Les routines suivantes manipulent RX_CONTEXT structures :
Routine | Description |
---|---|
Cette routine est utilisée pour effectuer une IRP associée à une structure RX_CONTEXT. Cette routine est utilisée en interne par RDBSS et ne doit pas être utilisée par les mini-redirecteurs réseau. |
|
Cette routine est utilisée pour effectuer une IRP associée à une structure RX_CONTEXT. Cette routine est utilisée en interne par RDBSS et ne doit pas être utilisée par les mini-redirecteurs réseau. |
|
Cette routine alloue une nouvelle structure RX_CONTEXT et initialise la structure de données. |
|
Cette routine déréférence une structure RX_CONTEXT et, si le nombre de références passe à zéro, elle libère et supprime la structure de RX_CONTEXT spécifiée des structures de données en mémoire RDBSS. |
|
Cette routine initialise une structure de RX_CONTEXT nouvellement allouée. |
|
Cette routine prépare une structure RX_CONTEXT pour la réutilisation en réinitialisant toutes les allocations et acquisitions spécifiques à l’opération effectuées précédemment. Les paramètres obtenus à partir de l’IRP ne sont pas modifiés. Cette routine est utilisée en interne par RDBSS et ne doit pas être utilisée par les mini-redirecteurs réseau. |
|
Cette routine réveille le thread d’attente suivant, le cas échéant, sur la file d’attente d’E/S bloquante sérialisée. |
|
La routine configure une routine d’annulation de mini-redirecteur réseau pour une structure RX_CONTEXT. |
|
__RxSynchronizeBlockingOperations | Cette routine est utilisée pour synchroniser les E/S bloquantes avec la même file d’attente de travail. Cette routine est utilisée en interne par RDBSS pour synchroniser les opérations de canal nommé. Cette routine peut être utilisée par un mini-redirecteur réseau pour synchroniser les opérations sur une file d’attente distincte gérée par le mini-redirecteur réseau. La routine est disponible uniquement sur Windows Server 2003. |
__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock | Cette routine est utilisée pour synchroniser les E/S bloquantes avec la même file d’attente de travail. Cette routine est utilisée en interne par RDBSS pour synchroniser les opérations de canal nommé. Cette routine peut être utilisée par un mini-redirecteur réseau pour synchroniser les opérations sur une file d’attente distincte gérée par le mini-redirecteur réseau. La routine est disponible uniquement sur Windows XP et Windows 2000. |
Les macros suivantes sont définies dans le fichier d’en-tête rxcontx.h qui appelle les routines répertoriées dans le tableau précédent. Ces macros sont normalement utilisées au lieu d’appeler ces routines directement.
Macro | Description |
---|---|
RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE) |
Cette macro synchronise les demandes d’E/S bloquantes dans la même file d’attente de travail. Sur Windows Server 2003, cette macro appelle la routine __RxSynchronizeBlockingOperations avec le paramètre DropFcbLock défini sur FALSE. Sur Windows XP et Windows 2000, cette macro appelle la routine __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock avec le paramètre DropFcbLock défini sur FALSE. |
RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE) |
Cette macro synchronise les demandes d’E/S bloquantes dans la même file d’attente de travail. Sur Windows Server 2003, cette macro appelle la routine __RxSynchronizeBlockingOperations avec le paramètre DropFcbLock défini sur TRUE. Sur Windows XP et Windows 2000, cette macro appelle la routine __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock avec le paramètre DropFcbLock défini sur TRUE. |