PureBasic - форум

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

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


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


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

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

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


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