из C в FASM

Тема в разделе "WASM.BEGINNERS", создана пользователем G0L1a7h, 3 июл 2008.

  1. G0L1a7h

    G0L1a7h New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2008
    Сообщения:
    41
    Здравствуйте уважаемые! Захотелось переписать маленькую програмку из Си в Фасм. Код:
    Код (Text):
    1. #include <windows.h>
    2.  
    3. typedef bool( *DllProc )( HINSTANCE );
    4.  
    5. int main()
    6. {    
    7.  
    8.     HINSTANCE hDll;
    9.     DllProc dpSetUpHook;
    10.     char szDllPath[] = "C:\\hook.dll";
    11.     MSG msg;
    12.    
    13.     hDll = LoadLibrary( szDllPath );
    14.     dpSetUpHook  = ( DllProc ) GetProcAddress( hDll,"SetUpHook" );
    15.      
    16.     ( dpSetUpHook )( hDll );
    17.        
    18.    
    19.     while ( GetMessage( &msg, NULL, 0, 0 ) )
    20.     {
    21.    
    22.         TranslateMessage( &msg );
    23.         DispatchMessage( &msg );
    24.        
    25.     }
    26.        
    27.     return 0;
    28. }
    Попробывал переписать, получилось:
    Код (Text):
    1. section '.code' code readable executable
    2. Start:
    3.  
    4. invoke LoadLibrary,szPath
    5. invoke GetProcAddress,eax,szFuncName
    6. call eax
    7. @@:
    8. invoke  GetMessage,msg,0,0,0
    9. test    eax,eax
    10. jz      @f
    11. invoke  TranslateMessage,msg
    12. invoke  DispatchMessage,msg
    13. jmp     @b
    14. @@:
    15.  
    16. invoke ExitProcess,0
    17.  
    18. section '.data' data readable writeable
    19.  
    20. szPath db 'C:\hook.dll',0
    21. szFuncName db 'SetHook',0
    22. msg MSG
    На GetMessage отладчик останавливается, следовательно неправильно передаю msg. Вопрос: как правильно написать?
     
  2. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    addr msg
     
  3. G0L1a7h

    G0L1a7h New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2008
    Сообщения:
    41
    FASM?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Судя по всему, ф-ия dpSetUpHook принимает параметер hDll
    Код (Text):
    1. ( dpSetUpHook )( hDll );
    а здесь:
    Код (Text):
    1. invoke GetProcAddress,eax,szFuncName
    2. call eax
    параметер исчез.

    +вероятно надо почистить стек, если вызов 'cdecl'.
     
  5. G0L1a7h

    G0L1a7h New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2008
    Сообщения:
    41
    Mika0x65, спасибо , еще ошибку исправил. Но вопрос из первого поста остается в силе.
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    незнаю как в фасме, но нужно передать указатель, или FASM это сам делает?
     
  7. G0L1a7h

    G0L1a7h New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2008
    Сообщения:
    41
    ну это и коню понятно (:
    сам незнаю, вот и спрашиваю (:
     
  8. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    2FED Делает.
     
  9. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    И вообще, странный разговор..."сам не знаю" В отладчике не посмотреть чтоле, какие параметры куда передаются?
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    G0L1a7h
    Может программа останавливается на GetMessage, потому что она ээ... ждёт получения сообщения? Можешь PostThreadMessage для своего потока из другой программы и посмотреть результат.

    2FED
    Всё верно, fasm передаёт указатель.
     
  11. G0L1a7h

    G0L1a7h New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2008
    Сообщения:
    41
    Эмм.. да не дурак я.. там где-то внутри функции Access Voilation..
    хм, я где-то видел пример если надо передать указатель , переменную заключают в [] , вот это меня и сбило..
     
  12. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Ты, помоему, все на свете перепутал )) Извини за язвительный тон, не в обиду.
    Поучи синтаксис фасма, прежде чем на нем писать. Поучи синтаксис Си, прежде чем с него переписывать. Может, с отладчиком, поучиться работать... Почему отладчик останавливается именно на этой инструкции? Возникает исключение или что?
     
  13. G0L1a7h

    G0L1a7h New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2008
    Сообщения:
    41
    Не сплю давно просто..
    Да, где-то внутри функции..
     
  14. G0L1a7h

    G0L1a7h New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2008
    Сообщения:
    41
    тю, ребутнулся все заработало :\ ХРюшка шалит :)
    Всем спасибо что откликнулись и помогли :)
     
  15. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    ToAll А как FASM узнаёт что ему передали, значение переменной или указатель на переменную?
     
  16. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    2FED
    invoke MyFunc,perem,0,0,0 ; указатель на perem
    invoke MyFunc,[perem],0,0,0 ; значение perem