Perl - нужна помощь

Тема в разделе "WASM.RESEARCH", создана пользователем Rustem, 16 июл 2005.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Пишу на ассемблере шпион для показа вызова методов Direct3D, нечто вроде моего kerberos API spy



    Нужно создать базу данных для него.

    Вопрос как на перле можно пропарсить из d3d9.h строку след. вида

    #define IDirect3D9_GetAdapterDisplayMode(p,a,b) (p)->lpVtbl->GetAdapterDisplayMode(p,a,b)



    чтобы получить такую



    xyz db "IDirect3D9_GetAdapterDisplayMode",0

    dd offset xyz ,3





    , где 3 - количество параметров в скобках
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Хм, не знаю, может, можно обойтись только регулярками.



    Вот что у меня:
    Код (Text):
    1.  
    2. # $s - исходная строка, приведённая выше
    3. $s =~ /#define (.+?)\((.*?)\).*$/;
    4. $f = $1;
    5. $p = $2;
    6. $p =~ s/,//g;    #убираем запятые
    7. $l = length($p); #считаем кол-во символов в параметрах
    8. print("xyz db \"$f\",0\ndd offset xyz ,$l\n\n");


    ограничение: параметры должны быть односимвольными.
     
  3. aSL

    aSL New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    43
    Адрес:
    Russia
    параметры должны быть односимвольными

    А нельзя вместо удаления запятых сделать split, а потом подсчитать кол=во элементов в массиве?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    век живи — век учись. я забыл про сплит.



    вот:
    Код (Text):
    1. $s =~ /#define (.+?)\((.*?)\).*$/;
    2. $l = scalar(split(/,/,$2));
    3. print("xyz db \"$1\",0\ndd offset xyz ,$l\n\n");
     
  5. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Спасибо. Пойду парсить.
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Не совсем в тему, но: метод IDirect3D9::GetAdapterDisplayMode имеет 2 параметра. Все COM методы имееют конвенцию __thiscall и первым параметром всегда передаётся указатель на VTable объекта (this).

    Макрос

    #define IDirect3D9_GetAdapterDisplayMode(p,a,b) (p)->lpVtbl->GetAdapterDisplayMode(p,a,b)

    используется для совместимости с Си.

    IMHO лучше обратить на это внимание, поскольку в MSDN и DXSDK все описания даны из расчёта на С++ и из-за "лишнего" параметра возхможны заморочки с использованием шпиона в будующем.
     
  7. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Учтемс...