процедура в fasm падает =/

Тема в разделе "WASM.BEGINNERS", создана пользователем e4key, 29 сен 2009.

  1. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Вообще-то если поставить параметр и не передавать его, то при stdcall должно быть нарушение стека при выходе из функции. А так, наличие и полное отсутствие локальных переменных и параметров отличаются генерацией стекового фрейма - push ebp и т.п. Если никаких переменных и параметров нет, то фрейм может не создаваться. Поэтому если в твоей процедуре затесалась левая запись в [esp], то при наличии фрейма она не затрет адрес возврата, а без фрейма - затрет со всеми вытекающими последствиями
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    то, что идет дисбаланс стека - ясно из высказывания о нормально отрабатывающем мессадж боксе в кнце процедуры. но что к нему привело? причин может быть несколько, как та, что высказал leo, так и например то, что функция может быть вызвана с меньшим кол-вом параметров, чем определена. или в функции идет вызов __cdecl функции через стандартный инвок.. без кода сказать точно довольно проблематично
     
  3. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    собственно вот процедура:

    Код (Text):
    1. proc MainFirefox
    2.         invoke  RegOpenKeyEx, HKEY_LOCAL_MACHINE, firefoxSubKey, 0, KEY_READ, hFirefoxKey
    3.         cmp     eax, 2
    4.         je      .close
    5.  
    6.         mov     [firefoxInstallSize], 256
    7.         invoke  RegQueryValueEx, [hFirefoxKey], firefoxKeyName, 0, 0, firefoxInstallPath, firefoxInstallSize
    8.         cmp     eax, 2
    9.         je      .close
    10.  
    11.         invoke  SetCurrentDirectory, firefoxInstallPath
    12.         cmp     eax, 0
    13.         je      .close
    14.  
    15.         invoke  LoadLibrary, dllNSS
    16.         cmp     eax, 0
    17.         je      .close
    18.         mov     [hNSS], eax
    19.  
    20.         invoke  GetProcAddress, [hNSS], pNSS_Init
    21.         mov     [NSS_Init], eax
    22.  
    23.         invoke  GetProcAddress, [hNSS], pPK11_GetInternalKeySlot
    24.         mov     [PK11_GetInternalKeySlot], eax
    25.  
    26.         invoke  GetProcAddress, [hNSS], pPK11_Authenticate
    27.         mov     [PK11_Authenticate], eax
    28.  
    29.         invoke  GetProcAddress, [hNSS], pNSSBase64_DecodeBuffer
    30.         mov     [NSSBase64_DecodeBuffer], eax
    31.  
    32.         invoke  GetProcAddress, [hNSS], pPK11SDR_Decrypt
    33.         mov     [PK11SDR_Decrypt], eax
    34.  
    35.         invoke  GetProcAddress, [hNSS], pPK11_FreeSlot
    36.         mov     [PK11_FreeSlot], eax
    37.  
    38.         invoke  GetProcAddress, [hNSS], pNSS_Shutdown
    39.         mov     [NSS_Shutdown], eax
    40.  
    41.         invoke  LoadLibrary, dllSQLite
    42.         cmp     eax, 0
    43.         je      .close
    44.         mov     [hSQLite], eax
    45.  
    46.         invoke  GetProcAddress, [hSQLite], psqlite3_open
    47.         mov     [sqlite3_open], eax
    48.  
    49.         invoke  GetProcAddress, [hSQLite], psqlite3_exec
    50.         mov     [sqlite3_exec], eax
    51.  
    52.         invoke  GetProcAddress, [hSQLite], psqlite3_close
    53.         mov     [sqlite3_close], eax
    54.  
    55.         invoke  SHGetSpecialFolderPath, 0, firefoxappDataPath, CSIDL_APPDATA, 0
    56.         invoke  wsprintf, firefoxIniPath, firefoxIniMask, firefoxappDataPath
    57.  
    58.         sub     ebx, ebx
    59.  
    60.         .theloop:
    61.                 invoke  wsprintf, firefoxProfileName, firefoxappNumMask, ebx
    62.                 invoke  GetPrivateProfileString, firefoxProfileName, firefoxKeyName, 0, firefoxProfileDirectory, 40, firefoxIniPath
    63.                 cmp     eax, 0
    64.                 je      .close
    65.  
    66.                 invoke  wsprintf, firefoxProfilePath, firefoxProfileMask, firefoxappDataPath, firefoxProfileDirectory
    67.                 invoke  SetCurrentDirectory, firefoxProfilePath
    68.  
    69.                 invoke  NSS_Init, firefoxProfilePath
    70.                 invoke  PK11_GetInternalKeySlot
    71.                 mov     [hKeySlot], eax
    72.                 invoke  PK11_Authenticate, [hKeySlot], 1, 0
    73.  
    74.                 cinvoke sqlite3_open, firefoxDBFile, hSQLiteDB
    75.                 cinvoke sqlite3_exec, [hSQLiteDB], firefoxSQLCommand, CallBack, 0, 0
    76.                 cinvoke sqlite3_close, [hSQLiteDB]
    77.  
    78.                 invoke  PK11_FreeSlot, [hKeySlot]
    79.                 invoke  NSS_Shutdown
    80.  
    81.                 inc     ebx
    82.                 jmp     .theloop
    83.  
    84.   .close:
    85.         ret
    86. endp
    CallBack - вывод в msgbox значений. она работает нормально)
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    wsprintf - cdecl, также cdecl возможно динамически находимые функции. тобешь вызывать надо не через invoke, а через cinvoke
     
  5. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Freeman, да, функции NSSxx.. оказались cdelc :) теперь все отлично работает) спасибо!