Вы не сможете сделать это в 32-битной Windows. Любая запущенная программа, которая хочет это сделать, будет иметь как минимум 3 загруженных модуля:
- ntdll.dll
- ядро32.dll
- ваше приложение.exe
yourApplication.exe по умолчанию загружается по адресу 0x00400000.exe, хотя вы можете изменить этот адрес. ntdll.dll и kernel32.dll будут загружаться по своим обычным адресам загрузки в верхнем диапазоне 0x7Dxx0000.
В Vista и более поздних операционных системах приведенный выше абзац не соответствует действительности, поскольку адреса загрузки рандомизированы, но библиотеки dll по-прежнему будут присутствовать по своим собственным адресам в первых 2 ГБ памяти.
Таким образом, у вас не будет достаточно непрерывного пространства для загрузки исключительно большого PE-файла, даже если вы запустите Windows с ключом /3GB.
Если вы хотите получить представление о том, где будут загружаться различные библиотеки DLL, используйте VMValidator. (бесплатно) для визуализации адресного пространства вашего приложения. Представление виртуальной памяти показывает графическое представление (1 пиксель на страницу 4 КБ) памяти. Представления «Страницы» и «Абзац» показывают фактическое состояние виртуальной памяти для каждой страницы памяти и абзаца памяти.
Для 64-битной Windows вы можете загрузить 64-битный PE-файл размером 2 ГБ - конечно, должно быть достаточно непрерывного пространства, чтобы он мог загрузиться в память. Что касается того, будет ли это работать, я не могу сказать, вам придется это проверить.
person
Stephen Kellett
schedule
29.03.2010