динамический экспорт в fasm

Тема в разделе "WASM.BEGINNERS", создана пользователем mix_mix, 24 фев 2007.

  1. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Есть программа, где количество экспортируемых функций изменяется. (Управляется это константами типа CONF_HBOOT_INCLUDE). Все хорошо, но как можно в фасме описать экспорт подобных функций?
    Код (Text):
    1.  export 'NTRAD.DLL',\
    2.      ...
    3.      Initialize,'Initialize',\
    4. if CONF_HBOOT_INCLUDE
    5.      HBoot,'HBoot',\
    6. end if
    7.      Install,'Install',\
    8.      ...
    Вот так не рабоает ((( Похоже, здесь получается, что if находится внутри макроса export. Можно сделать так, чтобы if обрабатывался проепроцессором раньше export?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Похоже, тебе придется вручную раскрыть макрос export.
     
  3. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    А можно как-нить сделать проверку на существование метки (что нибудь типа "if used label"), чтобы немного подправить существующий макрос export?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Подправить не сложно.
    Код (Text):
    1. format PE GUI
    2. entry __start
    3.  
    4. macro export dllname,[label,string]
    5.  {
    6.     common
    7.         local module,addresses,names,ordinal,count
    8.         count = 0
    9.     forward
    10.         if used label
    11.             count = count+1
    12.         end if
    13.     common
    14.         dd 0,0,0,RVA module,1
    15.         dd count,count,RVA addresses,RVA names,RVA ordinal
    16.         addresses:
    17.     forward
    18.         if used label
    19.             dd RVA label
    20.         end if
    21.     common
    22.         names:
    23.     forward
    24.         if used label
    25.             local name
    26.             dd RVA name
    27.         end if
    28.     common
    29.         ordinal: count = 0
    30.     forward
    31.         if used label
    32.             dw count
    33.             count = count+1
    34.         end if
    35.     common
    36.         module db dllname,0
    37.     forward
    38.         if used label
    39.             name db string,0
    40.         end if
    41.     common
    42.         local x,y,z,str1,str2,v1,v2
    43.         x = count shr 1
    44.         while x > 0
    45.             y = x
    46.             while y < count
    47.                 z = y
    48.                 while z-x >= 0
    49.                     load v1 dword from names+z*4
    50.                     str1=($-RVA $)+v1
    51.                     load v2 dword from names+(z-x)*4
    52.                     str2=($-RVA $)+v2
    53.                     while v1 > 0
    54.                         load v1 from str1+%-1
    55.                         load v2 from str2+%-1
    56.                         if v1 <> v2
    57.                             break
    58.                         end if
    59.                     end while
    60.                     if v1<v2
    61.                         load v1 dword from names+z*4
    62.                         load v2 dword from names+(z-x)*4
    63.                         store dword v1 at names+(z-x)*4
    64.                         store dword v2 at names+z*4
    65.                         load v1 word from ordinal+z*2
    66.                         load v2 word from ordinal+(z-x)*2
    67.                         store word v1 at ordinal+(z-x)*2
    68.                         store word v2 at ordinal+z*2
    69.                     else
    70.                         break
    71.                     end if
    72.                     z = z-x
    73.                 end while
    74.                 y = y+1
    75.             end while
    76.             x = x shr 1
    77.         end while
    78.  }
    79.  
    80. data export
    81.     export 'dll.dll', __start, 'start', val1, 'val1', val2, 'val2'
    82. end data
    83.  
    84. val1 dd 1
    85. val2 dd 2
    86.  
    87. __start:
    88.     mov     eax,val1
    89. ;   mov     ecx,val2
    90.     ret
     
  5. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    IceStudent
    О, блин, огромный thanx!
    Небось столько времени потратил :O