FASM наверное простой вопрос

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

  1. xx7

    xx7 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    18
    тут несколько дней осваиваю fasm, (как-то больше понравился чем остальные ) под виндос32.
    И вот такая проблема,
    попробовал искать везде , ничего похожего , наверное просто недопонимаю синтаксис

    при попытке запустить cmd из программы программа вылетает с ошибкой 0x00000005 "access denyed",
    а код переписываю почти в точности также с masm и там он работал.

    проблема похоже в том что в fasm нигде не объявлена структура SECURITY_ATTRIBUTES

    попробовал задать её сам
    Код (Text):
    1. struct SECURITY_ATTRIBUTES
    2. nLength dd ?
    3. lpSecurityDescriptor dd ?
    4. bInheritHandle dd ?
    5. ends
    6.  
    7. sat SECURITY_ATTRIBUTES ?
    8. mov [sat.nLength],sizeof.SECURITY_ATTRIBUTES
    9. mov [sat.lpSecurityDescriptor],NULL
    10. mov [sat.bInheritHandle],TRUE
    Но не помогает.

    дальше по коду просто идёт пока такое
    Код (Text):
    1. .idm_run:
    2. invoke CreatePipe,[hRead],[hWrite],[sat],NULL
    3.  
    4. or eax, eax
    5. jz .finish
    6.  
    7. mov [startupinfo.cb], sizeof.STARTUPINFO
    8. invoke GetStartupInfo,[startupinfo]
    9. mov eax,[hWrite]
    10. mov [startupinfo.hStdOutput],eax
    11. mov [startupinfo.hStdError],eax
    12. mov [startupinfo.dwFlags],STARTF_USESHOWWINDOW+\
    13.     STARTF_USESTDHANDLES
    14. mov [startupinfo.wShowWindow],SW_HIDE
    15. invoke CreateProcess,0, CommLine ,0,0,1,0,0,0,\
    16.   [startupinfo],[pinfo]
    17.  
    18. or eax, eax
    19. jz .finish
    20.  
    21. invoke CloseHandle,[hWrite]
    22.    
    23. .xm_loop:
    24. invoke RtlZeroMemory,[buffer],1024 
    25. invoke ReadFile,[hRead],[buffer],1023,\
    26. [bytesRead],NULL
    27.  
    28. or eax, eax
    29. jz .finish
    30.  
    31. invoke SendMessage,[hwndEdit],EM_SETSEL,-1,0
    32. invoke SendMessage,[hwndEdit],EM_REPLACESEL,\
    33.         FALSE,[buffer]
    34.        
    35. jmp .xm_loop
    Компилируется нормально , ошибок нет , только команду не могу выполнить , таких кнопок планировал несколько сделать , а на masm как-то нет желания переходить

    Подскажите , может есть простое решение ?
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Эта структура не очень то и нужна
    Код (Text):
    1. BOOL CreatePipe(
    2.  
    3.     PHANDLE hReadPipe,  // address of variable for read handle
    4.     PHANDLE hWritePipe, // address of variable for write handle  
    5.     LPSECURITY_ATTRIBUTES lpPipeAttributes, // pointer to security attributes
    6.     DWORD nSize     // number of bytes reserved for pipe
    7.    );
    hReadPipe,hWritePipe,lpPipeAttributes - указатели, т.е. адреса.
    А у тебя извлекается значение. Т.е. надо
    Код (Text):
    1. invoke CreatePipe,hRead,hWrite,sat,NULL
    Такая ошибка присутствует ещё и в других местах в коде.

    ---
    Как-то так:
    Код (Text):
    1. format PE GUI 4.0
    2. include '%fasminc%\win32a.inc'
    3.  
    4. BUFF_SIZE = 255
    5.  
    6. section '.data' data readable writeable
    7. hRead   dd ?
    8. hWrite  dd ?
    9. toexec  db 'D:\windows\system32\cmd.exe',0
    10. sin     STARTUPINFO <>
    11. pin     PROCESS_INFORMATION <>
    12. buff    db BUFF_SIZE+1 dup(?)
    13. b_r     dd ?
    14.  
    15. section '.code' code readable executable
    16. entry $
    17.  
    18. invoke CreatePipe,hRead,hWrite,0,BUFF_SIZE
    19. test eax,eax
    20.  jz @exit
    21.  
    22. mov  [sin.cb],sizeof.STARTUPINFO
    23. push [hWrite]
    24. pop  [sin.hStdInput]
    25. push [hRead]
    26. pop  [sin.hStdOutput]
    27. mov  [sin.wShowWindow], SW_HIDE
    28. mov  [sin.dwFlags], STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW
    29.  
    30. invoke CreateProcess,toexec,0,0,0,0,NORMAL_PRIORITY_CLASS,0,0,sin,pin
    31. test eax,eax
    32.  jz @exit
    33. invoke ReadFile,[hRead],buff,BUFF_SIZE,b_r,0
    34.  
    35. @exit:
    36. invoke ExitProcess,0
    37.  
    38. section '.idata' import data readable
    39. library kernel32,'kernel32.dll',\
    40.         user32, 'user32.dll'
    41.  
    42.  
    43. include '%fasminc%\apia\kernel32.inc'
    44. include '%fasminc%\apia\user32.inc'
     
  3. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
    SECURITY_ATTRIBUTES, вроде, безболезненно можно оставлять дефолтом... проблема, наверное не сдесь
    проверь работу с памятью твоей проги
     
  4. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    777
    я заметил у фасм порядок прохождения кода очень важен, похоже что где-то что-то неопределенно вовремя...
     
  5. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Немного об указателях, понимаешь в алгебре есть такое уравнение: С=A+10. где число C к примеру = 15, так вот С и будет указателем так же как и А. на фасме указатель можно передать так:

    Код (Text):
    1. ...
    2.     invoke ReadFile, дворд,\
    3. ...
    А само содержимое указателя передается так:
    Код (Text):
    1. ...
    2.     invoke ReadFile, [дворд],\
    3. ...
    а так twgt вполне на первый взгляд все подогнал правильно...
     
  6. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Такой вопрос.
    Как в fasm использовать поля структуры при передаче указателя на оную в процедуру?
    Например:
    Код (Text):
    1. proc DrawImage image, x, y
    2.     invoke GetDC, [g_hWnd]
    3.     mov [hdc], eax
    4.     invoke SetDIBitsToDevice, eax, [x], [y], [image.size_x], [size_y], ...
    5.     invoke ReleaseDC, [g_hWnd], [hdc]
    6. endp
    , где image - указатель на структуру IMAGE.
    Иначе говоря, как объяснить компилятору, что image - это указатель на IMAGE:
    Код (Text):
    1. struct IMAGE
    2.     size_x dd ?
    3.     size_y dd ?
    4.     pData  dd ?
    5. ends
    ?Ну и как потом обратиться к её полям по указателю (я понимаю, что у меня неправильно).

    Хотя что-то мне подсказывает, что это из области фантастики. Вот что значит начинать с языка высокого уровня(
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Phuntik
    тут неправильно

    mov eax,[image] ; берем из стека ссылку на структуру
    mov eax,[eax + IMAGE.size_x] ; берем size_x из структуры по ссылке
     
  8. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    qqwe
    Спасибо. Вы сэкономили мне много времени)