Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
1 / 1 / 1
Регистрация: 06.03.2015
Сообщений: 87

Различие в хп и 7 у функции ZwAllocateVirtualMemory

13.01.2017, 22:46. Показов 7282. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тестировал поведение функции ZwAllocateVirtualMemory на системах хп и 7 при требовании выделить память по указанному адресу пользователем. К примеру, если пробую выделить память с адреса 0x00000000, то на хп выделяет, а на 7 выдает ошибку 0xC00000F0=STATUS_INVALID_PARAMETER_2
C++
1
2
3
LPVOID addr = ( LPVOID )0x1;
         SIZE_T size = 0x1000;
         int ercod=(int)ZwAllocateVirtualMemory( ( HANDLE ) -1,&addr, 0, &size, MEM_COMMIT | MEM_RESERVE , PAGE_EXECUTE_READWRITE );
Собственно почему в 7 не выделяет по нулевым адресам и можно ли все-таки выделить на 7 там память ?
Тут чтобы узнать причину дебажить ядро надо как понимаю ? Пробовал windbg, но он почему-то проскакивает команду sysenter, не получается через него попасть в отладку в ядре этой функции.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2017, 22:46
Ответы с готовыми решениями:

Различие между double и int, и разъяснение функции result
Добрый вечер кодеры , появился такой вопрос в чём различие между int и double , я понимаю что int это для целых чисел , а double числа с...

Производные и производные неявно заданной функции. В чем различие?
Здравствуйте! Вот возникла следующая проблема не могу понять. 1. Пусть у меня есть функция, которая задана «явно», например: ...

Различие версий
Есть две версии Мака: Snow Leopard 10.6.2, 10.6.6i by Hazard В чем отличия версии 10.6.2 от версии 10.6.6i Хочи поставить Мак, не...

32
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
28.08.2021, 21:45
Студворк — интернет-сервис помощи студентам
Nexi99, https://devblogs.microsoft.com... 0/?p=42223
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
28.08.2021, 22:11
Цитата Сообщение от The trick Посмотреть сообщение
Nexi99, https://devblogs.microsoft.com... 0/?p=42223
значит всё же 64кб выделяется функцией ZwAllocateVirtualMemory. А VirtualAlloc выделяет 4кб(проверял сам лично) т.е. работает с участком выделенным ZwAllocateVirtualMemory. VirtualAlloc дробит участок на части поменьше, ядро системы может выделить память сразу нескольким ПО которые её просят. Выше VirtualAlloc стоит куча, а на самом верху maloc new.
Как пользоваться этим параметром BaseAddress?
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
28.08.2021, 22:40
Nexi99, нет, читай внимательно описание функций. ZwAllocateVirtualMemory и VirtualAlloc почти идентичны.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Как пользоваться этим параметром BaseAddress?
А что именно непонятно?
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
28.08.2021, 23:02
Цитата Сообщение от The trick Посмотреть сообщение
А что именно непонятно?
там какое-то смещение "адреса разреза". По идее его можно не трогать т.к. оно установлено по умолчанию, но даже в этой теме человек оставил вот так &addr.
0
 Аватар для Morgot
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
29.08.2021, 17:39
Цитата Сообщение от Nexi99 Посмотреть сообщение
там какое-то смещение "адреса разреза".
Этот параметр можно оставить как NULL, тогда система сама выделит где-то там память и запишет ее адрес. Параметр представляет собой указатель на указатель, т.е. как-то так:
C
1
2
3
4
5
6
    
    ULONG_PTR ZeroBits = 0;
    DWORD64 *mem = NULL;
    DWORD64 RegionSize = 8192;
 
    NtAllocateVirtualMemory(GetCurrentProcess(), (DWORD64)&mem, (DWORD64)&ZeroBits, (DWORD64)&RegionSize,(DWORD64)MEM_COMMIT | MEM_RESERVE, (DWORD64)PAGE_READONLY);
Код не надо копипастить, он вообще с другого проекта, тут суть в том, что параметр mem сам является указателем, вы в него заносите NULL (ну либо какой-то адрес), и после успешного выполнения функции в него же система запишет адрес памяти ! (тот, который возвращается virtualloc, потому что натив апи не возвращают ничего, кроме статусов).
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
29.08.2021, 20:10
Цитата Сообщение от Nexi99 Посмотреть сообщение
значит всё же 64кб выделяется функцией ZwAllocateVirtualMemory. А VirtualAlloc выделяет 4кб
Zw функции выполняются в ядре.
сравниваешь работу ZwAllocateVirtualMemory и VirtualAlloc вообще некорректно, неважно сколько памяти выделяется одной, а сколько другой.
юзер запихивает данные в VirtualAlloc, и пока трасса дойдёт до ZwAllocateVirtualMemory через internal, всё по сотне раз изменится системой на предмет правильного исполнения.
1
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
29.08.2021, 20:39
Цитата Сообщение от _lunar_ Посмотреть сообщение
неважно сколько памяти выделяется одной, а сколько другой
это очень важно. Т.к. эта функция ZwAllocateVirtualMemory может выделить общую память на несколько программ ZwAllocateVirtualMemory-VirtualAlloc-HeapCreate(там есть и другие специфические алокаторы типа LocalAlloc)-maloc(может отсутствовать)-new. ZwAllocateVirtualMemory является ядром по сути один процесс который будет распределён, потому что 64кб можно разбить чёрт знает как. 4кб слабая величина. Но если вам нужно более 64кб то VirtualAlloc-HeapCreate-maloc-new можно выбросить в мусорку.

