Pour réserver de la mémoire pour un processus, on va tout d'abord allouer les pages dont il a besoin pour son code, son stack, et éventuellement pour ses données. Puis ces zones mémoire seront partagées avec le kernel, qui va les mapper en 0xc0000000. Le kernel va ainsi pouvoir remplir ces zones directement. Puis le partage au niveau du kernel est libéré, et le processus peut alors s'executer.
La création de ces zones est effectuée par la fonction CreateMemProcess, qui prend un pointeur vers une structure MemProcess en paramètre.
typedef struct MemProc { struct ProcIn { int NumProcess; // Le numéro du process que l'on va créer int NbCodePage; // Le nombre de pages à réserver pour le code void * CodeEntry; // L'adresse virtuelle où implanter les pages de code int NbDataPages; // Le nombre de pages à réserver pour les data void * DataEntry; // L'adresse virtuelle où implanter les data int NbStackPages; // Le nombre de pages à réserver pour la pile void * StackEntry; // L'adresse virtuelle où implanter la pile. Attention: la pile va vers le bas. C'est donc l'adressse supérieure } In; struct ProcOut { void * CodeEntry; // Adresse virtuelle du code dans l'espace kernel void * DataEntry; // Adresse virtuelle du data dans l'espace kernel void * StackEntry; // Adresse virtuelle du stack dans l'espace kernel unsigned long cr3; // cr3 du process } Out; } MemProc;
L'appel à la fonction KernelNettoie permet de libérer les partages, et donc de créer un nouveau process.