PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование на PureBasic » Конфликт имен функций


Конфликт имен функций

Сообщений 1 страница 6 из 6

1

Задача: добавить в dll экспортируемую функцию, имя которой совпадает с именем встроенной.
Например

Код:
ProcedureDLL ReadFile()
EndProcedure

Терзают меня смутные сомнения, что не удастся решить задачу по-человечески, но вдруг ошибаюсь и есть какой-нибудь способ пнуть компилятор/линковщик, например, какой-нибудь командой для FASM-а? Устроит даже полностью на встроенном ассемблере, без ProcedureDLL, лишь бы компилировалось.

П.С.
Пока использую кривой обходной метод: компилирую функцию с другим именем (Read__Fi), а потом бинарный патчинг...

0

2

Есть такой способ.

Код:
Declare p0()

Import "/EXPORT:ReadFile" : EndImport
!public _Procedure0 as 'ReadFile'

Procedure p0()
  MessageRequester("","ReadFile")
EndProcedure

Procedure x() ; Нужно чтобы оптимизатор не выбросил функцию p0().
  p0()
EndProcedure

Нужно узнать идентификатор функции в исходнике. В данном случае он _Procedure0.
Нумерация начинается с первой найденной функции сверху вниз.

0

3

Пётр
Пробую. Не так всё просто оказывается. Компиляция с /commented показывает, что имя нужной процедуры _Procedure302. Как её каждый раз искать? Dll-ки каждый раз разные получаются. Уже даже подумал, а не сделать ли враппер для fasm.exe? Разбирать командную строку, вносить исправления в def-файл и вызывать оригинальный fasm... Тут ещё другая трабла выскочила - тот же ReadFile в экспорте dll есть, а программа ругается, что нет... Блин, чувствую, придётся разбираться с таблицами импорта/экспорта в PE и вносить туда изменения напрямую.

0

4

Smitis написал(а):

Как её каждый раз искать?

В самое начало кода (до xinclude, если есть) нужно добавить Declare с именем функции. То есть чтобы при компиляции PB нашел ее первой. Тогда у нее будет идентификатор _Procedure0 независимо от расположения в коде.

0

5

Пётр
Спасибо, буду пробовать.
На всякий случай, что я хочу добиться: это враппер для системных библиотек для портабелизации программ. В частности, ReadFile из kernel32.dll. Так как враппер компилируется под каждую программу индивидуально, трудно привязаться к конкретным именам. Экспортируемые функции добавляются двумя методами (на примере той же ReadFile):

Код:
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    #_WRP_ReadFile = "_ReadFile@20"
CompilerElse
    #_WRP_ReadFile = "ReadFile"
CompilerEndIf
Import "KERNEL32.LIB" : __wrp__ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped) As #_WRP_ReadFile : EndImport
ProcedureDLL Read__Fi(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped)
    ProcedureReturn __wrp__ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped)
EndProcedure
Код:
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    Import "KERNEL32.lib" : __wrp__ReadFile As "_ReadFile@20" : EndImport
    ProcedureDLL Read__Fi()
        !jmp _ReadFile@20
    EndProcedure
CompilerElse
    Import "KERNEL32.lib" : __wrp__ReadFile As "ReadFile" : EndImport
    ProcedureDLL Read__Fi()
        !add rsp,40
        !jmp ReadFile
    EndProcedure
CompilerEndIf

В первом методе прокатывает замена имени в ProcedureDLL на, скажем, Read__Fi с последующей заменой (бинарной) в файле на ReadFile.
Во втором это не прокатывает, но второй метод предпочтительнее, так как не требуется описание параметров функции (потенциальный источник ошибок, с чем уже столкнулся).

0

6

В общем, проще таблицу импорта изменить, чем с именами воевать.
Если кому интересно, портабелизация программ на PureBasic https://forum.ru-board.com/topic.cgi?fo … 69&glp

Отредактировано Smitis (12.11.2020 21:23:26)

0


Вы здесь » PureBasic - форум » Программирование на PureBasic » Конфликт имен функций