Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Запись в память, выделенную функцией ExAllocatePool  (Прочитано 12031 раз)
0 Пользователей и 1 Гость смотрят эту тему.
[nike]
Гость
« : 07-01-2004 12:36 » 

Проблема следующая.  Выделяю память функцией ExAllocatePool, затем ее освобождаю ExFreePool. Всё нормально.
Код:

PVOID pool = NULL;
int a = 5;
pool = ExAllocatePool)NonPagedPool, PAGE_SIZE:;
pool = &a;
ExFreePool)pool:;
               
Но когда пытаюсь туда что-нибудь записать, выскакивает SoftICE, пишет Page Fault, а потом перезагрузка.
Записан
grozny
Гость
« Ответ #1 : 09-01-2004 19:56 » 

не понял. Можно ли увидеть полный код с присваиванием?  

Приведённый кусок работать не будет - мы пул тут же испортили после выделения и пытаемся деаллокировать совершенно левый блок (адрес а)Не понял Опечатка?
Записан
BSOD
Гость
« Ответ #2 : 10-01-2004 11:22 » 

по ходу нет =)
Записан
BSOD
Гость
« Ответ #3 : 10-01-2004 11:25 » 

а пул никто не портил =)

не нада ляля, гронзи
Записан
BSOD
Гость
« Ответ #4 : 10-01-2004 11:32 » 

он освобождает стек =)
все верно =)
только перед а нада вставить заголовок пула, тогда бсода не будеzzz =)


скушно, господа, вы живете =)
Записан
grozny
Гость
« Ответ #5 : 11-01-2004 02:29 » 

нескушный БСОД, ещё подумай чё куда вставлять и про что спрашивали - глядишь,  через пару сообщений окончательно разберёшься в 5 строчках.
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #6 : 11-01-2004 10:53 » 

хоть я и не знаю, как работает ExAllocatePool, но по приведенному куску видно, что сначала pool присвоили полученный адрес, а следом адрес переменной a. А дальше пытаемся что-то высвободить по этому адресу - явная ошибка.
Записан
[nike]
Гость
« Ответ #7 : 11-01-2004 13:12 » 

Во избежание путаницы, не мог бы кто-нибудь привести код с правильным использованием данной функции.
Записан
maaaaaad
Гость
« Ответ #8 : 11-01-2004 15:33 » 

[nike],

int *pool;
int a = 5;
pool = (PVOID) ExAllocatePool(NonPagedPool, PAGE_SIZE);
*pool = a;
ExFreePool((PVOID) pool);

grozny,  раз ты так все хорошо понял, написал бы сам. И напиши еще как мы испортили наш выделенный пул. Повесели толпу.

[nike], учти, что следующий раз мы будем просто стыдить за такие вопросы.
Записан
grozny
Гость
« Ответ #9 : 12-01-2004 02:19 » 

Цитата

И напиши еще как мы испортили наш выделенный пул. Повесели толпу.

Охотно. тем более мне помогает такие талантливые клоуны.

переменная называется pool, ага. Она была испорчена, нет? Ну так я написал русскими буквами, что видимо и привело к путанице. Если это у кого-то вызвало недоумение, то надо бы уточнить, прежде чем пытаться изображать гигантов мысли. Вот так вот pool и испортили.  

Цитата

grozny, раз ты так все хорошо понял, написал бы сам.


Где это я писал, что я всё хорошо понял? Я писал вот это:

Цитата

не понял. Можно ли увидеть полный код с присваиванием?


У меня было подозрение, что автор вопроса смутно понимает, как работать с указателями (начиная с объявление PVOID pool и пр.). Однако я предпочёл дождаться разъяснений автора, опечатка или он и впрямь полагает, что код правильный (коих так и не последовало).

Мистер Трясоручкин (ничего, что по-русски,а?), ваш код скомпилируется с предупреждениями - объявляем указатель типа int* и потом пытаемся ему присваивать void*?
Код:

int *pool;
int a = 5;
pool = )int*: ExAllocatePool)NonPagedPool, PAGE_SIZE:;
*pool = a;
ExFreePool))PVOID: pool:;


За вопросы никого стыдить не надо. Любые вопросы приветствуются. А гонор - нет. Все как-нибудь начинали (либо опечатки делали) и надо хотя бы стараться относиться с пониманием, без претензий. И заявлять "мы" в подобных случах - перебор. Я вас не уполномачивал.

найк
ты б всё-таки пояснил - чё за петрушка с укропом у тебя в вопросе? И устраивает ли тебя приведённый вариант ответа? Телепатов тут, как видишь, нету  Отлично Стоит слово-то написать немного не так и уж черти по углам мерещатся кандидатам в телепаты.

К тому же выделять страницу под одну переменную - непрактично. Если нам нужна одна переменная типа int, отчего бы не объявить под прагмой alloc_text? и не мучить себя ручным выделением памяти. А если надо действительно массив - то так и сказать, чё конкретно надо.
Записан
[nike]
Гость
« Ответ #10 : 13-01-2004 10:16 » 

С указателями действительно напутал.
Надо было вместо
Код:
pool = &a; 

писать
Код:
*pool = a; 

Целую страницу под одну переменную тоже выделять конечно не практично,
но это только ради примера.
2grozny: Ваш ответ устраивает, с вопросом разобрался.
Всем спасибо за внимание.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines