Synchronisation oplock
Les filtres et les systèmes de fichiers qui demandent des verrous opportunistes exclusifs (oplocks) doivent synchroniser les appels dans le package oplock fourni par le système. En particulier, les appels aux routines FSCTRL oplock (pour établir des oplocks) doivent être synchronisés avec les appels aux routines oplock case activée-break. Voici une liste des deux ensembles de routines :
Routines d’Oplock FSCTRL :
- Minifilters : FltOplockFsctrl, FltOplockFsctrlEx
- Filtres et systèmes de fichiers hérités : FsRtlOplockFsctrl, FsRtlOplockFsctrlEx, FsRtlUpperOplockFsctrl
Routines oplock case activée-break :
- Minifilters : FltCheckOplock, FltCheckOplockEx
- Filtres et systèmes de fichiers hérités : FsRtlCheckOplock, FsRtlCheckOplockEx, FsRtlCheckOplockEx2, FsRtlOplockBreakH
Lors du traitement d’une demande oplock, les filtres et les systèmes de fichiers doivent garantir les éléments suivants :
- Les E/S susceptibles de rompre un blocage d’opération ne peuvent pas se produire en parallèle avec le traitement de la demande.
- Les demandes de blocage d’opération ne peuvent pas se produire simultanément avec les accusés de réception d’arrêt d’oplock.
Les appels IRP qui demandent la création d’oplocks exclusifs pour le même bloc de contrôle de fichier (FCB) sont les suivants :
- IRP_MJ_CREATE avec le bit FILE_OPEN_REQUIRING_OPLOCK défini dans Create.Options
- IRP_MJ_FILE_SYSTEM_CONTROL avec des contrôles oplock
Voici quelques exemples de synchronisation oplock :
Lors du traitement d’une demande oplock, un système de fichiers acquiert une ressource exclusivement, appelle FsRtlOplockFsctrlEx et libère la ressource.
Lors du traitement d’un accusé de réception d’arrêt d’opération, le système de fichiers acquiert cette même ressource partagée, appelle FsRtlOplockFsctrlEx et libère la ressource.
Lors de l’exécution d’E/S, le système de fichiers acquiert cette même ressource partagée, appelle FsRtlCheckOplockEx2, effectue les E/S et libère la ressource.
Les systèmes de fichiers supérieurs doivent s’assurer qu’ils se synchronisent entre les appels de FsRtlCheckUpperOplock et FsRtlUpperOplockFsctrl de la même manière.