Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2012, 22:14   #1
bomdom
Новичок
Джуниор
 
Регистрация: 19.09.2012
Сообщений: 6
Печаль VirtualProtect принимает значение False(Delphi 7). Как исправит?

Написал программу, в который один из пунктов поменять атрибут защиты страницы, а он не меняется, в чему у меня ошибка?
Проверяю атрибут с помощью VirtualQuery.

Код:
procedure TForm1.Button3Click(Sender: TObject);
VAR //mbi:MEMORY_BASIC_INFORMATION;
    mbi:TMemoryBasicInformation;
    dwRez:DWORD;
begin
  if Edit1.GetTextLen<=0
  then ShowMessage('Введите виртуальный адрес')
  else
  begin
    dwRez:=VirtualQuery(pointer(StrToInt(Edit1.Text)),mbi,sizeof(MEMORY_BASIC_INFORMATION));
    Memo1.Clear;
    Memo1.Lines.Add('Базовый адрес '+IntToStr(integer(mbi.BaseAddress)));
    Memo1.Lines.Add('Адрес размещения'+IntToStr(integer(mbi.BaseAddress)));
    case mbi.AllocationProtect of
      0:            Memo1.Lines.Add('ВАП зарезервировано');
      PAGE_NOACCESS:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_NOACCESS');
      PAGE_READONLY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READONLY');
      PAGE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READWRITE');
      PAGE_EXECUTE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE');
      PAGE_EXECUTE_READ:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READ');
      PAGE_EXECUTE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READWRITE');
      PAGE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_WRITECOPY');
      PAGE_EXECUTE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_WRITECOPY');
    end;
    Memo1.Lines.Add('Размер региона '+IntToStr(mbi.RegionSize)+' байт');
    case mbi.State of
      MEM_COMMIT: Memo1.Lines.Add('Состояние ВАП MEM_COMMIT');
      MEM_RESERVE: Memo1.Lines.Add('Состояние ВАП MEM_RESERVE');
      MEM_FREE: Memo1.Lines.Add('Состояние ВАП MEM_FREE');
    end;
    case mbi.Protect of
      0:            Memo1.Lines.Add('зарезервировано');
      PAGE_NOACCESS:Memo1.Lines.Add('Атрибут защиты физ.памяти PAGE_NOACCESS');
      PAGE_READONLY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READONLY');
      PAGE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READWRITE');
      PAGE_EXECUTE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE');
      PAGE_EXECUTE_READ:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READ');
      PAGE_EXECUTE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READWRITE');
      PAGE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_WRITECOPY');
      PAGE_EXECUTE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_WRITECOPY');
    end;
  end;
end;


procedure TForm1.Button7Click(Sender: TObject);
begin
Case  RadioGroup1.ItemIndex of
  0: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_NOACCESS,nil);
  1: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_REAdonly,nil);
  2: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_READWRITE,nil);
  3: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_EXECUTE,nil);
  4: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_EXECUTE_READ,nil);
  5: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_EXECUTE_READWRITE,nil);
  6: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_WRITECOPY,nil);
  7: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_EXECUTE_WRITECOPY,nil);
end;
end;
bomdom вне форума Ответить с цитированием
Старый 19.09.2012, 23:09   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Прочитайте документацию к VirtualProtect() и обратите особое внимание на последний аргумент.
waleri вне форума Ответить с цитированием
Старый 20.09.2012, 00:15   #3
bomdom
Новичок
Джуниор
 
Регистрация: 19.09.2012
Сообщений: 6
Сообщение

lpflOldProtect [out]
Указатель на переменную, которая принимает старое значение атрбута доступа к памяти для первой страницы из указанного диапазона. Если этот параметр равен nil, или не является правильным указателем на переменную, функция вернет ошибку.

Если имеется в виду вот это(то что с верху), я код изменял на такое, но и так не работает.

Код:
 p:=pointer(777777);
  case RadioGroup1.ItemIndex of
    0: sss:=VirtualProtect(pointer(StrToInt(Edit1.Text)),4096,PAGE_NOACCESS,p);
    1: sss:=VirtualProtect(pointer(StrToInt(Edit1.Text)),4096,PAGE_READONLY,p);
bomdom вне форума Ответить с цитированием
Старый 20.09.2012, 00:22   #4
bomdom
Новичок
Джуниор
 
Регистрация: 19.09.2012
Сообщений: 6
По умолчанию

Так же пробовал вот так.
Код:
procedure TForm1.Button7Click(Sender: TObject);
var  OldProtectionCode: Cardinal;
begin
Case  RadioGroup1.ItemIndex of
  0: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_NOACCESS,@OldProtectionCode);
  1: VirtualProtect(pointer(StrToInt64(Edit1.Text)),4096,PAGE_READONLY,@OldProtectionCode);
bomdom вне форума Ответить с цитированием
Старый 20.09.2012, 00:36   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Значит остается проверить адрес - читаем ту же документацию и теперь обращаем внимание на первый аргумент.
waleri вне форума Ответить с цитированием
Старый 20.09.2012, 14:58   #6
bomdom
Новичок
Джуниор
 
Регистрация: 19.09.2012
Сообщений: 6
Радость Нашёл решение.Спасибо!

В VirtualAlloc надо было прописать MEM_RESERVE. Теперь работает
До этого читал функции в методичке, в ней не все описано.
bomdom вне форума Ответить с цитированием
Старый 20.09.2012, 15:19   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Странно, должно работать и с MEM_COMMIT
waleri вне форума Ответить с цитированием
Старый 20.09.2012, 17:09   #8
bomdom
Новичок
Джуниор
 
Регистрация: 19.09.2012
Сообщений: 6
Радость

Я прочитал еще и про VirtualAlloc, да работает и с MEM_COMMIT, я поначалу не раздумывая менял знчения virtualAlloc, во и написал прошлый ответ(на деле изменил две переменные), оказывается я lpAddress в VirtualProtect указал не такой как в VirtualAlloc.

Программа у меня работает.
bomdom вне форума Ответить с цитированием
Старый 20.09.2012, 17:39   #9
bomdom
Новичок
Джуниор
 
Регистрация: 19.09.2012
Сообщений: 6
По умолчанию Вопрос?

Вопрос немного не по названию темы.
Почему при вводе некоторых адресов(например 6675435), размер регона становится большим(335872 байт) и атрибт защиты не меняется?

Где об этом почитать?
bomdom вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Иногда не сохраняются изменения в базе Paradox. Как исправит? Dux БД в Delphi 9 31.08.2012 23:30
Проблемы с Delphi 7 на Windows 7 (delphi не принимает пути с кирилицей) unbanned Общие вопросы Delphi 12 16.04.2011 21:19
не могу додуматься как исправит программу ... YooGine Общие вопросы C/C++ 2 23.07.2010 11:44
VirtualAlloc и VirtualProtect? VintProg Общие вопросы Delphi 1 29.06.2009 11:50
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body tabikA HTML и CSS 5 24.02.2009 21:50