Здравствуйте, nodir.temir, Вы писали:
NT>Но я хочу сделать гарантированно рабочий код для любого кол-ва аргументов. NT>После истечения EV сертификата, не смогу менять загрузчик драйвера.
Насколько я понимаю ты их используешь в качестве callbacks, получается что макс число аргументов ограничено тем, что эти функции в свои callbacks возвращают, а для каждого конкретного случая — ещё и собственно что вызываемая функция в callback передаёт.
Т.е. всё должно быть известно на этапе компиляции, не?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, nodir.temir, Вы писали:
NT>>Но я хочу сделать гарантированно рабочий код для любого кол-ва аргументов. NT>>После истечения EV сертификата, не смогу менять загрузчик драйвера.
CC>Насколько я понимаю ты их используешь в качестве callbacks, получается что макс число аргументов ограничено тем, что эти функции в свои callbacks возвращают, а для каждого конкретного случая — ещё и собственно что вызываемая функция в callback передаёт. CC>Т.е. всё должно быть известно на этапе компиляции, не?
У меня есть загрузчик драйвера, подписанный EV сертификатом.
Он грузит основной дравер, который может зарегистрировать у загрузчика любые функции как коллбеки.
Здравствуйте, reversecode, Вы писали:
CC>>Этож банальный массив function pointers
R>у него в одном и том же поинтере может лежать функции с разным количеством аргументов R>соответственно можно сделать на него только jmp R>и нельзя call R>в С с ходу не придумалось как это можно обойти R>кроме как заюзать __assume(0) что бы компиллер емитил jmp вместо call
Здравствуйте, reversecode, Вы писали:
R>вообще хорошо подумав R>в asm можно загнать только jmp R>а таблицу и вызовы из таблицы итд в С держать R>ну и вызывать каким нибудь jump_from(&g_table[0]);
Спасибо, таблицу перенёс в C.
А как вызывать через "jump_from(&g_table[0]);" я не понял.
это я так назвал функцию
вы можете объявить только одну в асм файле
из ваших
proxyCallback0 PROC
ProxyCallbackProc(0)
proxyCallback0 ENDP
а остальные перетянуть в си и само смещение по индексу тоже в си уйдет
а потом если подумать
то можно и сам jmp попробовать перетянут в си
директивы msvc __emit по моему поддерживаются на всех ее платформах?
значит можно код закинуть в си
и тогда от асма отказаться
Здравствуйте, nodir.temir, Вы писали:
NT>У меня есть загрузчик драйвера, подписанный EV сертификатом. NT>Он грузит основной дравер, который может зарегистрировать у загрузчика любые функции как коллбеки.
Ну т.е., ты делаешь ровно то, что Микрософт хочет, чтобы ты не делал, и рассчитываешь, что ты такой умный, что тебе всегда будет удаваться их перехитрить...
Здравствуйте, reversecode, Вы писали:
R>у него в одном и том же поинтере может лежать функции с разным количеством аргументов R>соответственно можно сделать на него только jmp
GetProcAddress() возвращает указатель на функцию из DLL, который работает независимо от того, какие у этой функции аргументы (после соответствующего преобразования типа, разумеется).
Точно то же можно сделать и здесь, и в рамках микрософтовских компиляторов это будет работать всегда, потому, что они не смогут сломать одно, не сломав другое.
В плане типа-безопасности это ничем не хуже, чем спрятать преобразование типов указателей на функции, стыдливо засунув их в .asm, где компилятор C их не видит.
Здравствуйте, reversecode, Вы писали:
R>на практике двойной call call который по итоге получится R>может сломать какие то регистры R>вон выше он писал что вроде eax ломается
Не должон, однако.
В принципе, в Си (не C++) можно описать функцию, вообще ничего не сказав о типе ее аргументов:
int foo ();
Это, вроде как, отменили в новых версиях стандарта, за которыми я не столь уж и пристально слежу, но тем не менее, совместимость придется оставить на достаточно долгое время.
А значит, calling convention должен позволять сконструировать корректный вызов функции, зная, какие аргументы ей передаются, но не зная, какие аргументы она ожидает. И вот именно этим механизмом я предлагаю воспользоваться.
Синтаксически это — typecast указателя в указатель на функцию с нужным списком аргументов.
Здравствуйте, Pzz, Вы писали:
Pzz>Ну т.е., ты делаешь ровно то, что Микрософт хочет, чтобы ты не делал, и рассчитываешь, что ты такой умный, что тебе всегда будет удаваться их перехитрить...
Здравствуйте, reversecode, Вы писали:
R>это я так назвал функцию R>вы можете объявить только одну в асм файле R>из ваших R>proxyCallback0 PROC R>ProxyCallbackProc(0) R>proxyCallback0 ENDP R>а остальные перетянуть в си и само смещение по индексу тоже в си уйдет
R>а потом если подумать R>то можно и сам jmp попробовать перетянут в си R>директивы msvc __emit по моему поддерживаются на всех ее платформах? R>значит можно код закинуть в си R>и тогда от асма отказаться
В асм-е много proxyCallback* функций именно для регистрации коллбеков на каждого из них.
Они же вызываются извне и должны перенаправить вызов на другую реальную функцию.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, nodir.temir, Вы писали:
NT>>У меня есть загрузчик драйвера, подписанный EV сертификатом. NT>>Он грузит основной дравер, который может зарегистрировать у загрузчика любые функции как коллбеки.
Pzz>Ну т.е., ты делаешь ровно то, что Микрософт хочет, чтобы ты не делал, и рассчитываешь, что ты такой умный, что тебе всегда будет удаваться их перехитрить...