| Предыдущий | Следующий |
| STATUS_DEVICE_POWER_FAILURE | STATUS_MEMORY_NOT_ALLOCATED |
STATUS_FREE_VM_NOT_AT_BASE
MEM_RELEASE должен указывать начало резервирования
Освобождение резервирования отличается от снятия фиксации страниц внутри него. Когда размер области равен нулю и вызывающая сторона запрашивает полное освобождение, базовый адрес должен точно совпадать с адресом, возвращённым исходным вызовом резервирования. Внутренний указатель, даже выровненный по странице, не может идентифицировать освобождаемый объект выделения.
Храните базовые адреса выделений в объектах владения и никогда не вычисляйте их округлением произвольных указателей. Если повторно использовать нужно только поддиапазон, снимите фиксацию, сохранив резервирование и соблюдая правила API. Для отображённых представлений по-прежнему требуется UnmapViewOfFile.
Что исследовать
- Сравните переданный указатель с AllocationBase из VirtualQuery и исходной записью выделения.
- Убедитесь, что RegionSize и FreeType соответствуют освобождению, а не снятию фиксации.
- Проверьте арифметику указателей и заголовки распределителя на потерю истинного базового адреса.
Ссылки
- Microsoft: VirtualFree
- Microsoft WDK: NtFreeVirtualMemory
- Microsoft: VirtualQuery
- Открытые спецификации Microsoft: значения NTSTATUS
Нужно найти другой код? Найти другой код состояния или ошибки.