Господа программисты! Хочу вот приблуду написать для открытия/закрытия лотка опптического привода, зная его букву... Возникло два вопроса: 1. Вернёт ли CreateFile хэндл сидюка, если диска в нём нет? 2. Почему CreateFile уверенно возвращает с моего DVD-RW INVALID_HANDLE_VALUE, не глядя - есть там диск, нет ли его... А с соседним CD-драйвом адекватно работает... Неужели, тип привода имеет значение
2 RammerLabs Спасибо, что успокоили насчёт первого вопроса Я в FASM пишу... Вызываю CreateFile,'\\.\f:',GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0 и наталкиваюсь на минус-единицу в eax. Уже отупел, перекомпилируя код и пытаясь добиться вразумительного поведения...
Про FILE_GENERIC_READ я не слышал... Вызывал и с 1,1,0,3,0,0 - всё равно те же грабли Код такой: Код (Text): format PE GUI 4.0 include 'win32axp.inc' ID_OPEN = 101h ID_CLOSE = 102h ID_EXIT = 103h ID_EDIT = 104h FILE_GENERIC_READ = 1 FILE_DEVICE_MASS_STORAGE = 2Dh METHOD_BUFFERED = 0 FILE_ANY_ACCESS = 0 FILE_READ_ACCESS = 1 FILE_WRITE_ACCESS = 2 IOCTL_STORAGE_EJECT_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (202h shl 2) or METHOD_BUFFERED IOCTL_STORAGE_LOAD_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (203h shl 2) or METHOD_BUFFERED .data bukva rb 1 handl dd ? xren db '\\.\',0,0 dvoet db ':',0 byr dd ? .code fuck: invoke GetModuleHandle,0 invoke DialogBoxParam,eax,69,HWND_DESKTOP,ProceduraDialoga,0 invoke ExitProcess,0 proc ProceduraDialoga,hwnddlg,msg,wparam,lparam push ebx push esi push edi cmp [msg],WM_INITDIALOG je Initialization cmp [msg],WM_COMMAND je Command cmp [msg],WM_CLOSE je Exit xor eax,eax jmp Finish Command: cmp [wparam],BN_CLICKED shl 16 + ID_EXIT je Exit invoke GetDlgItemText,[hwnddlg],ID_EDIT,bukva,2 test eax,eax jz Initialization invoke lstrcat,xren,bukva invoke lstrcat,xren,dvoet invoke CreateFile,xren,FILE_GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0 cmp eax,-1 je Initialization mov [handl],eax cmp [wparam],BN_CLICKED shl 16 + ID_CLOSE je Close invoke DeviceIoControl,eax,IOCTL_STORAGE_EJECT_MEDIA,0,0,0,0,byr,0 Initialization: xor eax,eax inc eax Finish: pop edi pop esi pop ebx ret Exit: invoke EndDialog,[hwnddlg],-1 jmp Finish Close: invoke DeviceIoControl,eax,IOCTL_STORAGE_LOAD_MEDIA,0,0,0,0,byr,0 jmp Initialization endp .end fuck section '.rsrc' resource from 'CDzap.res' data readable discardable Хоть убейте, не пойму, где ошибка... CreateFile вызывал и с GENERIC_READ и с FILE_GENERIC_READ по совету RamMerLabs - монопенисуально, INVALID_HANDLE_VALUE. Если вызываю с \\.\CdRom1 - получаю абсолютно левый хэндл 0x54, с которым тоже ничего не прокатывает
Ах, да!.... .rc к проге Код (Text): #define LANG_ENGLISH 0x9 #define LANG_RUSSIAN 0x19 #define DS_MODALFRAME 0x0080L #define WS_POPUP 0x80000000L #define WS_CAPTION 0x0C00000L #define WS_SYSMENU 0x80000L #define BS_DEFPUSHBUTTON 0x1 #define WS_CHILD 0x40000000L #define WS_VISIBLE 0x10000000L #define WS_TABSTOP 0x10000L #define BS_PUSHBUTTON 0x0 #define SS_LEFT 0x0 #define ES_LEFT 0x0 #define WS_BORDER 0x800000L #define ID_OPEN 0x101L #define ID_CLOSE 0x102L #define ID_EXIT 0x103L #define ID_EDIT 0x104L 69 DIALOG 70, 70, 160, 50 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Âëàäûêà CD-ROM'à ver. 0.0.0.1" LANGUAGE LANG_ENGLISH, LANG_RUSSIAN FONT 8, "MS Sans Serif" { CONTROL "Ââåäèòå áóêâó CD-ROM'à:", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE, 10, 10, 100, 8 CONTROL "", ID_EDIT, EDIT, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 110, 10, 30, 13 CONTROL "Îòêðûòü",ID_OPEN, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10, 30, 45, 15 CONTROL "Çàêðûòü",ID_CLOSE, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 60, 30, 45, 15 CONTROL "Âûõîä",ID_EXIT,BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP,110, 30, 45, 15 } Блин, чё с кириллицей-то? Хотя ладно, и так сойдёт Никак не пойму, в чём проблема... И Olly издевается LastError: ERROR_SUCCESS...
Adrax Код (Text): ... bukva rb 1 ;; тут один байт ... invoke GetDlgItemText,[hwnddlg],ID_EDIT,bukva,2 ;; тут два ;; куда попадет второй байт? ... Код (Text): ... xren db '\\.\',0,0 ;; тут два нуля ... invoke lstrcat,xren,bukva ;; буква вместо первого invoke lstrcat,xren,dvoet ;; двоеточие вместо второго ;; а где завершающий ноль? ...
2 q_q Не, тут я не прокололся - специально ж высчитывал, чтобы lstrcat красиво сшил и ноль добавился. Мож, я и ошибся чуток, но строка формируется правильно 2 все Уважаемые программисты! Допёр я, почему CreateFile не срабатывала. Причина оказалась банально проста: запущенная VmWare блокировала доступ к DVD-приводу! Сейчас столкнулся с другой проблемой... Видоизменил исходник следующим образом: Код (Text): format PE GUI 4.0 include 'win32axp.inc' ID_OPEN = 101h ID_CLOSE = 102h ID_EXIT = 103h ID_EDIT = 104h FILE_GENERIC_READ = 1 FILE_DEVICE_MASS_STORAGE = 2Dh METHOD_BUFFERED = 0 FILE_ANY_ACCESS = 0 FILE_READ_ACCESS = 1 FILE_WRITE_ACCESS = 2 IOCTL_STORAGE_EJECT_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (202h shl 2) or METHOD_BUFFERED IOCTL_STORAGE_LOAD_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) or (FILE_READ_ACCESS shl 14) or (203h shl 2) or METHOD_BUFFERED .data bukva rb 1 handl dd ? xren db '\\.\',0,0 dvoet db ':',0 byr dd ? .code fuck: invoke GetModuleHandle,0 invoke DialogBoxParam,eax,69,HWND_DESKTOP,ProceduraDialoga,0 invoke ExitProcess,0 proc ProceduraDialoga,hwnddlg,msg,wparam,lparam push ebx push esi push edi cmp [msg],WM_INITDIALOG je Initialization cmp [msg],WM_COMMAND je Command cmp [msg],WM_CLOSE je Exit xor eax,eax jmp Finish Command: cmp [wparam],BN_CLICKED shl 16 + ID_EXIT je Exit mov eax,[handl] test eax,eax jnz knopki invoke GetDlgItemText,[hwnddlg],ID_EDIT,bukva,2 test eax,eax jz Initialization invoke lstrcat,xren,bukva invoke lstrcat,xren,dvoet invoke CreateFile,xren,FILE_GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0 cmp eax,-1 je Initialization mov [handl],eax jmp Command knopki: cmp [wparam],BN_CLICKED shl 16 + ID_CLOSE je Close cmp [wparam],BN_CLICKED shl 16 + ID_OPEN je Open Initialization: xor eax,eax inc eax Finish: pop edi pop esi pop ebx ret Exit: invoke EndDialog,[hwnddlg],-1 jmp Finish Open: invoke DeviceIoControl,[handl],IOCTL_STORAGE_EJECT_MEDIA,0,0,0,0,byr,0 invoke CloseHandle,[handl] invoke RtlZeroMemory,handl,4 jmp Initialization Close: invoke DeviceIoControl,[handl],IOCTL_STORAGE_LOAD_MEDIA,0,0,0,0,byr,0 invoke CloseHandle,[handl] invoke RtlZeroMemory,handl,4 jmp Initialization endp .end fuck section '.rsrc' resource from 'CDzap.res' data readable discardable И всё равно - кнопки срабатывают максимум один раз, т.е. один раз нажал "Открыть" - и всё, после этого прогу можно только закрыть, больше она ни на что не способна... В чём моя ошибка?
Adrax строка формируется правильно Всегда? Или только первый раз? кнопки срабатывают максимум один раз При первом срабатывании после invoke lstrcat,xren,dvoet переменная dvoet будет указывать на db 0, 0. Следовательно, двоеточие в дальнейшем не добавляется.