Здравствуйте, Arier, Вы писали:
A>Нужно узнать число параметров у функции в dll, зная адрес данной функции и её имя.
В С++ рефлексии нет.
A>Ну или подскажите способ вызова функций по адресу и имени!Спасибо
int __stdcall the_foo(char, double, int) { ..... }
typedef void(*VoidFunc)(); // все функции можно привести к этому типу
VoidFunc vf = foo;
typedef int (__stdcall *FooType)(char,double,int);
FooType some_foo = (FooType)vf; // получили из обезличенного указателя - указатель нужного типаint x = some_foo('a',1.23,45); // и вызвали
Конкретно что касается DLL под виндами,
HMODULE hLib = LoadLibrary("the.dll");
FooType some_foo = (FooType) GetProcAddress(hLib, "the_foo"); // если функция была экспортирована под этим именем
Ну и чтоб два раза не вставать, упомяну, что
— экспортные имена у функций из С++ных библиотек, как правило, декорированы (mangled, decorated) — содержат суффикс с информацией о типе, это нужно для перегрузки
— можно заставить компилятор экспортировать/импортировать недекорированные имена — они объявляются как extern "C"
— однако, для разных конвенций вызова такие имена будут остаточно декорированы в стиле Си или WinAPI — "_the_foo" (конвенция __cdecl) или "the_foo" (конвенция __stdcall)
— в .def-файле можно указать линкеру, как именно экспортировать функцию — вплоть до того, что её именем будет целое число
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: получение параметров функции по указателю и имени
Здравствуйте, Кодт, Вы писали:
К>Ну и чтоб два раза не вставать, упомяну, что К>- экспортные имена у функций из С++ных библиотек, как правило, декорированы (mangled, decorated) — содержат суффикс с информацией о типе, это нужно для перегрузки К>- можно заставить компилятор экспортировать/импортировать недекорированные имена — они объявляются как extern "C" К>- однако, для разных конвенций вызова такие имена будут остаточно декорированы в стиле Си или WinAPI — "_the_foo" (конвенция __cdecl) или "the_foo" (конвенция __stdcall) К>- в .def-файле можно указать линкеру, как именно экспортировать функцию — вплоть до того, что её именем будет целое число
Ну и тогда уж надо упомянуть о UnDecorateSymbolName, которая позволяет в случае хорошо декорированного имени получить-таки сигнатуру.
--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: получение параметров функции по указателю и имени
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Arier, Вы писали:
A>>Нужно узнать число параметров у функции в dll, зная адрес данной функции и её имя.
К>В С++ рефлексии нет.
A>>Ну или подскажите способ вызова функций по адресу и имени!Спасибо
К>
К>int __stdcall the_foo(char, double, int) { ..... }
К>typedef void(*VoidFunc)(); // все функции можно привести к этому типу
К>VoidFunc vf = foo;
К>typedef int (__stdcall *FooType)(char,double,int);
К>FooType some_foo = (FooType)vf; // получили из обезличенного указателя - указатель нужного типа
К>int x = some_foo('a',1.23,45); // и вызвали
К>
К>Конкретно что касается DLL под виндами, К>
К>HMODULE hLib = LoadLibrary("the.dll");
К>FooType some_foo = (FooType) GetProcAddress(hLib, "the_foo"); // если функция была экспортирована под этим именем
К>
К>Ну и чтоб два раза не вставать, упомяну, что К>- экспортные имена у функций из С++ных библиотек, как правило, декорированы (mangled, decorated) — содержат суффикс с информацией о типе, это нужно для перегрузки К>- можно заставить компилятор экспортировать/импортировать недекорированные имена — они объявляются как extern "C" К>- однако, для разных конвенций вызова такие имена будут остаточно декорированы в стиле Си или WinAPI — "_the_foo" (конвенция __cdecl) или "the_foo" (конвенция __stdcall) К>- в .def-файле можно указать линкеру, как именно экспортировать функцию — вплоть до того, что её именем будет целое число
Здравствуйте, проблема в том, что мне необходимо вызвать максимальное число функций Win32 API при этом используя только dll. То есть достать адреса и имена функций можно, но нужно каким-то способом определить число параметров, для вызова...вот проблема...
Re[3]: получение параметров функции по указателю и имени
Здравствуйте, Sergey Chadov, Вы писали:
SC>Ну и тогда уж надо упомянуть о UnDecorateSymbolName, которая позволяет в случае хорошо декорированного имени получить-таки сигнатуру.
... которую пользователь сможет прочесть в рантайме
... которую можно использовать для автоматического порождения C++ного кода, который потом нужно скомпилировать и как-то запустить
Поскольку jit-компиляторы C++ — это... редкость, что ли,.. то пользы от UnDecorateSymbolName маловато будет.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: получение параметров функции по указателю и имени
< оверквотинг выброшен >
A>Здравствуйте, проблема в том, что мне необходимо вызвать максимальное число функций Win32 API при этом используя только dll. То есть достать адреса и имена функций можно, но нужно каким-то способом определить число параметров, для вызова...вот проблема...
А по-подробнее можно?
Вообще, эта тема абсолютно выходит за рамки С++ и относится к низкоуровневому программированию или каким-то отдельным моментам винапи.
Определись с этим, и мы перебросим ветку в соответствующий форум.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: получение параметров функции по указателю и имени
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Arier, Вы писали:
К>< оверквотинг выброшен >
A>>Здравствуйте, проблема в том, что мне необходимо вызвать максимальное число функций Win32 API при этом используя только dll. То есть достать адреса и имена функций можно, но нужно каким-то способом определить число параметров, для вызова...вот проблема...
К>А по-подробнее можно? К>Вообще, эта тема абсолютно выходит за рамки С++ и относится к низкоуровневому программированию или каким-то отдельным моментам винапи. К>Определись с этим, и мы перебросим ветку в соответствующий форум.
Ну вообщем да, относиться к низкоуровневому программированию...поскольку решение нашлось нетривиальное и заключается в забивании стека пустыми параметрами по максимуму, то есть максимальное число параметров у Win32 API функции.Вопрос в принципе исчерпан, но проблема в другом, теперь нужно отлавливать исключения, а делать это в ассемблерной части...то есть секции try-catch не позволяют это сделать, или всё же можно как-то распростронить их на ассемблерный код??
Re[4]: получение параметров функции по указателю и имени
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Arier, Вы писали:
К>< оверквотинг выброшен >
A>>Здравствуйте, проблема в том, что мне необходимо вызвать максимальное число функций Win32 API при этом используя только dll. То есть достать адреса и имена функций можно, но нужно каким-то способом определить число параметров, для вызова...вот проблема...
К>А по-подробнее можно? К>Вообще, эта тема абсолютно выходит за рамки С++ и относится к низкоуровневому программированию или каким-то отдельным моментам винапи. К>Определись с этим, и мы перебросим ветку в соответствующий форум.
Задача в том, чтобы вызвать к примеру все функции библиотеки user32.dll, при этом вовсе не обязательно передавать правильные параметры, нужно просто заставить программу зайти в функцию и по возможности отловить исключения возникающие при этом.вот такое задание...=)
Re[5]: получение параметров функции по указателю и имени
Здравствуйте, Arier, Вы писали:
A>Ну вообщем да, относиться к низкоуровневому программированию...поскольку решение нашлось нетривиальное и заключается в забивании стека пустыми параметрами по максимуму, то есть максимальное число параметров у Win32 API функции.Вопрос в принципе исчерпан, но проблема в другом, теперь нужно отлавливать исключения, а делать это в ассемблерной части...то есть секции try-catch не позволяют это сделать, или всё же можно как-то распростронить их на ассемблерный код??
Обработка исключений реализуется виндой. Как использовать в программе ассемблере см. например http://www.wasm.ru
--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[5]: получение параметров функции по указателю и имени
Здравствуйте, Arier, Вы писали:
A>Задача в том, чтобы вызвать к примеру все функции библиотеки user32.dll, при этом вовсе не обязательно передавать правильные параметры, нужно просто заставить программу зайти в функцию и по возможности отловить исключения возникающие при этом.вот такое задание...=)
Стресс-тестирование user32.dll?
Во-первых, там большинство функций экспортируются с ординалами, а те, которые с именами — не декорированы, поскольку потребители — не С++ные программы, а любые.
Во-вторых, исключения там очень простые: либо функция возвращает код ошибки, либо возникает структурное исключение (чаще всего — защита памяти), либо она успевает сделать нечто деструктивное, например, удалить все файлы из текущего каталога.
То есть, ловить особо нечего.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[6]: получение параметров функции по указателю и имени
Здравствуйте, Кодт, Вы писали:
К>Стресс-тестирование user32.dll? К>Во-первых, там большинство функций экспортируются с ординалами, а те, которые с именами — не декорированы, поскольку потребители — не С++ные программы, а любые. К>Во-вторых, исключения там очень простые: либо функция возвращает код ошибки, либо возникает структурное исключение (чаще всего — защита памяти), либо она успевает сделать нечто деструктивное, например, удалить все файлы из текущего каталога. К>То есть, ловить особо нечего.
Да мне не ловить, мне нужно чтобы программа при этом не падала...а она из-за первого неправильного обращения к памяти падает...=)
Re[7]: получение параметров функции по указателю и имени
Здравствуйте, Arier, Вы писали:
A>Да мне не ловить, мне нужно чтобы программа при этом не падала...а она из-за первого неправильного обращения к памяти падает...=)
И пусть падает. Потому что если сегодня ты поймал AV, то завтра не поймаешь (кто-то удачно выстрелит в незащищённую страницу) и огребёшь произвольные наведённые ошибки.
Так что вместо повышения живучести лучше сейчас побороться за повышение правильности.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[8]: получение параметров функции по указателю и имени
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Arier, Вы писали:
A>>Да мне не ловить, мне нужно чтобы программа при этом не падала...а она из-за первого неправильного обращения к памяти падает...=)
К>И пусть падает. Потому что если сегодня ты поймал AV, то завтра не поймаешь (кто-то удачно выстрелит в незащищённую страницу) и огребёшь произвольные наведённые ошибки. К>Так что вместо повышения живучести лучше сейчас побороться за повышение правильности.