Комманда mount и блокировка CDROM

Автор: waw Дата: 25.07.2003 15:06 Уважаемые проффесионалы, прошу прошение за очень простой вопрос.
Но может кто-то опуститися до ответа на него.

Мне очень нужно узнать каким образом mount в Linux болкирует открытие CDROM при нажатии кропки на приводе? Как она его держит. После монтирования я не могу вытащить диск до выполнения комманды umount.


Если есть пример кода или описание, или хотябы ссылка на документацию. Мне нужно эту возможность реализовать в Windows.
Re: Комманда mount и блокировка CDROM 25.07.2003 16:45Woodoo waw писал(а):

> Но может кто-то опуститися до ответа на него.

Но почему Вы изначально думаете, что "никто не опустится"? Мозги набекрень

> Мне очень нужно узнать каким образом mount в Linux болкирует
> открытие CDROM при нажатии кропки на приводе? Как она его
> держит. После монтирования я не могу вытащить диск до
> выполнения комманды umount.

Имхо. Команда на открытие|закрытие трея cdrom, воспроизведение, останов, перемотка - оснезависимы - т.е. эти функции работатют на уровне встроенного элементарного командного интерфейса cdrom.

Доказательство - отключите шлейф, оставьте только разъем питания. Если есть соответствующие кнопки управления на панели - его можно даже запустить на воспроизведение.

Win-CDPlayer именно этим и занимается - отдает управляющие команды.

> Если есть пример кода или описание, или хотябы ссылка на
> документацию. Мне нужно эту возможность реализовать в Windows.

Разница только в том, что в выни нет (или не попадалось) программ, блокирующих трей.
Думаю, можно пойти "от противного"
- взять сырцы пакета eject,
- спецификацию командного интерфейса atapi cdrom,
- в случае windows - документацию по соответствующему драйверу.

Увы, здесь я "полный чайник" Улыбка
Re: Комманда mount и блокировка CDROM 25.07.2003 16:58waw Огромное спасибо. Это первый форум где я получил вразумительный ответ.

>>Разница только в том, что в выни нет (или не попадалось) >>программ, блокирующих трей.
>>Думаю, можно пойти "от противного"
>>- взять сырцы пакета eject,
>>- спецификацию командного интерфейса atapi cdrom,
Елси Вы видели где-нибудь спецификацию командного интерфейса atapi cdrom, тогда подскажите ссылочку
>>- в случае windows - документацию по соответствующему драйверу.
Re: Комманда mount и блокировка CDROM 25.07.2003 18:40Light Вообще в вынь апи управление cd осуществляется через функции MCISendString и MCISendCommand попробуй поискать описание этих функций в win32 sdk
Re: Комманда mount и блокировка CDROM 25.07.2003 19:30Woodoo waw писал(а):

> Елси Вы видели где-нибудь спецификацию командного интерфейса
> atapi cdrom, тогда подскажите ссылочку

[www.google.com]

Вот еще нарыл:
[www.t13.org]
Re: Комманда mount и блокировка CDROM 28.07.2003 17:37waw Спецификацию налел. Спасибо.

Нашел комманду Door Lock. Но другая беда, это совсем на ниском уровне бокировка происходит, а я незнаю как комманду отправить на само устройство. По идее это нужно в какой то порт IDE контроллера записывать код комманду, но в какой? Может попадался пример упарвления CDROM (Любой пример) на assembere? Или на любом языке программирования?

Раскопки комманд MCISendString и MCISendCommand ничего не дали. Похоже там нет таких, или они не документированы.

Изучение комманды mount как и функции блокировки в ядре Linux ничего не длали. Организация другая, комманды отправляютс напремую в Linux драйвер, а мне нужно в порт контроллера.

Так что пока "архиологи роют дальше". Копаю дальше.

Если что-то узнаете новое пишите, буду очень благодарен за любую помошь.
Re: Комманда mount и блокировка CDROM 28.07.2003 19:52Light ---
...
#include <windows.h>
#include <mmsystem.h>
...
mciSendString("set cdaudio door open",0,0,0);
...
---

for e.g. открывает дверцу cdroom
Re: Комманда mount и блокировка CDROM 29.07.2003 13:18waw Спасибо Light, mciSendString("set cdaudio door open",0,0,0); эту комманду я знаю. Но она открывает дверцу CD. А мне нужно заблокировать открытие.

Мне подсказали другой вариант блокировки CD:

>>Для Вин2000 так:
>>
>>1) Открываем диск
>>hDrive:=CreateFile("\\.\F:",GENERIC_READ, FILE_SHARE_READ, NULL, >>OPEN_EXISTING, NULL, NULL);
>>//Вместо F - твоя буква привода
>>2) Блокируем лоток
>>#define PREVENT_MEDIA_REMOVAL 0x002D4804;
>>ULONG Returned;
>>ULONG DisableEject:=1;
>>DeviceIoControl(hDrive,PREVENT_MEDIA_REMOVAL, &DisableEject, >>sizeof(DisableEject), NULL, NULL, &Returned, NULL);
>>3) Разблокируем лоток
>>DisableEject:=0;
>>--- аналогично блокировке ---
>>4) Закрываем диск
>>CloseHandle(hDrive);
>>Сколько раз заблокируешь, столько раз надо разблокировать иначе >>лоток откроешь только после перезагрузки.
>>
>>Для Win9x здесь
>>[support.microsoft.com]

Все работет, вот код функции на Delphi 6:

procedure Door_Lock(Locked:boolean);
const IOCTL_STORAGE_MEDIA_REMOVAL = $002D4804;
var hDrive : THandle;
Returned : DWORD;
DisableEject : boolean;
begin
hDrive := CreateFile('\\.\D:', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if GetLastError <> 0 then
MessageDlg('Error:'+IntToStr(GetLastError), mtError, [mbOK], 0);
try
DisableEject := Locked;
if not DeviceIoControl(hDrive,
IOCTL_STORAGE_MEDIA_REMOVAL, // PREVENT_MEDIA_REMOVAL,
@DisableEject,
sizeof(DisableEject),
nil,
0,
Returned,
nil) then
MessageDlg('Error:'+IntToStr(GetLastError), mtError, [mbOK], 0);

finally
CloseHandle(hDrive);
end;
end;

Door_Lock(true); - Заблокировать
Door_Lock(false); - Разблокировать

Всем спасибо, обсуждение этого вопроса считаю закрытым.
RSS-материал