Добавлено через 3 минуты
Цитата Сообщение от Morgot Посмотреть сообщение
после успешного выполнения функции в него же система запишет адрес памяти
т.е. можно задать смещение?
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
29.08.2021, 20:45
Цитата Сообщение от Nexi99 Посмотреть сообщение
там какое-то смещение "адреса разреза". По идее его можно не трогать т.к. оно установлено по умолчанию, но даже в этой теме человек оставил вот так
Нужно тебе к примеру зарезервировать регион адресного пространства с конкретными адресами - ты задаешь этот адрес в параметре BaseAddress (указатель на адрес). Если адрес неважен - передаешь в этом параметре NULL (указатель на NULL). В этом параметре всегда возвращается адрес выделенной / зарезервированной памяти. Это значение при резервировании округляется до 64КБ границы (allocation granularity), при выделении до 4КБ (page boundary). Можно к примеру зарезервировать регион адресного пространства и по необходимости выделять в этом регионе страницы - адреса будут именно те что ты задашь - система не позволит кому-нибудь другому зарезервировать память в этом регионе.

Добавлено через 2 минуты
Цитата Сообщение от Nexi99 Посмотреть сообщение
это очень важно. Т.к. эта функция ZwAllocateVirtualMemory может выделить общую память на несколько программ ZwAllocateVirtualMemory-VirtualAlloc-HeapCreate(там есть и другие специфические алокаторы типа LocalAlloc)-maloc(может отсутствовать)-new. ZwAllocateVirtualMemory является ядром по сути один процесс который будет распределён, потому что 64кб можно разбить чёрт знает как. 4кб слабая величина. Но если вам нужно более 64кб то VirtualAlloc-HeapCreate-maloc-new можно выбросить в мусорку.
Менеджер хипа работает поверх функций выделения виртуальной памяти. ZwAllocateVirtualMemory и VirtualAlloc, как я написал, почти идентичны.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
29.08.2021, 21:10
Цитата Сообщение от The trick Посмотреть сообщение
Нужно тебе к примеру зарезервировать регион адресного пространства с конкретными адресами - ты задаешь этот адрес в параметре BaseAddress
какаета задача специфическая если вы просите в строгом месте выделить память. Я так понимаю это виртуальный адрес а не физический. В справочнике почитал но не понял ничего думал для защиты.
Если мне нужна память сейчас реалтайм сколько даст ZwAllocateVirtualMemory 4 или 64. Если резервируешь она полностью блокируется или если туда нет записей то блокировка память устная?
Цитата Сообщение от The trick Посмотреть сообщение
Менеджер хипа работает поверх функций выделения виртуальной памяти.
Ну так а где от них ядро? Какая изначальная функция под ними?
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
29.08.2021, 21:30
Цитата Сообщение от Nexi99 Посмотреть сообщение
какаета задача специфическая если вы просите в строгом месте выделить память. Я так понимаю это виртуальный адрес а не физический. В справочнике почитал но не понял ничего думал для защиты.
Каждый процесс имеет свое собственное виртуальное адресное пространство. Вот VirtualAlloc/ZwAllocateVirtualMemory выделяют/резервируют виртуальную память (это очевидно из их названия). Нужно, к примеру тебе разместить какой-либо код с абсолютной адресацией - необходимо выделить память строго по определенным адресам.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Если мне нужна память сейчас реалтайм сколько даст ZwAllocateVirtualMemory 4 или 64.
Сколько запросишь - функция только выровнит по границе страниц. 64Кб - относится к резервированию. Можно зарезервировать 100МБ, но физически память не будет выделена - это лишь означает что в АП процесса появится область размером в 100МБ. Из этой области потом можно выделять с грануляцией в 4КБ (размер страниц). Можно за раз и зарезервировать и выделить.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Если резервируешь она полностью блокируется или если туда нет записей то блокировка память устная?
Что значит блокируется? Если регион АП зарезервирован - в нем можно выделить память. Зарезервировать еще раз эту память не получится, но память выделить по адресу зарезервированной памяти - вполне.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Ну так а где от них ядро? Какая изначальная функция под ними?
ZwAllocateVirtualMemory.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
29.08.2021, 22:41
Цитата Сообщение от The trick Посмотреть сообщение
ZwAllocateVirtualMemory.
значит я схему написал правильно. ZwAllocateVirtualMemory-VirtualAlloc-HeapCreate-maloc-new. Последние 3 лишь пилят память и распределяют её сравнивать их с ZwAllocateVirtualMemory не нужно.
Цитата Сообщение от The trick Посмотреть сообщение
Каждый процесс имеет свое собственное виртуальное адресное пространство. Вот VirtualAlloc/ZwAllocateVirtualMemory выделяют/резервируют виртуальную память (это очевидно из их названия). Нужно, к примеру тебе разместить какой-либо код с абсолютной адресацией - необходимо выделить память строго по определенным адресам.
Ну буду знать не работал ещё с ней.
Цитата Сообщение от The trick Посмотреть сообщение
Сколько запросишь - функция только выровнит по границе страниц.
Значит ZwAllocateVirtualMemory в режиме резервирования-64Кб(минимум) а в реалтайм 4кб(минимум) ну а дальше пилите, хотите свои функции распределения памяти пишите хотите хотите вызывайте VirtualAlloc-HeapCreate-maloc-new, в целом так? Я на форумах читал что он 64 всегда выделяет минимум.
Цитата Сообщение от The trick Посмотреть сообщение
Что значит блокируется?
Если память Виртуальная не факт что она достанется именно вам, просто ОС может держать в уме заметочку что вам она понадобится и нужно вам в какой-то момент предоставить.

