Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Вопрос по поводу передачи аргументов

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Вопрос по поводу передачи аргументов
Имя
Сообщение << Старые топики   Новые топики >>
Вопрос по поводу передачи аргументов - 2010-10-29 01:12:57.333333   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Имеется функция, в ней первые два параметра должны принимать вид либо число, либо указатель на строку.

Как лучше поступить, использовать перегруженые функции?
Объявить аргументы void типа, и в ручную пытатся определить адрес это или число.

Расчитывается так же на 64 битную архитектуру, и на то что исходный файл может быть в будующем собран в библиотеку.

Удобство использования функций на выходе должно быть таким:

func(1, 'text_ololo');
func('ololo_1','ololo_2');
func(1,2);
Post #: 1
RE: Вопрос по поводу передачи аргументов - 2010-10-29 01:34:44.896666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Теоритически тогда возможен баг, если большое число передастся, как определить адрес или нет?
Все равно это костыли.

Четыре почти одинаковых функции писать тоже не вариант, шаблоны тут не заюзаешь.
Post #: 2
RE: Вопрос по поводу передачи аргументов - 2010-10-29 12:19:30.903333   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
quote:

не перевалит за 2^16


Ну это понятно, при установленом 31 бите, это считается RVA на имя ресурса в Unicode вроде.

В 32 битных NT, это адрес должен быть >= 0x80000000, а там ядерная память, конечно если не включен ключ /3GB.
В 64 битных там те еще костыли будут с определением, адрес это или нет.

Я же говорил что код как под 32 биткой юзатся будет так и под 64 биткой.
Перегрузку мне юзать нельзя, так как не возможно будет создать DLL тогда.
Post #: 3
RE: Вопрос по поводу передачи аргументов - 2010-10-29 12:47:34.790000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Вечером приду, надо будет подебажить kernel32.dll && ntdll.dll, посмотреть как MS этот вопрос решила.
Post #: 4
RE: Вопрос по поводу передачи аргументов - 2010-10-29 20:19:18.406666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
quote:

Я же писал выше - они анализируют поинтер. Если он меньше или равен 0xFFFF - то id ресурса - число. Иначе - указатель на строку. Тут дебажить ничего не надо, достаточно посмотреть сигнатуры функций по работе с ресурсами. И макросы типа MAKEINTRESOURSE и IS_INTRESOURCE


Ну да, судя по таким строчкам кода:

quote:


if ( (unsigned int)lpType &lt; 0x10000 )
{
v9 = (const WCHAR *)lpType;
RtlInitUnicodeString(&v18, 0);
}


Но, в NT адрес ниже 0x10000 быть не может, про Linux я не знаю, а ведь мой класс должен работать как под Windows так и под Linux.

Под Linux данное решение корректное? Хип там не будет случайно находится?
Post #: 5
RE: Вопрос по поводу передачи аргументов - 2010-10-29 21:53:47.430000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
quote:

Напиши две функции, одну для строк, другую для интов.

Четыре функции, (int,int),(char,char),(int,char),(char,int). Тут даже было бы удобно использовать шаблоны, но это можно юзать только при компиляции, имею ввиду в либу это не превратишь.

quote:

Кстати поведение мелкомягкого кода непредсказуемо, если вдруг я передам в него нулевой указатель (получить этот указатель я могу по разным причинам из какого-то левого кода)


Для добавления ресурса, это будет ID: 0, для получения, он в древовидной структуре попытается найти ID == 0. Все просто.

PS интересные доки: http://skif.bas-net.by/bsuir/lkern/index.HТМL
Post #: 6
RE: Вопрос по поводу передачи аргументов - 2010-10-29 22:16:02.960000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
quote:

И какой ресурс будет иметь ID == 0?


Какой в голову взбредет. Не запрещено использовать нулевой идентификатор.

quote:


1. Ты специально меняешь HТМL на HТМL, чтобы кликающие по твоим линка получали бы 404? Запомни: это только в DOS'е прописные буквы не отличаются от строчных. Ах да, ещё Common Lisp никак не может избавиться от этой болезни.

Лично я ничего специально не менял, возможно сам форум, хз, я скопипастил.

quote:

2. Это доки по внутренностям ядра. Для прикладного программиста они могут служить лишь развлекательной литературой, но никак не руководством к действию.

Ну тебе тогда памятник надо ставить если тебе информация о ядрах – развлекуха.

quote:

DOS программисты сделали помойку из DOS'а, перелезли в win, сделали помойку из win. Ты хочешь провернуть то же самое с линём? Зря.


Не стоит холивар начинать о Linux и Windows.

quote:

Почему? Одну функцию можно превратить в библиотеку, а две нельзя?


Перегруженную функцию или шаблонную?
Покажи мне экспорт такой DLL, и самое главное как ты такое будешь юзать. Может я тупой совсем.
Post #: 7
RE: Вопрос по поводу передачи аргументов - 2010-10-29 23:20:10.430000   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
Решил просто добавить два дополнительных параметра в функцию, в итоге код будет один, функция одна.

AddResource(0, "123", 0, "123", 1049, &Mem, Size);
AddResource(RT_DIALOG, NULL, 0, NULL, 1049, &Mem, Size);

Если пользователь захочет добавить символический ресурс, то пускай указывает это, иначе NULL и юзается числовое имя.
Post #: 8
RE: Вопрос по поводу передачи аргументов - 2010-10-30 00:38:27.956666   
Sunzer

Сообщений: 253
Оценки: 31190
Присоединился: 2007-06-15 19:23:32.436666
quote:

Производительность тебя не интересует? Объёмы используемого стека?


Производительность упала в миллионы раз, из за того что в стековом кадре выделяется на 8 байтов (16 в x64) больше.
Собственно я нихера не понимаю с фига снизится производительность?

quote:

Ты мне объясни, чего это тебе так приспичило объединять в одну функцию две разных? Чтобы документация на AddResource не влезала бы в лист формата A4?

Документация была бы гораздо лучше, конечно, если бы экспортировалось 4 функции с одинаковым кодом.

Там ничего сложного.

AddResource(0, "123", 0, "123", 1049, &Mem, Size);

1) ID типа ресурса
2) Символьное имя, у которого приоритет над идентификатором выше.
3) ID имени ресурса.
4) Символьное имя, у которого приоритет над идентификатором выше.
5) Язык ресурса
6) void указатель на данные
7) Размер данных

Очень сложная документация?

А заюзать можно у себя в проекте подключив мой клас вот так:

void func() { RESOURCE_WORKER new; if(new.BeginupdаtеResource("x.exe", true)) { new.AddResource(RT_STRING, NULL, 0, "MEGA_RES", 1049, Result.Offset, Result.Size); new.EndupdаtеResource(); } }
Post #: 9
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Вопрос по поводу передачи аргументов







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.