Вобщем трабла , есть длл , которая должна создовать vpn подключение , но при нажатии IDC_BTN8 прога вылетает но впн подключение создаёт . Пытался сохранять регистры до вызова invoke CreatVPN и востонавливать после , не помогает . Уже 2 день сижу никак разобраться немогу ( . Может есть другой код создания VPN ? подкиньте если не сложно ... Код (Text): .386 .model flat, stdcall option casemap :none ; case sensitive include bin\StringsEx.mac include bin\windows.inc include bin\user32.inc include bin\kernel32.inc include bin\rasapi32.inc include bin\masm32.inc include bin\msvcrt.inc includelib bin\user32.lib includelib bin\kernel32.lib includelib bin\masm32.lib includelib bin\rasapi32.lib includelib bin\msvcrt.lib IDD_DLG_IL equ 1000 IDD_DLG_EW equ 2000 IDD_DLG_IC equ 3000 IDD_DLG_ADSL equ 4000 IDD_DLG_inet equ 5000 IDC_WEB_Start equ 1001 IDC_WEB_Forum equ 1002 IDC_WEB_bans equ 1003 IDC_WEB_wowd equ 1004 IDC_WEB_batlenet equ 1005 IDC_WEB_aowow equ 1006 IDC_WEB_reg equ 1007 IDC_BTN1 equ 1002 IDC_BTN2 equ 1003 IDC_BTN3 equ 1004 IDC_BTN4 equ 1005 IDC_BTN5 equ 1006 IDC_BTN6 equ 1007 IDC_BTN7 equ 1008 IDC_BTN8 equ 1009 IDC_BTN9 equ 1010 _RASENTRYA STRUCT dwSize DWORD ? dwfOptions DWORD ? dwCountryID DWORD ? dwCountryCode DWORD ? szAreaCode db RAS_MaxAreaCode + 1 dup(?) szLocalPhoneNumber db RAS_MaxPhoneNumber + 1 dup(?) dwAlternateOffset DWORD ? ipaddr RASIPADDR <> ipaddrDns RASIPADDR <> ipaddrDnsAlt RASIPADDR <> ipaddrWins RASIPADDR <> ipaddrWinsAlt RASIPADDR <> dwFrameSize DWORD ? dwfNetProtocols DWORD ? dwFramingProtocol DWORD ? szScript db MAX_PATH dup(?) szAutodialDll db MAX_PATH dup(?) szAutodialFunc db MAX_PATH dup(?) szDeviceType db RAS_MaxDeviceType + 1 dup(?) szDeviceName db RAS_MaxDeviceName + 1 dup(?) szX25PadType db RAS_MaxPadType + 1 dup(?) szX25Address db RAS_MaxX25Address + 1 dup(?) szX25Facilities db RAS_MaxFacilities + 1 dup(?) szX25UserData db RAS_MaxUserData + 1 dup(?) dwChannels DWORD ? dwReserved1 DWORD ? dwReserved2 DWORD ? dwSubEntries DWORD ? dwDialMode DWORD ? dwDialExtraPercent DWORD ? dwDialExtraSampleSeconds DWORD ? dwHangUpExtraPercent DWORD ? dwHangUpExtraSampleSeconds DWORD ? dwIdleDisconnectSeconds DWORD ? dwType DWORD ? dwEncryptionType DWORD ? dwCustomAuthKey DWORD ? guidId GUID <> szCustomDialDll db MAX_PATH dup(?) dwVpnStrategy DWORD ? dwfOptions2 DWORD ? dwfOptions3 DWORD ? szDnsSuffix db 256 dup(?) dwTcpWindowSize DWORD ? szPrerequisitePbk db MAX_PATH dup(?) szPrerequisiteEntry db RAS_MaxEntryName + 1 dup(?) dwRedialCount DWORD ? dwRedialPause DWORD ? _RASENTRYA ENDS RASCREDENTIALS STRUCT dwSize DWORD ? dwMask DWORD ? szUserName db UNLEN + 1 dup(?) szPassword db PWLEN + 1 dup(?) szDomain db DNLEN + 1 dup(?) RASCREDENTIALS ENDS ;########################################################################### .data? Host dd ? hLib DD ? Message MSG <?> SysDir db 255 dup (?) ;########################################################################### .data error_Host db "Ошибка определения сети",0 szAtlAxWinInit DB "AtlAxWinInit",0 szDLL DB "\atl.dll",0 hCurrentDLL dd ? _hWnd dd ? VPN_msg db "OK?",0 ;########################################################################### .code CreatVPN proc User:dword,Pass:dword local re:_RASENTRYA local crd:RASCREDENTIALS lea edi,re mov ecx,00000B44h xor al,al rep stosb mov re.dwSize,00000B44h mov re.dwfOptions,3c000710h mov re.dwCountryID,0 mov re.dwCountryCode,0 .if Host==1 invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("il_ip") .elseif Host==2 invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("ew_ip") .elseif Host==3 invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("ic_ip") .elseif Host==4 invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("vt_ip") .elseif Host==5 invoke lstrcpy,addr re.szLocalPhoneNumber,$CTA0("wow_ip") .endif mov re.dwAlternateOffset,0 mov re.dwFrameSize,0 mov re.dwfNetProtocols,4 mov re.dwFramingProtocol,1 invoke lstrcpy,addr re.szDeviceType,$CTA0("vpn") invoke lstrcpy,addr re.szDeviceName,$CTA0("WAN Miniport (L2TP)") mov re.dwIdleDisconnectSeconds,00000000h mov re.dwType,00020000h mov re.dwEncryptionType,00030000h mov re.dwfOptions2,01040000h mov re.dwRedialPause,00000300h mov re.dwVpnStrategy,00020000h invoke RasSetEntryProperties,0,$CTA0("internet"),addr re,00000B44h,0,0 .if eax == 0 invoke lstrcpy,addr crd.szUserName,User invoke lstrcpy,addr crd.szPassword,Pass mov crd.dwMask,3 mov crd.dwSize,sizeof RASCREDENTIALS + 2 invoke RasSetCredentials,0,$CTA0("internet"),addr crd,0 .if eax == 0 .endif .endif ret CreatVPN endp OneWindowVis Proc Visible:DWORD , __hWnd:DWORD invoke GetDlgItem,__hWnd,IDC_WEB_Start invoke ShowWindow,eax,FALSE invoke GetDlgItem,__hWnd,IDC_WEB_Forum invoke ShowWindow,eax,FALSE invoke GetDlgItem,__hWnd,IDC_WEB_bans invoke ShowWindow,eax,FALSE invoke GetDlgItem,__hWnd,IDC_WEB_wowd invoke ShowWindow,eax,FALSE invoke GetDlgItem,__hWnd,IDC_WEB_batlenet invoke ShowWindow,eax,FALSE invoke GetDlgItem,__hWnd,IDC_WEB_aowow invoke ShowWindow,eax,FALSE invoke GetDlgItem,__hWnd,IDC_WEB_reg invoke ShowWindow,eax,FALSE invoke GetDlgItem,__hWnd,Visible push eax invoke ShowWindow,eax,TRUE invoke SetForegroundWindow,__hWnd pop eax invoke SetFocus,eax ret OneWindowVis EndP DlgProc Proc hWnd:DWORD,uMsg:DWORD,wParam:WPARAM, lParam:LPARAM .If uMsg == WM_INITDIALOG invoke OneWindowVis,IDC_WEB_Start,hWnd .elseif uMsg == WM_CLOSE invoke ExitProcess,0 .elseif wParam == IDC_BTN2 ; Forum invoke OneWindowVis,IDC_WEB_Forum,hWnd .elseif wParam == IDC_BTN3 ; BanList invoke OneWindowVis,IDC_WEB_bans,hWnd .elseif wParam == IDC_BTN4 ; Wowd invoke OneWindowVis,IDC_WEB_wowd,hWnd .elseif wParam == IDC_BTN5 ; Battle.net invoke OneWindowVis,IDC_WEB_batlenet,hWnd .elseif wParam == IDC_BTN6 ; Aowow invoke OneWindowVis,IDC_WEB_aowow,hWnd .elseif wParam == IDC_BTN7 ; Reg Acc invoke OneWindowVis,IDC_WEB_reg,hWnd .elseif wParam == IDC_BTN8 ; CreateVPN invoke CreatVPN,$CTA0("bnet"),$CTA0("bnet") .Else MOV EAX,FALSE RET .EndIf MOV EAX,TRUE RET DlgProc EndP LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD .if reason == DLL_PROCESS_ATTACH mov eax,1 .endif ret LibMain Endp MainCodeProc proc pop eax mov Host,eax pop eax mov hCurrentDLL,eax invoke GetSystemDirectory,addr SysDir,sizeof SysDir invoke lstrcat,addr SysDir,addr szDLL Invoke LoadLibrary,Offset SysDir MOV hLib,EAX Invoke GetProcAddress,hLib,ADDR szAtlAxWinInit CALL EAX .if Host==1 Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_IL, NULL, Offset DlgProc, NULL .elseif Host==2 Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_EW, NULL, Offset DlgProc, NULL .elseif Host==3 Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_IC, NULL, Offset DlgProc, NULL .elseif Host==4 Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_ADSL, NULL, Offset DlgProc, NULL .elseif Host==5 Invoke CreateDialogParam, hCurrentDLL,IDD_DLG_inet, NULL, Offset DlgProc, NULL .else invoke MessageBox,0,addr error_Host,addr error_Host,0 Invoke ExitProcess,0 .endif .While TRUE Invoke GetMessage, ADDR Message,0,0,0 .Break .If (!EAX) Invoke TranslateMessage,ADDR Message Invoke DispatchMessage,ADDR Message .EndW Invoke FreeLibrary,hLib Invoke ExitProcess,EAX MainCodeProc endp End LibMain
Swat2k Код (Text): MainCodeProc proc pop eax mov Host,eax pop eax mov hCurrentDLL,eax Это как? Что ты делаешь этим кодом? Сначала в Host запихиваешь старове значение ebp, затем в hCurrentDLL пихаешь адрес возврата... Непонятно, куда все это вылетит после выхода из процедуры?
нет . Сперва запускается ехешник собирает нужную инфу , загружае длл , передаю параметры через стек. В ехешнике : Код (Text): Invoke GetProcAddress,hLib,ADDR MainCodeProc push hLib push Host jmp eax Повторюсь все функции проги работают как надо , траблы возникают только при создании VPN
Swat2k Начало функции MainCodeProc под отладчиком должно быть таким: push ebp mov ebp, esp дальше идет твой код.. pop eax mov Host,eax pop eax mov hCurrentDLL,eax Кстати, почему просто не pop Host, pop hCurrentDLL? Все равно получается фигня, потому что ты в Host сохраняешь старое значение ebp. Отсюда и падает прога при создании соеденения... Что мешает нормально передавть параметры?
Нормально это как ? мне казалось передача параметров всегда подразумевала работу со стеком Извратился так : Код (Text): MainCodeProc proc mov x_ebp,ebp mov ebp, esp pop eax mov Host,eax pop eax mov hCurrentDLL,eax push x_ebp Ошибка не ушла , мне кажется что ошибка в процедуре CreateVPN . Но нимогу понять где именно . Без функции создания VPN прога работает стабильно .
Да...но не так,как это делаешь ты... Ща.. PS Я тоже так могу.. Да, и кстати, не забывай в каком порядке ты передаешь параметры...у тебя все с ног на голову.
Код (Text): MainCodeProc proc lHost: dword, lhCurrentDLL: dword Нормально юзаешь эти два параметра обращаясь к неи по именам lHost и lhCurrentDLL соответсвено. Вызов делаешь так: Код (Text): push hLib push Host call eax
Проблему это не решает ( . Хоть так хоть сяк . Повторюсь , приложение падает после нажатия кнопки . Впн создаёт и падает. Под отладчиком всё норм создаёт проблема не в процедуре CreateVPN (она норм отробатывает) а вот "где то дальше" приложение падает . Сейчас времени нет , вечером сделаю ехешник который будет создавать VPN , а моя dll будет его дропать и запускать с параметром Host . Изврат но что же делать ... Сделал передачу параметров через регистры (что бы не трогать стек , хотя зачем ? всё и так работало) Вызываю так : Код (Text): ... Invoke GetProcAddress,hLib,ADDR MainCodeProc mov ecx,Host mov edx,hLib jmp eax В dll : Код (Text): MainCodeProc proc push ebp mov ebp, esp mov Host,ecx mov hCurrentDLL,edx ... Вечером выложу листинг оли , сейчас уходить нужно _Aspire : стукни если не сложно вечером в icq : 6665899 дам все сурсы , а то чуствую один не справлюсь , а придумывать большие извращения нехочется
_Aspire Ну зачем же вводить в заблуждение домыслами про ebp? Посмотрели бы сами в отладчике - не создаёт masm стековых фреймов в процедуре, если ей этого не заказывают. Код Код (Text): zzz proc xor eax,eax ret zzz endp скомпилится честно в Код (Text): xor eax,eax ret (Пример случая, где это заказано: Код (Text): zzz proc a:dword xor eax,eax ret zzz endp скомпилится уже в Код (Text): push ebp mov ebp,esp xor eax,eax leave ret 4 ) Swat2k В изначальном коде: CreateVPN разрушает edi, что отражается на том, что диалоговая процедура тоже разрушает edi, а такого винда может не простить. Кроме того, MainCodeProc не является "честной" процедурой и не может быть вызвана командой call, но при "вызове" через jmp с этим проблем нет.
Да, но это далеко не самое главное. Основная проблема в том, что неправильно определены структуры - в реальности должно быть выравнивание на 4 байта всего подряд, иначе размер структуры получается неверным (меньше 0xb44) и обнуление переменной в начале кода затирает важные данные из стека. Код (Text): _RASENTRYA STRUCT dwSize DWORD ? dwfOptions DWORD ? dwCountryID DWORD ? dwCountryCode DWORD ? szAreaCode db RAS_MaxAreaCode + 1 dup(?) szLocalPhoneNumber db RAS_MaxPhoneNumber + 1 dup(?) dwAlternateOffset DWORD ? ipaddr RASIPADDR <> ipaddrDns RASIPADDR <> ipaddrDnsAlt RASIPADDR <> ipaddrWins RASIPADDR <> ipaddrWinsAlt RASIPADDR <> dwFrameSize DWORD ? dwfNetProtocols DWORD ? dwFramingProtocol DWORD ? szScript db MAX_PATH dup(?) szAutodialDll db MAX_PATH dup(?) szAutodialFunc db MAX_PATH dup(?) szDeviceType db RAS_MaxDeviceType + 1 dup(?) szDeviceName db RAS_MaxDeviceName + 1 dup(?) szX25PadType db RAS_MaxPadType + 1 dup(?) szX25Address db RAS_MaxX25Address + 1 dup(?) szX25Facilities db RAS_MaxFacilities + 1 dup(?) szX25UserData db RAS_MaxUserData + 1 dup(?) align 4 dwChannels DWORD ? dwReserved1 DWORD ? dwReserved2 DWORD ? dwSubEntries DWORD ? dwDialMode DWORD ? dwDialExtraPercent DWORD ? dwDialExtraSampleSeconds DWORD ? dwHangUpExtraPercent DWORD ? dwHangUpExtraSampleSeconds DWORD ? dwIdleDisconnectSeconds DWORD ? dwType DWORD ? dwEncryptionType DWORD ? dwCustomAuthKey DWORD ? guidId GUID <> szCustomDialDll db MAX_PATH dup(?) dwVpnStrategy DWORD ? dwfOptions2 DWORD ? dwfOptions3 DWORD ? szDnsSuffix db 256 dup(?) dwTcpWindowSize DWORD ? szPrerequisitePbk db MAX_PATH dup(?) szPrerequisiteEntry db RAS_MaxEntryName + 1 dup(?) align 4 dwRedialCount DWORD ? dwRedialPause DWORD ? _RASENTRYA ENDS RASCREDENTIALS STRUCT dwSize DWORD ? dwMask DWORD ? szUserName db UNLEN + 1 dup(?) szPassword db PWLEN + 1 dup(?) szDomain db DNLEN + 1 dup(?) _padding dw ? RASCREDENTIALS ENDS