Luego ya tienes la de sistemas 'NT' (elfa_new apunta a ella) IMAGE_NT_HEADERS:
Error de tipografía es e_lfanew
ohh.. shaddy volvistes por estos lares
, sin duda un 3lit3...
Ahora, sobre la pregunta de si necesita estar en la base 0x00400000 la respuesta es: No.
No es necesario, el Sistema Operativo siempre da prioridad al ImageBase, pero en caso de no poder mapearse en esa zona de memoria lo situaría en una página sin reservar.
El caso más fácil de ver son por ejemplo las librerías, la mayoría de ellas intentan mapearse en 0x01000000 pero si te fijas en tu debugger favorito verás que siempre se van alojando de forma contigua.
Si no me equivoco a la hroa de linkear puedes cambiar eso...
Ahora si me preguntas sobre el resto de direcciones quitando las que reservan las librerías tienes las páginas de Stack y contextos (PEB y TEB) en los últimos 100K de los 2GB.
El resto son páginas que se reservan para generar memoria (y devolver heaps).
Aparte de lo que te dijo Shaddy:
Cada programa tiene sus 4GB de memoria en el espacio de direcciones, eso no quiere decir que ocupen 4gb de memoria física, si no que el programa puede direccionar cualquier dirección en ese rango.
Nox.