
Tema
04.04.2017
13:23:52

Alex Фэils?︙
04.04.2017
13:24:42
в этом контексте речь о TCHAR

Tema
04.04.2017
13:25:48

Alex Фэils?︙
04.04.2017
13:27:03
они кстати осмысленные но выглядят как вызов ктулу с непривычки

Google

Alex Фэils?︙
04.04.2017
13:27:03
они МАКСИМАЛЬНО краткие и информативные, не придерешься

Tema
04.04.2017
13:27:16

Square
04.04.2017
13:27:36
Не хочу #holywar но мс придумала весьма неплохие костыли

Alex Фэils?︙
04.04.2017
13:27:38
да вот ща я мтпрото-бота напишу, и будет счастье

Tema
04.04.2017
13:27:40

Vitaly
04.04.2017
13:28:12
Бот в таком случае будет перехватывать авторство сообщений же.

Tema
04.04.2017
13:28:57

Vitaly
04.04.2017
13:29:14

Alex Фэils?︙
04.04.2017
13:29:34
я нашел тут либу по мтпрото на крестах

Tema
04.04.2017
13:29:52

Aleksei
04.04.2017
13:30:04

Google

Alex Фэils?︙
04.04.2017
13:30:12
нет, там ужасно все
мне проще на планшете собрать ту либу в автотулзах, чем десктопную телегу с кучей ебанистики

Vitaly
04.04.2017
13:31:30

Michael
04.04.2017
13:43:46

Антон
04.04.2017
16:13:46
void nf_nativeload(std::stack<MValue*>* stack) {
void *handle = dlopen(((std::string*) stack->top()->castTo(MTYPE_STRING)->get())->c_str(), RTLD_LOCAL);
stack->pop();
int count = *(int*) dlsym(handle, "mlang_nativefunctions_count");
char** list = *(char***) dlsym(handle, "mlang_nativefunctions_list");
for(int i = 0; i < count; i++) {
void (*func)(std::stack<MValue*>*) = *(void(**)(std::stack<MValue*>*)) dlsym(handle, list[i]);
nativefunctions[(std::string) list[i]] = func;
}
}


Antony
04.04.2017
16:54:11
Жуть какая нечитабельная. Пользуйтесь http://www.boost.org/doc/libs/1_63_0/doc/html/boost_dll.html
void nf_nativeload(std::stack<MValue*>* stack) {
boost::dll::shared_library lib( // переменная должна сущестовать, пока пользуетесь функциями из библиотеки
((std::string*) stack->top()->castTo(MTYPE_STRING)->get())->c_str() // Что-то стрёмное
);
stack->pop();
int count = lib.get<int>("mlang_nativefunctions_count");
char** list = lib.get<char**>("mlang_nativefunctions_list");
for(int i = 0; i < count; i++) {
// ны вы поняли...
}
}
И ресурсы течь не будут. И под Windows работать будет

Антон
04.04.2017
17:28:30
вообще, у меня неизвестно, когда использование функций завершится

Surreal
04.04.2017
17:30:07

Антон
04.04.2017
17:30:47

Surreal
04.04.2017
17:33:16
Ну блин, внутри программы же код, а не сингулярность какая-нибудь, уж время жизни объекта можно контролировать. В крайнем случае пихать шаред поинтер во все функции.

Антон
04.04.2017
17:42:16
а если сделать dlclose, то все указатели из библиотеки становятся недействительными?

Aldar
04.04.2017
17:43:20

Surreal
04.04.2017
17:44:32
Вот кросс рефкаунт только фиг знает как работает.

Антон
04.04.2017
17:46:27
дело в том, что библиотека используется до конца исполнения всего кода

Antony
04.04.2017
18:03:47
тогда стоит линковаться напрямую к библиотеке

Антон
04.04.2017
18:04:57
список библиотек подгружается из файла
это модули

Александр
04.04.2017
18:08:18
кстати, кто-нибудь знает разумный способ динамической подгрузки либ, но с предварительной их расшифровкой?

Google

Александр
04.04.2017
18:08:25
под линь

Michael
04.04.2017
18:09:44
эээ
прочитал, расшифровал, сдампил на диск, загрузил

Александр
04.04.2017
18:10:24
... с диска слили расшифрованную

Michael
04.04.2017
18:10:39
значит, нет такого способа
успеют слить за несколько микросекунд думаешь?

Александр
04.04.2017
18:11:00
я ищу что-то типа ld, но с возможностью грузить из памяти

Michael
04.04.2017
18:11:03
никсы ж файлы не держат как винда

Александр
04.04.2017
18:11:27
не подумал, что после загрузки стереть можно
хм

Michael
04.04.2017
18:12:17
я как-то под виндой этим вопросом задавался, и это мрак
тоже только с диска
только винда и удалить не даст временный файл

Александр
04.04.2017
18:13:42
то есть линукс позволит прогрузить в память, удалить исходный файл и всё будет ок? удивительно