А тот адрес про который вы объяснили он физический или виртуальный?
И ещё вопрос если адрес выделяется библиотеке к какому адресному пространству будет принадлежать такой указатель к вызывающему или к какому-то другому?
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
29.08.2021, 23:07
Цитата Сообщение от Nexi99 Посмотреть сообщение
Последние 3 лишь пилят память и распределяют её сравнивать их с ZwAllocateVirtualMemory не нужно.
Ну вообще память разная бывает, это может быть к примеру и отображение секции.

Цитата Сообщение от Nexi99 Посмотреть сообщение
ну а дальше пилите, хотите свои функции распределения памяти пишите хотите хотите вызывайте VirtualAlloc-HeapCreate-maloc-new, в целом так?
Еще раз - VirtualAlloc и ZwAllocateVirtualMemory это почти одно и тоже. HeapAlloc к примеру - это уже надстройка, Local/GlobalAlloc - тоже.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Если память Виртуальная не факт что она достанется именно вам, просто ОС может держать в уме заметочку что вам она понадобится и нужно вам в какой-то момент предоставить.
Ничего не понял. Вот есть зарезервированный регион АП. Память тут можно выделить, но зарезервировать опять не получится пока память не будет освобождена (MEM_RELEASE). Можно к примеру выделить в этом регионе память, потом эту память освободить (MEM_DECOMMIT), потом опять выделить и так сколько угодно - регион зарезервирован.

Цитата Сообщение от Nexi99 Посмотреть сообщение
А тот адрес про который вы объяснили он физический или виртуальный?
Я говорил о виртуальных адресах, программист в подавляющем большинстве случаев работает с ними.

Цитата Сообщение от Nexi99 Посмотреть сообщение
И ещё вопрос если адрес выделяется библиотеке к какому адресному пространству будет принадлежать такой указатель к вызывающему или к какому-то другому?
Не понял вопроса, но в общих чертах память при вызове ZwAllocateVirtualMemory выделяется в процессе, хендл которого передается в первом параметре. Если нужно расшарить память между процессами то используйте секции (маппинги). В разных процессах виртуальные адреса могут отличаться, но физически они будут ссылаться на одну и ту же память. Это относится и к исполняемым файлам - запустив 100 блокнотов, физически память для всех exe/dll ссылается на одну и туже физ-память.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
30.08.2021, 01:33
Цитата Сообщение от The trick Посмотреть сообщение
HeapAlloc к примеру - это уже надстройка
я про это и пишу.
Ну понятно теперь всё.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.08.2021, 01:33

Различие в тригерах
Подскажите в чем разница между INSTEAD OF и FOR???

Объяснить различие
int Head() const { return first->item; } int &Head() { return first->item; } Здравствуйте ! Можете объяснить отличие...

Различие индуктивностей.
Здравствуйте уважаемые электроведы) Подскажите пожалуйста в чем отличие индуктивностей похожих на резисторы и индуктивностей...

Различие в строках
Уважаемые форумчане! У меня происходит какая-то магия при взаимодействии c# wpf и ms sql: Есть какая-то строка: class...

Различие в версии
Начал изучать Java.Скачал книгу,там пишется про Java 2.Вопрос:отличаеться Java 2 от сегодняшнего стандарта Java 7?Сильно ли отличается?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru