Ну значить так, =) написал я код решил запустить... (писал под FASM) вот кстати часть кода где и скрыт подвох как я думаю... Code (Text): a1007: invoke CreateFile,buffer,GENERIC_WRITE+GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 mov [hFile],eax invoke GetFileSize,hFile,0 cmp eax,0 je err mov [FileSize],eax invoke GetProcessHeap mov [HandHeap],eax invoke HeapAlloc,HandHeap,0,FileSize mov [p_start],eax invoke ReadFile,hFile,p_start,FileSize,[FileSize],0 cmp eax,0 je err mov eax,1 jmp finish Ну и вот ошибка вылетает только тогда когда появляеться сктрока invoke ReadFile,hFile,p_start,FileSize,[FileSize],0 в коде... То есть ошибка вылетает при выпонении программы а не при компиляции...
>> invoke ReadFile,hFile,p_start,FileSize,[FileSize],0 сначала надо [FileSize], а потом FileSize читать MSDN пробовал? + буффер надо укзать [p_start], а не p_start. все напутал к ядрёне фене
Code (Text): format PE GUI 4.0 on '40h.stub' entry MyEntry include 'F:\coding\radasm\INCLUDE\win32ax.inc' include 'cripto.inc' section '.code' import data code readable writable executable library kernel, 'KERNEL32.DLL',\ user, 'USER32.DLL',\ comdlg32, 'COMDLG32.DLL' import kernel,\ CloseHandle,'CloseHandle',\ CreateFile,'CreateFileA',\ GetFileSize,'GetFileSize',\ GetModuleHandle, 'GetModuleHandleA',\ GetProcessHeap,'GetProcessHeap',\ HeapAlloc,'HeapAlloc',\ ReadFile,'ReadFile',\ ExitProcess, 'ExitProcess' import user,\ SetDlgItemText, 'SetDlgItemTextA',\ DialogBoxParam, 'DialogBoxParamA',\ EndDialog, 'EndDialog',\ SendMessage, 'SendMessageA' import comdlg32,\ GetOpenFileName, 'GetOpenFileNameA',\ GetSaveFileName, 'GetSaveFileNameA' MyEntry: invoke GetModuleHandle,eax mov [gIst],eax invoke DialogBoxParam,eax,1,0,DlgProc,0 ExitApp: invoke ExitProcess,0 proc DlgProc,hWnd,uMsg,wParam,lParam push edi esi ebx mov eax,[uMsg] cmp eax,WM_COMMAND je jCOMMAND cmp eax,WM_INITDIALOG je jINITDIALOG cmp eax,WM_CLOSE je jCLOSE xor eax,eax jmp finish ;-------------------------------------------------------------------------------- jINITDIALOG: mov eax,[hWnd] mov [gWnd],eax mov [ofn.lStructSize],sizeof.OPENFILENAME push [hWnd] pop [ofn.hwndOwner] push [gIst] pop [ofn.hInstance] mov [ofn.lpstrFilter],FilterString mov [ofn.lpstrFile],buffer mov [ofn.nMaxFile],MAXSIZE invoke SetDlgItemText,[hWnd],IDC_EDT1,init_input invoke SetDlgItemText,[hWnd],IDC_EDT2,init_out invoke SetDlgItemText,[hWnd],IDC_EDT4,load_prog mov eax,1 jmp finish ;-------------------------------------------------------------------------------- jCOMMAND: mov eax,[wParam] cmp eax,1000 je a1000 cmp eax,1005 je a1005 cmp eax,1007 je a1007 xor eax,eax jmp finish a1000: invoke SendMessage,[hWnd],WM_CLOSE,0,0 mov eax,1 jmp finish a1005: invoke GetOpenFileName,ofn cmp eax,1 jne finish invoke SetDlgItemText,[hWnd],1001,buffer mov eax,1 jmp finish a1007: invoke CreateFile,buffer,GENERIC_WRITE+GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 mov [hFile],eax invoke GetFileSize,hFile,0 cmp eax,0 je err mov [FileSize],eax invoke GetProcessHeap mov [HandHeap],eax invoke HeapAlloc,HandHeap,0,FileSize mov [p_start],eax invoke ReadFile,[hFile],[p_start],[FileSize],FileSize,0 cmp eax,0 je err invoke CloseHandle,hFile mov eax,1 jmp finish err: mov eax,1 jmp finish ;-------------------------------------------------------------------------------- jCLOSE: invoke EndDialog,[hWnd],0 mov eax,1 finish: pop ebx esi edi ret endp section '.rsrc' resource from 'cripto.res' data readable
*.inc фаил Code (Text): IDC_EDT1 = 1001 IDC_EDT2 = 1002 IDC_EDT4 = 1010 IDC_BTN2 = 1005 MEMSIZE = 65535 MAXSIZE = 260 section '.data' data readable writeable gIst dd 0 gWnd dd 0 hFile dd 0 FileSize dd 0 HandHeap dd 0 p_start dd 0 init_input TCHAR 'C:\',0 init_out TCHAR 'C:\',0 load_prog TCHAR 'Программа загружена',0 FilterString db "Все файлы",0,"*.*",0,0 buffer db MAXSIZE dup(0) ofn OPENFILENAME
Code (Text): invoke HeapAlloc,HandHeap,0,FileSize --> error is here; остальное даже не смотрел, эта строчка меня просто убила DDDDDDDDDDDDDDDDDDD
47726573684e696b ReadFile ты исправил, а вызовы других ф-й кто будет исправлять ? В фасме имя переменной без кв.скобок означает адрес переменной, а со скобками - значение, которое лежит по этому адресу. Поэтому нужно писать: Code (Text): invoke GetFileSize,[hFile],0 invoke HeapAlloc,[HandHeap],0,[FileSize] invoke CloseHandle,[hFile]
47726573684e696b Да и вызовы API-шек обычно проверяют на успех/неуспех, тогда вопросов меньше(особенно таких)
47726573684e696b [hFile] - это хэндл. hFile - а это адрес хэндла. По аналогии, просмотри весь код на такой предмет (несколько мест ошибочны). Обычная вещь при переходе с MASM на FASM.
Я вообще просто тупо сидел и смотрел в первый раз -круто чувак перепутал адреса и значения по этим адресам во всех местах, где только можно было перепутать )