Michael
04.04.2017
18:14:30
да, линукс не запрещает удалять используемые файлы
можно хоть rm -rf / сделать


Антон
04.04.2017
18:16:24
void nf_nativeload(std::stack<MValue*>* stack) {
std::string prefixes[] = {"./lib", "", ""};
std::string suffixes[] = {".so", ".so", ""};
void *handle = nullptr;
for(int i = 0; i < sizeof(prefixes)/sizeof(prefixes[0]); i++) {
handle = dlopen((prefixes[i]+(*(std::string*) stack->top()->castTo(MTYPE_STRING)->get())+suffixes[i]).c_str(), RTLD_LAZY | RTLD_LOCAL);
if(!handle) {
if(i == sizeof(prefixes)/sizeof(prefixes[0])-1) {
std::cout << dlerror() << std::endl;
exit(1);
}
} else {
break;
}
}
stack->pop();
int count = *(int*) dlsym(handle, "mlang_nativefunctions_count");
char** list = *(char***) dlsym(handle, "mlang_nativefunctions_list");
for(int i = 0; i < count; i++) {
void (*func)(std::stack<MValue*>*) = (void(*)(std::stack<MValue*>*)) dlsym(handle, list[i]);
if(func == nullptr) {
std::cout << dlerror() << std::endl;
exit(1);
}
nativefunctions[(std::string) list[i]] = func;
}
}
а теперь выколем глаза


Antony
04.04.2017
18:17:17
В заголовочном файле:
// Beware! Singlethreaded!!
void load_modules();
using function_type = void (параметры);
function_type get_function(string_view func_name);
// В cpp файле
namespace { namespce impl {
std::vector<boost::dll::shared_libraries> modules; // in cpp file
std::unordered_map<string_view, function_type> functions;
}}
void load_modules() {
// имплементация
for (auto& module_file: module_files) {
impl::modules.emplace_back(module_file);
}
// тут вместо list можно использовать boost::dll::library_info
// заполняем impl::functions
}
function_type get_function(string_view func_name) {
return impl::functions.at(func_name);
}

Google

Александр
04.04.2017
18:17:18
nativefunctions[(std::string) list[i]] = func; думаю, каст здесь лишний

Антон
04.04.2017
18:18:38
nativefunctions - map<string, sometype>
хммм... и без каста работает

Alex Фэils?︙
04.04.2017
19:01:47

Michael
04.04.2017
19:02:04
я что-то такое и делал
и еще такм какие-то трюки с апи ntdll
и инъекцией прямо в IAP
но это было годы назад уже не ромню

Aldar
04.04.2017
19:03:53
#url #coding_standards
https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=637


Group Butler [beta]
04.04.2017
20:11:47
Правила
0. Язык чата — русский. The chat's language is Russian.
1. Простые вопросы (к примеру, о базовом синтаксисе языка, или от новичков в C/C++) , лабы, "помогите с задачкой" и о IDE — в чат новичков: https://telegram.me/joinchat/BYlFbD3eN3JMaG34hyh96w
2. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств (для этого есть pro.cxx.holywars — https://telegram.me/joinchat/BYlFbECi8UKU0bCqc7jWlQ и @flood);
2.0. Не поддавайтесь на провокации, а лучше репортите, написав в реплае @admin.
2.1. Не делайте ложных доносов на людей, и не "пингуйте" администраторов чата зря;
2.2. Не разводите срачи/холивары в этом чате. За разведение срача администрация банит без предупреждения;
3. Не надо оффтопить в этом чате и флудить (в частности не рекомендуется писать кучу мелких сообщений);
3.0. Не стоит злоупотреблять стикерами и (или) кидать их без всякой причины;
3.1. Голосовые сообщения в этом чате запрещены;
4. Вы можете спросить тематический чат, и вам, по возможности, его подскажут (также можно ввести команду #chatlist, и бот вам напишет списочек известных чатов)
5. Все вакансии, реклама и добавление своего чатика в списочек известных чатов — по согласованию с @AlexFails;
6. Нарушители сначала получают предупреждение, а затем, в случае рецидива, бан на срок от 1 дня до бесконечности.
Все правила - /rules.


Rusteros
04.04.2017
20:13:22
А у меня вопрос
Можно из функции вернуть лямбду?

Taylor
04.04.2017
20:14:25
Конечно. А ещё принимать в аргументы функции.
Сейчас скажу точно.
std::function<ReturnType (ArgType arg)> retFun() {
return [](ReturnType arg) { return variable; };
}

Rusteros
04.04.2017
20:18:25
Окей

Alexey
04.04.2017
20:37:39
Вопрос.. я уже туплю наверное, но.. почему я получаю
has no member named 'valid'
struct __attribute_(packed) foo {
Uint8 reserve:1,
pdsp_res:2,
mode:1,
cmp_irq:1,
req_irq:1,
suspend:1,
valid:1;
};