CreateFile и CD/DVD-приводы

Тема в разделе "WASM.BEGINNERS", создана пользователем Adrax, 8 июл 2007.

  1. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Господа программисты!
    Хочу вот приблуду написать для открытия/закрытия лотка опптического привода, зная его букву...
    Возникло два вопроса:

    1. Вернёт ли CreateFile хэндл сидюка, если диска в нём нет?

    2. Почему CreateFile уверенно возвращает с моего DVD-RW INVALID_HANDLE_VALUE, не глядя - есть там диск, нет ли его... А с соседним CD-драйвом адекватно работает... Неужели, тип привода имеет значение
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    1. да
    2.
    Код (Text):
    1. hCD = CreateFileA("\\\\.\\CDROM1", 1, 1, 0, 3, 0, 0);
     
  3. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 RammerLabs

    Спасибо, что успокоили насчёт первого вопроса
    Я в FASM пишу... Вызываю CreateFile,'\\.\f:',GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0 и наталкиваюсь на минус-единицу в eax. Уже отупел, перекомпилируя код и пытаясь добиться вразумительного поведения...
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    вообще-то FILE_GENERIC_READ

    попробуй вызвать createfile с параметрами, как у меня.
     
  5. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Про FILE_GENERIC_READ я не слышал... Вызывал и с 1,1,0,3,0,0 - всё равно те же грабли:dntknw:
    Код такой:
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32axp.inc'
    4.  
    5.  
    6. ID_OPEN = 101h
    7. ID_CLOSE = 102h
    8. ID_EXIT = 103h
    9. ID_EDIT = 104h
    10.  
    11. FILE_GENERIC_READ = 1
    12.  
    13. FILE_DEVICE_MASS_STORAGE = 2Dh
    14. METHOD_BUFFERED = 0
    15. FILE_ANY_ACCESS = 0
    16. FILE_READ_ACCESS = 1
    17. FILE_WRITE_ACCESS = 2
    18.  
    19. IOCTL_STORAGE_EJECT_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (202h shl 2) or METHOD_BUFFERED
    20. IOCTL_STORAGE_LOAD_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (203h shl 2) or METHOD_BUFFERED
    21.  
    22.  
    23. .data
    24.  bukva rb 1
    25.  handl dd ?
    26.  xren db '\\.\',0,0
    27.  dvoet db ':',0
    28.  byr dd ?
    29.  
    30.  
    31. .code
    32. fuck:
    33.         invoke  GetModuleHandle,0
    34.         invoke  DialogBoxParam,eax,69,HWND_DESKTOP,ProceduraDialoga,0
    35.         invoke  ExitProcess,0
    36.  
    37. proc ProceduraDialoga,hwnddlg,msg,wparam,lparam
    38.  push ebx
    39.  push esi
    40.  push edi
    41.   cmp [msg],WM_INITDIALOG
    42.   je Initialization
    43.   cmp [msg],WM_COMMAND
    44.   je Command
    45.   cmp [msg],WM_CLOSE
    46.   je Exit
    47.  xor eax,eax
    48.  jmp Finish
    49.  
    50. Command:
    51.  cmp [wparam],BN_CLICKED shl 16 + ID_EXIT
    52.  je Exit
    53.  invoke GetDlgItemText,[hwnddlg],ID_EDIT,bukva,2
    54.  test eax,eax
    55.  jz Initialization
    56.  invoke lstrcat,xren,bukva
    57.  invoke lstrcat,xren,dvoet
    58.  invoke CreateFile,xren,FILE_GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
    59.  cmp eax,-1
    60.  
    61.  je Initialization
    62.  mov [handl],eax
    63.  cmp [wparam],BN_CLICKED shl 16 + ID_CLOSE
    64.  je Close
    65.  invoke DeviceIoControl,eax,IOCTL_STORAGE_EJECT_MEDIA,0,0,0,0,byr,0
    66.  
    67. Initialization:
    68.  xor eax,eax
    69.  inc eax
    70.  
    71. Finish:
    72.  pop edi
    73.  pop esi
    74.  pop ebx
    75.  ret
    76.  
    77. Exit:
    78.  invoke EndDialog,[hwnddlg],-1
    79.  jmp Finish
    80.  
    81. Close:
    82.  invoke DeviceIoControl,eax,IOCTL_STORAGE_LOAD_MEDIA,0,0,0,0,byr,0
    83.  jmp Initialization
    84.  
    85. endp
    86. .end fuck
    87.  
    88. section '.rsrc' resource from 'CDzap.res' data readable discardable
    Хоть убейте, не пойму, где ошибка...
    CreateFile вызывал и с GENERIC_READ и с FILE_GENERIC_READ по совету RamMerLabs - монопенисуально, INVALID_HANDLE_VALUE. Если вызываю с \\.\CdRom1 - получаю абсолютно левый хэндл 0x54, с которым тоже ничего не прокатывает
     
  6. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Ах, да!.... .rc к проге
    Код (Text):
    1. #define LANG_ENGLISH 0x9
    2. #define LANG_RUSSIAN 0x19
    3.  
    4. #define DS_MODALFRAME 0x0080L
    5. #define WS_POPUP 0x80000000L
    6. #define WS_CAPTION 0x0C00000L
    7. #define WS_SYSMENU 0x80000L
    8. #define BS_DEFPUSHBUTTON 0x1
    9. #define WS_CHILD 0x40000000L
    10. #define WS_VISIBLE 0x10000000L
    11. #define WS_TABSTOP 0x10000L
    12. #define BS_PUSHBUTTON 0x0
    13. #define SS_LEFT 0x0
    14. #define ES_LEFT 0x0
    15. #define WS_BORDER 0x800000L
    16.  
    17.  
    18. #define ID_OPEN 0x101L
    19. #define ID_CLOSE 0x102L
    20. #define ID_EXIT 0x103L
    21. #define ID_EDIT 0x104L
    22.  
    23.  
    24. 69 DIALOG 70, 70, 160, 50
    25. STYLE  DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
    26. CAPTION "Âëàäûêà CD-ROM'à  ver. 0.0.0.1"
    27. LANGUAGE LANG_ENGLISH, LANG_RUSSIAN
    28. FONT 8, "MS Sans Serif"
    29. {
    30. CONTROL "Ââåäèòå áóêâó CD-ROM'à:", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE, 10, 10, 100, 8
    31. CONTROL "", ID_EDIT, EDIT, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 110, 10, 30, 13
    32. CONTROL "Îòêðûòü",ID_OPEN, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10, 30, 45, 15
    33. CONTROL "Çàêðûòü",ID_CLOSE, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 60, 30, 45, 15
    34. CONTROL "Âûõîä",ID_EXIT,BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP,110, 30, 45, 15
    35. }
    Блин, чё с кириллицей-то? Хотя ладно, и так сойдёт:)

    Никак не пойму, в чём проблема... И Olly издевается LastError: ERROR_SUCCESS...
     
  7. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    зачем 2 Zero ?

    \\.\CDROM1
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Adrax
    Код (Text):
    1. ...
    2. bukva rb 1                  ;; тут один байт
    3. ...
    4. invoke GetDlgItemText,[hwnddlg],ID_EDIT,bukva,2 ;; тут два
    5.                         ;;  куда попадет второй байт?
    6. ...
    Код (Text):
    1. ...
    2. xren db '\\.\',0,0              ;; тут два нуля
    3. ...
    4. invoke lstrcat,xren,bukva           ;; буква вместо первого
    5. invoke lstrcat,xren,dvoet           ;; двоеточие вместо второго
    6.                         ;; а где завершающий ноль?
    7. ...
     
  9. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 q_q
    Не, тут я не прокололся - специально ж высчитывал, чтобы lstrcat красиво сшил и ноль добавился. Мож, я и ошибся чуток, но строка формируется правильно

    2 все
    Уважаемые программисты! Допёр я, почему CreateFile не срабатывала. Причина оказалась банально проста: запущенная VmWare блокировала доступ к DVD-приводу!
    Сейчас столкнулся с другой проблемой... Видоизменил исходник следующим образом:
    Код (Text):
    1. format PE GUI 4.0
    2. include 'win32axp.inc'
    3.  
    4. ID_OPEN = 101h
    5. ID_CLOSE = 102h
    6. ID_EXIT = 103h
    7. ID_EDIT = 104h
    8.  
    9. FILE_GENERIC_READ = 1
    10.  
    11. FILE_DEVICE_MASS_STORAGE = 2Dh
    12. METHOD_BUFFERED = 0
    13. FILE_ANY_ACCESS = 0
    14. FILE_READ_ACCESS = 1
    15. FILE_WRITE_ACCESS = 2
    16.  
    17. IOCTL_STORAGE_EJECT_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (202h shl 2) or METHOD_BUFFERED
    18. IOCTL_STORAGE_LOAD_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (203h shl 2) or METHOD_BUFFERED
    19.  
    20. .data
    21.  bukva rb 1
    22.  handl dd ?
    23.  xren db '\\.\',0,0
    24.  dvoet db ':',0
    25.  byr dd ?
    26.  
    27. .code
    28. fuck:
    29. invoke GetModuleHandle,0
    30. invoke DialogBoxParam,eax,69,HWND_DESKTOP,ProceduraDialoga,0
    31. invoke ExitProcess,0
    32.  
    33. proc ProceduraDialoga,hwnddlg,msg,wparam,lparam
    34.  push ebx
    35.  push esi
    36.  push edi
    37.   cmp [msg],WM_INITDIALOG
    38.   je Initialization
    39.   cmp [msg],WM_COMMAND
    40.   je Command
    41.   cmp [msg],WM_CLOSE
    42.   je Exit
    43.  xor eax,eax
    44.  jmp Finish
    45.  
    46. Command:
    47.  cmp [wparam],BN_CLICKED shl 16 + ID_EXIT
    48.  je Exit
    49.  mov eax,[handl]
    50.  test eax,eax
    51.  jnz knopki
    52.  
    53.  invoke GetDlgItemText,[hwnddlg],ID_EDIT,bukva,2
    54.  test eax,eax
    55.  jz Initialization
    56.  invoke lstrcat,xren,bukva
    57.  invoke lstrcat,xren,dvoet
    58.  invoke CreateFile,xren,FILE_GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
    59.  cmp eax,-1
    60.  je Initialization
    61.  mov [handl],eax
    62.  jmp Command
    63.  
    64. knopki:
    65.  cmp [wparam],BN_CLICKED shl 16 + ID_CLOSE
    66.  je Close
    67.  cmp [wparam],BN_CLICKED shl 16 + ID_OPEN
    68.  je Open
    69.  
    70. Initialization:
    71.  xor eax,eax
    72.  inc eax
    73.  
    74. Finish:
    75.  pop edi
    76.  pop esi
    77.  pop ebx
    78.  ret
    79.  
    80. Exit:
    81.  invoke EndDialog,[hwnddlg],-1
    82.  jmp Finish
    83.  
    84. Open:
    85.  invoke DeviceIoControl,[handl],IOCTL_STORAGE_EJECT_MEDIA,0,0,0,0,byr,0
    86.  invoke CloseHandle,[handl]
    87.  invoke RtlZeroMemory,handl,4
    88.  jmp Initialization
    89.  
    90. Close:
    91.  invoke DeviceIoControl,[handl],IOCTL_STORAGE_LOAD_MEDIA,0,0,0,0,byr,0
    92.  invoke CloseHandle,[handl]
    93.  invoke RtlZeroMemory,handl,4
    94.  jmp Initialization
    95.  
    96. endp
    97. .end fuck
    98.  
    99. section '.rsrc' resource from 'CDzap.res' data readable discardable
    И всё равно - кнопки срабатывают максимум один раз, т.е. один раз нажал "Открыть" - и всё, после этого прогу можно только закрыть, больше она ни на что не способна...
    В чём моя ошибка?
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Adrax
    строка формируется правильно
    Всегда? Или только первый раз?

    кнопки срабатывают максимум один раз
    При первом срабатывании после invoke lstrcat,xren,dvoet переменная dvoet будет указывать на db 0, 0. Следовательно, двоеточие в дальнейшем не добавляется.
     
  11. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 q_q
    Спасибо, уже разобрался!
    И насчёт строки вы были абсолютно правы