Partager via


Connexions et verrouillage de la structure de fichiers

À des fins de verrouillage, deux niveaux de tables de recherche sont utilisés :

  • Table d’objets par appareil pour les structures SRV_CALL et NET_ROOT (table préfixe)

  • Structure table par NET_ROOT pour les structures FCB (table FCB)

Ces tables distinctes permettent aux opérations d’annuaire sur différentes structures NET_ROOT de ne pas interférer une fois les connexions établies. Toutefois, les opérations de répertoire sur la même structure NET_ROOT interfèrent légèrement. Le tableau suivant décrit les verrous nécessaires pour des opérations spécifiques :

Opération Types de données Verrou obligatoire

Créer ou finaliser

SRV_CALL NET_ROOT V_NET_ROOT

Verrou exclusif sur la table NetName (champ TableLock de RxContext-RxDeviceObject-pRxNetNameTable>>).

Référence, déréférencement ou Recherche

SRV_CALL NET_ROOT V_NET_ROOT

Verrou partagé ou exclusif sur la table NetName (champ TableLock de RxContext-RxDeviceObject-pRxNetNameTable>>).

Créer ou finaliser

FCB SRV_OPEN FOBX

Verrou exclusif sur la table FCB (champ TableLock de NET_ROOT-FcbTable>).

Référence, déréférencement ou Recherche

FCB SRV_OPEN FOBX

Verrou partagé ou exclusif sur la table FCB (champ TableLock de NET_ROOT-FcbTable>).

Notez que les manipulations des structures de données SRV_OPEN et FOBX nécessitent actuellement le même verrou que pour les manipulations des structures de données FCB. Il s’agit simplement d’une idée d’économie de mémoire. Les versions ultérieures de Windows peuvent ajouter une autre ressource au niveau du fcb pour supprimer cette restriction afin qu’un ensemble de ressources partagées puisse être utilisé pour réduire la probabilité d’une collision à un niveau acceptablement faible.

Si vous avez besoin des deux verrous (FinaliseNetFcb, par exemple), vous devez d’abord prendre le verrou sur la table NetName, puis le verrou sur la table FCB. Vous devez libérer les verrous dans l’ordre inverse.

Le processus de création et de finalisation SRV_CALL, NET_ROOT et V_NET_ROOT est régi par l’acquisition et la publication du verrou RDBSS sur la table NetName.

Le processus de création et de finalisation fcb est régi par l’acquisition et la libération du verrou sur la table NetName associée à la structure NET_ROOT.

Le processus de création et de finalisation FOBX et SRVOPEN est régi par l’acquisition et la libération du verrou sur la table FCB.

Le tableau suivant récapitule les verrous et les modes dans lesquels les verrous doivent être acquis pour la création et la finalisation des différentes structures de données :

Type d’opération SRV_CALL NET_ROOT FCB SRV_OPEN FOBX

Créer

Verrou exclusif sur la table NetName

Verrou exclusif sur la table NetName

Verrou exclusif sur la table FCB

Verrou exclusif sur la table FCB

Verrou exclusif sur la table FCB

Finalize

Verrou exclusif sur la table NetName

Verrou exclusif sur la table NetName

Verrou exclusif sur la table FCB

Verrou exclusif sur la table FCB

Verrou exclusif sur la table FCB

Le référencement et le déréférencement de ces structures de données doivent également respecter certaines conventions.

Lorsque le nombre de références associées à l’une des structures de données passe à 1 (la seule référence détenue par la table de noms dans la plupart des cas), la structure de données est un candidat potentiel pour la finalisation. La structure de données peut être finalisée immédiatement ou marquée pour la récupération. Ces deux méthodes sont implémentées dans RDBSS. Lorsque les exigences de verrouillage sont remplies pendant le déréférencement, les structures de données sont finalisées immédiatement. La seule exception à cela est lorsque l’optimisation de l’opération différée est implémentée (déréférencement de la structure FCB, par exemple). Sinon, la structure de données est marquée pour la récupération.

Un mini-redirecteur réseau doit avoir un verrou exclusif sur la table NetName afin d’appeler une routine de finalisation.

Pour exécuter un create sur l’une de ces structures de données, un pilote de mini-redirecteur réseau doit effectuer une opération similaire à ce qui suit :

    getshared();lookup();
    if (failed) {
        release(); getexclusive(); lookup();
            if ((failed) { create(); }
        }
    deref();
    release();

Une fois le verrou acquis, insérez le nœud dans la table, relâchez le verrou, puis vérifiez si le serveur est disponible. Si le serveur est disponible, configurez le reste des informations et débloquez toute personne qui attend sur le même serveur (structures SRV_CALL ou NET_ROOT).