Section Objects et Memory Mapping en Kernel Windows

Ce cours dédiée au développement de drivers en kernel mode sans Framework

Moderator: Rick

Post Reply
Hydraxx
Site Admin
Posts: 144
Joined: Mon Jan 12, 2026 4:04 pm
Location: France
Contact:

Section Objects et Memory Mapping en Kernel Windows

Post by Hydraxx »

Section Objects et Memory Mapping en Kernel Windows

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
Une section est un véritable objet kernel géré par l'Object Manager.


2. Relation avec CreateFileMapping

Côté user mode :

Code: Select all

CreateFileMapping
MapViewOfFile
reposent conceptuellement sur les sections natives.

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
);
Avec un FileHandle valide, la section peut être adossée à un fichier.


4. Droits d'accès

Exemples de droits :

Code: Select all

SECTION_MAP_READ
SECTION_MAP_WRITE
SECTION_MAP_EXECUTE
SECTION_QUERY
Le principe reste le même que pour les autres objets : demander uniquement les droits nécessaires.


5. Protections de pages

Exemples :

Code: Select all

PAGE_READONLY
PAGE_READWRITE
PAGE_EXECUTE_READ
La protection doit être cohérente avec l'utilisation prévue.


6. SEC_COMMIT et SEC_IMAGE

Les attributs de section modifient le comportement.

Exemples :

Code: Select all

SEC_COMMIT
SEC_RESERVE
SEC_IMAGE
SEC_IMAGE sert notamment pour les images exécutables et obéit à des règles spécifiques.


7. ZwMapViewOfSection

Une section devient accessible lorsqu'une vue est mappée.

Conceptuellement :

Code: Select all

Section Object
      |
      v
Virtual Address Space
      |
      v
BaseAddress
Le mapping crée une vue dans le processus cible.


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
Ces valeurs doivent être conservées pour accéder à la vue puis la démonter correctement.


10. ZwUnmapViewOfSection

Une vue doit être retirée avec :

Code: Select all

ZwUnmapViewOfSection(
    ProcessHandle,
    BaseAddress
);
Fermer le handle de section n'est pas identique à démonter une vue.


11. Section adossée à un fichier

Pour une section adossée à un fichier :

Code: Select all

File Handle
    |
    v
Section
    |
    v
Mapped View
Les pages peuvent être chargées à la demande par le Memory Manager.


12. Lien avec Cache Manager

Le mapping de fichiers interagit avec :
  • Memory Manager
  • Cache Manager
  • Filesystem
Cela explique pourquoi une lecture via mapping n'est pas simplement équivalente à ZwReadFile.


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
Les deux vues peuvent référencer les mêmes pages physiques.


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
La présence d'une vue ou d'une référence peut maintenir les ressources nécessaires.


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
Mapping :

Code: Select all

ZwCreateSection
ZwMapViewOfSection
-> accès mémoire
-> ZwUnmapViewOfSection
Le meilleur choix dépend du scénario. Pour de petites lectures ponctuelles, l'I/O classique est souvent plus simple. Pour des accès aléatoires ou répétés dans de gros fichiers, le mapping peut être intéressant.


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.

Who is online

Users browsing this forum: No registered users and 1 guest