тут несколько дней осваиваю fasm, (как-то больше понравился чем остальные ) под виндос32. И вот такая проблема, попробовал искать везде , ничего похожего , наверное просто недопонимаю синтаксис при попытке запустить cmd из программы программа вылетает с ошибкой 0x00000005 "access denyed", а код переписываю почти в точности также с masm и там он работал. проблема похоже в том что в fasm нигде не объявлена структура SECURITY_ATTRIBUTES попробовал задать её сам Код (Text): struct SECURITY_ATTRIBUTES nLength dd ? lpSecurityDescriptor dd ? bInheritHandle dd ? ends sat SECURITY_ATTRIBUTES ? mov [sat.nLength],sizeof.SECURITY_ATTRIBUTES mov [sat.lpSecurityDescriptor],NULL mov [sat.bInheritHandle],TRUE Но не помогает. дальше по коду просто идёт пока такое Код (Text): .idm_run: invoke CreatePipe,[hRead],[hWrite],[sat],NULL or eax, eax jz .finish mov [startupinfo.cb], sizeof.STARTUPINFO invoke GetStartupInfo,[startupinfo] mov eax,[hWrite] mov [startupinfo.hStdOutput],eax mov [startupinfo.hStdError],eax mov [startupinfo.dwFlags],STARTF_USESHOWWINDOW+\ STARTF_USESTDHANDLES mov [startupinfo.wShowWindow],SW_HIDE invoke CreateProcess,0, CommLine ,0,0,1,0,0,0,\ [startupinfo],[pinfo] or eax, eax jz .finish invoke CloseHandle,[hWrite] .xm_loop: invoke RtlZeroMemory,[buffer],1024 invoke ReadFile,[hRead],[buffer],1023,\ [bytesRead],NULL or eax, eax jz .finish invoke SendMessage,[hwndEdit],EM_SETSEL,-1,0 invoke SendMessage,[hwndEdit],EM_REPLACESEL,\ FALSE,[buffer] jmp .xm_loop Компилируется нормально , ошибок нет , только команду не могу выполнить , таких кнопок планировал несколько сделать , а на masm как-то нет желания переходить Подскажите , может есть простое решение ?
Эта структура не очень то и нужна Код (Text): BOOL CreatePipe( PHANDLE hReadPipe, // address of variable for read handle PHANDLE hWritePipe, // address of variable for write handle LPSECURITY_ATTRIBUTES lpPipeAttributes, // pointer to security attributes DWORD nSize // number of bytes reserved for pipe ); hReadPipe,hWritePipe,lpPipeAttributes - указатели, т.е. адреса. А у тебя извлекается значение. Т.е. надо Код (Text): invoke CreatePipe,hRead,hWrite,sat,NULL Такая ошибка присутствует ещё и в других местах в коде. --- Как-то так: Код (Text): format PE GUI 4.0 include '%fasminc%\win32a.inc' BUFF_SIZE = 255 section '.data' data readable writeable hRead dd ? hWrite dd ? toexec db 'D:\windows\system32\cmd.exe',0 sin STARTUPINFO <> pin PROCESS_INFORMATION <> buff db BUFF_SIZE+1 dup(?) b_r dd ? section '.code' code readable executable entry $ invoke CreatePipe,hRead,hWrite,0,BUFF_SIZE test eax,eax jz @exit mov [sin.cb],sizeof.STARTUPINFO push [hWrite] pop [sin.hStdInput] push [hRead] pop [sin.hStdOutput] mov [sin.wShowWindow], SW_HIDE mov [sin.dwFlags], STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW invoke CreateProcess,toexec,0,0,0,0,NORMAL_PRIORITY_CLASS,0,0,sin,pin test eax,eax jz @exit invoke ReadFile,[hRead],buff,BUFF_SIZE,b_r,0 @exit: invoke ExitProcess,0 section '.idata' import data readable library kernel32,'kernel32.dll',\ user32, 'user32.dll' include '%fasminc%\apia\kernel32.inc' include '%fasminc%\apia\user32.inc'
SECURITY_ATTRIBUTES, вроде, безболезненно можно оставлять дефолтом... проблема, наверное не сдесь проверь работу с памятью твоей проги
я заметил у фасм порядок прохождения кода очень важен, похоже что где-то что-то неопределенно вовремя...
Немного об указателях, понимаешь в алгебре есть такое уравнение: С=A+10. где число C к примеру = 15, так вот С и будет указателем так же как и А. на фасме указатель можно передать так: Код (Text): ... invoke ReadFile, дворд,\ ... А само содержимое указателя передается так: Код (Text): ... invoke ReadFile, [дворд],\ ... а так twgt вполне на первый взгляд все подогнал правильно...
Такой вопрос. Как в fasm использовать поля структуры при передаче указателя на оную в процедуру? Например: Код (Text): proc DrawImage image, x, y invoke GetDC, [g_hWnd] mov [hdc], eax invoke SetDIBitsToDevice, eax, [x], [y], [image.size_x], [size_y], ... invoke ReleaseDC, [g_hWnd], [hdc] endp , где image - указатель на структуру IMAGE. Иначе говоря, как объяснить компилятору, что image - это указатель на IMAGE: Код (Text): struct IMAGE size_x dd ? size_y dd ? pData dd ? ends ?Ну и как потом обратиться к её полям по указателю (я понимаю, что у меня неправильно). Хотя что-то мне подсказывает, что это из области фантастики. Вот что значит начинать с языка высокого уровня(
Phuntik тут неправильно mov eax,[image] ; берем из стека ссылку на структуру mov eax,[eax + IMAGE.size_x] ; берем size_x из структуры по ссылке