Извлечь CD / оптический привод на языке ассемблера - PullRequest
1 голос
/ 21 февраля 2012

Это не могло быть проще, но не сдвигалось с места.

У меня есть простой код, который я использую, чтобы увидеть, будет ли оптический привод выдвигаться

Код написан на ассемблере, синтаксис Intel nasm.

[BITS 16]
[ORG 0X07C00]
STI

Eject:

mov ah, 46h
mov al, 00h
mov dl, 00h
int 13h

endprogram:
times 510-($-$$) db 0
db 0x55
db 0xAA

Я мог бы просто увеличить номер диска, но не должен ли он работать правильно, если диск был 0? может быть начало диска где-то около 128 десятичных

Спасибо

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Похоже, что нет никакого стандартного прерывания BIOS для извлечения компакт-диска из привода. Так что, по сути, у вас много работы, если вы хотите эту функцию. Вам нужно написать драйвер ATA и отправить необработанные команды, чтобы принудительно извлечь дисковод компакт-дисков.

Это влечет за собой гораздо больше, чем кажется. Вы должны обнаружить диски ATA, отфильтровать их на дисковод компакт-дисков и затем отправить команду.

Вам нужно проверить статью ATA OSDev и статью ATAPI

0 голосов
/ 04 апреля 2018

Вы можете попробовать этот код, который был опубликован , когда он снова в сети :

.386
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE

INCLUDE windows.inc

INCLUDE kernel32.inc
INCLUDE winmm.inc
INCLUDE masm32.inc

INCLUDE c:\masm32\macros\macros.asm

INCLUDELIB kernel32.lib
INCLUDELIB winmm.lib
INCLUDELIB masm32.lib

.DATA

   szDriveLetter BYTE "R:", 0

.DATA?

   szBuffer      BYTE 256 DUP(?)

.CODE

start:

 ; to close
   INVOKE lstrcat, ADDR szBuffer, SADD("open ")
   INVOKE lstrcat, ADDR szBuffer, ADDR szDriveLetter
   INVOKE lstrcat, ADDR szBuffer, SADD(" type cdaudio alias CDName")
   INVOKE mciSendString, ADDR szBuffer, NULL, 0, 0
   .IF eax != 0
       push eax
       INVOKE StdOut, SADD("Error",13,10)
       pop eax
       jmp done
   .ENDIF
   INVOKE mciSendString, SADD("set CDName door closed"), NULL, 0, 0
   .IF eax != 0
       push eax
       INVOKE StdOut, SADD("Error",13,10)
       pop eax
       jmp done
   .ENDIF    
   INVOKE mciSendString, SADD("close CDName"), NULL, 0, 0                          
   .IF eax != 0
       push eax
       INVOKE StdOut, SADD("Error",13,10)
       pop eax
       jmp done
   .ENDIF  

   mov eax, 0

 done:  

   INVOKE ExitProcess, eax

END start 

Или более простая версия FASM (Это был один из встроенных примеров).

; Beer - example of tiny (one section) Win32 program

format PE GUI 4.0

include 'win32a.inc'

; no section defined - fasm will automatically create .flat section for both
; code and data, and set entry point at the beginning of this section

invoke MessageBoxA,0,_message,_caption,MB_ICONQUESTION+MB_YESNO
cmp eax,IDYES
jne exit

invoke mciSendString,_cmd_open,0,0,0
invoke mciSendString,_cmd_eject,0,0,0
invoke mciSendString,_cmd_close,0,0,0

exit:
invoke ExitProcess,0

_message db 'Do you need additional place for the beer?',0
_caption db 'Desktop configuration',0

_cmd_open db 'open cdaudio',0
_cmd_eject db 'set cdaudio door open',0
_cmd_close db 'close cdaudio',0

; import data in the same section

data import

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
winmm,'WINMM.DLL'

import kernel32,\
ExitProcess,'ExitProcess'

import user32,\
MessageBoxA,'MessageBoxA'

import winmm,\
mciSendString,'mciSendStringA'

end data
0 голосов
/ 21 февраля 2012

Попробуйте функцию 48h, чтобы получить параметры привода. Посмотри, что ты получишь. Может быть, другой номер диска. Или эта расширенная функция может быть недоступна / не поддерживаться для ваших типов дисков в вашем конкретном BIOS.

...