Как закрыть крышку CD-ROM'a

Тема в разделе "WASM.BEGINNERS", создана пользователем tester3000, 7 янв 2007.

  1. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    В исходниках с FASM есть пример (Beer.asm) открытие CD-ROM'a а как можно закрыть его ?
     
  2. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    пример исключительно для линейки NT
    не знаю точно, что при этом исползуется, кажется WinAspi layer
    самому интересно, как проделать то же без ASPI в 9x
    или даже если с aspi - как по индексу диска определить его физический номер?
     
  3. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    А можно пример на FASM а то я С++ вообще не знаю
     
  4. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Примерно так (MASM)
    Код (Text):
    1. .data
    2. aOpen db "Set cdaudio door open wait",0
    3. aClose db "Set cdaudio door closed wait",0
    4. .code
    5. Открытие
    6. invoke mciSendString,addr aOpen, 0, 0, 0
    7. Закрытие
    8. invoke mciSendString,addr aClose, 0, 0,0
     
  5. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    GMax спасибо

    вот пример на FASM может кому тоже пригодится

    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32a.inc'
    4.  
    5. invoke  mciSendString,_cmd_close,0,0,0
    6. invoke  ExitProcess,0
    7.  
    8. _cmd_close db 'Set CDAudio Door Closed Wait',0
    9.  
    10. ; import data in the same section
    11.  
    12. data import
    13.  
    14.  library kernel32,'KERNEL32.DLL',\
    15.          winmm,'WINMM.DLL'
    16.  
    17.  import kernel32,\
    18.         ExitProcess,'ExitProcess'
    19.  
    20.  import winmm,\
    21.         mciSendString,'mciSendStringA'
    22.  
    23. end data
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    все хорошо, пока сд только один...
     
  7. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Если CD/DVD не один, то дело не намного сложнее... (MASM)
    Код (Text):
    1. .data
    2.         aCDAudio     db "CDAudio",0
    3.         aCD            db "E:",0
    4. .code
    5. ;#########################################################################
    6. OpenCD proc paDrName:DWORD
    7. LOCAL OpenParm:MCI_OPEN_PARMS
    8.  
    9. mov OpenParm.dwCallback,0
    10. mov OpenParm.lpstrDeviceType,offset aCDAudio
    11. mov eax,paDrName
    12. mov OpenParm.lpstrElementName,eax
    13. invoke  mciSendCommand,0,MCI_OPEN,MCI_OPEN_TYPE or MCI_OPEN_ELEMENT,addr OpenParm
    14. .if eax==0
    15.     invoke  mciSendCommand,OpenParm.wDeviceID,MCI_SET, MCI_SET_DOOR_OPEN, 0
    16. .endif
    17. invoke  mciSendCommand,OpenParm.wDeviceID,MCI_CLOSE,MCI_OPEN_TYPE or MCI_OPEN_ELEMENT,addr OpenParm
    18.  
    19. ret
    20. OpenCD endp
    21. ;#########################################################################
    22. CloseCD proc paDrName:DWORD
    23. LOCAL OpenParm:MCI_OPEN_PARMS
    24.  
    25. mov OpenParm.dwCallback,0
    26. mov OpenParm.lpstrDeviceType,offset aCDAudio
    27. mov eax,paDrName
    28. mov OpenParm.lpstrElementName,eax
    29. invoke  mciSendCommand,0,MCI_OPEN,MCI_OPEN_TYPE or MCI_OPEN_ELEMENT,addr OpenParm
    30. .if eax==0
    31.     invoke  mciSendCommand,OpenParm.wDeviceID,MCI_SET, MCI_SET_DOOR_CLOSED, 0
    32. .endif
    33. invoke  mciSendCommand,OpenParm.wDeviceID,MCI_CLOSE,MCI_OPEN_TYPE or MCI_OPEN_ELEMENT,addr OpenParm
    34.  
    35. ret
    36. CloseCD endp
    37. ;#########################################################################
    38. ...........
    39. ...........
    40. invoke  OpenCD,addr aCD
    41. invoke  Sleep,3000
    42. invoke  CloseCD,addr aCD
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    работает..
    раздражает только, что mci создает дополнительный поток и оставляет его работать после возврата из своих функций
    например, если в конце программы поставить не ExitProcess, а просто ret, то процесс уже не завершится
     
  9. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    А может кто подскажет как на FASM сделать форму с двумя кнопками Open CD-ROM и Close CD-ROM
    и чтоб по нажатию открывался и закрывался CD_ROM используя эти сорсы

    Open CD-ROM :

    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32a.inc'
    4.  
    5.         invoke  mciSendString,_cmd_open,0,0,0
    6.  
    7. exit:
    8.         invoke  ExitProcess,0
    9.  
    10. _cmd_open db 'Set cdaudio door open wait',0
    11.  
    12.  
    13. ; import data in the same section
    14.  
    15. data import
    16.  
    17.  library kernel32,'KERNEL32.DLL',\
    18.          user32,'USER32.DLL',\
    19.          winmm,'WINMM.DLL'
    20.  
    21.  import kernel32,\
    22.         ExitProcess,'ExitProcess'
    23.  
    24.  import user32,\
    25.         MessageBoxA,'MessageBoxA'
    26.  
    27.  import winmm,\
    28.         mciSendString,'mciSendStringA'
    29.  
    30. end data

    Close CD-ROM:


    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32a.inc'
    4.  
    5.         invoke  mciSendString,_cmd_close,0,0,0
    6.  
    7. exit:
    8.         invoke  ExitProcess,0
    9.  
    10. _cmd_close db 'Set cdaudio door closed wait',0
    11.  
    12.  
    13. ; import data in the same section
    14.  
    15. data import
    16.  
    17.  library kernel32,'KERNEL32.DLL',\
    18.          user32,'USER32.DLL',\
    19.          winmm,'WINMM.DLL'
    20.  
    21.  import kernel32,\
    22.         ExitProcess,'ExitProcess'
    23.  
    24.  import user32,\
    25.         MessageBoxA,'MessageBoxA'
    26.  
    27.  import winmm,\
    28.         mciSendString,'mciSendStringA'
    29.  
    30. end data
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    tester3000
    Разве примеров, которые идут с фасмом не достаточно?
     
  11. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    мне нет я только вчера начил учить асм и вроде этот раздел создан для новичков вот я и спрашиваю
     
  12. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    Все вообще-то ты был прав ;) час мучений и вот что получилось:

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'win32a.inc'
    5.  
    6. ID_EXIT = IDCANCEL
    7. ID_OPEN = 100
    8. ID_CLOSE = 101
    9.  
    10. IDD_COMDEMO = 1
    11.  
    12. section '.data' data readable writeable
    13.  
    14. _cmd_close db 'Set cdaudio door closed wait',0
    15. _cmd_open  db 'Set cdaudio door open wait',0
    16.  
    17. section '.code' code readable executable
    18.  
    19.  start:
    20.  
    21.         invoke  GetModuleHandle,0
    22.         invoke  DialogBoxParam,eax,IDD_COMDEMO,HWND_DESKTOP,COMDemo,0
    23.  
    24.         invoke  ExitProcess,0
    25.  
    26. proc COMDemo hwnd,msg,wparam,lparam
    27.         push    ebx esi edi
    28.         cmp     [msg],WM_INITDIALOG
    29.         je      .wminitdialog
    30.         cmp     [msg],WM_COMMAND
    31.         je      .wmcommand
    32.         cmp     [msg],WM_CLOSE
    33.         je      .wmclose
    34.         xor     eax,eax
    35.         jmp     .finish
    36.   .wminitdialog:
    37.         jmp     .processed
    38.   .wmcommand:
    39.         cmp     [wparam],BN_CLICKED shl 16 + ID_EXIT
    40.         je      .wmclose
    41.         cmp     [wparam],BN_CLICKED shl 16 + ID_OPEN
    42.         je      .open
    43.         cmp     [wparam],BN_CLICKED shl 16 + ID_CLOSE
    44.         jne     .processed
    45.   .close:
    46.         invoke  mciSendString,_cmd_close,0,0,0
    47.         jmp     .processed
    48.   .open:
    49.         invoke  mciSendString,_cmd_open,0,0,0
    50.         jmp     .processed
    51.   .wmclose:
    52.         invoke  EndDialog,[hwnd],0
    53.   .processed:
    54.         mov     eax,1
    55.   .finish:
    56.         pop     edi esi ebx
    57.         ret
    58. endp
    59.  
    60. section '.idata' import data readable
    61.  
    62.   library kernel32,'KERNEL32.DLL',\
    63.           user,'USER32.DLL',\
    64.           winmm,'WINMM.DLL'
    65.  
    66.   import kernel32,\
    67.          GetModuleHandle,'GetModuleHandleA',\
    68.          ExitProcess,'ExitProcess'
    69.  
    70.   import user,\
    71.          DialogBoxParam,'DialogBoxParamA',\
    72.          EndDialog,'EndDialog'
    73.  
    74.   import winmm,\
    75.          mciSendString,'mciSendStringA'
    76.  
    77. section '.rsrc' resource data readable
    78.  
    79. directory RT_DIALOG,dialogs
    80.  
    81.   resource dialogs,\
    82.            IDD_COMDEMO,LANG_ENGLISH+SUBLANG_DEFAULT,comdemo
    83.  
    84.   dialog comdemo,'CDROM item control',70,70,170,24,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
    85.     dialogitem 'BUTTON','Open',ID_OPEN,4,4,45,15,WS_VISIBLE+WS_TABSTOP
    86.     dialogitem 'BUTTON','Close',ID_CLOSE,54,4,45,15,WS_VISIBLE+WS_TABSTOP
    87.     dialogitem 'BUTTON','Exit',ID_EXIT,120,4,45,15,WS_VISIBLE+WS_TABSTOP
    88.   enddialog
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    tester3000
    Ну вот, а ты боялся =)
    Можешь ещё прочитать Iczelion'a чтобы понятнее было. Правда там синтаксис masm, но общие сведения о WinAPI присутствуют.
     
  14. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    Nouzui писал:
    а как убить этот тред?
    моя прога работает долго, и если несколько раз закрывать/открывать сидюк, будет много лишних тредов
     
  15. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Лучше не через MCI, а через DeviceIOControl - тогда никаких заморочек: открыл девайс "\\.\X:", кинул ему команду, и готово!
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    да вряд ли.. скорее всего, mci будет юзать все тот же один раз созданный поток..

    RamMerLabs
    через ioctl, естественно, лучше, но несовместимо с 9x
    если, конечно, вообще стоит об этом задумываться..

    pluton
    если хочешь попробовать DeviceIoControl, смотри мой аттач выше
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    она комуто нужна?
    я всегда рассчитываю на совместимость только по линейке нт и то в лучшем случае) про 9х можно забыть
     
  18. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ну.. смотря для каких целей писать..
     
  19. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    to Nouzui:
    спасибо!!!
    работает :)
     
  20. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    ASPI здесь не причём.

    Всё что касается сидюков лучше писать через SPTI, т.к. ASPI предоставляет большую дыру в безопасности системы. Хорошо, что ребята из Ahead догадались сделать Nero через SPTI (точнее используется эмулятор ASPI) - иначе все бы уже давно имели на своей тачке какого-нибудь экзотического виря.