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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2013, 16:37   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию VirtualAllocEx возвращает ошибку 87 (неправильный параметр)

Почему то не работает код:
Код:
startaddr:=$03000000;
libsize:=GetFileSize('C:\MyDll.dll',0);
dumphandle:=GetModuleHandle(0);
VirtualAllocEx(dumphandle,Pointer(startaddr),libsize,MEM_COMMIT,PAGE_READWRITE);
Пробовал dumphandle:=GetModuleHandle('C:\pro gram1.exe'); - тоже самое
calypso вне форума Ответить с цитированием
Старый 26.02.2013, 17:29   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

скорее всего по вашему адресу нельзя выделить нужный блок памяти.
и в самом себе выделять память можно просто VirtualAlloc
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.02.2013, 19:08   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Похоже ошибку выдает все-таки GetModuleHandle.Я просто вставил GetLastError после VirtualAllocEx,поэтому путаница возникла.Косвенно это подтверждается тем,что:
Код:
VirtualAllocEx(dumphandle,nil,libsize,MEM_COMMIT,PAGE_READWRITE);
дает тот же результат (здесь уже адрес я предоставил выбрать системе)

Вообще мне надо получить дескриптор самого вызывающего процесс.По идее должно быть GetModuleHandle(nil) наверно?
Целиком должно получиться вот что:
1. Узнали размер MyDll.dll
2. Узнали хэндл самого процесса (сами себя то есть)
3. Выделили под нее память в самом процессе, начиная с адреса startaddr
4. Вызываем LoadLibrary('MyDll.dll')

Так сложно потому что код инжектирован в другой процесс.

Последний раз редактировалось calypso; 26.02.2013 в 19:12.
calypso вне форума Ответить с цитированием
Старый 26.02.2013, 19:26   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

чтоб выделить память в самом себе примените VirtualAlloc.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.02.2013, 20:33   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Чем вам LoadLibrary не угодил...

Ваш вариант не работает, потому что вы путаете HMODULE и HANDLE процесса.
В одном процессе могут быть загружены разные модули.
waleri вне форума Ответить с цитированием
Старый 26.02.2013, 20:41   #6
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Фишка в том,чтобы загрузить библиотеку в нужную дырку.Для этого весь гемморой с VirtualAllocEx
Цитата:
startaddr:=$03000000;
Цитата:
чтоб выделить память в самом себе примените VirtualAlloc.
А ну да,я почему то спутал что MemoryMappingEx где нельзя было задавать адрес.А тут всё должно получиться:
LPVOID WINAPI VirtualAlloc(
_In_opt_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD flAllocationType,
_In_ DWORD flProtect
);
calypso вне форума Ответить с цитированием
Старый 26.02.2013, 22:35   #7
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Я так и не понял, зачем тебе выделять память предварительно. LoadLibrary же сделает это сама.
Son Of Pain вне форума Ответить с цитированием
Старый 26.02.2013, 22:51   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Я так и не понял, зачем тебе выделять память предварительно. LoadLibrary же сделает это сама.
и при этом уже выделенную память она не сможет применить(хотя может на это и расчет?)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция возвращает неправильный указатель RomanA Общие вопросы C/C++ 3 25.02.2012 19:06
TrackPopupMenuEx возвращает 87 ошибку (неверные входные параметры) TitoAlehandro Win Api 0 27.09.2011 11:01
при вставке записи в БД (MDB) выдает ошибку "неправильный синтаксис запроса" lkjuio C# (си шарп) 8 01.05.2011 23:30
HttpWebResponse: вервер возвращает 500 ошибку Manonia Общие вопросы .NET 0 24.07.2010 08:07
idHTTP при нерабочем сайте возвращает ошибку Yuran Работа с сетью в Delphi 5 26.05.2008 14:37