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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2010, 16:27   #1
Neoteric
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 23
По умолчанию Ошибка доступа при выделении памяти в чужом процессе

Значит, пытаюсь выделить память в чужом процессе, ниче не выходит.
GetLastError() выдает 5. Т.е ошибка доступа
Код:
//бла-бла-бла находим окно чужого процесса
GetWindowThreadProcessId(Wnd, @pid);
proc := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
ptr := VirtualAllocEx(proces, nil, 4096, MEM_RESERVE, PAGE_READONLY);
// указатель становиться равным NULL, а GetLastError возвращает 5
Ради интереса, попробовал тоже самое, но на другом процессе, все ОК работает. Я что-то озадачен либо как-то надо запускать нужный мне процесс, либо его защитили от внедрения
Neoteric вне форума Ответить с цитированием
Старый 05.12.2010, 16:44   #2
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

Делают так. Выясняют что значит 5 из GetLastError. И таким образом понимают где ошибка. Или берут готовый пример и сравнивают со своим. Но лучше по первому.
oleg.v вне форума Ответить с цитированием
Старый 05.12.2010, 16:47   #3
Neoteric
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 23
По умолчанию

я написал же уже. 5 - это ошибка доступа или access denied
Neoteric вне форума Ответить с цитированием
Старый 05.12.2010, 16:55   #4
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

А proc вернул правильный хенлд, проверь его на нулл.
oleg.v вне форума Ответить с цитированием
Старый 05.12.2010, 19:14   #5
Neoteric
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 23
По умолчанию

Цитата:
Сообщение от oleg.v Посмотреть сообщение
А proc вернул правильный хенлд, проверь его на нулл.
да proc возвращает все правильно, сравнивал с программой WinSpy
Neoteric вне форума Ответить с цитированием
Старый 05.12.2010, 20:15   #6
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

Дурацкий вопрос, но всё же: Чем это отличается?

Код:
//бла-бла-бла находим окно чужого процесса
GetWindowThreadProcessId(Wnd, @pid);
proc := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
ptr := VirtualAllocEx(proces, nil, 4096, MEM_RESERVE, PAGE_READONLY);
// указатель становиться равным NULL, а GetLastError возвращает 5
oleg.v вне форума Ответить с цитированием
Старый 05.12.2010, 20:18   #7
Neoteric
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 23
По умолчанию

описачка) Когда вставлял сюда, код забыл отредактировать
Вот так у меня в програме
Код:
GetWindowThreadProcessId(Wnd, @pid);
proces := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
ptr := VirtualAllocEx(proces, nil, 4096, MEM_RESERVE, PAGE_READONLY);
Neoteric вне форума Ответить с цитированием
Старый 05.12.2010, 20:41   #8
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

Выполни GetLastError после proces := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);


process := OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
oleg.v вне форума Ответить с цитированием
Старый 05.12.2010, 21:06   #9
Neoteric
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 23
По умолчанию

тоже пробовал, ниче не возвращает
Neoteric вне форума Ответить с цитированием
Старый 05.12.2010, 21:17   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще ничего?
1)просите только те привилегии которые вам нужны. может процесс защитился от закрытия?(к примеру)

2)попробуйте так
Код:
pid:=GetWindowThreadProcessId(Wnd,nil);
if pid=0 then ShowMessage('не удалось получить идентификато процесса');
proc := OpenProcess(PROCESS_VM_OPERATION, FALSE, pid);//я поставил только аттрибут на выделение памяти, но не право её чтения/записи
if proc=0 then ShowMessage('не удалось открыть процесс');
ptr := VirtualAllocEx(proc, nil, 4096,MEM_COMMIT or MEM_RESERVE, PAGE_READONLY);
if ptr=nil then ShowMessage('не удалось выделить память');
да и освободить не забудьте потом её.
если выдаст сообщение то напишите которое.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка доступа памяти, при работе с принятой строкой. Zeraim Работа с сетью в Delphi 11 26.01.2010 01:11
Ошибка доступа к памяти AzoTik Общие вопросы Delphi 6 22.01.2010 10:17
Ошибка: Нарушение доступа к памяти. VladimirAleks Общие вопросы Delphi 6 03.11.2009 14:42
Как программно нажать клавишу в чужом процессе? Sere0ga Win Api 2 27.03.2007 18:43