Les sections constituent le mécanisme natif utilisé par Windows pour mapper de la mémoire, partager des pages et relier des fichiers à la mémoire virtuelle.
Le sujet mérite un cours indépendant car il se situe à l'intersection du Memory Manager, du filesystem et du modèle objet.
Sommaire
- 1. Définition d'un Section Object
- 2. Relation avec CreateFileMapping
- 3. ZwCreateSection
- 4. Droits d'accès
- 5. Protections de pages
- 6. SEC_COMMIT et SEC_IMAGE
- 7. ZwMapViewOfSection
- 8. Mapping dans le processus système
- 9. BaseAddress et ViewSize
- 10. ZwUnmapViewOfSection
- 11. Section adossée à un fichier
- 12. Lien avec Cache Manager
- 13. Mémoire partagée
- 14. Sections nommées
- 15. Lifetime d'une section
- 16. Cas d'usage
- 17. Pièges
- 18. Comparaison avec I/O classique
1. Définition d'un Section Object
Une section représente un ensemble de pages pouvant être mappé dans un ou plusieurs espaces d'adressage.
Une section peut être :
- adossée à un fichier
- adossée au fichier de pagination
- partagée entre plusieurs processus
2. Relation avec CreateFileMapping
Côté user mode :
Code: Select all
CreateFileMapping
MapViewOfFile
Côté kernel, on rencontre notamment :
Code: Select all
ZwCreateSection
ZwMapViewOfSection
ZwUnmapViewOfSection
3. ZwCreateSection
Prototype simplifié :
Code: Select all
NTSTATUS ZwCreateSection(
PHANDLE SectionHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PLARGE_INTEGER MaximumSize,
ULONG SectionPageProtection,
ULONG AllocationAttributes,
HANDLE FileHandle
);
4. Droits d'accès
Exemples de droits :
Code: Select all
SECTION_MAP_READ
SECTION_MAP_WRITE
SECTION_MAP_EXECUTE
SECTION_QUERY
5. Protections de pages
Exemples :
Code: Select all
PAGE_READONLY
PAGE_READWRITE
PAGE_EXECUTE_READ
6. SEC_COMMIT et SEC_IMAGE
Les attributs de section modifient le comportement.
Exemples :
Code: Select all
SEC_COMMIT
SEC_RESERVE
SEC_IMAGE
7. ZwMapViewOfSection
Une section devient accessible lorsqu'une vue est mappée.
Conceptuellement :
Code: Select all
Section Object
|
v
Virtual Address Space
|
v
BaseAddress
8. Mapping dans le processus système
Un driver peut mapper une vue dans un contexte approprié, notamment le processus système selon le scénario.
Cela ne dispense pas de gérer :
- le contexte d'exécution
- l'IRQL
- la taille
- le lifetime de la vue
9. BaseAddress et ViewSize
ZwMapViewOfSection renseigne notamment :
Code: Select all
BaseAddress
ViewSize
10. ZwUnmapViewOfSection
Une vue doit être retirée avec :
Code: Select all
ZwUnmapViewOfSection(
ProcessHandle,
BaseAddress
);
11. Section adossée à un fichier
Pour une section adossée à un fichier :
Code: Select all
File Handle
|
v
Section
|
v
Mapped View
12. Lien avec Cache Manager
Le mapping de fichiers interagit avec :
- Memory Manager
- Cache Manager
- Filesystem
13. Mémoire partagée
Une section adossée au pagefile peut être utilisée pour partager de la mémoire entre plusieurs processus.
Chaque processus peut mapper une vue du même objet section.
Conceptuellement :
Code: Select all
Section
/ \
v v
Process A view Process B view
14. Sections nommées
Une section peut être nommée dans le namespace Object Manager.
Cela permet à plusieurs composants d'ouvrir le même objet par son nom, sous réserve des droits de sécurité.
15. Lifetime d'une section
Le lifetime suit les règles générales de l'Object Manager.
Il faut distinguer :
- handle de section
- références kernel
- vues encore mappées
16. Cas d'usage
Exemples :
- memory mapped files
- shared memory
- chargement d'images exécutables
- traitement de gros fichiers
- partage efficace entre composants
17. Pièges
- oublier ZwUnmapViewOfSection
- fermer trop tôt un handle ou une ressource associée
- utiliser une vue après unmap
- mapper avec des droits trop larges
- supposer que les pages sont toutes résidentes
- ignorer les contraintes d'IRQL
18. Comparaison avec I/O classique
Lecture classique :
Code: Select all
ZwReadFile
-> buffer
-> traitement
Code: Select all
ZwCreateSection
ZwMapViewOfSection
-> accès mémoire
-> ZwUnmapViewOfSection
Conclusion
Les section objects montrent comment Windows unifie fichiers, mémoire virtuelle et partage de pages. Elles sont fondamentales pour comprendre les memory mapped files et plusieurs mécanismes internes du système.
Exercices
- Créer une section read-only sur un fichier de test.
- Mapper la section et lire quelques octets.
- Créer une section de mémoire partagée entre deux programmes user mode puis comparer le principe avec la version kernel.
