| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Virtual Protect, выделение памяти |
| Автор: kin 27.10.2012, 14:39 | ||
Здравствуйте. Есть следующий участок кода:
Итак, мне нужно в процессе работы программы выделить участок памяти равный размеру X по адресу 0x00400000 (Базовый адрес загрузки PE файлов по умолчанию). ImageBase моего exe - 0x00500000. Проблема: У VirtualAlloc выделяет память не всегда; когда выделяет, когда нет. Поработав с отладчиком, увидел, что иногда по данному адресу уже лежат какие-то данные, либо этот участок зарезервирован. Наверное в связи с этим, VirtualAlloc и возвращает NULL. Вопрос: Как можно указать в моем приложении PE загрузчику (может директивы какие и пр.), чтобы он не проецировал ничего на такой-то участок памяти, не резервировал его и пр.? Так как, данные мне нужно разместить именно в этом участке и ни в каком другом. Если что-то не понятно, спрашивайте. P.S. Ставил GetLastError после VirtualProtect. Код ошибки почему-то тоже не постоянный. То 87-"Параметр задан неверно", то 487-"Попытка обращения к неверному адресу". |
| Автор: bems 28.10.2012, 01:25 |
| Только успеть зарезервировать этот регион раньше. Что мешает работать по другому адресу? Если отсутствие релоков в экзешнике, то в этой ситуации и виндовый загрузчик не загрузит |
| Автор: kin 28.10.2012, 13:47 | ||
Тогда, получается, это нужно делать тогда еще до запуска моего приложения, чтобы загрузчик не успел спроецировать туда данные. Этот вариант разумеется отпадает. Далее, bems, я правильно понял, что можно загрузить образ по другому адресу и обработать таблицу релокаций? Но тут же вопрос, если в exe-шнике нет релокаций, то это значит что он должен грузиться только по одному ImageBase или что в нем просто нет абсолютных адресов, и он может грузиться по любому адресу? |