__thiscall

Тема в разделе "WASM.RESEARCH", создана пользователем shefchick, 21 ноя 2005.

  1. shefchick

    shefchick New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2005
    Сообщения:
    22
    Есть DLL(ws2_32.dll), в которой параметры в некоторые функции передаются следующим образом:



    первый параметр - указатель на структуру - в регистре ecx

    второй параметр(int) - булевая переменная - через стек.



    Вопрос простой: что это за соглашение о передачи параметров и как его можно организовать в микрософтофском компиляторе?



    это не microsoft __fascall т.к. два параметра должны передаваться в регистрах ecx и edx соответсвенно, однако этого не наблюдается.



    похоже на __thiscall, но код то сишный...
     
  2. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    исходники winsock2 доступны...

    [вместе с сорцами винды :)]
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Кто сказал, что сишный? В сорцах неоднократно встречаются классы.



    Chkdsk и иже с ним на ООП сделали, например.
     
  4. shefchick

    shefchick New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2005
    Сообщения:
    22
    А какие отличительный особенности си++`ного кода от простого сишного, кроме приатаченных стандартных классов?
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    shefchick



    Это может быть указатель на объект, классу которого принадлежит ф-ция.





    Написать на C++:
    Код (Text):
    1. MyClass *p;
    2. p -> mymethod(param);


    Но сначала нужно вызвать конструктор этого класса.
     
  6. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    shefchick

    А речь идет об экспортных или каких-то внутр ф-циях. Есть имена?
     
  7. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    солидарен с Quantum, ddraw например также юзается
     
  8. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Сорри, читаю невнимательно.

    Либо код не сишный, либо одно из двух.
     
  9. shefchick

    shefchick New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2005
    Сообщения:
    22
    Угу, значит _thiscall...и функции это методы класса.



    А может компилятор поступать таким образом: зажать какую-нибудь глобальную переменную в регистр и использовать этот регистр постоянно?
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    shefchick

    Не может, тем более для экспортируемой функции. Компилятор строго соблюдает соглашения о вызове.
     
  11. shefchick

    shefchick New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2005
    Сообщения:
    22
    не не...она не экспортируемая - судя по семантике это конструктор...



    теоретическая ситуация: у нас есть глобальная константа -указатель на структуру, которая инициализируется один раз в начале программы и больше не меняется. И есть набор внутренних функций со стандартным соглашением вызова, допустим _cdecl, которые обращаются к этой структуре по этому глобальному указателю (bad style, понимаю, но все же...). Разве не может компилятор хранить этот указатель в регистре? И тогда функции юзают его обращаясь к регистру...Если не может, то по какой причине?...
     
  12. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Скорее всего внутренняя реализация использует глобальный объект, и экспортируемые функции вызывают методы этого объекта.
     
  13. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ




    компилятор пишет в obj

    потом несколько obj собираются линкером в (например) exe

    в одном obj хранится в регистре указатель на глобал

    в другом - stack frame

    в третьем - это константа (например NULL)

    и как потом все это заставить вместе работать?



    пиши на асме и храни смело что угодно в регистре

    но если юзаешь чужие функции (например winAPI) или чужие библиотеки то знай и соблюдай их правила по регистрам
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    если ф-ция не єкспортируемая, компилятор может использовать custom calling conventions. Это типичная оптимизация в режиме LTCG.
     
  15. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    народ, а дайте пример вызова таких ф-ций в си, а то у меня как-то некрасиво:

    Код (Text):
    1. FARPROC OpenFile; CHAR Path[MAX_PATH]; BYTE Temp[128] = "\0";
    2.  
    3. if hModule = LoadLibraryEx(Path, 0, LOAD_WITH_ALTERED_SEARCH_PATH)
    4.   {
    5.    OpenFile = GetProcAddress(hModule, "??0OpenFile@@ABC@ABCString@@0ABCDEFJQ2@Z");
    6.    __asm { xor  eax,eax
    7.            push eax
    8.            push eax
    9.            push eax
    10.            push eax
    11.            push eax
    12.            push eax
    13.            push eax
    14.            lea  ecx,Temp};
    15.            OpenFile();
    16.   }
     
  16. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    можно деманглить имя и сделать объявление класса и юзать обычные указатели на функции-члены... и буфер под данные объекта отдельно не надо будет

    тока где етот код взял? он не компилицо и UnDecorateSymbolName выдала вот чего:

    private: __pascal OpenFile::OpenFile(signed char const &,ing,signed char const &,signed char const &,char,unsigned char,short,long, ?? __based() ::* const, ?? )const throw( ?? )

    и зачем вызывать приватный конструктор хз 8-)
     
  17. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    эээ ... имя это было выдуманное, так сказать псевдоним от "??0StartVirusInNuclearReactor@@AND@DestroyThePlanet@@054321GO!@Z" :) , деманглить мне не обязательно, надо просто вызвать ф-цию (передав указатель на буффер(ф-ция в него только пишет) в ecx), затем прочитать из него 1 байт, типа такого нет? (без асмовой вставки)

    (THISCALL)OpenFile(Temp, 0, 0, 0, 0, 0, 0, 0);
     
  18. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    указатель на буффер - это this экземпляра класса, он и передается в ecx.

    а деманглить вот зачем... написал красивый с++ интерфейс:
    Код (Text):
    1. struct foo
    2. {
    3.   void bar();
    4.   char buf[256];
    5. };
    6.  
    7. int main()
    8. {
    9.   // тип указателя на функцию-член
    10.   typedef void (foo::* pf)();
    11.   // аллоцируем место под экземпляр класса
    12.   char buf[sizeof(foo)];
    13.   // указатель на экземпляр класса
    14.   foo * p = reinterpret_cast<foo*>(&buf[0]);
    15.   // указатель на функцию-член
    16.   pf f = &foo::bar; // reinterpret_cast<pf>(GetProcAddress(dll, "?bar@foo@@QAEXXZ");
    17.   // вызываем функцию
    18.   (p->*f)();
    19. }
    вызов __thiscall на валидном С++ компилируется и нет ассемблера... тока с конструкторами так низя... надо под них именованную функцию-член отводить.
     
  19. IceStudent

    IceStudent Active Member

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